![IPTables - 仅允许来自特定范围的流量](https://linux22.com/image/169508/IPTables%20-%20%E4%BB%85%E5%85%81%E8%AE%B8%E6%9D%A5%E8%87%AA%E7%89%B9%E5%AE%9A%E8%8C%83%E5%9B%B4%E7%9A%84%E6%B5%81%E9%87%8F.png)
我试图阻止除某些定义的子网之外的所有到网络服务器的流量。我检查了很多帖子,并相信我的 iptables 设置正确,但由于某种原因,该站点仍然可以在我在规则集中定义的子网之外访问。有人能够阐明我可能做错了什么吗?我已经确定,删除规则 3 会导致网站完全无法访问。该网站本身位于 10.10.0.0/16。
Chain INPUT (policy DROP 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 ACCEPT all -- any any 10.10.0.0/16 anywhere
2 0 0 ACCEPT all -- any any 172.30.0.0/16 anywhere
3 0 0 ACCEPT all -- lo any anywhere anywhere
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 ACCEPT all -- any lo anywhere anywhere
目标是添加各种列入白名单的公共 IP 并锁定该网站,以便只有某些人可以访问。
添加规则如下:
iptables -I INPUT -i lo -j ACCEPT
iptables -I OUTPUT -o lo -j ACCEPT
iptables -I INPUT -s 10.10.0.0/16 -j ACCEPT
iptables -I INPUT -s 172.30.0.0/16 -j ACCEPT
iptables -P INPUT DROP
答案1
这规则顺序iptables 中的问题。通过使用iptables -A
您正在附加规则在最后规则集的。但iptables -I
会在规则集之上插入一条规则,除非您指定了行号(您没有指定)。因此,规则不会按预期顺序进行评估。
这是一个应该可以工作的示例配置,基于这个帖子。之前刷新您的规则以避免重复。
iptables -P FORWARD DROP
iptables -A INPUT -m state --state INVALID -j DROP
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -s 10.10.0.0/16 -j ACCEPT
iptables -A INPUT -s 172.30.0.0/16 -j ACCEPT
# add some more whitelisting rules here
iptables -P INPUT DROP # Drop everything we don't accept
第三条规则很重要:
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
否则,您的服务器将不会收到对其发起的连接的回复,例如 DNS 请求。
顺便说一句,iptables 适用于 IPv4,但不适用于 IPv6,因此,如果您的服务器支持 IPv6,您可能会有客户端使用以下方式进行连接IPv6。如果它们通过主机名而不是 IP 地址进行连接,并且主机名解析为服务器上的有效 IPv6 地址,则这是可能的。您可能会意识到,但许多人仍然不知道 iptables 确实可以过滤 IPv6 流量(和攻击)。ip6tables
如果适合您的设置,我也会添加类似的规则。