このチュートリアルでは、独自の DNS overTLSを設定する方法を紹介します。 (DoT)Nginxを使用したUbuntuのリゾルバー。DNSクエリを暗号化して、詮索好きな目から保護できます。
DNSoverTLSとは何ですか。なぜそれが重要なのか
DNS(ドメインネームシステム)は、ドメイン名をIPアドレスに変換する役割を果たします。 1987年に設計され、セキュリティやプライバシーを考慮していません。デフォルトでは、DNSクエリは暗号化されていません。それらはネットワーク上でプレーンテキストで送信され、中間エンティティによって悪用される可能性があります。たとえば、中国のグレートファイアウォール( GFW )DNSキャッシュポイズンと呼ばれる手法を使用します 中国のインターネットを検閲する。 (他の方法も使用しますが、この記事の範囲を超えています。)
GFWは、中国国外のDNSサーバーに送信されるすべてのDNSクエリをチェックします。プレーンテキストのDNSプロトコルはコネクションレス型プロトコルであるUDPに基づいているため、GFWはクライアントIPとサーバーIPの両方をスプーフィングできます。 GFWは、ブロックリストでドメイン名を見つけると、DNS応答を変更します。たとえば、中国のインターネットユーザーがgoogle.comにアクセスしたい場合、GFWはGoogleの実際のIPアドレスではなく中国にあるIPアドレスをユーザーのDNSリゾルバーに返します。次に、DNSリゾルバーが偽のIPアドレスをユーザーのコンピューターに返すため、ユーザーはgoogle.comにアクセスできません。
DNS over TLSは、DNSクエリがTLSで暗号化された安全な接続を介して送信されることを意味します。これは、HTTPトラフィックを暗号化するのと同じテクノロジーです。
独自のDoTリゾルバーを実行する理由
DNS over TLSをサポートする1.1.1.1や9.9.9.9などのパブリックDNSリゾルバーがすでにいくつかあるため、独自に実行するスキルや時間がない場合は、それらを使用できます。ただし、これにより、大規模なDNSサービスプロバイダーがユーザーに関する情報を収集できるようになると主張する人もいます。彼らはISPをより信頼しているようです。ただし、プライバシーに偏執的である場合は、独自のDoTリゾルバーを実行する必要があります。そうすれば、大規模なDNSサービスプロバイダーもISPもあなたをスパイすることはできません。
現在、すべてのDNSリゾルバー(BIND、Unbound、Knotリゾルバー、PowerDNSリゾルバーなど)がDNSoverTLSをサポートしているわけではありません。特定のリゾルバーのガイドを作成する代わりに、既存のDNSリゾルバーにNginx TLSプロキシを設定してDoTサービスを提供する方法を紹介します。したがって、使用しているDNSリゾルバーに関係なく、このチュートリアルに従うことができます。
前提条件
UbuntuサーバーでDNSリゾルバーが実行されていることを前提としています。任意のDNSリゾルバー(BIND、Unbound、Knotリゾルバー…)を使用できます。私は個人的にBINDを使用しています。
- Ubuntu 16.04/18.04で独自のBIND9DNSリゾルバーを設定する
- Ubuntu20.04で独自のBIND9DNSリゾルバーを設定する
DNSクライアントはDNSリゾルバーとの安全なTLS接続を確立する必要があるため、ドメイン名も必要です。ドメイン名をNameCheapから登録しました。これは、価格が低く、whoisのプライバシー保護が一生無料になるためです。
上記の要件を満たしたら、以下の手順に従ってください。
ステップ1:UbuntuサーバーにNginxをインストールする
とても簡単です。次のコマンドを実行するだけです。
sudo apt install nginx
ステップ2:Let’sEncryptから信頼できるTLS証明書を取得する
DNS over TLSでは、サーバー側にTLS証明書をインストールする必要があります。 Let'sEncrypt証明書を取得してインストールします。 Let’s Encrypt証明書を使用する利点は、無料で、セットアップが簡単で、クライアントソフトウェアによって信頼されていることです。
次のコマンドを実行して、デフォルトのUbuntuリポジトリからLet’s Encryptクライアント(certbot)をインストールします。
sudo apt install certbot
Let’s Encrypt TLS証明書を取得するには、次のコマンドを使用してNginx仮想ホストを作成できます。 dot.example.com
を交換します あなた自身のドメイン名で。このサブドメインのDNSAレコードを作成することを忘れないでください。
sudo nano /etc/nginx/conf.d/dot.example.com.conf
次のテキストをコピーして、仮想ホストファイルに貼り付けます。
server { listen 80; server_name dot.example.com; root /usr/share/nginx/html/; location ~ /.well-known/acme-challenge { allow all; } }
ファイルを保存して閉じます。変更を有効にするためにNginxをリロードします。
sudo systemctl reload nginx
仮想ホストを作成して有効にしたら、次のコマンドを実行して、webrootプラグインを使用してLet’sEncrypt証明書を取得します。
sudo certbot certonly --webroot --agree-tos --email [email protected] -d dot.example.com -w /usr/share/nginx/html/
ステップ3:NginxでDNSoverTLSプロキシを作成する
Nginxのメイン構成ファイルを編集します。
sudo nano /etc/nginx/nginx.conf
このファイルの最後に次の行を追加します。 http
の外に配置する必要があることに注意してください コンテキスト。
stream { # DNS upstream pool upstream dns { zone dns 64k; server 127.0.0.1:53; } # DoT server for decryption server { listen 853 ssl; ssl_certificate /etc/letsencrypt/live/dot.example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/dot.example.com/privkey.pem; proxy_pass dns; } }
上記の構成では、Nginxにポート853でTLS接続を終了させ、 127.0.0.1:53
でリッスンしているローカルDNSリゾルバーにDNS要求をリダイレクトします。 。
ファイルを保存して閉じます。次に、Nginx構成をテストして再起動します。
sudo nginx -t sudo systemctl restart nginx
Ubuntuサーバーでファイアウォールが実行されている場合は、TCPポート853を開く必要があります。たとえば、UFWファイアウォールを使用している場合は、次のコマンドを実行します。
sudo ufw allow 853/tcp
DNS over TLSを使用しているため、DNS増幅攻撃について心配する必要はありません。
ステップ5:UbuntuデスクトップでStubbyDoTクライアントを構成する
Stubbyは、getdnsチームによって開発されたオープンソースのDNSスタブリゾルバーです。スタブリゾルバーは、FirefoxなどのアプリケーションからDNS要求を受信し、1.1.1.1や8.8.8.8などの再帰的リゾルバーに要求を転送するエンドユーザーのコンピューター上の小さなDNSクライアントです。 Stubbyは、DNSoverTLSをサポートするという点で特別です。デフォルトでは、暗号化されたDNSリクエストのみを送信します。
デフォルトのリポジトリからUbuntuデスクトップにStubbyをインストールします。
sudo apt install stubby
インストールすると、スタビーはバックグラウンドで実行されます。ステータスを確認する:
systemctl status stubby
Stubbyは、ローカルホスト(127.0.0.1)のTCPおよびUDPポート53でリッスンします。デフォルトでは、StubbyはサードパーティのDNSoverTLSリゾルバーを使用します。独自に使用するように構成する必要があります。
sudo nano /etc/stubby/stubby.yml
upload_recursive_servers:
まで下にスクロールします セクションを作成し、他のDNSサーバーの上に次のテキストを追加します。 12.34.56.78をDoTリゾルバーのIPアドレスに置き換えます。
# My Own DNS over TLS resolver - address_data: 12.34.56.78 tls_auth_name: "dot.example.com"
次に、次の行を見つけます。
round_robin_upstreams: 1
1
を変更します 0
へ 。これにより、スタビーは常に独自のDNSoverTLSリゾルバーを使用するようになります。利用できない場合、stubbyは他のDNSサーバーを使用します。ファイルを保存し、変更を有効にするためにスタビーを再起動します。
sudo systemctl restart stubby
ステップ6:Stubbyを使用するようにUbuntuデスクトップを構成する
Stubbyは実行されていますが、オペレーティングシステムでは使用されていません。デスクトップの右上隅にあるNetworkManagerアイコンをクリックします。次に、有線設定を選択します。 (Wi-Fiを使用している場合は、Wi-Fi設定を選択します。)
歯車ボタンをクリックします。
IPv4
を選択します タブをクリックし、DNS設定で自動
を切り替えます オフにすると、UbuntuシステムがルーターからDNSサーバーアドレスを取得できなくなります。 127.0.0.1
と入力します DNSフィールドに入力します。 適用コード>をクリックします ボタンをクリックして変更を保存します。
次に、NetworkManagerを再起動して、変更を有効にします。
sudo systemctl restart NetworkManager
再接続すると、Ubuntuシステムが Details
のDNSサーバーとして127.0.0.1を使用していることがわかります。 タブ。
DNSトラフィックが暗号化されているかどうかを確認する方法
WireSharkを使用してDNSトラフィックを監視できます。 UbuntuデスクトップにWireSharkをインストールします。
sudo apt install wireshark
「スーパーユーザー以外のユーザーがパケットをキャプチャできるようにする必要がありますか?」という質問が表示された場合は、「はい」と答えます。インストールしたら、次のコマンドを実行してユーザーアカウントをwiresharkグループに追加し、パケットをキャプチャできるようにします。
sudo adduser your-username wireshark
変更を有効にするには、ログアウトしてから再度ログインします。次に、アプリケーションメニューからWireSharkを開き、WireSharkでネットワークインターフェイスを選択します。たとえば、私のイーサネットインターフェイス名はenp5s0です。次に、 port 853
と入力します キャプチャフィルターとして。これにより、WireSharkはDNSoverTLSで使用されるポートであるポート853でのみトラフィックをキャプチャします。
左上隅のボタンをクリックして、キャプチャを開始します。その後、ターミナルウィンドウで次のコマンドを実行し、 dig
を使用してドメイン名を照会します。 効用。たとえば、ドメイン名のAレコードをクエリできます。
dig A linuxbabe.com
これで、キャプチャされたDNSトラフィックをWireSharkで確認できます。接続はTCPを介して行われ、TLSで暗号化されました。これは私たちが望んでいることです。 [宛先]列にDoTリゾルバーのIPアドレスが含まれているかどうかを確認する必要があります。
DNSクエリが暗号化なしで送信された場合、コンピュータはポート53でDNSサーバーに接続します。ポート53
を使用してパケットを再度キャプチャできます。 キャプチャフィルタとして使用しますが、WireSharkにはパケットが表示されません。これは、スタビーがDNSクエリを暗号化していることを意味します。