getent / nsswitch.conf 実務デバッグ完全ガイド

  • URLをコピーしました!

Linuxの名前解決トラブル対応で、
「pingは通るのにアプリは失敗する」「サーバごとに挙動が違う」 といった現象に遭遇したことはないでしょうか。

この原因の多くは、glibcの名前解決順序と、 それを制御する nsswitch.conf を正しく理解していないことにあります。

本記事では、getentを使った実務的なデバッグ手順を軸に、 nsswitch.confの読み解き方と障害切り分け方法を完全整理します。

目次

なぜgetentが重要なのか

多くの人は名前解決確認に以下を使いがちです。

  • ping
  • nslookup
  • dig

しかし、これらはglibcの最終結果を必ずしも反映しません

一方、getentglibcが実際に返す結果 を表示します。

つまり、

「アプリが見る世界」をそのまま確認できる

のが getent です。

getent の基本構文

# hosts データベースを参照
getent hosts example.com
# IPv4 / IPv6 を含めた詳細確認
getent ahosts example.com
# ユーザー解決(名前解決以外にも使える)
getent passwd username

getent hosts と ahosts の違い

getent hosts

getent hosts example.com
  • 最終的に選ばれたIPのみ表示
  • 接続順は分からない

getent ahosts

getent ahosts example.com
  • IPv6 / IPv4 の両方を表示
  • glibcが試行する順番が分かる

通信トラブル時は ahosts が必須です。

/etc/nsswitch.conf の役割

nsswitch.conf は、glibcが「どの順番で名前解決を行うか」を定義します。

hosts: files dns

この設定は以下を意味します。

  1. /etc/hosts を確認
  2. 見つからなければ DNS

ここで重要なのは、上で見つかったら下は見ないという点です。

よくある nsswitch.conf 設定パターン

標準的な構成

hosts: files dns

systemd-resolved 利用時

hosts: files resolve dns

LDAP / AD 連携環境

hosts: files dns ldap

順序が違うだけで、解決結果・速度・失敗条件が大きく変わります

files(/etc/hosts)による事故パターン

nsswitch.conf に files がある限り、/etc/hosts は最優先です。

典型例

192.168.0.10 example.com
  • DNS変更しても反映されない
  • LB配下でも単一IPに固定される

getent で確認すると一発で分かります。

getent hosts example.com

DNSが正しいのに通信できないケースの見抜き方

  1. dig / nslookup でDNS確認
  2. getent ahosts でglibc結果確認
  3. 両者のIP差分を見る

digは正しいが getent が違う場合、 原因は nsswitch.conf / hosts / キャッシュ です。

IPv6絡みのトラブル切り分け

getent ahosts example.com

出力例:

2001:db8::1   STREAM example.com
2001:db8::1   DGRAM
192.0.2.10    STREAM
192.0.2.10    DGRAM
  • IPv6が先頭 → IPv6優先
  • IPv6通信不可 → タイムアウト

この場合、IPv6無効化やアプリ設定見直しが必要になります。

キャッシュが原因の切り分け

nscd

systemctl status nscd
systemctl restart nscd

systemd-resolved

resolvectl status
resolvectl flush-caches

設定変更後は必ずキャッシュ影響を疑うのが実務の鉄則です。

実務でのデバッグ黄金ルート

  1. getent hosts / ahosts
  2. /etc/nsswitch.conf 確認
  3. /etc/hosts 確認
  4. /etc/resolv.conf(search含む)
  5. IPv6影響確認
  6. キャッシュ有無確認

この順序で確認すれば、迷子になりません

まとめ

  • getentはglibcの最終回答
  • nsswitch.confが全ての起点
  • digだけでは不十分

名前解決トラブルは「DNSの問題」ではなく、
glibcの挙動を理解しているかどうかで差が出ます。

目次