LinuxでDNS名前解決できない原因と確認手順|getent・resolv.conf・dig
Linuxでホスト名をIPアドレスへ名前解決できないとき、いきなり/etc/resolv.confを書き換えず、NSS・ローカル設定・resolver・DNSサーバー・通信経路を順番に確認して原因を切り分けるページです。
このページの目的
getentとdigの結果を比較し、「Linuxの名前解決経路で失敗」「DNS問い合わせ自体が失敗」「特定の名前・DNSサーバーだけ失敗」を分けます。設定変更より先に、どこで止まっているかを確認します。
最初にやること
障害が出ているホスト名でgetent hostsを実行し、次にdigを確認します。両方の結果が違う場合は、nsswitch.confや/etc/hostsを含むLinux側の名前解決経路を優先して確認します。
DNSトラブル早見表
最初の確認結果から、次に見る場所を決めます。1つのコマンド結果だけで原因を断定しないのがポイントです。
| 症状・確認結果 | 優先して確認する範囲 | 次の確認 |
|---|---|---|
getentもdigも失敗 | resolver設定、DNSサーバー、経路・通信 | resolv.conf → resolvectl → DNS指定dig |
dig成功、getent失敗 | NSS、/etc/hosts、名前解決順序 | nsswitch.conf → /etc/hosts |
| IPアドレスなら通信できるが名前だけ失敗 | 名前解決系 | getent hosts → dig |
| 特定ホスト名だけ失敗 | 対象レコード、検索ドメイン、hosts | FQDNで確認 → DNS応答コード確認 |
NXDOMAIN | 問い合わせた名前・DNSゾーン | FQDN・レコード有無を確認 |
SERVFAILやtimeout | DNSサーバー処理、上流、経路 | 別DNS指定・経路・パケット確認 |
目的からDNSの確認先を選ぶ
getent・dig・resolvectlの使い分け
OS側の名前解決とDNS直接問い合わせを比較し、次に見る場所を判断します。
コマンドを確認 →dig結果NOERROR・NXDOMAIN・SERVFAILの見方
DNS応答コードとtimeoutを分け、別resolverやDNSSECなど次の確認へ進みます。
statusを確認 →Linux DNS設定systemd-resolvedとresolv.conf
127.0.0.53、resolvectl、リンク別DNS、設定管理元を確認します。
resolver設定を確認 →まず名前解決障害かを確認する
アプリケーションのエラーだけでDNS障害と決めつけず、障害が出ている名前をLinux自身が解決できるか確認します。対象ホスト名は実際に失敗している名前へ置き換えてください。
getentはName Service Switch(NSS)の設定に従ってhostsデータベースを参照します。一方、digはDNS問い合わせの確認に向いています。2つを比較すると、DNSそのものとLinux側の名前解決経路を分けやすくなります。
ping失敗だけでネットワークやDNSの異常を確定しません。getentでLinuxの名前解決を確認する
getentで結果が返るかを確認し、Linuxの通常の名前解決経路で対象名を取得できるかを判断します。返らない場合は、nsswitch.conf・/etc/hosts・resolver設定へ進みます。
getent ahosts、dig、resolvectl、旧環境のnslookup/hostまで比較したい場合は DNS確認コマンドの使い分け を確認してください。このページでは障害時の判断順に絞ります。nsswitch.confと/etc/hostsを確認する
hosts:行は環境によってfiles、dns、resolve、myhostname、mymachinesなどのNSSモジュールを含みます。利用できるモジュールは環境によって異なり、順序や条件によってDNSより先に/etc/hostsやローカル名が参照されることがあります。
dig成功・getent失敗なら:DNSサーバー自体を直す前に、hosts:行と/etc/hosts、NSSモジュールの状態を確認します。/etc/resolv.confを確認する
主に確認するのはnameserver、search、optionsです。glibc resolverではnameserverに問い合わせ先を、searchに検索ドメインを設定できます。
/etc/resolv.confはNetworkManager、systemd-resolved、DHCPクライアントなどにより生成・管理される場合があります。まずls -lでsymlinkか確認し、管理元を特定してから変更してください。短いホスト名だけ失敗する場合はsearchやoptions ndots:の影響も確認します。まずFQDNでも同じ症状になるか比較すると切り分けやすくなります。
systemd-resolved環境を確認する
systemd-resolvedが有効なら、resolvectl statusで実際に選ばれているDNSサーバーとリンク別設定を確認します。127.0.0.53が見えるだけで誤設定とは判断しません。
/etc/resolv.confのsymlink、stub resolver、リンク別DNS、旧環境のsystemd-resolveは systemd-resolvedとresolv.conf で整理しています。digでDNS問い合わせを確認する
digでDNS問い合わせ自体が成立するかを確認します。デフォルト問い合わせだけ失敗し、DNSサーバーを明示すると成功する場合は、通常利用しているresolverやDNSサーバー選択経路を優先して確認します。
dig成功・getent失敗:NSS・/etc/hosts・resolver統合部分へ戻る。- 特定DNS指定だけ成功:通常利用しているDNSサーバーと選択経路を確認する。
- timeout:DNSサーバーへの到達性、Firewall、上流を確認する。
- NXDOMAIN / SERVFAIL / REFUSED:応答コード別の判断へ進む。
DNSサーバーへの経路・通信を確認する
DNSサーバーが分かったら、そのアドレスへのルートと、必要に応じてDNSパケットの送受信を確認します。
通常のDNS問い合わせではUDPが使われることが多く、応答サイズや条件によってTCPも使われます。そのためncでTCP/53へ接続できることだけを根拠に「DNSは正常」とは判断しません。digの応答とパケット確認を合わせます。
よくあるエラー文字列・DNS応答
| 表示 | 最初に考えること |
|---|---|
Temporary failure in name resolution | 一時的なresolver/DNS失敗として、getent、resolver設定、DNS応答を確認 |
Could not resolve host | アプリが指定名を解決できていないため、対象名とOS側名前解決を確認 |
Name or service not known | 名前の誤り、NSS、DNS結果などを確認。文字列だけで原因を確定しない |
NXDOMAIN | DNSサーバーから「その名前は存在しない」という応答。名前・ゾーン・レコードを確認 |
SERVFAIL | DNSサーバーが処理を完了できていない。上流・DNSSEC・サーバー状態などサーバー側調査も必要 |
| timeout / no servers could be reached | DNSサーバー、経路、Firewall、resolverの問い合わせ先を確認 |
確認結果から次の対応を決める
| 確認結果 | 対処 |
|---|---|
getentもdigも失敗 | 現在使うべきDNSサーバーを管理元(NetworkManager、systemd-resolved、DHCP/VPN、静的設定)から特定し、誤ったDNS指定や経路をその管理元で修正します。 |
dig成功・getent失敗 | nsswitch.confのhosts:順序、/etc/hosts、NSSモジュールを確認し、意図しない優先順位や誤登録を修正します。 |
resolv.confがstub resolverを指す | stub自体を消さず、resolvectl statusで実DNSサーバーとリンクを特定し、上流のNetworkManager・networkd・DHCP/VPN設定を修正します。 |
| 特定DNS指定だけ成功 | 通常選択されるDNSサーバーまたは経路に問題があります。正しいDNSサーバーを選ぶ設定へ直し、不要な一時dig @server依存を残しません。 |
| 問い合わせは出るが応答がない | DNSサーバー側、経路、Firewall/ACL、VPN経路を確認し、53/UDPだけでなく必要に応じ53/TCPも阻害していないか修正します。 |
| 名前解決は成功するがSSHだけ失敗 | DNSは解決済みです。DNS設定を変更せず、SSH接続トラブルガイドへ調査範囲を移します。 |
修正後の再確認
設定を直したら、同じホスト名でOSの名前解決経路とDNS問い合わせを両方確認します。
systemd-resolved環境では必要に応じてresolvectl query example.comも確認します。期待するIPが返るだけでなく、利用しているDNSサーバーやリンクが想定どおりかも確認してください。
/etc/resolv.confを書き換えて成功しただけでは完了にしません。再接続・DHCP更新・VPN再接続後も設定が維持される管理元を修正できているか確認します。設定変更前のチェック
- 障害が出ている実際のホスト名で
getentとdigを比較したか /etc/resolv.confの管理元(systemd-resolved、NetworkManager、DHCPなど)を確認したか- 複数NIC・VPN・コンテナなど、名前解決経路がホストOSと異ならないか
- DNSサーバーを変更する前に、現在選ばれているサーバーと失敗結果を記録したか
- 変更後は
getentと実際のアプリケーションの両方で再確認するか