従来のDNSに潜む「無防備な」脆弱性
ラボ環境から本番環境まで、6年以上にわたりLinuxシステムを管理してきた中で、ある初歩的なミスに気づきました。それは、エンジニアの90%がDNSプロトコルを含めた基本的なネットワーク知識を軽視しているということです。デフォルトでは、DNSはポート53で作動し、データをプレーンテキスト(非暗号化)で送信します。これにより、ISPや「中間者」は、あなたがどのウェブサイトにアクセスしているかを容易に把握できてしまいます。たとえウェブサイトがHTTPSを使用していたとしても、ドメイン名は丸見えなのです。
さらに悪いことに、通信事業者はDNSハイジャック技術を使用して、ユーザーを広告ページにリダイレクトしたり、アクセスを遮断したりすることもあります。そのため、私は半年以上前からインフラ全体をDNS over TLS (DoT) および DNS over HTTPS (DoH) に移行しました。結果は非常に良好で、追跡の心配がなくなり、スマートなキャッシュメカニズムのおかげで解決速度も以前より安定しています。
systemd-resolvedで5分以内にDoTへアップグレード
Ubuntu、Debian、または最新のCentOSを使用している場合、systemd-resolvedを利用するのが最も近道です。複雑なサードパーティ製ソフトウェアを追加することなく, すぐにDoTを導入できます。
ステップ1:設定ファイルの編集
sudo nano /etc/systemd/resolved.conf
以下の行を探して編集してください(行頭のコメント記号 # を外すのを忘れないでください):
[Resolve]
DNS=1.1.1.1 8.8.8.8
# CloudflareまたはGoogleのIPを使用
DNSOverTLS=yes
DNSStubListener=yes
ステップ2:有効化と確認
sudo systemctl restart systemd-resolved
sudo resolvectl status
インターフェース情報セクションで DNS over TLS: yes という行が表示されれば成功です。これで、すべてのDNSクエリは非常に安全なポート853上の暗号化されたTLSレイヤーに包まれます。
DoT vs DoH:サーバーにとっての最適な選択肢は?
本番環境で運用する場合、各プロトコルにはそれぞれの利点があります:
- DNS over TLS (DoT): 独立したポート853で作動します。ネットワーク管理の面でクリーンで扱いやすいのが特徴です。ただし、会社のファイアウォールが非常に厳しい場合、ポート853は遮断されやすい傾向にあります。
- DNS over HTTPS (DoH): 通常のウェブトラフィックと同じポート443を共有します。DoHを遮断するとウェブサイト自体もダウンしてしまうため、非常に遮断されにくいのがメリットです。一方で、設定には通常
cloudflaredのような内部プロキシが必要になります。
このDNSサーバークラスターのIP範囲を素早く計算するために、私はよく toolcraft.app/ja/tools/developer/ip-subnet-calculator を使います。CIDRを入力するだけで、ネットワーク範囲、ブロードキャストアドレス、利用可能なホスト数がすぐにわかるので、VLANの分割やファイアウォールの設定がより正確になります。
高度な設定:Cloudflaredを使用したDoHプロキシのインストール
最高のセキュリティを求める場合や、通信事業者の制限を効果的に回避したい場合には、Cloudflaredが最良の選択肢です。メールサーバーシステムでテストしましたが、非常に安定して動作することを確認しています。
1. クイックインストール
wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb
sudo dpkg -i cloudflared-linux-amd64.deb
2. サービスの構成
/etc/default/cloudflared に以下の内容で設定ファイルを作成します:
CLOUDFLARED_OPTS=--proxy-dns=true --proxy-dns-port=5053 --proxy-dns-upstream https://1.1.1.1/dns-query --proxy-dns-upstream https://8.8.8.8/dns-query
注意:マシン上のデフォルトのDNSサービスとの競合を避けるため、ポート5053を使用しています。
3. 自動起動の設定
sudo cloudflared service install
最後に、システムのDNSを 127.0.0.1#5053 に向ければ、すべてのトラフィックがDoHによって保護されます。
トラフィックの検証:理論だけでなく実際に確認する
エンジニアなら、自分の目で確かめる必要があります。私はパケットを確認するために tcpdump をよく使います。従来のDNSでは、アクセスしているドメイン名がはっきりと見えます。しかし、DoT/DoHでは、すべてが暗号化された文字列になります。
ポート53(通常のDNS)でネットワーク接続の状態をパケットキャプチャしてみます:
sudo tcpdump -ni any port 53
ウェブサイトを閲覧していても画面に動きがなければ、設定は正しく行われています。次に、ポート853を確認してみましょう:
sudo tcpdump -ni any port 853
データが TLS (Encrypted Application Data) として次々と流れてきます。これがあなたの成果です。
6ヶ月間の使用を経た実践的な経験
遅延(レイテンシ)を心配しすぎる必要はない
暗号化によってウェブの閲覧が遅くなることを心配する人が多いですが、実際には、最初のクエリが約15ms遅くなる程度です。それ以降は systemd-resolved のキャッシュのおかげで、速度はほぼ瞬時です。高頻度取引(HFT)でも行っていない限り、一般的なユーザーが違いを感じることはないでしょう。
内部ドメイン(ローカルドメイン)の処理
DoTを有効にした後、内部サーバー(例:gitlab.local)にアクセスできなくなるという「笑えない」ネットワーク接続問題を経験したことがあります。原因は、すべてのクエリがCloudflareに送信されてしまったためです。解決策は Split DNS を使用することです。インターネット向けのトラフィックのみを暗号化し、ローカルドメインは従来通り内部DNSで処理するように設定します。
おわりに
DoH/DoTへの移行は単なるセキュリティ対策ではなく、ISPによる不快な広告挿入シナリオから逃れる方法でもあります。Linuxサーバーを管理しているなら、今すぐDoTを有効にすることをお勧めします。設定には5分もかかりませんが、プライバシーの面でもたらされる価値は非常に大きいです。

