CentOS7のネットワーク周りの設定はNetworkManagerが司っており、手動でDNS関係のresolv.confを編集しても再起動すると元に戻ってしまうということになります。
普段は一度設定してしまえばあまり触ることのないresolv.confですが、プライマリDNSがこけたときのセカンダリへ切り替わる際のタイムアウトの値などを考慮する機会があったのでメモ書きとして残します。
まず直接resolv.confをviなどで編集可能なようにNetworkManagerに設定変更を実施します。以下のファイルを編集します。
# vi /etc/NetworkManager/NetworkManager.conf [main] dns=none ← 追記 |
そしてNetworkManagerを再起動します。
# systemctl restart NetworkManager |
これで直接resolv.confが編集可能となります。
resolv.confに指定可能なDNSサーバは最大3つまでです。また、option項目としてtimeoutとattemptsを設定可能です。それぞれの意味は下記のようになります。
項目 | 意味 |
timeout | 「レゾルバが他のネームサーバで問い合わせをリトライする前に、リモートネームサーバからの応答を待つ時間」を設定する。単位は秒で、デフォルトは RES_TIMEOUTである(現状では5秒、<resolv.h>を参照) |
attempts | 「レゾルバが諦めて呼び出し元のアプリケーションにエラーを返すまでに、ネームサーバに問い合わせを行う回数」を設定する。デフォルトは RES_DFLRETRY 回である (現状では 2回、<resolv.h> を参照) |
timeoutに関しては指定したDNSが丸ごと死んだのかポートだけ空いていないのかによって挙動が異なります。大抵の場合、DNSのポートだけ死ぬということはまずなく、丸ごと死亡の場合がほとんどで理論的にセカンダリまでの切り替わり時間はデフォルトで以下の計算式になります。
5秒(timeout) × 2回(attempts) = 10秒
以下のコマンドで試して確認してみました。
# time ping www.yahoo.co.jp -c1 PING edge.g.yimg.jp (182.22.24.124) 56(84) bytes of data. 64 bytes from 182.22.24.124 (182.22.24.124): icmp_seq=1 ttl=56 time=11.9 ms --- edge.g.yimg.jp ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 11.980/11.980/11.980/0.000 ms real 0m10.038s user 0m0.000s sys 0m0.005s |
理論値通りの結果が出ています。このtimeoutとattemptsを変更することが可能です。resolv.confに次のように設定します。
# vi /etc/resolv.conf nameserver xx.xx.xx.xx nameserver yy.yy.yy.yy options timeout:3 attempts:1 |
この状態で再度実行すると以下の結果となりました。
# time ping www.yahoo.co.jp -c1 PING edge.g.yimg.jp (182.22.24.124) 56(84) bytes of data. 64 bytes from 182.22.24.124 (182.22.24.124): icmp_seq=1 ttl=56 time=11.9 ms --- edge.g.yimg.jp ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 11.980/11.980/11.980/0.000 ms real 0m6.048s user 0m0.000s sys 0m0.005s |
てっきり3秒×1回=3秒になるのかなと思ったのですが6秒でした。attemptsを2にしても結果は6秒だったのでひょっとしたらattemptsの最小値は2なのかもしれません。このあたりご存知の方がおられたらぜひ教えてください。
またresolv.confのnameserverは記載した順番に引きにいくのですが、これをランダムに引きにいくようにして分散させることができます。これもoptionsで指定可能で以下のように記載します。
# vi /etc/resolv.conf nameserver xx.xx.xx.xx nameserver yy.yy.yy.yy options timeout:3 attempts:1 options rotate |
これらのオプションはDNSサーバが死んだときのことを考えると設定しておいたほうが安全だと言えそうです。