2007年08月27日

内部コンテンツNSで名前解決出来ない問題を解決

livedoorClipに登録 | このエントリーをはてなブックマークに追加 | del.icio.usに登録 | MM/Memoに登録

■特殊な環境で起きる

同様の現象に遭遇する事は滅多にない。
しかし、今度遭遇した時にすぐ解決出来る様にしたい。
ここに作業記録を残しておく。未来の自分へのラブレター。



▼環境
・Debian GNU/Linux (etch)
・tinydnsで内部コンテンツNS
・プライベートネットワークは内部コンテンツNSを参照


▼背景
・外部からの接続にはプライベートネットワークのサーバへ、
 ルーターがルーティングしてくれる。
・内部からFQDNで接続しようとすると、ルーターに割り当てられている
 グローバルIPアドレスへ接続し、プライベートネットワークのサーバへ
 ルーティングしてくれない


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




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



ルーターのグローバルIPアドレスが返って来てしまう。



▼背景2
解決策の選択しを幾つか列挙し、
議論の結果、内部コンテンツNSを立ち上げて解決する事となた。

tinydns, dnscacheを設定

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


この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


▼結果
$ telnet web.examle.com 80
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


半袖 at 01:30 │Comments(0)TrackBack(0)サーバ管理 

トラックバックURL

この記事にコメントする

名前:
URL:
  情報を記憶: 評価: 顔