とあるURLをブラウザで開こうとすると名前解決ができなかったので、その時の調査についての備忘録
簡易ネットワーク図
[クライアントPC(Mac)]-----[無線AP(WLX202)]-----[スイッチ(SWX2200-8PoE)]-----[ルータ(RTX1210)]-----[インターネット]
調査
digコマンドを打ってみた
> dig xxx.com(ドメインは伏せてます)
;; Truncated, retrying in TCP mode.
;; Connection to 192.168.1.1#53(192.168.1.1) for xxx.com failed: connection refused.
connection refusedになる。
そもそも1行目の「Truncated, retrying in TCP mode.」ってなんだろう?
参考: https://harasou.jp/2016/02/21/dns-packet-over-512/
サーバは、UDP の問い合わせに対し応答が512バイトを超える場合、
応答するレコードを 512バイト以下に切り詰めた上で、切り詰められたこと示すビット(TC)を立て、UDP の応答を返す。
クライアント側は、その TCビットを確認すると再度、同じ問い合わせをTCPで行い、全てのレコードがつまった応答を受け取る。
つまり、今回の名前解決をした時に、UDPで問い合わせたけども、応答パケットが512byte以上になっていたのでtruncateしました、再度TCPで問い合わせ(TCPフォールバック)をしてね、ということらしい
しかし、その結果TCPでは接続できませんよと怒られた模様
ルータ(RTX1210)上から名前解決できるか?
ルータにログインし、nslookupコマンドを打ってみると名前解決成功!
DNSサーバまではアクセスできていることがわかった
クライアントPCのDNSをパブリックDNSにしてみたらどうか
Google Public DNS(8.8.8.8)をmacのDNSの項目に設定
この状態でdigコマンドを打ってみた
> dig xxx.com(ドメインは伏せてます)
;; Truncated, retrying in TCP mode.
;; Connection to 192.168.1.1#53(192.168.1.1) for xxx.com failed: connection refused.
; <<>> DiG 9.8.3-P1 <<>> xxx.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 54041
;; flags: qr rd ra; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 0
(以下略)
ルータ(192.168.1.1)では名前解決できなかったが、Google Public DNSではできた
PC、ルータ間で何か起こっていそう
YAMAHAの公式ページで調べてみた
「rtx1210 dns tcp非対応」でググってみた
ひっかかったのはYAMAHAの公式サイト
参考: http://www.rtpro.yamaha.co.jp/RT/FAQ/TCPIP/dns-recursive-server.html
RTシリーズのDNSリカーシブサーバ機能は、UDPによる配送にしか対応していません。
ほとんどの場合はこれで問題ありませんが、ごくまれにレコードが大きくなって、TCPによる配送に切り替わってしまうと、
それを扱えないためにアドレスが引けないということが起こります。
このような場合は、RTシリーズのDNSリカーシブサーバ機能を使わないようにして下さい。
DNSリカーシブサーバ機能を使っているとTCP通信はできない・・・
ブラウザからRTX1210にアクセスし、「詳細設定」→「DNSサーバー」を確認
「DNSサーバ機能が有効になっています。(リカーシブサーバー)」
(^ω^)
まとめ&感想
- YAMAHA系ルータのDNSリカーシブサーバは、TCPフォールバックによる通信を通さない
- YAMAHAのサイトにも書いていたが、名前解決の応答パケットが512byteを超えることはまれ
- DNSのリカーシブで恩恵を受けている部分もあるので、なるべくならこの機能は切りたくない
- なので、名前解決できないドメインがあったら一時的にパブリックDNSを使おうと個人的に思ってます
以上