前言#
上次 ubuntu の dns がエラーになった後、debain サーバーの dns も壊れた
どうして dns がこんなに私と縁があるの?
問題背景#
Debian サーバーに奇妙な現象が発生:
- 公共 DNS(例えば
8.8.8.8
または223.5.5.5
)はドメイン名を解決できない - ローカルネットワーク自作 DNS(例えば
192.168.0.254
)は正常に解決する
排查过程#
1. DNS 接続性テスト#
nc -zuv 223.5.5.5 53 # 出力: Connection succeeded!
公共 DNS の 53 ポートに到達可能
疑問中
2. DNS 設定確認#
cat /etc/resolv.conf
# 出力:
nameserver 223.5.5.5
nameserver 8.8.8.8
かなり正常な qwq
3. ファイアウォールルール#
sudo iptables -L -n -v | grep 53
問題なし〜
4.dig クエリ#
# UDP クエリ(失敗)
dig @223.5.5.5 aliyun.com +short
# 出力: ;; communications error: timed out
# TCP クエリ(成功!)
dig +tcp @223.5.5.5 aliyun.com +short
# 出力: 106.11.253.83 140.205.60.46 ...
UDP DNS クエリがブロックされ、TCP DNS は正常
5. ネットワークパケットキャプチャ#
sudo tcpdump -i any port 53 -w dns.pcap
キャプチャ結果:
- ただ 外向き DNS リクエスト(
A? aliyun.com
) - 応答データパケット は返ってこない
6. 接続トラッキング検証#
sudo conntrack -L -p udp --dport 53
# 出力: 0 flow entries
UDP リクエストは接続を確立せず、応答パケットは転送中に破棄された
本当に逆天
結論#
まだ何が問題かは分からないが、途中のネットワーク機器がブロックしている可能性がある?
docker なども排除した
解決策を知っている友人がいれば、コメントを残してください。
解決策#
強制的に TCP プロトコルで解析#
# /etc/resolv.conf を変更
echo "options use-vc" | sudo tee -a /etc/resolv.conf
自作 DNS#
穴を残しておく