Linux/dnsmsqの無効化

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にしたり、
もう少し、いろいろ調べないとダメかもしれませんね。


*1 OSのバージョンは /etc/os-release で見れます。いつも /etc...っどこだっけ、と忘れるのでここに書いておきます。
*2 調べると言っても単に digしただけです。Webでnslookupを提供してくれているサービスもあるので、そちらで「IP逆引き」しても調べることができます。
*3 最初、root権限無しでlsofコマンド使って、何も表示されないなぁ?とか思っていました...要root権限。
*4 たぶん各端末から外部DNSへの通信はファイアウォールで止めているんじゃないですかね。各自が勝手にDNSサーバ選んで、勝手にキャッシュポイズニングとかに引っかかったりされたら困る、ので。

  最終更新のRSS