iptables 可以只允许对某个域名进行 DNS 查询吗?

Posted

技术标签:

【中文标题】iptables 可以只允许对某个域名进行 DNS 查询吗?【英文标题】:Can iptables allow DNS queries only for a certain domain name? 【发布时间】:2012-12-15 08:08:54 【问题描述】:

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

让我们以 google.com 为例。

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

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

我也尝试过--dport 53 而不是--sport。没有骰子。

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

谢谢, 震动

【问题讨论】:

【参考方案1】:

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

如果你在wireshark或类似软件中查看DNS请求包的内容,你会发现没有使用点字符。域名的每一部分都是一个计数字符串,所以google.com请求的实际字节数为:

06 67 6f 6f 67 6c 65 03 63 6f 6d

第一个字节 (06) 是 google 的长度,然后是 6 个 ASCII 字符,然后是 com 长度的计数字节 (03),然后是......你明白了。

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

【讨论】:

好人,你节省了很多时间。虽然这需要时间来验证。 为什么算法类型是 bm (Boyer-Moore)? @GauravKansal 从记忆中,这是我在执行此操作时可以找到的所有示例中使用的那个。另一种选择是 Knuth-Morris-Pratt,在这种情况下,它不一定比 Boyer-Moore 快,而且开销可能略高。我无法确认这一点,因为我没有进行任何测试。 这个答案很棒,我很高兴地采纳了它!但是,应该指出的是,从技术上讲,可以使用多个问题来制作 DNS 查询,只要允许的主机也在 DNS 查询的问题部分中,就允许某人解析任意主机。不过,很少支持带有多个问题的 DNS 查询。 @Corey 如果规则会拒绝对某个域的请求,是的。但最初的任务(和我的)是只允许某些主机。如果您随后在问题部分中使用至少一个允许的主机制作多 DNS 查询,则可以通过将其添加到问题部分来查询任何主机。【参考方案2】:

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

这将起作用:

iptables -A OUTPUT -o eth0 -p udp --port 53 -m string --string google --algo bm -j ACCEPT

【讨论】:

以上是关于iptables 可以只允许对某个域名进行 DNS 查询吗?的主要内容,如果未能解决你的问题,请参考以下文章

linux iptables 要设置 某个目录 只允许指定IP 访问怎么弄呢。

iptables及智能DNS

9DNS主从和iptables使用

iptables dns

iptables -P OUTPUT DROP 修改成允许某个ip通过?

如何配置使得BIND只解析特定域名