Debian 上的 iptables 阻止 git pull、http api 请求等

Debian 上的 iptables 阻止 git pull、http api 请求等

我在 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

因为你为什么要阻止它

相关内容