我知道这有点晚了,但既然你还没有结束这个问题......
如果您在wireshark 或类似软件中查看DNS 请求数据包的内容,您会发现没有使用点字符。域名的每一部分都是一个计数字符串,因此请求的实际字节数google.com
将是:
06 67 6f 6f 67 6c 65 03 63 6f 6d
第一个字节 (06) 是 的长度google
,然后是 6 个 ASCII 字符,然后是计数字节 (03) 的长度,com
然后是......你明白了。
要在 iptables 中匹配它,请使用以下命令:
iptables -A OUTPUT -o eth0 -p udp --port 53 -m string --hex-string "|06|google|03|com" -algo bm -j ACCEPT
该--hex-string
参数解析提供的字符串以查找由垂直条对分隔的十六进制值。竖线之外的任何内容都被解释为 ASCII 文本。
如果您在添加条目后列出 OUTPUT 表,您会发现以下内容:
ACCEPT udp -- anywhere anywhere udp dpt:domain STRING match "|06676f6f676c6503636f6d|" ALGO name bm TO 65535
--from
您可以通过使用和--to
参数限制搜索范围来稍微调整规则并加快速度。