定番の悩み:DNSを設定したのに…再起動で設定が消える
Webプロジェクトのために20台のUbuntuサーバーを管理していると想像してみてください。/etc/resolv.confファイルを開き、nameserver 8.8.8.8という行を追加して保存。ping google.comが20msで返ってくるのを確認して一安心。しかし、定期的なrebootやネットワークサービスの再起動を行うと、その努力は水の泡になります。resolv.confは、まるで何事もなかったかのように元の状態に戻ってしまうのです。
なぜLinuxはこれほど「頑固」なのでしょうか?Ubuntu 20.04/22.04、Fedora、CentOS 8などのモダンなディストリビューションでは、/etc/resolv.confはもはや静的なファイルではありません。これはsystemd-resolvedやNetworkManagerによって自動管理されています。手動で修正し続けても、「修正しては消える」というストレスの溜まるループから抜け出すことはできません。
正しいDNS設定方法(Ubuntu/Debian向け)
一時的なファイルを修正するのではなく、より上位のネットワーク管理ツールを操作する必要があります。ここでは、最も一般的な2つの方法を紹介します。
1. Netplanを使用する(サーバー向け)
現在のほとんどのUbuntu Serverは、ネットワーク管理にNetplanを使用しています。/etc/netplan/内にある設定ファイルを探してください。通常、00-installer-config.yamlといった名前になっています。
sudo nano /etc/netplan/00-installer-config.yaml
nameserversセクションの内容を修正します。注意: YAMLはインデント(空白)に非常に敏感です。必ず2つまたは4つのスペースを正確に使用してください。
network:
version: 2
ethernets:
eth0:
dhcp4: true
nameservers:
addresses: [8.8.8.8, 1.1.1.1]
以下のコマンドで変更を即座に適用します:
sudo netplan apply
2. nmcliを使用する(デスクトップまたはRHEL/CentOS向け)
NetworkManagerがインストールされているマシンでコマンドラインを使用する場合、nmcliが最も手軽なツールです。
# 接続名を確認(通常は 'Wired connection 1' や 'ens33')
nmcli connection show
# 新しいDNSを設定
nmcli con mod "Wired connection 1" ipv4.dns "8.8.8.8 1.1.1.1"
# 変更を有効化
nmcli con up "Wired connection 1"
本質:systemd-resolvedとresolv.confの関係
プロを目指すなら、コマンドを丸暗記するのではなく、その仕組みを理解する必要があります。
systemd-resolvedの役割とは?
これは内部DNSプロキシとして機能します。アプリケーションが直接インターネットへIPを問い合わせる代わりに、127.0.0.53にあるsystemd-resolvedに問い合わせます。このサービスは結果をキャッシュして次回のアクセスを高速化するほか、VPNの使用時やWi-Fi/有線LANの切り替え時にもスマートに処理を行います。
/etc/resolv.confファイルの真実
ls -l /etc/resolv.confコマンドで確認してみてください。次のようなリンク先が表示されるはずです:../run/systemd/resolve/stub-resolv.conf
これは**シンボリックリンク**です。このファイルへの手動の変更は無意味です。なぜなら、これはシステムによって生成される一時的なファイルだからです。マシンが起動すると、サービスが内容を上書きし、以前に追加したnameserver行はすべて削除されます。
高度なカスタマイズ:グローバルDNSの設定
どのインターフェースが動作しているかに関わらず、システム全体に共通のDNSを適用したい場合は、サービスの構成ファイルを直接編集します。
sudo nano /etc/systemd/resolved.conf
[Resolve]セクションを探し、DNS情報を追加します:
[Resolve]
DNS=8.8.8.8 1.1.1.1
FallbackDNS=8.8.4.4
# DNSOverTLS=yes # セキュリティを強化し、ISPによる監視を回避したい場合に有効化
変更を適用するためにサービスを再起動します:
sudo systemctl restart systemd-resolved
実践的な経験とトラブルシューティング
長年のシステム運用経験から、時間を無駄にしないための重要な注意点をいくつか挙げます:
- 見た目ではなく、コマンドを信じる: 確認のために
resolv.confファイルを開かないでください。代わりにresolvectl statusを使用します。このコマンドは、各インターフェース(eth0, wlan0)で実際にどのDNSサーバーが動作しているかを正確に示します。 - “Temporary failure in name resolution” エラー: 通常、
/etc/resolv.confのリンクが切れているか破損していることが原因です。一度削除してから、以下のコマンドで正しいリンクを再作成してください:sudo ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf - 診断ツール:
digコマンドを使用するために、常にdnsutilsをインストールしておきましょう。dig google.comを実行した際、末尾のSERVER行を確認してください。127.0.0.53と表示されていれば、内部プロキシが正常に動作しています。 - どのDNSを選ぶべきか? 日本国内でもGoogle (8.8.8.8) は非常に安定していますが、Cloudflare (1.1.1.1) の方が解決速度が5〜10msほど速いことが多いです。ベストなのは、両方を組み合わせることです。
LinuxでのDNS管理は、問題の根本を把握していれば難しくありません。resolv.confという「枝葉」をいじるのではなく、systemd-resolvedやネットワーク管理ツールという「根幹」に注目しましょう。もし珍しいエラーに遭遇したり、Docker/VPNとの競合が発生したりした場合は、ぜひコメント欄で教えてください!

