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 サービスを試すことができます。
行動管理の強化、プライバシー情報の漏洩、悪意のあるハイジャックといった問題がますます深刻化する中、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
-
A detailed explanation of Hadoop core architecture HDFS
Knowledge Base Team
-
What Does IOT Mean
Knowledge Base Team
-
6 Optional Technologies for Data Storage
Knowledge Base Team
-
What Is Blockchain Technology
Knowledge Base Team
Explore More Special Offers
-
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
