Locked

CentOS_TIPS_003

リゾルバ関連メモ

主にリゾルバ(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の起動を待つサーバ、アプリケーションが有る場合は、それらの起動スクリプトについて調整/確認が必要かもしれません。