Development practice of using cloud server ECS to build DoH service

ご存じの通り、DNS サーバーは人間にとって理解しやすいドメイン名(通常 URL と呼ばれます)を、マシンにとって理解しやすい「IP アドレス」に変換します。UDP ポート 53 を使用して外部にサービスを提供します。通常、DNS クエリは平文であるため、ネットワーク管理者や ISP がウェブサイトのアクセス記録を簡単に取得できます。

行動管理の強化、プライバシー情報の漏洩、悪意のあるハイジャックといった問題がますます深刻化する中、DoH はより安全な DNS クエリ手法として幅広く利用されるようになりました。RFC 8484 で規定されている TLS 暗号化 HTTP 接続を通じて DNS 名前解決を提供するため、DNS クエリは暗号化されて保護されます。

パブリックネットワーク上で DoH サーバーを構築してみることができるでしょうか?

このアイデアを思いついてから、すぐに行動に移しました。公開されているオンライン資料を参考にさまざまな疑問を解決し、最終的に Alibaba Cloud の ECS(イメージソースが非常に高速でおすすめです)を活用して、DoH サーバーの構築を無事に完了させることができました。

それでは、構築の手順を順を追って見ていきましょう。

01 リソースの準備:ECS + ドメイン名

1. クラウドサーバー

今回の演習では、Ubuntu イメージがインストールされたクラウドサーバーの使用をおすすめします。Alibaba Cloud のトライアルセンターで、t5 インスタンスを 1 か月間無料で利用できます。

学生や教職員の方は、大学プランを利用して 2.5 か月間無料で利用できます。

2. ドメイン名の準備

ドメイン名は Alibaba Cloud World Wide Web を使用して購入することをおすすめします。無料で SSL 証明書を取得できるのがメリットです。

02 簡易構築手順

手軽に設定を済ませたい場合は、以下の手順を参照してください。

1. Docker をインストールします。

apt-get install docker.io

2. Docker を起動します。

service docker start

3. DNSCrypt コンテナを作成・初期化します。

説明:

①:example.com を独自のドメイン名に、192.168.1.1:443 を ECS のパブリック IP アドレスに置き換えます。カンマ区切りで複数の IP アドレスとポートを指定できます(例:-E '192.168.1.1:443, [2001:0db8::412f]:443')。

②:コンテナ内のパス /etc/dnscrypt-server:/opt/encrypted-dns/etc/keys は、ホスト側の /opt/encrypted-dns/etc/keys が /etc/dnscrypt-server/keys にマッピングされることを示しています。

サービス起動コマンド:docker start dnscrypt-server

4. DoH サーバーコンテナを作成・初期化します。

5. コンテナの稼働状況を確認します。

docker ps -a

6. 自動起動を設定します。

docker update --restart=unless-stopped dnscrypt-server docker update --restart=unless-stopped doh-server

7. Web クライアントと SSL 証明書については、以下の nginx の手順を参照してください。

8. 設定の確認 - すべてのサービスが起動したら、DoH サービスが利用可能になります。最後のまとめセクションを参照してください。

03 高度な構築チュートリアル

構築方法は一通りではないため、ここでは 3 つの異なるアプローチと考え方を紹介します。

I. nginx + DoH サーバー + DNSCrypt(この記事で使用)

II. nginx + DoH サーバー + Bind(代替案)

III. nginx + DoH サーバー + CoreDNS(クラウドネイティブソリューション)

1. software-properties-common パッケージをインストールします。

これは事前準備の操作です。ここでは Alibaba Cloud が公式に提供する Ubuntu 20.04 64 ビットシステムを使用していますが、このシステムには add-apt-repository コマンドが含まれていないため、システムターミナルで以下のコマンドを実行して software-properties-common パッケージをインストールする必要があります。

sudo apt update

sudo apt -y install software-properties-common dirmngr apt-transport-https lsb-release ca-certificates

ヒント:

以下のコマンドで PPA リポジトリを追加できます。

sudo add-apt-repository ppa:

PPA リポジトリを追加した後、パッケージリストを更新し、リポジトリから新しいパッケージをインストールします。

sudo apt update

sudo apt install

2. Dnscrypt-Proxy をインストールします

a) インストールと検証

Dnscrypt-Proxy は多くの最新の機能を備えた DNS プロキシサーバープログラムで、DNSCrypt v2(認証対応)、DNS-over-HTTPS(RFC 8484、DoH)などの機能をサポートしています。

Dnscrypt-Proxy は Golang で開発されているため、CentOS 5 およびそれ以前の Linux ディストリビューションではインストールできません。Dnscrypt-Proxy はポート 53 を使用するため、インストール前にポート 53 の使用状況を確認できます。コマンドは以下の通りです。

ss -lp 'sport = :domain'

ボランティアが提供する PPA を使用して、最新バージョンのプログラムを素早くインストールし、維持管理できます。

sudo add-apt-repository ppa:shevchuk/dnscrypt-proxy

sudo apt install dnscrypt-proxy

インストール後、Dnscrypt-Proxy サービスはサーバー上で自動的に起動します。

プログラムは /etc/dnscrypt-proxy フォルダにインストールされます。Dnscrypt-Proxy のリスニングアドレスは通常(v2.1.0〜ppa6)127.0.0.53:53 です。dig コマンドで確認できます。

設定ファイル /etc/dnscrypt-proxy/dnscrypt-proxy.toml の server_names フィールドでは、好みのサーバーを 1 つ以上設定する必要があります。最初のサーバーへのリクエストが失敗した場合、自動的に 2 番目のサーバーにリクエストを送信します。例:server_names=['alidns-doh']。ここでは変更を行いません。サーバーが配置されているアベイラビリティゾーンによっては、ここのパラメータを変更する場合があります。

b) システム DNS 設定の変更

システム DNS 設定を削除するコマンド:

apt-get remove resolvconf

システム DNS 設定ファイルのバックアップを作成します。

cp /etc/resolv.conf /etc/resolv.conf.backup

元の DNS 設定ファイルを編集します。

vim /etc/resolv.conf

nameserver 127.0.0.53 options edns0 に変更します。

最後に、Dnscrypt-Proxy サービスを再起動します。

sudo systemctl restart dnscrypt-proxy

注意:システムの Systemd サービスが使用するデフォルトのソケットライブラリアドレスは 127.0.2.1:53 です。

3. DNS-over-HTTPS をインストールします

これは Golang で開発されたオープンソースの DoH サーバープログラムで、HTTP リクエストを受け取り、DNS クエリを実行します。deb インストールパッケージを使用して、DNS-over-HTTPS サーバープログラムを素早くインストールできます。

debian を使用している場合、コマンドは以下の通りです。

sudo dpkg -i doh-server_2.0.1_amd64.deb

ubuntu では、コマンドは以下の通りです。

sudo apt install doh-server_2.0.1_amd64.deb

sudo apt install /root/doh-server_2.0.1_amd64.deb

注意:上記のファイルパスは実際の環境に合わせて置き換えてください。

ヒント:deb パッケージのインストール中に依存関係エラーが発生した場合は、以下のコマンドで依存関係の問題を修復できます。

sudo apt install -f

インストールした DoH サーバープログラムの設定ファイルは /etc/dns-over-https/doh-server.conf にあります。リバース名前解決を設定するために、upstream フィールド(upstream DNS 名前解決)を前述の Dnscrypt-Proxy のリスニングアドレスに変更します。Dnscrypt-Proxy のリスニングフィールドは /etc/dnscrypt-proxy/dnscrypt-proxy.toml ファイルで変更できます。これにより、DoH プログラムは Dnscrypt-Proxy を使用して DNS リクエストを送信するようになります。

変更コード:

vim /etc/dns-over-https/doh-server.conf

変更内容は以下の図の通りです。

サービスを再起動して、変更を適用します。

sudo systemctl restart doh-server

4. Nginx をインストールします

Nginx は高性能なリバースプロキシサーバープログラムで、クライアントからの HTTPS DNS リクエストを受け取り、リバースプロキシとしてクライアントからの HTTPS リクエストをデコードし、DoH リクエストを DoH サーバープログラムに送信します。クライアントとの通信を行うゲートウェイであり、HTTPS リクエストの認証に対応するため SSL 証明書も設定します。

ここでは Ondrej Sury が提供する関連バージョンを使用しています。このキーワードで検索し、ウェブページにアクセスして対応するインストールパッケージをダウンロードしてください。インストールコマンドは以下の通りです。

sudo add-apt-repository ppa:ondrej/nginx

sudo apt install nginx-full

Nginx は /etc/nginx ディレクトリにインストールされます。設定ファイルを編集する必要があります。

vim /etc/nginx/sites-available/dns-over-https

server_name フィールドには独自のドメイン名を指定する必要があり、これは DoH サービスの提供に必要です。upstream_dns_backend は Nginx が転送先のアドレスで、ここでは DoH のリスニングアドレスです。設定例は以下の通りです。

Nginx で SSL 証明書を検証する設定もできます。

設定は以下の図の通りで、resolver 変数は DNSCrypt のリスニングアドレスです。

5. SSL 証明書の取得

方法 1:手動インストール

Alibaba Cloud のドメイン名を購入した場合、手動インストールを選択できます。有効期間を最長 1 年まで延長できるのがメリットですが、手続きがやや煩雑なのがデメリットです。

コンソール - Certificate Management Service にアクセスします https://yundun.console.aliyun.com/

DV 単一ドメイン証明書パッケージを購入した後、「証明書の作成」をクリックし、申請情報を入力して検証を完了させます。

購入が成功したら、証明書をダウンロードしてサーバーにデプロイします。FTP などの方法で証明書をサーバーのディレクトリにアップロードし、nginx の設定ファイルを更新して変更を適用します。設定例は以下の通りです。

nginx -t コマンドを使用して設定が正しいかどうかをテストします。

nginx を再起動して設定を適用します。

sudo systemctl reload nginx

方法 2:プラグインを使用したインストール

Certbot は、手動で管理するウェブサイトに無料の Let's Encrypt 証明書を自動的にデプロイし、HTTPS を有効にするための無料オープンソース SSL 証明書申請ツールです。Nginx サーバーで Certbot を使用して証明書を設定するのは優れた選択肢です。手軽なのがメリットで、有効期間が短いのがデメリットです。

PPA を使用して Certbot をインストールします。

成功後のスクリーンショットは以下の通りです。

ドメイン名に対して証明書を申請します。置き換えに注意し、プロンプトに従って Agreement と入力して進めます。

sudo certbot --nginx -d dns.example.com

次に、HTTP トラフィックを HTTPS に転送するために 2 を選択します。1 を選択すると転送なしを意味します。(以下の図を参照)

プラグイン設定ファイルのアドレスは /etc/letsencrypt/options-ssl-nginx.conf です。

nginx を再起動して設定を適用します。

sudo systemctl reload nginx

Let's Encrypt から発行される証明書の有効期間は 90 日間のみのため、certbot renew コマンドで証明書を更新できます。

04 DoH の使用まとめ

RFC 8484 では、/dns-query パスの使用がデフォルトのクエリパスとして規定されています。クライアント側では、Firefox や Google などのブラウザが既に DoH をサポートしており、Google ブラウザでの設定パスは:設定 - セキュリティとプライバシーの設定 - 詳細設定 - セキュア DNS を使用、です。

もちろん、ポリシー上の理由により、中国国内で独自に構築した DoH サーバーは運用資格なしにパブリックネットワークに対してサービスを提供できないため、この演習の意義は学習と実践の楽しさにあります。

また、DNS サービスを高速かつ正確に提供するという要件から、個人で構築したサーバーは最適な選択肢とは言えません。DNS サービスの利用が必要な場合は、Alibaba Cloud のパブリック DoH サービスを試すことができます。

Related Articles

Explore More Special Offers

  1. Short Message Service(SMS) & Mail Service

    50,000 email package starts as low as USD 1.99, 120 short messages start at only USD 1.00

phone お問い合わせ
Hi, I'm Alibaba Cloud AI Assistant!
I can help with questions and solutions.