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.
以上です。
参考文献
- /etc/nsswitch.confのhosts行を理解する - えんでぃの技術ブログ
- SadServers - Troubleshooting Linux Servers / "Jakarta": it's always DNS.