LinuxのDNS設定方法|resolv.confが元に戻る原因とnmcliの手順


図解60p「Linuxサーバー構築入門マニュアル」無料
登録10秒/自動返信でDL/合わなければ解除3秒
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Linuxtips, ネットワーク > LinuxのDNS設定方法|resolv.confが元に戻る原因とnmcliの手順
「/etc/resolv.conf を編集してDNSを設定したのに、サーバーを再起動したら元に戻ってしまった...」
現代の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

この警告文こそが「このファイルを直接編集しても無駄ですよ」という、NetworkManagerからのメッセージです。つまり、現代のLinuxでDNSを恒久設定するにはNetworkManagerに対して設定を行う必要があるということです。

現代の標準「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)がコネクション名です。環境によっては ens33enp0s3 のような名前になっていることもあります。

2. nmcliコマンドでDNSサーバーを設定する

確認したコネクション名に対して、利用したいDNSサーバーのIPアドレス(例としてGoogleのパブリックDNSである 8.8.8.88.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

※2つ目を追加する際、+ を付け忘れると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

設定したIPアドレスが反映されていれば、DNS設定は完了です。

設定後の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

ここに設定したIPアドレスが表示されていれば、NetworkManagerへの設定は正しく行われています。

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-dnsyes に設定します。

# 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.comserver01.sub.example.com の順に名前解決を試みます。社内のサーバーに短縮名でアクセスしたい場合に便利な設定です。

nmclisearch ドメインを設定するには、以下のコマンドを使います。

# 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日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。



無料プレゼント
図解60p「Linuxサーバー構築入門マニュアル」
独学で詰まる前に、“型(手順書)”で最初の環境構築をサクッと終わらせましょう。
登録10秒/自動返信でDL/合わなければ解除3秒
無料で受け取る ※メールアドレスだけでもOK(必須項目は最小限)

宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として15年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

<<関連記事>>
・MIMEでエンコードされたテキストを読めるように変換する
・viエディタで文字をコピーする
・ハードディスクの使用状況を調べるには
・tar.bz2ファイルの解凍・圧縮コマンド|tar.gzとの違いやオプション一覧
・tar.gz形式のファイルを解凍、展開するには

図解60pのLinux無料マニュアル
登録10秒/自動返信でDL
無料で受け取る