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 ACCEP
T
我也尝试过--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 访问怎么弄呢。