現代のLinuxを触り始めたエンジニアが、かなりの確率でハマるネットワーク設定の罠です。
この記事では、LinuxにおけるDNSサーバー(参照先)の設定・変更方法を解説します。古い記事にある「設定ファイルを直接書き換える方法」が現代では非推奨となっている理由と、最新の環境(AlmaLinux 9やRHEL 9など)で再起動しても消えない正しいDNS設定の手順を現場目線でまとめました。
「設定したはずなのに反映されない...」というトラブルの原因と対処法もあわせて解説していますので、ぜひ最後まで読んでみてください。
なぜ /etc/resolv.conf を直接編集してはいけないのか?
かつてのLinux(CentOS 6など)では、/etc/resolv.conf というファイルに nameserver 8.8.8.8 のように記述するのが当たり前でした。しかし、現代のLinux環境では「NetworkManager」というシステムがネットワーク設定を一元管理しています。
NetworkManager(ネットワークマネージャー)とは、RHEL 7以降のRed Hat系ディストリビューションで標準搭載されているネットワーク管理デーモン(サービス)です。IPアドレス、ルーティング、DNSなどのネットワーク設定を自動で制御しています。
そのため、人間が手動で
/etc/resolv.conf を書き換えても、ネットワークの再起動やOSの再起動のタイミングでNetworkManagerによって上書き(初期化)されてしまいます。実際に
/etc/resolv.conf の中身を見てみると、一番上に「Generated by NetworkManager(ネットワークマネージャーによって自動生成されました)」という警告文が書かれているはずです。# cat /etc/resolv.conf # Generated by NetworkManager search example.com nameserver 192.168.1.1
現代の標準「nmcli」コマンドでDNSを恒久設定する
RHEL 7~9、AlmaLinux、Rocky LinuxなどのRed Hat系OSでは、NetworkManagerを操作するためのnmcli(NetworkManager Command Line Interface)コマンドを使って設定するのが現在の標準(正しい手順)です。以下の4ステップで完了します。
1. 現在のコネクション(接続名)を確認する
まずは、設定を変更したいネットワークインターフェースの「コネクション名」を確認します。# nmcli connection show NAME UUID TYPE DEVICE eth0 1234abcd-56ef-78gh-90ij-klmnopqrstuv ethernet eth0
NAME 列(この例では eth0)がコネクション名です。環境によっては ens33 や enp0s3 のような名前になっていることもあります。2. nmcliコマンドでDNSサーバーを設定する
確認したコネクション名に対して、利用したいDNSサーバーのIPアドレス(例としてGoogleのパブリックDNSである8.8.8.8 と 8.8.4.4)を設定します。# 1つ目のDNSサーバー(プライマリ)を設定する # nmcli connection modify eth0 ipv4.dns 8.8.8.8 # 2つ目のDNSサーバー(セカンダリ)を追加する(※ + をつけるのがポイント) # nmcli connection modify eth0 +ipv4.dns 8.8.4.4
+ を付け忘れると1つ目の設定が上書きされてしまうため注意してください。3. 設定を反映させる
設定を変更した後は、コネクションを有効化し直して設定をシステムに反映させます。# nmcli connection up eth0 Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/2)
nmcli connection modify はNetworkManagerの設定ファイルに値を書き込むコマンドなので、OSを再起動しても設定が元に戻ることはありません。4. resolv.conf を確認して設定の反映を検証する
最後に、NetworkManagerが正しく/etc/resolv.conf を自動生成してくれたか確認しましょう。# cat /etc/resolv.conf # Generated by NetworkManager nameserver 8.8.8.8 nameserver 8.8.4.4
設定後のDNS動作確認コマンド(dig・nslookup・nmcli)
/etc/resolv.conf を目視で確認するだけでなく、実際に名前解決が正しく行われるかを動作確認するのが現場の鉄則です。nmcli device show でDNS設定値を確認する
nmcli device show コマンドで、NetworkManagerが認識しているDNS設定を直接確認できます。# nmcli device show eth0 | grep DNS IP4.DNS[1]: 8.8.8.8 IP4.DNS[2]: 8.8.4.4
dig コマンドで名前解決を検証する
dig(Domain Information Groper)は、DNSの名前解決を検証するための定番コマンドです。# dig example.com ;; ANSWER SECTION: example.com. 3600 IN A 93.184.216.34 ;; SERVER: 8.8.8.8#53(8.8.8.8)
;; SERVER: の行に、設定したDNSサーバーのIPアドレスが表示されていれば正常です。※
dig コマンドが使えない場合は nslookup でも同様の確認ができます。# nslookup example.com Server: 8.8.8.8 Address: 8.8.8.8#53 Non-authoritative answer: Name: example.com Address: 93.184.216.34
Server: の行が、設定したDNSサーバーのIPアドレスになっていれば正常に動作しています。DHCP環境でDNSを固定する方法(ipv4.ignore-auto-dns)
実務では「IPアドレスはDHCPで自動取得しているけど、DNSだけは指定したサーバーを使いたい」というケースがよくあります。通常、DHCP(Dynamic Host Configuration Protocol:IPアドレスを自動的に割り当てる仕組み)を使用していると、DHCPサーバーから配布されるDNS情報が
nmcli で設定した値を上書きしてしまうことがあります。これを防ぐには、
ipv4.ignore-auto-dns を yes に設定します。# DHCPから配布されるDNS情報を無視する設定 # nmcli connection modify eth0 ipv4.ignore-auto-dns yes # DNSを手動で指定する # nmcli connection modify eth0 ipv4.dns "8.8.8.8 8.8.4.4" # 設定を反映する # nmcli connection up eth0
ipv4.ignore-auto-dns yes を設定すると、DHCPサーバーから通知されるDNS情報は完全に無視されます。手動で設定したDNSサーバーのみが使用されるため、手動設定側のDNSサーバーが止まった場合に名前解決ができなくなるリスクがある点には注意してください。resolv.conf の「search」ディレクティブとは?
/etc/resolv.conf を見ると、nameserver の他に search という行が書かれていることがあります。# cat /etc/resolv.conf search example.com sub.example.com nameserver 8.8.8.8
search ディレクティブは、ホスト名だけを指定した場合に自動補完されるドメイン名を定義するものです。たとえば上記の設定で
ping server01 を実行すると、Linuxは自動的に server01.example.com → server01.sub.example.com の順に名前解決を試みます。社内のサーバーに短縮名でアクセスしたい場合に便利な設定です。nmcli で search ドメインを設定するには、以下のコマンドを使います。# nmcli connection modify eth0 ipv4.dns-search "example.com sub.example.com" # nmcli connection up eth0
【補足】一時的にDNSを変更したい場合
「トラブルシューティングのために、今この瞬間だけDNSの参照先を変えたい」という場合は、昔ながらの/etc/resolv.conf を直接編集する方法が手っ取り早いです。# vi /etc/resolv.conf
nameserver IPアドレス を追記・修正して保存します。この方法は再起動やネットワークの再接続を行うと元に戻るため、あくまで一時的なテスト用として活用してください。DNS設定が反映されない場合のトラブルシューティング
「手順通りに設定したはずなのに、DNSが反映されない...」という場合は、以下の3つのポイントを順番にチェックしてください。1. NetworkManagerが稼働しているか確認する
そもそもNetworkManagerが停止していると、nmcli で設定しても反映されません。# systemctl status NetworkManager * NetworkManager.service - Network Manager Active: active (running)
Active: active (running) と表示されていれば正常です。もし停止していた場合は systemctl start NetworkManager で起動してください。2. コネクション名を正しく指定しているか確認する
nmcli connection modify で指定するコネクション名が間違っていると、エラーになるか、名前が似ている別のコネクションに意図せず設定されてしまう可能性があります。# nmcli connection show NAME UUID TYPE DEVICE System eth0 1234abcd-56ef-78gh-90ij-klmnopqrstuv ethernet eth0
System eth0)は、ダブルクォーテーションで囲んで指定してください。# nmcli connection modify "System eth0" ipv4.dns 8.8.8.8
3. connection up で反映を忘れていないか確認する
nmcli connection modify は設定ファイルに値を書き込むだけのコマンドです。実際のネットワークに反映するには nmcli connection up コネクション名 の実行が必須です。設定変更後に
connection up を忘れるのは非常によくあるミスなので、必ずセットで実行する習慣をつけましょう。本記事のまとめ
| やりたいこと | 手順・コマンド |
|---|---|
| コネクション名を確認する | nmcli connection show |
| DNSサーバーを恒久設定する | nmcli connection modify コネクション名 ipv4.dns IPアドレス |
| セカンダリDNSを追加する | nmcli connection modify コネクション名 +ipv4.dns IPアドレス |
| DHCPのDNS自動取得を無効にする | nmcli connection modify コネクション名 ipv4.ignore-auto-dns yes |
| searchドメインを設定する | nmcli connection modify コネクション名 ipv4.dns-search "ドメイン名" |
| 設定をネットワークに反映する | nmcli connection up コネクション名 |
| NetworkManagerが認識しているDNSを確認する | nmcli device show デバイス名 | grep DNS |
| 現在の resolv.conf を確認する | cat /etc/resolv.conf |
| 名前解決の動作を検証する | dig ドメイン名 または nslookup ドメイン名 |
ネットワーク設定が反映されず、無駄な時間を過ごしていませんか?
Linuxのネットワーク管理はOSのバージョン進化と共に大きく変わっています。古いネットの情報をツギハギでコピペしていると、「設定が反映されない」「再起動でシステムが繋がらなくなった」という大事故を招きます。
バージョンに振り回されず、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
登録10秒/自動返信でDL/合わなければ解除3秒
<<関連記事>>
・MIMEでエンコードされたテキストを読めるように変換する
・viエディタで文字をコピーする
・ハードディスクの使用状況を調べるには
・tar.bz2ファイルの解凍・圧縮コマンド|tar.gzとの違いやオプション一覧
・tar.gz形式のファイルを解凍、展開するには
