如何使用 iptables 正确阻止传出的 http 流量

如何使用 iptables 正确阻止传出的 http 流量

我正在试验 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 连接应该会成功。

相关内容