リゾルバ関連メモ
主にリゾルバ(DNS名前解決)に関係する設定について纏めています。
バージョン情報
ここでは、以下のバージョンについて記載しています。
$ cat /etc/redhat-release CentOS release 6.4 (Final)
/etc/resolv.conf の single-request-reopen オプション
IPv6を有効化している場合、libcの実装によるリゾルバを使用してホスト名の名前解決を行うと、AレコードとAAAAレコードの両方を取得しようとします。
その際、ソケットを使い回す(source portが同一になる)ことにより、ネットワーク構成によっては問題が発生する場合があります。
- 参考URL
http://www.kunitake.org/chalow/2012-11-02-1.html
/etc/resolv.conf に、single-request-reopen オプションを記述する事で、ソケットの使い回しを抑制する事が出来ます。
options single-request-reopen
サーバ内のmanを見ても、当オプションの記載が無いかもしれませんが、ちゃんと機能します。
http://linuxjm.sourceforge.jp/html/LDP_man-pages/man5/resolver.5.html
getentコマンドをトレースして、動作を見てみます。
- single-request-reopen無しの場合
$ strace getent ahosts www.iij.ad.jp 2>&1 | grep ^socket | wc -l 6
- single-request-reopen有りの場合
$ strace getent ahosts www.iij.ad.jp 2>&1 | grep ^socket | wc -l 7
single-request-reopen有りの場合に、ソケットを多く使用している事が分かります。
(詳細はstraceの出力を確認してください。ここでは割愛します。)
但し、デフォルトではAレコードとAAAAレコードを並列に処理しているものが、順番に処理されるようになるため、僅かながら処理遅延が発生します。
リゾルバ側のログを見てみます。
single-request-reopen無しの場合
08-Sep-2013 12:34:56.420 client 10.0.0.1#52955: query: www.iij.ad.jp IN A + (10.0.0.254) 08-Sep-2013 12:34:56.420 client 10.0.0.1#52955: query: www.iij.ad.jp IN AAAA + (10.0.0.254)
同一ポートが使用されています。
- single-request-reopen有りの場合
08-Sep-2013 12:34:56.453 client 10.0.0.1#47638: query: www.iij.ad.jp IN A + (10.0.0.254) 08-Sep-2013 12:34:56.456 client 10.0.0.1#38786: query: www.iij.ad.jp IN AAAA + (10.0.0.254)
クエリ毎にポートが変更されています。
ネットワーク構成上、問題が無いと分かっている場合は、このオプションを追加する必要はありません。
構成上問題があり、遅延が問題にならないことを確認した上で設定しましょう。
構成上も遅延も問題になるようなら、ローカルにリゾルバを立てる、等の対応が必要になります。
/etc/resolv.conf の domain/search オプション
時折、管理を引き継いだサーバに、両方のオプションが併記されている場合があります。
これらのオプションは、片方(最後の記述)しか有効ではありません。
ドメイン補完が意図した通りに動作しない、と言った場合にチェックが必要でしょう。
$ man resolv.conf ... domain と search キーワードは、互いに排他的である。これらのキーワードが 2 つ以上記述されている場合、最後に記述されているものが有効になる。 ...
/etc/host.conf 設定
条件が良く分かっていませんが、CentOS6のインストール時に、/etc/host.confが以下のように設定されてしまう場合があります。
$ cat /etc/host.conf multi on
/etc/hosts内のエントリを複数行応答するかの制御を行いますが、使用するサーバ、アプリケーションによっては動作の違いが影響するかもしれません。
$ cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
- multi on の場合
$ ping6 localhost PING localhost(localhost) 56 data bytes 64 bytes from localhost: icmp_seq=1 ttl=64 time=0.037 ms 64 bytes from localhost: icmp_seq=2 ttl=64 time=0.012 ms
127.0.0.1と::1の両方が応答されるため、::1宛てにping6が成功します。
- multi off の場合
$ ping6 localhost unknown host
127.0.0.1のみ応答されるため、ping6は失敗します。
ユニークなlocalhost6に対しては、問題無く疎通します。
$ ping6 localhost6 PING localhost6(localhost) 56 data bytes 64 bytes from localhost: icmp_seq=1 ttl=64 time=0.031 ms 64 bytes from localhost: icmp_seq=2 ttl=64 time=0.012 ms
起動時 ntpdate が失敗する場合の対応
リゾルバの応答待ちや、ネットワークがSPT(スパニングツリー)を構成している等が影響して、ntpd起動時のntpdateが失敗する場合の対応方法です。
ntpdate: Synchronizing with time server: [FAILED] Starting ntpd: [ OK ]
/etc/sysconfig/ntpdateを修正し、必要に応じてタイムアウトを設定します。
--- a/sysconfig/ntpdate
+++ b/sysconfig/ntpdate
@@ -1,5 +1,5 @@
# Options for ntpdate
-OPTIONS="-U ntp -s -b"
+OPTIONS="-U ntp -s -b -t 10"
# Set to 'yes' to sync hw clock after successful ntpdate
SYNC_HWCLOCK=yes
デフォルトでは1秒でタイムアウトします。
なお、データベース等、ntpdの起動を待つサーバ、アプリケーションが有る場合は、それらの起動スクリプトについて調整/確認が必要かもしれません。