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

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOME > Linux技術 リナックスマスター.JP(Linuxマスター.JP) > Linuxtips, ネットワーク > LinuxのDNS設定方法|resolv.confが元に戻る原因とnmcliの手順
「/etc/resolv.conf を編集してDNSを設定したのに、サーバーを再起動したら元に戻ってしまった...」
現代のLinuxを触り始めたエンジニアが、かなりの確率でハマるネットワーク設定の罠です。

この記事では、LinuxにおけるDNSサーバー(参照先)の設定・変更方法を解説します。古い記事にある「設定ファイルを直接書き換える方法」が現代では非推奨となっている理由と、最新の環境(AlmaLinux 9やRHEL 9など)で再起動しても消えない正しいDNS設定の手順を現場目線でまとめました。

「設定したはずなのに反映されない...」というトラブルの原因と対処法もあわせて解説していますので、ぜひ最後まで読んでみてください。

この記事のポイント

・resolv.confが再起動で元に戻る理由(NetworkManager・systemd-resolved)
・「nmcli」コマンドでDNSを恒久設定する4ステップ
・dig・nslookup・resolvectl queryで動作確認する方法
・DHCP環境でDNSを固定する(ipv4.ignore-auto-dns)


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

なぜ /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に対して設定を行う必要があるということです。

【Ubuntu / RHEL 8以降の環境では「systemd-resolved」にも注意】

Ubuntu 18.04以降やRHEL 8以降の一部環境では、systemd-resolvedというDNSスタブリゾルバーデーモンも動作しています。この環境では /etc/resolv.conf がシンボリックリンクになっており、中身を見ると nameserver 127.0.0.53 と表示されます。

# /etc/resolv.confがシンボリックリンクかどうか確認する $ ls -la /etc/resolv.conf lrwxrwxrwx 1 root root 39 /etc/resolv.conf -> /run/systemd/resolve/stub-resolv.conf # 中身に 127.0.0.53 が表示される場合はsystemd-resolvedが管理している $ cat /etc/resolv.conf # This is /run/systemd/resolve/stub-resolv.conf managed by systemd-resolved. nameserver 127.0.0.53

127.0.0.53 はsystemd-resolvedがローカルで待ち受けるスタブリゾルバーのアドレスです。この場合も /etc/resolv.conf を直接書き換えてはいけません。本記事で解説するnmcliの手順はNetworkManagerとsystemd-resolvedが連携している環境でも有効です。

現代の標準「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

※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アドレスになっていれば正常に動作しています。

resolvectl query で名前解決をテストする(systemd-resolved 環境)

systemd-resolvedが動作している環境(Ubuntu 18.04以降・RHEL 8以降など)では、resolvectl query コマンドを使ってsystemd-resolvedを経由した名前解決の動作をテストできます。

# ホスト名を解決してIPアドレスを確認する $ resolvectl query www.google.com www.google.com: 172.217.26.4 -- link: ens3 # resolvectl statusで現在のDNS設定を一覧確認する $ resolvectl status Global DNS Servers: 8.8.8.8 8.8.4.4 Link 2 (ens3) DNS Servers: 192.168.1.1 DNS Domain: example.internal

dig がDNSサーバーへ直接問い合わせるのに対し、resolvectl query はsystemd-resolvedのキャッシュと設定を経由します。設定変更直後に古い結果が返ってくる場合はDNSキャッシュが残っている可能性があります(後述のキャッシュクリアを参照)。

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が反映されない...」という場合は、以下のポイントを順番にチェックしてください。

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 を忘れるのは非常によくあるミスなので、必ずセットで実行する習慣をつけましょう。

4. DNSキャッシュをクリアする

nmcliでの設定変更は正しく反映されているのに、名前解決の結果が変わらない場合は、OSがDNSの結果をキャッシュしている可能性があります。

systemd-resolvedが動作している環境では、resolvectl flush-caches コマンドでキャッシュをクリアできます。

# DNSキャッシュをクリアする(systemd-resolved環境) $ sudo resolvectl flush-caches # クリア後に resolvectl query で再確認する $ resolvectl query example.com example.com: 93.184.216.34 -- link: ens3

NetworkManagerのみの環境(systemd-resolvedなし)では、systemctl restart NetworkManager でキャッシュが消えることが多いです。

5. systemd-resolved のログを確認する

systemd-resolvedが動作している環境で名前解決に繰り返し失敗する場合は、journalctl でログを確認して原因を絞り込みましょう。

# systemd-resolvedのログをリアルタイムで確認する $ journalctl -u systemd-resolved -f # 直近30分のログを確認する $ journalctl -u systemd-resolved --since "30 min ago" # エラーレベルのログだけ抽出する $ journalctl -u systemd-resolved -p err

SERVFAIL が繰り返し記録されている場合はDNSサーバーへの到達失敗や設定ミスが疑われます。NXDOMAIN は指定したホスト名が実際に存在しない場合に返されます。

本記事のまとめ

やりたいこと 手順・コマンド
コネクション名を確認する 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 ドメイン名
systemd-resolved経由で名前解決をテストする resolvectl query ドメイン名
DNSキャッシュをクリアする sudo resolvectl flush-caches
DNS設定状態を一覧確認する resolvectl status

本記事のDNS設定をVPS上で実際に試してみたい方は、Linux学習用VPS比較2026でConoHa・Xserver VPS・シンVPS・さくら・KAGOYA・WebARENA 6社を比較しています。VPSではDNSサーバー設定から逆引き(rDNS)の設定まで、本番に近い環境で手を動かせます。

LinuxのDNS設定で詰まっていませんか?

resolv.confが戻る問題はnmcliで解決できます。ネットワーク設定の全体像を体系的に押さえておくと、こうしたトラブルを素早く解決できます。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。

※ 「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。

<PR> おすすめ書籍

まずは上記の無料メルマガで体系的に学ぶのが第一歩ですが、手元に置いてじっくり学びたい方には、次の書籍もおすすめです。

・Amazon Web Services基礎からのネットワーク&サーバー構築 改訂4版(大澤 文孝 他 / 日経BP / 2023年)

・DNSがよくわかる教科書(株式会社日本レジストリサービス(JPRS) 渡邉 結衣 他 / SBクリエイティブ / 2018年)

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

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

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

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。