Closed trantuan-20048607 closed 7 months ago
现有实现是直接用 gopacket 的 layer.DNS.DecodeFromBytes()
解析 UDP 包, 如果不返回 error 就视为是 DNS 。
构造一个让 gopacket 的 layer.DNS.DecodeFromBytes()
不返回 error 的 UDP 包挺简单的, 包大小不小于 12 且直接把 packet[4:12]
置 0 即可(这样可以跳过对后续更复杂结构的解析), 例如下面的脚本就可以发送一个 UDP 包, 让 OpenGFW 的 dns != nil
。
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
try:
message = bytes(12)
sock.sendto(message, ("192.0.2.1", 2333))
finally:
sock.close()
这样啊,反正也不会崩溃,问题不大...
在 OpenWRT 上测试 DNS 规则时遇到了奇怪的报错:
报错对应的规则内容:
我认为这是将 NTP 数据包误识别为 DNS,使得
dns != nil
导致的,主要原因有两点:port.src
和port.dst
都是123
,这是 NTP 协议所使用的端口非权威应答: 253.116.253.17.in-addr.arpa name = twtpe2-ntp-002.aaplimg.com