2007年08月27日
■特殊な環境で起きる
同様の現象に遭遇する事は滅多にない。
しかし、今度遭遇した時にすぐ解決出来る様にしたい。
ここに作業記録を残しておく。未来の自分へのラブレター。
▼環境
・Debian GNU/Linux (etch)
・tinydnsで内部コンテンツNS
・プライベートネットワークは内部コンテンツNSを参照
▼背景
【図1: 外部ネットワークからの接続】


【図2: 内部ネットワークからの接続】


ルーターのグローバルIPアドレスが返って来てしまう。
▼背景2
解決策の選択しを幾つか列挙し、
議論の結果、内部コンテンツNSを立ち上げて解決する事となた。
【図3: 内部ネットワーク内で解決した名前解決】


しかし、hostコマンドだけでは足りなかったのだ…
■hostコマンド v.s. telnetコマンド
▼ある日
hostコマンドで確認すると問題ない。
しかし、telnetコマンドを使うと確かにルーターのIPアドレスが返って来る。
何だコレは?!
▼仮説
・hostコマンドとtelnetコマンドでは名前解決ロジックが違う
・telnetを実行したサーバのリゾルバが設定不十分
・nsswitchの設定で、検索優先順位が意図しない物を最優先にしている
▼検証: straceコマンド
コマンドの挙動を確認する時に使うのがstraceコマンド。
straceコマンドを使う事で、システムコールをトレース出来る。
この2つのコマンドを実行し、
どのファイルをopenしているのかを観察してみた。
▼新たな疑惑
そしてnscdのキャッシュ疑惑が生まれた。
どうもnscdがあやしいぞ?
■容疑者nscd
▼/etc/nscd.conf
nscdの設定ファイルは/etc/nscd.conf。
こいつの設定項目を確認していった。
その中で日と際目立つヤツを発見。
▼仮説
enable-cache hostに違いない。
▼検証
yesをnoへ変更
▼結果
成功だ
■まとめ
▼発生する環境
・内部コンテンツNSを立てている
・nscdを使っている
▼解決策
・『enable-cache hosts no』にする
『何故nscd使うの?』と言う突っ込みは今回の議論の対象外。
■関連リンク
・やむにやまれず: Air Stationに変えたらLAN側自社サービスにアクセスできなくなった
・tech memo: cached
同様の現象に遭遇する事は滅多にない。
しかし、今度遭遇した時にすぐ解決出来る様にしたい。
ここに作業記録を残しておく。未来の自分へのラブレター。
▼環境
・Debian GNU/Linux (etch)
・tinydnsで内部コンテンツNS
・プライベートネットワークは内部コンテンツNSを参照
▼背景
・外部からの接続にはプライベートネットワークのサーバへ、
ルーターがルーティングしてくれる。
・内部からFQDNで接続しようとすると、ルーターに割り当てられている
グローバルIPアドレスへ接続し、プライベートネットワークのサーバへ
ルーティングしてくれない
ルーターがルーティングしてくれる。
・内部からFQDNで接続しようとすると、ルーターに割り当てられている
グローバルIPアドレスへ接続し、プライベートネットワークのサーバへ
ルーティングしてくれない
【図1: 外部ネットワークからの接続】

【図2: 内部ネットワークからの接続】

ルーターのグローバルIPアドレスが返って来てしまう。
▼背景2
解決策の選択しを幾つか列挙し、
議論の結果、内部コンテンツNSを立ち上げて解決する事となた。
tinydns, dnscacheを設定
↓
hostコマンドで名前解決出来る事を確認
↓
hostコマンドで名前解決出来る事を確認
【図3: 内部ネットワーク内で解決した名前解決】

しかし、hostコマンドだけでは足りなかったのだ…
■hostコマンド v.s. telnetコマンド
▼ある日
やむ:『telnet web.example.com 80 とすると、ルーターに接続してしまうよ』
hostコマンドで確認すると問題ない。
しかし、telnetコマンドを使うと確かにルーターのIPアドレスが返って来る。
何だコレは?!
▼仮説
・hostコマンドとtelnetコマンドでは名前解決ロジックが違う
・telnetを実行したサーバのリゾルバが設定不十分
・nsswitchの設定で、検索優先順位が意図しない物を最優先にしている
▼検証: straceコマンド
コマンドの挙動を確認する時に使うのがstraceコマンド。
straceコマンドを使う事で、システムコールをトレース出来る。
$ strace host web.examle.com
$ strace telnet web.examle.com 80
$ strace telnet web.examle.com 80
この2つのコマンドを実行し、
どのファイルをopenしているのかを観察してみた。
▼新たな疑惑
そしてnscdのキャッシュ疑惑が生まれた。
どうもnscdがあやしいぞ?
■容疑者nscd
▼/etc/nscd.conf
nscdの設定ファイルは/etc/nscd.conf。
こいつの設定項目を確認していった。
その中で日と際目立つヤツを発見。
enable-cache hosts yes
▼仮説
enable-cache hostに違いない。
enable-cache hosts yes
▼検証
yesをnoへ変更
$ sudo cp -pi /etc/nscd.conf /etc/nscd.conf.0
$ sudo vi /etc/nscd.conf
$ diff /etc/nscd.conf.0 /etc/nscd.conf
enable-cache hosts no
$ sudo /etc/init.d/nscd restart
$ sudo vi /etc/nscd.conf
$ diff /etc/nscd.conf.0 /etc/nscd.conf
enable-cache hosts no
$ sudo /etc/init.d/nscd restart
▼結果
$ telnet web.examle.com 80
Trying 192.168.0.80...
Connected to web.example.com.
Escape character is '^]'.
^]
telnet> close
Connection closed.
Trying 192.168.0.80...
Connected to web.example.com.
Escape character is '^]'.
^]
telnet> close
Connection closed.
成功だ
■まとめ
▼発生する環境
・内部コンテンツNSを立てている
・nscdを使っている
▼解決策
・『enable-cache hosts no』にする
『何故nscd使うの?』と言う突っ込みは今回の議論の対象外。
■関連リンク
・やむにやまれず: Air Stationに変えたらLAN側自社サービスにアクセスできなくなった
・tech memo: cached