resolv.confではない
resolvconfの設定
知らなかったこんなの
背景
うちで使っているDNSサーバはMyDNS
MyDNSさんは非常に優秀で、IPアドレスの通知が一定期間ないとアラートメールが飛んでくる。
無料でアラートメールまでくれるのはすごく嬉しい
ちなみにアラートメールはこんな感じ
このDNS更新ができていないことと、resolvconfは何が関係あるんだってことだけど、
cronに登録したperl script(register_ip.pl)でDNS更新を行っている。
このregister_ip.plでは、DNSを解決して、登録IPと現IPを比較し、違ったら登録という処理を行っている。
特にIPv6というか、AとAAAAを登録しているauto.meto4dドメインを確認したいときは、DNS Resolvのあたりの処理をしっかり行わないとできない。
そこで、登録IPを確認するためにNet::DNS::Resolverを動かして得るのだが、もともとのresolvが動いていないと失敗する。
しかもこのエラー文がNet::DNSモジュールにどうとかこうとかというエラーで、DNS Resolveができなかったというエラーを出してくれないので、数ヶ月前に苦労したことがあった。
なんかネットワークがおかしいと想いつつ、sshで他のマシンにつなげようとしたときにresolv.confがどうもおかしいと、やっと判明した。
普通(?)は/etc/resolv.confを編集
nameserverが192.168.xx.18.8.8.8
192.168.xx.1と8.8.8.8が192.168.xx.18.8.8.8とtypo
これを直して終わり
だがそうじゃなかった、
% cat /etc/resolv.conf # Generated by resolvconf nameserver 192.168.xx.18.8.8.8
resolvconf?で管理されているらしい
確かに、/etc/resolv.confを編集した後に再起動すると、また間違ったresolv.confが流されている
resolvconfで変更を行う必要があるらしい
そもそもresolvconfとやらを見るのは始めてだし、ちょっと調べたという雑記
resolvconfとは
いつも大変お世話になっております。
Archlinux wikiから
openresolv には resolvconf ユーティリティが入っています。これは複数の DNS 設定を管理するためのフレームワークです。詳しくは
https://wiki.archlinux.jp/index.php/%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E5%90%8D%E5%89%8D%E8%A7%A3%E6%B1%BA#openresolv_.E3.82.92.E4.BD.BF.E3.81.86man 8 resolvconf
やman 5 resolvconf.conf
を見て下さい。
そもそも論として、自分が体験していた不具合のように、/etc/resolv.confは影響がでかいconfファイルである。
そのため、openresolvなどで安全に変更するフレームワークとなっている
安全に変更されてへんやんか
resolvconfのconfであるresolvconf.confは/etc/resolvconf.confにある
% cat /etc/resolvconf.conf # Configuration for resolvconf(8) # See resolvconf.conf(5) for details resolv_conf=/etc/resolv.conf # If you run a local name server, you should uncomment the below line and # configure your subscribers configuration files below. #name_servers=127.0.0.1
なんも設定されてねえ
テストしてみる。
resolvconfの設定を読み込んで/etc/resolv.confに適用するには# resolvconf -u
% sudo vim /etc/resolv.conf →適当に変える % cat /etc/resolv.conf # Generated by resolvconf nameserver 192.168.xx.1 nameserver 8.8.4.4 % sudo resolvconf -u →適用させる % cat /etc/resolv.conf # Generated by resolvconf nameserver 192.168.xx.18.8.8.8 →元の間違った設定に戻っている
resolvconf自体は/run/resolvconf/interface/nic0
を参照してresolv.confを生成しているらしい
% cat /run/resolvconf/interfaces/eth0 nameserver 192.168.xx.18.8.8.8 →なんかわからん改行が多いが、編集する % sudo vim /run/resolvconf/interfaces/eth0 % cat /run/resolvconf/interfaces/eth0 nameserver 192.168.xx.1 nameserver 8.8.8.8 % cat /etc/resolv.conf # Generated by resolvconf nameserver 192.168.xx.18.8.8.8 % sudo resolvconf -u % cat /etc/resolv.conf # Generated by resolvconf nameserver 192.168.xx.1 nameserver 8.8.8.8 →とりあえずresolvconf経由では/run/resolvconfを見ているらしい
そもそも論として/run/を編集するのはおかしい
実際、再起動すると/run/resolvconf/がリセットされていた
% cat /run/resolvconf/interfaces/eth0 nameserver 192.168.xx.1 nameserver 8.8.8.8 % sudo reboot now % cat /run/resolvconf/interfaces/eth0 nameserver 192.168.xx.18.8.8.8
resolvconfは/run/resolvconf/を参照して/etc/resolv.confを設定しているようだが、/run/resolvconf/はどこを参照して作られているかがわからない
interfacesで管理しているようなので、nic周りで管理されているようだが、、man見ても、調べてもよくわからない
nicからということは、もしかしたらnetctlで定義したnicのDNSを参照している可能性がある
% grep -i dns /etc/netctl/eth0 DNS=('192.168.xx.1''8.8.8.8')
すっごい怪しい
調べたら正しい設定は以下のようだ
DNS=('192.168.xx.1', '8.8.8.8') →コンマがない
特に出てこなかったが、netctl→resolvconfで/etc/resolv.confを管理している可能性がある
試しに変更してrebootしてみる
% grep -i dns /etc/netctl/eth0 DNS=('192.168.xx.1','8.8.8.8') % sudo reboot now % cat /etc/resolv.conf # Generated by resolvconf nameserver 192.168.xx.1,8.8.8.8
どうもそうみたいだ
でもnameserver 192.168.xx.1,8.8.8.8
はだめ
安全に変更してくれよ
どうも単純な構文解析しかしてないようだ
% grep -i dns /etc/netctl/eth0 DNS=('192.168.xx.1','8.8.8.8') ↓ % grep -i nameserver /etc/resolv.conf nameserver 192.168.xx.1,8.8.8.8 % grep -i dns /etc/netctl/eth0 DNS=('192.168.xx.1' '8.8.8.8') ↓ % grep -i nameserver /etc/resolv.conf nameserver 192.168.xx.1 nameserver 8.8.8.8
なるほどなあ
まとめ
netctl のDNSは’シングルクォート’で挟んで、間にスペースが必要
間にコロン,やらが入っているとそのまま代入される
スペースがあることで始めてnameserverが分割される
resolvconfは安全に変更するフレームワーク(疎通確認はちゃんと行わない)
これでやっと再起動してもネットワーク不通問題はなくなったでしょう
たぶん