投稿日:2020年11月21日
UbuntuでPC起動中に違うネットにつなぎ直したりした際に、特定のサイトだけ表示できない問題が起こることがあります。これはsystemd-resolvedのキャッシュが原因で起こる問題です。この記事ではこの問題の解決方法について解説しています。
実家に帰省して家のネットでネットサーフィンをしていたのですが、一部のWebサイトだけ何故か表示できない!
他のサイトは問題なく表示できていたので、サイトのサーバー側の問題だと思っていたのですが…
どうも調べてみると自分のPCに問題がありそう?
一部のサイトだけ表示できないということは、DNSサーバー周りに問題があるのかも?
ということでまずはnslookupコマンドを使ってみます。
このコマンドはドメイン名を指定するとそのドメイン名のIPアドレスと名前解決に利用したDNSサーバを表示してくれるコマンドです。
$ nslookup marsquai.com
Server: 127.0.0.53
Address: 127.0.0.53#53
Non-authoritative answer:
Name: marsquai.com
Address: 34.84.179.139
どうやら名前解決に利用しているDNSサーバは127.0.0.53のIPアドレスのサーバーを利用しているようです。
127.0.0.0/8のIPアドレスはループバックアドレスとして設定されているはずなので、ローカルPCで動いている何かのサービスに向いているようです。
一応/etc/resolve.confファイルも確認してみましょう。
このファイルはLinuxの名前解決の設定ファイルです。
$ ls -la /etc/resolv.conf
lrwxrwxrwx 1 root root 39 4月 11 2018 /etc/resolv.conf -> ../run/systemd/resolve/stub-resolv.conf
$ cat /etc/resolv.conf
# This file is managed by man:systemd-resolved(8). Do not edit.
#
# This is a dynamic resolv.conf file for connecting local clients to the
# internal DNS stub resolver of systemd-resolved. This file lists all
# configured search domains.
#
# Run "resolvectl status" to see details about the uplink DNS servers
# currently in use.
#
# Third party programs must not access this file directly, but only through the
# symlink at /etc/resolv.conf. To manage man:resolv.conf(5) in a different way,
# replace this symlink by a static file or a different symlink.
#
# See man:systemd-resolved.service(8) for details about the supported modes of
# operation for /etc/resolv.conf.
nameserver 127.0.0.53
options edns0 trust-ad
どうやら/etc/resolv.confはSymbolicLinkになっているようです(これは設定が動的な設定であることを表す)。
またファイルの中身を見るとnslookupで確認した内容と同じ様にDNSサーバとして127.0.0.53を利用している設定が確認できます。
さらにコメントでいろいろ書いてあります。
要約すると以下の
どうもこの内部DNS stub resolverというのが気になります…
まずはそれぞれのリゾルバの役割について簡単に解説します。
通常、ブラウザからドメインの名前解決を行う場合以下のような手順が踏まれます。
スタブリゾルバはローカルのPC内のリゾルバでただドメイン名とIPアドレスの受け渡しをするだけのはずなのですが…
もしやUbuntuの利用しているスタブリゾルバに何か特殊な機能があるのかも!?
先程、/etc/resolve.confを確認した際のコメントに、スタブリゾルバとしてsystemd-resolvedを使っていると書いてありました。
実はこのsystemd-resolvedはパフォーマンス向上のためにほんの少しだけDNSクエリの結果をキャッシュするのです(https://fedoraproject.org/wiki/Changes/systemd-resolved)。
どうやらこのキャッシュが悪さをしているようです。
スタブリゾルバのキャッシュを削除すれば解決できそうです!
このキャッシュはPCの再起動をすれば削除できるのですが、僕みたいにブログの編集中とかでPCを起動したまま直したい場合には以下のコマンドをうってキャッシュを削除しましょう。
$ sudo systemd-resolve --flush-caches
systemd-resolvedを使うことでネットの接続のパフォーマンスは向上することは間違いないのですが、これが原因で起きる問題も多いようです。
ここではこれをOFFにする設定について解説します。
まずはサービスの自動起動の設定をOFF、そしてサービス自体も終了させます。
$ sudo systemctl disable systemd-resolved
$ sudo systemctl stop systemd-resolved
次にネットワークのDNSを再設定させます。
まずは現在のDNSの設定を削除
$ sudo rm -f /etc/resolv.conf
次にDNSサーバーとしてネットワークのデフォルトのものが使用される様に設定。
これはNetworkManager.confの[main]にdns=defaultを加えて、NetworkManagerサービスを再起動します。
[main]
dns=default
$ sudo systemctl restart NetworkManager
$ cat /etc/resolv.conf
# Generated by NetworkManager
nameserver 192.168.0.1
nameserver 2001:268:fd07:4::1
nameserver 2001:268:fd08:4::1
$ nslookup marsquai.com
Server: 192.168.0.1
Address: 192.168.0.1#53
Non-authoritative answer:
Name: marsquai.com
Address: 34.84.179.139