Archlinuxのnetctlやらresolvconfやらの設定小話

resolv.confではない
resolvconfの設定
知らなかったこんなの

背景

うちで使っているDNSサーバはMyDNS
MyDNSさんは非常に優秀で、IPアドレスの通知が一定期間ないとアラートメールが飛んでくる。
無料でアラートメールまでくれるのはすごく嬉しい
ちなみにアラートメールはこんな感じ

MyDNSからのメール画面

この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 設定を管理するためのフレームワークです。詳しくは man 8 resolvconf や man 5 resolvconf.conf を見て下さい。

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.86

そもそも論として、自分が体験していた不具合のように、/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は安全に変更するフレームワーク(疎通確認はちゃんと行わない)

これでやっと再起動してもネットワーク不通問題はなくなったでしょう
たぶん

コメントを残す

メールアドレスが公開されることはありません。