我正在试验 iptables,并尝试允许所有传出的 HTTPS 请求,但阻止 HTTP。
我有下面的代码;
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT tcp -- anywhere anywhere tcp dpt:ssh
ACCEPT udp -- anywhere anywhere udp dpt:ssh
ACCEPT udp -- anywhere anywhere udp dpt:https
ACCEPT tcp -- anywhere anywhere tcp dpt:https
DROP tcp -- anywhere anywhere
DROP udp -- anywhere anywhere
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT tcp -- anywhere anywhere tcp dpt:ssh
ACCEPT udp -- anywhere anywhere udp dpt:https
ACCEPT udp -- anywhere anywhere udp dpt:ssh
ACCEPT tcp -- anywhere anywhere tcp dpt:https
DROP tcp -- anywhere anywhere
DROP udp -- anywhere anywhere
.
显然,这会阻止我尝试浏览的几乎所有网页,无论它是否http://example.com或者https://example.com
我不明白什么?非常感谢您的帮助!
答案1
我认为这些规则没有问题就 HTTP 和 HTTPS 而言去。问题是你也阻止了 DNS 解析,所以没有客户端可以解决主机以尝试与其建立 HTTPS 连接。
您已注意到,NEW
在链的第 1 行中添加允许状态OUTPUT
允许 DNS 解析 - 但它也允许其他所有内容,包括出站 HTTP;然后,所有返回半数据包都将被INPUT
链的第 1 条规则允许进入。相反,请恢复到上面的规则集,并使用以下方式明确允许 DNS
iptables -I OUTPUT 2 -p udp --dport 53 -j ACCEPT
这应该允许主机的 DNS 解析工作,但继续阻止通过 HTTP 连接到它们的尝试。请注意,您404
寻求的是第 4 层(协议层)错误,您无法使用第 3 层工具(如)实现这一点iptables
。相反,出站 HTTP 连接将只是超时,而 HTTPS 连接应该会成功。