iptables是否只允许对某个域名进行DNS查询?

Jar*_*nny 16 linux dns iptables

我目前有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.没有骰子.

如果有人知道如何做到这一点或看到我出错的地方你的帮助表示赞赏!

谢谢,Jarred

Cor*_*rey 27

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

如果您在wireshark或类似的内容中查看DNS请求数据包的内容,您会发现未使用点字符.域名的每个部分都是一个计数字符串,因此请求的实际字节数为google.com:

06 67 6f 6f 67 6c 65 03 63 6f 6d
Run Code Online (Sandbox Code Playgroud)

第一个字节(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
Run Code Online (Sandbox Code Playgroud)

--hex-string参数解析提供的字符串,查找由垂直条对分隔的十六进制值.垂直条之外的任何内容都被解释为ASCII文本.

如果在添加条目后列出OUTPUT表,您将找到以下内容:

ACCEPT     udp  --  anywhere             anywhere             udp dpt:domain STRING match  "|06676f6f676c6503636f6d|" ALGO name bm TO 65535
Run Code Online (Sandbox Code Playgroud)

您可以通过使用--from--to参数限制搜索范围来略微调整规则并加快速度.

  • @Corey如果规则将“拒绝”对某个域的请求,则为是。但最初的任务(也是我的任务)是“仅允许”某些主机。然后,如果您在问题部分中使用至少一个允许的主机来制作多DNS查询,则可以通过将任何主机添加到问题部分中来查询任何主机。 (2认同)