关闭除 DNS 解析之外的所有 UDP 流量

关闭除 DNS 解析之外的所有 UDP 流量

这是我的 iptables 设置:

-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A INPUT ! -s 87.27.77.107/32 -p tcp -m tcp --dport 21 -j DROP
-A INPUT -i eth0 -p udp -j DROP
-A OUTPUT -p udp -j DROP

尝试使用 /etc/resolv.conf 中指定的两个 DNS 服务器来允许 DNS 解析,但遇到了麻烦。我尝试在不限制源/目标 IP 地址的情况下打开端口 53,但没有成功:

iptables -A INPUT -p udp --sport 53 -j ACCEPT
iptables -A INPUT -p udp --dport 53 -j ACCEPT
iptables -A OUTPUT -p udp --sport 53 -j ACCEPT
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT

iptables -A INPUT -p tcp --sport 53 -j ACCEPT
iptables -A INPUT -p tcp --dport 53 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 53 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 53 -j ACCEPT

# host google.it
;; connection timed out; trying next origin

我错在哪里了?

答案1

一开始仅仅检查 iptables 设置是不够的;你还必须在最后检查它们以查看结果你的命令。规则从上到下进行处理,每次使用-A(缩写--append)时,它都会在底部添加规则 –以下现有的“丢弃所有 UDP 数据包”规则。

最终结果如下:

-P 输入接受
-P 转发接受
-P 输出接受
-A 输入!-s 87.27.77.107/32 -p tcp -m tcp --dport 21 -j DROP
-A 输入-i eth0 -p udp -j DROP
-A 输入-p udp-m udp --sport 53-j 接受
-A 输入-p udp -m udp --dport 53 -j 接受
-A 输入-p tcp -m tcp --sport 53 -j 接受
-A 输入-p tcp -m tcp --dport 53 -j 接受
-A 输出 -p udp -j 删除
-A 输出 -p udp -m udp --sport 53 -j 接受
-A 输出 -p udp -m udp --dport 53 -j 接受
-A 输出 -p tcp -m tcp --sport 53 -j 接受
-A 输出 -p tcp -m tcp --dport 53 -j 接受

为了解决这个问题,请将“接受”规则移到“删除”规则之上,例如通过在插入或附加时指定确切的位置(-I/-A INPUT <lineno>)。

(更好的方法是,以文本文件形式准备完整的规则集,并一次性加载所有内容(iptables-save/restore 甚至发酵) 而不是在随机位置插入随机规则。

请注意,如果您仅充当 DNS 客户端(而不是 DNS 服务器),则一半的接受规则都是无用的。传出的 DNS 查询将以 53 作为其目标端口,但不是作为源端口(而是随机的);反之亦然,传入的响应将以 53 作为源,但目标端口是随机的。

相关内容