这是我的 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 作为源,但目标端口是随机的。