※このブログではサーバー運用、技術の検証等の費用のため広告をいれています。
記事が見づらいなどの問題がありましたらContactからお知らせください。


【Ubuntu20.04LTS】特定のWebサイトだけ閲覧できない問題を解決

スタブリゾルバ― DNS ネットワーク 名前解決

投稿日:2020年11月21日

このエントリーをはてなブックマークに追加
UbuntuでPC起動中に違うネットにつなぎ直したりした際に、特定のサイトだけ表示できない問題が起こることがあります。これはsystemd-resolvedのキャッシュが原因で起こる問題です。この記事ではこの問題の解決方法について解説しています。

特定のWebサイトだけ閲覧できない問題を解決

一部のWebサイトだけ表示できない!?

実家に帰省して家のネットでネットサーフィンをしていたのですが、一部のWebサイトだけ何故か表示できない!

他のサイトは問題なく表示できていたので、サイトのサーバー側の問題だと思っていたのですが…

どうも調べてみると自分のPCに問題がありそう?

DNSリゾルバ

一部のサイトだけ表示できないということは、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.confSymbolicLinkになっているようです(これは設定が動的な設定であることを表す)。

またファイルの中身を見るとnslookupで確認した内容と同じ様にDNSサーバとして127.0.0.53を利用している設定が確認できます。

さらにコメントでいろいろ書いてあります。

要約すると以下の

  • このファイルはman:systemd-resolved(8)により管理されているため、勝手に編集しないこと
  • このファイルはsystemd-resolved内部DNS stub resolverに接続するよう設定されています。
  • resolvectl statusコマンドを使用することで上り回線で今使用されているDNSサーバーの詳細を表示できます。
  • サードパーティのプログラムはこのファイル(../run/systemd/resolve/stub-resolv.conf)を直接参照せず/etc/resolve.confにアクセスすること

どうもこの内部DNS stub resolverというのが気になります…


DNS stub resolver(DNSスタブリゾルバ―)

まずはそれぞれのリゾルバの役割について簡単に解説します。

通常、ブラウザからドメインの名前解決を行う場合以下のような手順が踏まれます。

  1. ブラウザからローカルPCのスタブリゾルバにドメイン名の検索を依頼
  2. スタブリゾルバからフルサービスリゾルバ(DNSキャッシュサーバ)にドメイン名の検索を依頼
  3. フルサービスリゾルバはコンテンツサーバにドメイン名の検索を依頼。見つかった場合にはそのIPアドレスが返される
  4. フルサービスリゾルバは返されたIPアドレスをスタブリゾルバに返す
  5. スタブリゾルバはIPアドレスをブラウザに返す

スタブリゾルバはローカルのPC内のリゾルバでただドメイン名とIPアドレスの受け渡しをするだけのはずなのですが…

もしやUbuntuの利用しているスタブリゾルバに何か特殊な機能があるのかも!?

先程、/etc/resolve.confを確認した際のコメントに、スタブリゾルバとしてsystemd-resolvedを使っていると書いてありました。

実はこのsystemd-resolvedはパフォーマンス向上のためにほんの少しだけDNSクエリの結果をキャッシュするのです(https://fedoraproject.org/wiki/Changes/systemd-resolved)。

どうやらこのキャッシュが悪さをしているようです。

【結論】systemd-resolvedのキャッシュを削除

スタブリゾルバのキャッシュを削除すれば解決できそうです!

このキャッシュはPCの再起動をすれば削除できるのですが、僕みたいにブログの編集中とかでPCを起動したまま直したい場合には以下のコマンドをうってキャッシュを削除しましょう。

ターミナル
$ sudo systemd-resolve --flush-caches

【補足】systemd-resolvedを使用しない様に設定

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サービスを再起動します。

/etc/NetworkManager/NetworkManager.conf
[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
このエントリーをはてなブックマークに追加


関連記事

記事へのコメント