我在 API 服务器上使用 IPTables 来阻止除 SSH、HTTP 和 HTTPS 之外的所有传入流量。我需要对环回接口拥有完全访问权限才能运行beanstalkd
其他操作,并且需要传出 http、https 和 SSH 访问权限才能对其他服务进行 API 调用,以及从 github 提取数据。
我创建了如下规则:
iptables -F
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp --dport ssh -j ACCEPT
iptables -A INPUT -p tcp --dport http -j ACCEPT
iptables -A INPUT -p tcp --dport https -j ACCEPT
iptables -A INPUT -j DROP
iptables -L
输出:
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere anywhere
ACCEPT tcp -- anywhere anywhere tcp dpt:ssh
ACCEPT tcp -- anywhere anywhere tcp dpt:http
ACCEPT tcp -- anywhere anywhere tcp dpt:https
DROP all -- anywhere anywhere
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
尽管如此,git pull
还是找不到服务器,无法 ping google,mailgun 也无法发送。运行iptables -F
可以解决这些问题,我不能让防火墙完全阻止我的应用程序运行...
我怎样才能实现上述目标?
答案1
如果你仔细想一想,就会发现这一点非常明显:
Ping Google 不起作用,因为您没有允许传入 ICMP 回复的规则。
由于您没有允许 DNS 回复的规则,因此无法“找到服务器”。
Mailgun 无法使用 SMTP,因为您没有允许 SMTP 数据包的规则 – TCP SYN 出去了,但相应的 SYN/ACK 被丢弃了。
这里的通用解决方案是使用 netfilter 的连接跟踪(又名“conntrack”)来制定一条规则,允许所有与活动连接相对应的数据包:
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
(旧文档可能有-m state
;这已被弃用。)
而且当然,
-A INPUT -4 -p icmp -j ACCEPT
-A INPUT -6 -p icmp6 -j ACCEPT
因为你为什么要阻止它