16

我目前有 iptables 阻止所有 UDP 流量,但是我只想允许某些 DNS 查询通过。

让我们以 google.com 为例。

我正在尝试使用字符串匹配来查找请求中的域名,并允许它。这就是我想出的。

iptables -A OUTPUT -o eth0 -p udp --sport 53 -m string --string "google.com" --algo bm -j ACCEP

我也试过--dport 53代替--sport. 没有骰子。

如果有人知道如何做到这一点或看到我出错的地方,我们将不胜感激!

谢谢, 杰瑞德

4

2 回答 2

27

我知道这有点晚了,但既然你还没有结束这个问题......

如果您在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参数限制搜索范围来稍微调整规则并加快速度。

于 2013-06-19T06:24:48.867 回答
4

我发现带点的字符串不可靠。

这将起作用:

iptables -A OUTPUT -o eth0 -p udp --port 53 -m string --string google --algo bm -j ACCEPT
于 2013-03-08T14:07:37.793 回答