RHEL6.4 / CentOS 6.4 のホストを立ててそこへ SSH 接続したら接続開始に妙に時間がかかる。だいたい20~30秒ほど待たされる。待たないと繋がらない。こういう微妙な時間待たされるのはだいたい名前解決での問題である。
ネットで調べるとよく有る方法は2つ。ipv6を無効化する、名前解決を無効化する、の二つの方法だ。
■ipv6 の機能を無効化
/etc/modprobe.d/ipv6.conf
ファイルを作成し、以下の一行を記述しておけば次回起動時から ipv6 関連の動作が無効化される。
options ipv6 disable=1
■SSHの名前解決を無効化
/etc/ssh/sshd_config
で無効化指定しておけば、名前解決をしなくなるので待たされない。
UseDNS no
■なぜ名前解決で引っかかる
しかし、nslookup しても問題なく名前が引けるし ipv6 での接続もできるのにやはり SSH 接続開始が遅い場合がある。なぜだ。
これは DNS サーバが Firewall 機器の向こう側にあり、Firewall 機器が DNS 応答を正常に返さない場合に起こるらしい。
RHN に出ている情報はコレ → Slow DNS on RHEL6 with IPV6 going through a firewall - Red Hat Customer Portal
このページはカスタマー登録してないと見れない。内容を解説してくれてるサイトがあるのでそっちを合わせて紹介 → RHEL 6/ CentOS 6: Slow SSH logins with DNS timeouts ~ Mattias Geniar
リゾルバは、IPv4 と IPv6 の両方 ( A と AAAA ) を同一のソケットで要求する。ところが一部 Firewall 機器では返答を一つしか返さないものがある。
2つの名前解決を要求したのに1つしか返ってこないのでもう1つの回答をタイムアウトまで待ってしまうという流れ。
この場合、リゾルバが 1つのソケットで複数の要求をしない(1ソケット1要求する)ように構成すれば良い。
/etc/resolv.conf
に以下の行を追記。
options single-request-reopen
これで何ら機能を損なうことなく(無効にせず)問題を回避できる。ホントならイケてない Firewall をどうにかしてほしいところ。