こんにちは、Nirecom です。一日中仁礼家の誰かが zoom しているので、Yamaha ルータのメンテができず肩身が狭いです。

DNS での名前解決に異様に時間がかかるときがあるので、調査してみました。

名前解決が遅いのは AWS VPN のせい?

自宅のネットワーク (仕事のじゃないよ!) は、以下のように AWS 上の AD と VPN で接続してあります。

AWS - 自宅 LAN 間の VPN

Active Directory ベースな環境なので、LAN 上に接続したクライアントは、DHCP から 2台ある AD サーバ AD1 (10.10.1.100), AD2 (10.20.1.100) を渡されて名前解決に使用します。

AD サーバ上の forwarders は Google Public DNS (8.8.8.8, 8.8.4.4) を指定しています。

つまりこうなっています。

  • ドメイン内のクライアント / サーバは AD 2台が名前解決
  • ネット上のサーバの名前解決は AD 2台 -> Google Public DNS に forward

ところが、2日ほど前からウチの PlayStation 4 がネットワークエラーを起こすようになりました。Windows 10 上で dig / nslookup でテストすると、2秒以上たってタイムアウトになります。

AWS 上の BGP を用いた IPsec VPN は苦労した経験があり、何かあると VPN を疑うのですが (苦笑) 今回はシロでした。平和な時代になったなあ。疑ってマジすまん。

実は ISP でした

色々調べて、いきついたのは ISP の問題でした。

仁礼家で契約している ISP (ネットワークプロバイダ) は 2つあり、仮に ISP1, ISP2 とします。ISP1 がメインなんですが、これを ISP2 に変更するとタイムアウトにならないことが判明。

なんだこりゃ。挙動的には ISP1 から 8.8.8.8, 8.8.4.4 へのアクセスがよほど殺到しているか、意図的に絞られているように見えます。ISP1 内部の DNS サーバを使わせるため?

でも、どこのプロバイダでもそうだと思いますが、ISP 自身が用意している DNS サーバってさほど速くない上に、動的に IP が変わるため、RTX1210 のような内部ルータの定義には書きづらいのですよねぇ。

一次対応として、RTX1210 に静的ルーティングを追加しました。

ip route 8.8.8.8 gateway pp 2 hide gateway pp 1 weight 0
ip route 8.8.4.4 gateway pp 2 hide gateway pp 1 weight 0

Google Public DNS へのルーティングは、ISP2 (pp 2) の接続が生きているそちらを使い、落ちているときだけフェイルオーバーで ISP1 (pp 1) に回します。

Google Public DNS も最速ではない

これでタイムアウトしない程度にレスポンスは返ってくるようになりました。しかし、スピード中としては、dig / nslookup のレスポンスになんかモッサリ感を感じます。Google Public DNS ってこんな遅かったっけ?

DNSPerf で確認してみると、Google の平均は 47.14ms で 26位となっていました。1位は Cloudflare DNS (1.1.1.1) です。なんと 10.96ms ! 速い!

Google は当然のこと、Cloudflare も CDN プロバイダなので世界中にノードをもっており、どこからでも速いことは想像されますがそれにしても 10ms かぁ。

待って、DNSPerf の結果だけ盛ってませんよね? Japan region からだと激遅だったり 🙂 とにかく日本の私の自宅環境から速くなければ意味がないので、検証してみます。

Github に DNS Performance Test なるものがあるので、これを使わせてもらいます。

Ubuntu 上にインストール想定か。Windows 10 の WSL で Ubuntu 入れたところなのでちょうどいいや。

Windows 10 WSL: OS List

github のインストラクションどおりにインストール。

$ sudo apt-get install bc dnsutils
$ git clone --depth=1 https://github.com/cleanbrowsing/dnsperftest/
$ cd dnsperftest
$ bash ./dnstest.sh 

結果がこちらになります。10回試行して平均値を出してくれる。シンプル。

test1 test2 test3 test4 test5 test6 test7 test8 test9 test10 Average
(AD1) 25 ms 27 ms 25 ms 27 ms 56 ms 24 ms 31 ms 30 ms 31 ms 30 ms 30.60
(AD2) 43 ms 18 ms 16 ms 21 ms 29 ms 16 ms 10 ms 11 ms 9 ms 109 ms 28.20
(RTX1210) 2 ms 1 ms 1 ms 1 ms 7 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1.70
cloudflare 7 ms 6 ms 6 ms 7 ms 8 ms 7 ms 6 ms 6 ms 7 ms 5 ms 6.50
level3 11 ms 12 ms 12 ms 12 ms 12 ms 13 ms 12 ms 12 ms 12 ms 78 ms 18.60
google 17 ms 22 ms 67 ms 20 ms 17 ms 174 ms 17 ms 97 ms 8 ms 81 ms 52.00
quad9 106 ms 105 ms 106 ms 105 ms 105 ms 120 ms 106 ms 119 ms 109 ms 106 ms 108.70
freenom 78 ms 147 ms 78 ms 495 ms 195 ms 426 ms 115 ms 78 ms 78 ms 122 ms 181.20
opendns 43 ms 7 ms 6 ms 40 ms 7 ms 173 ms 6 ms 42 ms 44 ms 7 ms 37.50
norton 84 ms 86 ms 83 ms 83 ms 80 ms 83 ms 82 ms 80 ms 86 ms 88 ms 83.50
cleanbrowsing 121 ms 127 ms 121 ms 135 ms 120 ms 121 ms 120 ms 119 ms 121 ms 136 ms 124.10
yandex 274 ms 266 ms 258 ms 260 ms 286 ms 260 ms 274 ms 260 ms 261 ms 285 ms 268.40
adguard 126 ms 320 ms 231 ms 149 ms 120 ms 106 ms 118 ms 115 ms 106 ms 120 ms 151.10
neustar 58 ms 58 ms 55 ms 58 ms 59 ms 55 ms 57 ms 54 ms 55 ms 58 ms 56.70
comodo 10 ms 9 ms 8 ms 9 ms 7 ms 7 ms 8 ms 8 ms 8 ms 9 ms 8.30

最初に DHCP から取得したサーバのレスポンスが返ってきます。(AD1 / AD2 / RTX1210 とありますが、実際は IP アドレスが表示されるのを加工しています)

  • Cloudflare … 平均最速 6.5ms!! しかも試行回数ごとの揺れが少ない。
  • Google … 平均 52ms ですが、min 17ms — max 174ms と、かなり揺れがあるようです。速い時は遜色ないんですが、遅い瞬間があるようですね。なるほどなるほど。

まあ CDN に命をかけている Cloudflare の方が、GCP 上で複雑に自社サービスを提供している Google よりもパフォーマンスにフォーカスしやすいのでしょう。

ということで、満足したので AD1, AD2 の forwarders は Cloudflare の説明ページに従い

  • For IPv4: 1.1.1.1 and 1.0.0.1
  • For IPv6: 2606:4700:4700::1111 and 2606:4700:4700::1001

を指定して幸せになりましたとさ。

結局 AD1, AD2 からの forward であり、VPN を行って帰るので各クライアントからは 30ms 程度かかってしまうのですが、仕方ないです。

昔はオンプレ DNS サーバがいましたが、今は AWS に追い出してしまいましたし、RTX1210 のリカーシブサーバは速いのですが、IPv6 / AAAA レコードの名前解決が今ひとつな感触なので、予備としてしか使っていません。

おしまい。