DNS接続で「127.0.1.1」に行って、かつ失敗する件(2018-03-28)
うちの Ubuntu16.04 環境で apt install 実行時に以下にようにDNSで失敗しました。
'jp.archive.ubuntu.com' が一時的に解決できません
この環境は厄介なことに、
Web接続がうまくいったりいかなかったりしていたので、
なかなか今回の結論に至りませんでした...
リゾルバの追加†
結論から言えば、後述のdnsmasq 部分だけでこと足りたので。
このリゾルバの話は自分向けのメモとして残します。
さておき、
「/etc/resolvconf/resolv.conf.d/base」 へ以下を追加しました。
nameserver 8.8.8.8
DNSサーバが不味いから解決できないのならば、他のDNSサーバにすれば良いじゃない、
ということで、新たなネームサーバとして、アドレス8.8.8.8を追加しています。
OS環境によっては「/etc/resolv.conf」等になると思いますが、
私のUbuntu 16.04*1 の reslv.conf ファイルにばっちり英語で
「DO NOT EDIT THIS FILE BY HAND」って書いてありました。
Web検索でよく出てくる呪文 8.8.8.8 が何か調べてみると*2
google-public-dns らしいです。
つまり、nameserver には信頼できそうな何処かのDNSサーバを指定すれば良いかと。
(そして、なんかこう、Googleに依存しまくっている私...)
そして、
resolvconf -u やら OS再起動やらやって上記の設定を読み込んでも、
...まだインストールに失敗します。
('jp.archive.ubuntu.com' が一時的に解決できません)
次は dnsmasq です。
dnsmasq (127.0.1.1:53) の無効化†
DNSで失敗するので、
そもそも何処のDNSサーバに聞きに行っているのかって話です...
$ nslookup google.com # google とか yahoo とか適当なドメイン名の解決を試みる
Server: 127.0.1.1
Address: 127.0.1.1#53
** server can't find google.com: REFUSED
つまり、先ほど追加したアドレス(8.8.8.8)には聞きに行っていないとのこと。
もちろん、127.0.1.1 が、ちゃんと 8.8.8.8へ聞きに行ってくれていれば問題ないのですが...
さておき、では「127.0.1.1」が何者かとWeb検索するとどうやら、dnsmasq らしい。
$ netstat -na | grep 127.0.1.1
udp 0 0 127.0.1.1:53 0.0.0.0:*
なんか ポート53(=DNS)で LISTENしているので、
「sudo lsof -i4:53」コマンドでプロセス名を確認すると、*3
確かに「dnsmasq」がこのポートを使っています。
「man dnsmasq」を見て(そして、英語なので、そっと閉じて)
私の環境がうまくいったり、いかなかったりしていたのは、
繋いだ時の状況、キャッシュされた状態によって動作が変わってたんだろうなぁ
と自身を納得させました。
そこで askubuntu.com で先達が教えてくれているとおりにdnsmasqを無効化して、
「127.0.1.1」に聞きに行かないようにしました。
$ sudo vi /etc/NetworkManager/NetworkManager.conf
(以下の一行をコメントアウト(#)しました)
#dns=dnsmasq
(コメントアウトしたら、リスタートします)
$ sudo service network-manager restart
もう一度、nslookup したら今度は上手くいったので、
dnsmasq と外のDNSとの情報連携が、上手くいってなかったのかもしれませんね。
ここからは、推測とうろ覚えのメモなんですが、
確かに、昔ローカルで動いていたDNSサーバの設定をどうこうしたようなしなかったような気が、しないでも無いです。
(昔、安全の為に想定外の外との通信は片っ端から閉じたはずなので、その影響かも?)
あと、
今回は自分の環境だから自己責任で良いですけれど、
社内LANとかで内部にDNSサーバを持っている環境ならば、
直接外部(この例だと8.8.8.8)にDNS解決はできないはずなので、*4
dnsmasq(DHCP)の内容を確認したり、前述の 8.8.8.8 ではなく社内のDNSにしたり、
もう少し、いろいろ調べないとダメかもしれませんね。