resolv.confの設定について



●概要

 「/etc/resolv.conf」は、自分のマシンが利用するDNSサーバの情報(IPアドレス)を記述するファイルです。このファイルにDNSサーバのIPアドレスを記述しておかないと、そのマシンはDNSサーバを利用することができません。
# cat /etc/resolv.conf
domain exmple.jp
nameserver 127.0.0.1
nameserver ***.***.***.***
 たとえば、このホストマシンのシェル上から「telnet hoge.testdomain.co.jp」などと指定した場合、hosts.confで定義している順番から名前解決を行い始めます。そして、bindで定義されるDNS参照に移ると、resolv.conf内の設定によってネームサーバを参照することとなります。
 上記の設定では、nameserverが2行書かれていますが、まず最初に「127.0.0.1」、つまり自らのホストで稼動中のネームサーバを参照し、それでも解決できない場合には「***.***.***.***」へ問い合わせを行うようになります。

●説明

 設定は下記のよ鵜になります。
nameserver ネームサーバのIPアドレス
domain     ドメイン名
search     検索リスト
 最低必要なのが、nameserverです。これで、ネームサーバを指定します。
nameserver 192.168.1.1
nameserver 192.168.1.2
などのように、複数指定することも可能です。この場合、まず192.168.1.1へ問い合わせます。解決できなければ、次に192.168.1.2へ問い合わせます。ちなみに、3台まで指定できるようです。(/usr/include/resolv.h の MAXNS より。)
 domainは、自分が所属しているドメイン名を指定します。すると、DNS を引く時に、このドメイン名を付加して解決しようとしてくれます。
domain test.co.jp.
と指定しておいて、www にアクセスしようとすると、test.co.jp.を付加して、www.test.co.jpでDNSを引いてくれます。
 searchは、domainを複数指定できるようにしたものです。指定したドメインを順に付加して、DNSを引いてくれます。
search in.test.co.jp. test.co.jp.
と指定しておいて、wwwにアクセスしようとすると、まずin.test.co.jp.を付加したwww.in.test.co.jp.でDNSを引き、解決できなければ、test.co.jp.を付加した www.test.co.jp.でDNSを引きます。

●resolve.confを自動的に更新しないようにする

 redhat系のlinuxだと、/etc/sysconfig/network-scripts/ifcfg-<デバイス名>の設定ファイルで、ネットワークデバイスのIPアドレスなどの設定を行います。
 たとえばeth0を、DHCPを利用して自動設定する場合は
#vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=dhcp
ONBOOT=yes
と記載すれば自動的にIPアドレスが割り振られ、DNSサーバの情報も得られるようになります。
 ここでIPアドレスだけは自動割り当てとし、/etc/resolve.confだけは自動設定してほしくない場合があります。そのような場合、PEERDNS=noを追加する必要があります。
 また、最近ではIPv6用の最低限の設定が記載されているため、IPV6_PEERDNS=noに設定変更しておかないとそちらから情報を得てしまう場合があります。
#vi /etc/sysconfig/network-scripts/ifcfg-eth0
  :
(途中省略)
  :
DEVICE=eth0
BOOTPROTO=dhcp
ONBOOT=yes
PEERDNS=no ← DHCPサーバからDNS情報を受けとりたくない場合
IPV6_PEERDNS=no ← IPv6用のDHCPサーバからDNS情報を受けとりたくない場合
NM_CONTROLLED=no ← NetworkManager起動時に該当インターフェースをUPさせない場合
  :
(途中省略)
  :
注意
# systemctl restart network
では、書き替えたインターフェース情報が更新されませんでした。なので、ifdown及びifupコマンドで実行しました。
これだとうまく反映される(ifconfig及びcat /etc/resolv.confで確認)ようです。
# /etc/sysconfig/network-scripts/ifdown <インターフェース名>
# /etc/sysconfig/network-scripts/ifup <インターフェース名>
 なお、ネットワークインターフェースカードを複数枚挿入している場合、上記設定は全ての設定ファイルで実施する必要があるかもしれません。下記のような設定でDNSサーバを設定したい場合、最初に読み込まれる設定ファイルに記載することにより問題が解決する場合があります。また、下記設定を追加した設定ファイルが必ずOS起動時に有効になる(ONBOOT=yes)必要があります。
DNS1=xxx.xxx.xxx.xxx
DNS2=xxx.xxx.xxx.xxx

 上記の方法でもresolve.confが更新されてしまう場合には、NetworkManagerを停止させ、再起動時に起動しないように設定し直してください。
 ただし、Fedora 22でNetworkManagerを再起動時に起動しないよう設定した状態でOSを再起動したところ、そのように設定したインターフェースがON状態になりませんでした。
 これでNetworkManagerが動作していてもresolv.confの内容は更新されないようになります。