这是我为内部开发服务器编写的防火墙脚本。我希望能够使用 http/https 进行访问,但我只希望服务器可以通过 ssh/http 从内部网络访问。
iptables -P INPUT DROP
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
iptables -F
iptables -A INPUT -i eth0 -p tcp -s 10.1.1.0/24 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp --sport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp -s 10.1.1.0/24 --dport http -j ACCEPT
似乎按我预期的那样工作,但由于某种原因,我似乎无法访问外部世界。例如:
super@dev0:~$ ping google.com
ping: unknown host google.com
既然我将默认输出策略设置为接受,难道我不应该可以不受任何限制地退出吗?我误解了什么?
答案1
您不允许相关数据包重新进入。您看到的不仅是 ping 不起作用,而且您甚至无法解析 DNS 名称。您需要对 ESTABLISHED 和 RELATED 数据包进行状态匹配:
iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
您也可以只允许 ping 入站:
iptables -I INPUT 2 -p icmp --icmp-type echo-request -j ACCEPT
答案2
ping 使用 ICMP。您的规则和状态适用于 TCP。ICMP 数据包会传出您的网络,但会被您的“INPUT DROP”默认策略阻止。