晴耕雨読

working in the fields on fine days and reading books on rainy days

pingは失敗するがdigの名前解決はできる場合の対処法 (nsswitch.conf)

Name Service Switch (/etc/nsswitch.conf) による名前解決をしていてNSSの設定に問題がある場合は、pingでの名前解決が失敗します。

前提条件

ping google.com を実行すると「Name or service not known」と表示されます。

$ ping google.com
ping: google.com: Name or service not known

一方で、dig google.com による名前解決は成功します。

$ dig google.com

;; ANSWER SECTION:
google.com.             120     IN      A       142.250.190.110

解決方法

Name Service Switch (NSS) の設定を確認します。

$ sudo vi /etc/nsswitch.conf

hosts: の行を確認します。「dns」が含まれていない場合は追加します。 追加後のサービス再起動は不要です。

# /etc/nsswitch.conf
#
# Example configuration of GNU Name Service Switch functionality.
# If you have the `glibc-doc-reference' and `info' packages installed, try:
# `info libc "Name Service Switch"' for information about this file.

passwd:         files systemd
group:          files systemd
shadow:         files
gshadow:        files

hosts:          files dns
networks:       files

protocols:      db files
services:       db files
ethers:         db files
rpc:            db files

netgroup:       nis

hosts: の行に追加できる値は以下の通りです。左から順に名前解決で使用する優先順位が高いです。

  • files : /etc/hostsの設定ファイルによる名前解決を行います。
  • dns : /etc/resolve.confの記載内容に基づいてDNSによって名前解決を行います。
  • resolve : systemd-resolvedというDNSクライアントによって名前解決を行います。

なお、digはNSSを利用しないで名前解決をするコマンドのため、NSSの設定に関係なく名前解決を行えます。 もし、digでの名前解決は成功して、pingやcurlでの名前解決が失敗する場合は、NSSを確認してください。

NSSの設定修正後は、pingが飛ぶようになります。

$ ping google.com
PING google.com (142.250.190.110) 56(84) bytes of data.

以上です。

参考文献