LinuxでのDNS設定:再起動後に設定が消える問題を完全に解決する

Network tutorial - IT technology blog
Network tutorial - IT technology blog

定番の悩み: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-resolvedNetworkManagerによって自動管理されています。手動で修正し続けても、「修正しては消える」というストレスの溜まるループから抜け出すことはできません。

正しい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との競合が発生したりした場合は、ぜひコメント欄で教えてください!

Share: