DNSのブラックホール:なぜサーバーは突然「目が見えなくなる」のか
誰もが経験したことがあるでしょう。新しいVPSを立ち上げたり、社内VPNを切り替えたりした途端、接続が虚無に消えてしまう。ping 8.8.8.8は問題なく通るのに、ドメイン名を試した瞬間にTemporary failure in name resolution(名前解決の一時的な失敗)に見舞われます。これは単なる偶発的な不具合ではありません。Ubuntu 22.04やFedora、Debianといったモダンなディストリビューションに移行する際、多くのエンジニアを悩ませる典型的なDNS設定の摩擦です。
/etc/resolv.confを覗いてみると、おそらくnameserver 127.0.0.53という記述があるはずです。あなたが設定したわけでも、DHCPサーバーが設定したわけでもありません。これはsystemd-resolvedの象徴です。これはローカルのスタブリゾルバとして動作し、アプリケーションとインターネットの間に位置します。ネットワークをよりスマートにすることを目的としていますが、その仕組みを理解していないと、トラブルシューティングの悪夢に変わることがよくあります。
静的から動的への移行:なぜsystemd-resolvedなのか?
かつてDNSはシンプルでした。/etc/resolv.confにある静的なテキストファイルがアップストリームのIPを保持していました。2005年当時はそれで十分でした。しかし今日、私たちはWi-Fi、イーサネット、複数のVPNトンネル、およびIPv6スタックを使い分けています。静的なファイルでは、このレベルの変動に対応できません. 私たちには「交通整理役」が必要だったのです。
systemd-resolvedは、いくつかの重要なレイヤーを提供することで、これらの移行を管理します:
- ローカルスタブリゾルバ:
127.0.0.53でリッスンし、結果をキャッシュします。これにより、システムは30秒ごとにgoogle.comをインターネットに問い合わせる必要がなくなります。 - スプリットホライゾンDNS: 特定のクエリを特定の経路にルーティングします。例えば、
*.dev.company.ioはVPN経由で送信し、それ以外は自宅のプロバイダー経由で送信するといったことが可能です。 - ゼロコンフィギュレーション・ネットワーキング: mDNSやLLMNRを処理し、中央サーバーなしでプリンターやローカルのPi-holeを見つけることができます。
- モダンなプライバシー: DNS-over-TLS (DoT) をネイティブにサポートし、クエリが覗き見されるのを防ぎます。
問題が発生するのは、systemd-resolvedが/etc/resolv.confをシンボリックリンクであることを期待している場合です。レガシーなスクリプトや手動の編集によって、そのリンクがただのファイルで上書きされてしまうと、名前解決の連鎖全体が崩壊します。
DNSエラーに対処する3つの方法
名前解決が行き詰まったとき、主に3つの道があります。あなたのアーキテクチャに合ったものを選んでください:
1. 「力業」による方法(静的ファイル)
シンボリックリンクを削除し、/etc/resolv.confを直接書き込みます。緊急時の応急処置にはなりますが、次回の再起動やDHCPの更新で内容が消えてしまい、振り出しに戻ってしまう可能性があります。
2. NetworkManagerによるアプローチ
接続プロファイル内でDNSサーバーを定義します。これはデスクトップ環境での標準です。しかし、ヘッドレスサーバーでは、他のオーケストレーションツールと制御を奪い合う競合が発生する可能性があります。
3. systemd-resolved ネイティブ・パス(推奨)
サービスを直接設定し、シンボリックリンクを維持します。これが最も堅牢な戦略です。ディストリビューションのメンテナが意図したアーキテクチャに従っており、アップデート後も設定が維持されます。
実装:本番環境に耐えうる設定の構築
システムに抗うのではなく、コントロールしましょう。グローバルパラメータは/etc/systemd/resolved.confにあります。運任せにするのではなく、リゾルバに明示的な指示を与えます。
以下は、私が高可用性環境でデプロイしている、セキュリティを強化した設定です:
# /etc/systemd/resolved.conf を編集
[Resolve]
DNS=1.1.1.1 8.8.8.8
FallbackDNS=1.0.0.1 8.8.4.4
Domains=~.
DNSSEC=allow-downgrade
DNSOverTLS=opportunistic
MulticastDNS=yes
LLMNR=yes
Cache=yes
CacheMaxTTL=3600
なぜこれらの設定なのか? Domains=~. ディレクティブは、デフォルトですべてのトラフィックをこれらのサーバーで処理することを保証します。

