ryotatake blog

Webエンジニア

【調査と解消】DNS_PROBE_FINISHED_NXDOMAIN

PCを起動してしばらく使っているとChromeで一部のサイトにアクセスできなくなりDNS_PROBE_FINISHED_NXDOMAINのエラーが発生していました。

この問題について調査して解消できたので、その内容を記載します。

結論

私の場合はDHCPクライアントが起動しておらず、IPアドレスが有効期限切れで使えなくなっていたことが原因でした。

PC起動時にDHCPクライアントのdhcpcd自動起動するように設定したことで解消しました。

$ systemctl enable dhcpcd.sevice

以下に問題と調査した内容の詳細を記載します。

環境

問題発生時の状況

基本的には普通にインターネットを利用することができます。

しかし、しばらくすると一部のサイトにアクセスしようとしたときだけDNS_PROBE_FINISHED_NXDOMAINのエラーが発生し、見られない状態になっていました。

例えば、Google検索は常に問題なく行うことができますが、 https://tver.jp にはアクセスできなくなる、といった形です。

PCを再起動すると全てのサイトにアクセスできるようになりますが、またしばらくすると一部のサイトにアクセスできなくなる、となっておりました。

調査

DNS_PROBE_FINISHED_NXDOMAINとは何か?

とりあえずこのエラーが何かを確認します。
調べると、DNSドメイン名をIPアドレスに変換できなかったということを表しているようです。

ユーザーがWebブラウザにURLを入力すると、DNSがそのURLをサーバーのIPアドレスに合わせます。これはDNSの名前解決といい、サーバーの実際のIPアドレスを把握するためにさまざまなネームサーバーに問い合わせるDNS再帰のことです。DNSドメイン名またはアドレスの解決に失敗すると、DNS_PROBE_FINISHED_NXDOMAINエラーが発生することがあります。NXDOMAINとは、Non-Existent Domain(存在しないドメイン)の略です。

ChromeのDNS_PROBE_FINISHED_NXDOMAINの解決方法(7つの対策方法)

再起動前後の変化を確認する

再起動すれば一時的に問題が解決することは分かったため、問題が起きている状態と再起動した後で何が変化するのか確認します。

エラーからDNSの名前解決に失敗していることが分かっているので、DNSサーバの動作を確認するnslookupコマンドを利用します。

アクセスできなくなる tver.jp を使って確認しました。

再起動前

$ nslookup tver.jp
Server:         2001:268:fd07:4::1
Address:        2001:268:fd07:4::1#53

Non-authoritative answer:
Name:   tver.jp
Address: 13.35.49.113
Name:   tver.jp
Address: 13.35.49.13
Name:   tver.jp
Address: 13.35.49.40
Name:   tver.jp
Address: 13.35.49.5

再起動後

$ nslookup tver.jp
Server:         192.168.0.1
Address:        192.168.0.1#53

Non-authoritative answer:
Name:   tver.jp
Address: 13.35.49.13
Name:   tver.jp
Address: 13.35.49.113
Name:   tver.jp
Address: 13.35.49.40
Name:   tver.jp
Address: 13.35.49.5

コマンド直後のServerAddressの値が再起動前後で変わっています。これはDNSサーバの名前とIPアドレスを表すものです。

2001:268:fd07:4::1IPv6IPアドレスで、192.168.0.1IPv4IPアドレスなので、このIPv6IPv4かの違いが怪しいです。

ついでにエラー中でもアクセスできる google.com も確認しておきます。

$ nslookup google.com
Server:         192.168.0.1
Address:        192.168.0.1#53

Non-authoritative answer:
Name:   google.com
Address: 216.58.197.238
Name:   google.com
Address: 2404:6800:4004:818::200e

google.comの名前解決結果に、tver.jpでは見られなかったIPv6IPアドレス2404:6800:4004:818::200e)が含まれています。これはIPv6対応のサイトであるということです。

ここまでの調査で、DNSサーバのIPがIPv6のものを使っている場合、IPv6対応のサイト(IPv6IPアドレスを持っているサイト)にしかアクセスできないということ、そして何らかの原因でIPv4DNSサーバが利用できなくなっていること、そのためにIPv4にしか対応していないtver.jpのようなサイトにアクセスできなくなることが分かりました。

なぜIPv4IPアドレスDNSサーバを利用できないのか?

いくつか理由は考えられるかもしれませんが、私は、DNSサーバと通信する私のPCのIPアドレスIPv6のものになっているのではないか?だからIPv6DNSサーバしか利用できないのではないか?と仮説を立てました。

基本的にはIPv4同士、IPv6同士でしか通信できないためです。

PCのIPアドレスを確認する

ip addressコマンドで確認しました。

$ ip address
...(略)...
3: wlp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 18:5e:0f:24:e0:91 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.6/24 brd 192.168.0.255 scope global dynamic noprefixroute wlp3s0
       valid_lft 2048sec preferred_lft 2048sec
    inet6 240f:74:f712:1:73ec:8cd1:1357:ad22/64 scope global dynamic noprefixroute 
       valid_lft 281sec preferred_lft 281sec
    inet6 fe80::2eee:3aac:99d8:db81/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

するとinetvalid_lftの数値が時間が経つごとに減っていっていることに気づきました。valid_lftについて調べると、IPアドレスの有効期限ということです。Linux:ネットワーク設定の確認を行う、ipコマンドを読み解く | SlackNote

試しにvalid_lftが0になるまで待ってみると、0になった後はそのIPアドレスが消え、DNS_PROBE_FINISHED_NXDOMAINのエラーが発生するようになりました。

上の例では最終的にvalid_lft foreverとなっているIPv6IPアドレスだけが残ることになります。

私が考えていた、PCのIPアドレスIPv6のものになるため、IPv6DNSサーバしか利用できないというのは正しそうなことが分かりました。

DHCPクライアントを起動する

valid_lftが0になってIPアドレスが消えてしまうのは困ります。これをいい感じにしてくれるのがDHCPクライアントです。

DHCPクライアントが動いている場合、valid_lftがある程度短くなった時点でDHCPサーバに問い合わせて新しいIPアドレスを割り当ててくれます。

私が使っているOSではdhcpcdがデフォルトのDHCPクライアントなので、これをPCの起動時に有効になるように設定しました。

$ systemctl enable dhcpcd.sevice

これで常にIPv4IPアドレスが使えるようになり、これ以降DNS_PROBE_FINISHED_NXDOMAINが発生することはなくなりました。

DHCP周りはあまり詳しくないので、もし間違っている情報があれば教えていただけますと幸いです。