resolv.confが上書きされる事象について(CentOSの場合)
/etc/resolv.confに直接DNS設定を記述していたところ、気がついたら勝手に上書きされてしまっていた件について簡易メモ。 今回はCentOS系について。ディストリビューションによって管理の仕方は結構違うものなんですね(小並感)。
調査対象
- CentOS6系
- CentOS7系
ケース1:DHCPを使用している場合(CentOS 6.8で確認)
症状
- network.serviceを再起動すると手動で設定したresolv.confが上書きされてしまう
- DHCPでもらってくるDNSに上書きされる、もしくはDHCPを使用していなくても別NICに設定されているDNSの内容にresolv.confを書き換えられてしまう
例えば...
; generated by /sbin/dhclient-script
search xxx.com
nameserver yy.yy.yy.yy
nameserver zz.zz.zz.zz
原因:dhclient-script
- 犯人はこいつ
Linuxのdhclientプロセスの概要 | VPSサーバーでWebサイト公開 備忘録 ~Linux、MySQLからAJAXまで
Man page of dhclient-script
ローカル用にカスタマイズしたい場合は、提供されているHOOKSを使用する。 このフックによって/etc/resolv.confファイルを作成してデフォルトの振る舞いをオーバーライドすることが出来る。
対処法
- ifcfg-*に”PEERDNS=no”を記載する
- CentOS7の場合、nmcliコマンドでもOK
nmcli c modify [nic名] ipv4.ignore-auto-dns "yes"
/etc/dhclient.confを編集するという手段もありそうだけど、こちらの方が簡単だと思います。
ちなみに…
- BOOTPROTO=noneにするだけでは書き換えが発生する場合もある模様。DHCPをオフにするだけでは駄目らしいです。 d.hatena.ne.jp
ケース2:NetworkManagerによるもの(CentO S7.2で確認)
事象
- NetworkManagerやnetwork.serviceが再起動された際にresolv.confが自動的に上書きされてしまう
- 上書き内容はifcfg-*に記載されているDNS
- 記載がない場合は空のファイルが作成される
例
# Generated by NetworkManager
# No nameservers found; try putting DNS servers into your
# ifcfg files in /etc/sysconfig/network-scripts like so:
#
# DNS1=xxx.xxx.xxx.xxx
# DNS2=xxx.xxx.xxx.xxx
# DOMAIN=lab.foo.com bar.foo.com
原因:NetwrokManager
(私の場合、NetworkManagerの再起動で上書きされるホストと、network.serviceの再起動で上書きがされるホストがあったりして、この点は切り分けができませんでした)
対処方法①
- NetworkManagerを停止させ、自動起動しないようにする
- ifcfg-*ファイルにNM_CONTROLLED=noを追記し、network.serviceを再起動させる
※NM_CONTROLLEDとは?
NICの設定や制御をNetworkManagerで行うことを可能にするか否かの設定
http://www.obenri.com/_minset_cent6/netconfig_cent6.html
対処方法② (推奨)
1 /etc/NetworkManager/NetworkManager.confに設定を追記
[main]
【追記】dns=none
NetworkManager.conf man page - NetworkManager | ManKier
Set the DNS (resolv.conf) processing mode. (略) none: NetworkManager will not modify resolv.conf. This implies rc-manager unmanaged
2 追記後、NetworkManagerの再起動を実施する
NetworkManagerとは?
そもそもこいつはなんなのか?
1.3. NetworkManager について - Red Hat Customer Portal
Red Hat Enterprise Linux 7 では、NetworkManager がデフォルトのネットワークサービスを提供します。これは動的なネットワーク制御および設定デーモンで、ネットワークデバイスと接続が利用可能な間は、これらをアクティブな状態に保ちます。
1.8. NetworkManager とネットワークスクリプト - Red Hat Customer Portal
NetworkManager はデフォルトのネットワークサービスを提供しますが、Red Hat 開発者はスクリプトと NetworkManager が相互に協力できるようにしました。スクリプトに精通している管理者はそのままスクリプトを継続して使用できます。両方のシステムが並列して稼働し、協力できることが期待されています。 NetworkManager は sysconfig 設定ファイルを使用するプライマリアプリケーションとされており、/etc/init.d/network はフォールバックとなるセカンダリーとされています。
1.9. sysconfig ファイルを使ったネットワーク設定 - Red Hat Customer Portal
/etc/init.d/network は起動時にすべての ifcfg ファイルを読み込み、ONBOOT=yes となっているファイルすべてに関して、NetworkManager がすでに ifcfg ファイルの DEVICE を起動しているかどうかをチェックします。NetworkManager がデバイスを起動している最中、またはすでに起動し終わっている場合は、そのファイルについてはこれ以上なにも実行されず、次の ONBOOT=yes ファイルがチェックされます。NetworkManager がまだデバイスを起動していない場合は、initscripts は従来の動作を継続し、その ifcfg ファイルの ifup を呼び出します。
上記の通りCentOS7以降ではネットワーク周りの制御が大きく変更されています。直接resolv.confを書き換えてもOSやnetwrokを再起動するとNetworkManagerがifcfgファイル内容を読み取り、その内容でresolv.confを上書きしてしまう挙動が今回の原因になります。ただしnmtui、nmcliコマンドはこいつと対話できるようにするコマンドだったりするので、CentOS7では以前のようにNwtworkManagerを停止させるのは得策ではなさそうですね。
NetworkManagerの挙動に関してはもっと勉強が必要そうです。