如何使用 iptables 删除美国境外的所有子网

如何使用 iptables 删除美国境外的所有子网

我想屏蔽美国以外的所有子网。我编写了一个包含所有美国子网的脚本。我想禁止或删除除我的列表之外的所有子网。有人能给我举个例子说明如何从拒绝所有内容开始吗?


这是 -L 的输出

Chain INPUT (policy DROP)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ftp state NEW
DROP       icmp --  anywhere             anywhere

Chain FORWARD (policy DROP)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

这些是规则

iptables --F
iptables --policy INPUT DROP
iptables --policy FORWARD DROP
iptables --policy OUTPUT ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp -i eth0 --dport 21 -m state --state NEW -j ACCEPT
iptables -A INPUT -p icmp -j DROP

为清楚起见,有了这些规则,我仍然可以连接到端口 21,而无需我的子网列表。我想阻止所有子网,只打开美国境内的子网。

答案1

如果数据包与“ACCEPT”匹配,则会立即被接受。如果数据包与“DROP”匹配,则会立即被丢弃。

听起来你只希望美国的主机能够连接到 ftp。有几种方法可以实现这一点。


制定许多像这样的复杂规则。

iptables -P INPUT DROP
iptables -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT --src 1.2.3.4/24 -p tcp -i eth0 --dport 21 -m state --state NEW -j ACCEPT
iptables -A INPUT --src 4.5.6.7/12 -p tcp -i eth0 --dport 21 -m state --state NEW -j ACCEPT
iptables -A INPUT --src 8.9.1.2/31 -p tcp -i eth0 --dport 21 -m state --state NEW -j ACCEPT

创建新链,将所有流量发送到该链,对所有美国子网使用 RETURN,并在链中设置最终规则 DROP 所有其他内容。这应该是更好的方法,因为需要进行的条件检查较少。

iptables -P INPUT DROP
iptables -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -N USNETS
iptables -A USNETS -s 1.2.3.4/24 -j RETURN
iptables -A USNETS -s 4.5.6.7/12 -j RETURN
iptables -A USNETS -s 8.9.1.2/31 -j RETURN
iptables -A USNETS -j DROP # drop everything that isnt in USNETS
iptables -A INPUT -j USNETS # send everything to USNETS
# PERMIT traffic that
iptables -A INPUT -p tcp -i eth0 --dport 21 -m state --state NEW -j ACCEPT

通过使用单独的更改,您甚至可以在分配新地址空间时添加/删除 USNETS 链中的内容,而无需重置整个防火墙。我真的很怀疑这个想法是否值得付出努力。外面的人将能够进入,他们只需使用代理即可。


您甚至可以反过来做,完成链中的所有端口/服务。

iptables -P INPUT DROP
iptables -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -N SRVCS
iptables -A SRVCS -p tcp -i eth0 --dport 21 -m state --state NEW -j RETURN
iptables -A SRVCS -j DROP # drop everything that isnt in allowed SRVCS
iptables -A INPUT -j SRVCS # send everything to SRVCS
# PERMIT traffic that has been returned from SRVCS
iptables -A INPUT --src 1.2.3.4/24 -j ACCEPT
iptables -A INPUT --src 4.5.6.7/12 -j ACCEPT
iptables -A INPUT --src 8.9.1.2/31 -j ACCEPT

答案2

将您的默认策略设置为 DROP,然后为所有位于美国的子网添加 ACCEPT 规则。

就像是:

iptables -P INPUT DROP
iptables -A INPUT --src 1.2.3.4/24 -j ACCEPT
iptables -A INPUT --src 4.5.6.7/12 -j ACCEPT
iptables -A INPUT --src 8.9.1.2/31 -j ACCEPT
...

答案3

但是,如果你决定制作大型阻挡装置,你应该研究一下ipset它可以非常快的速度处理非常大的列表。

使用 ipset,您可以让一条 iptable 规则作用于一组规则。无需为每个子网都设置规则。

但是主流内核并不支持 ipset,需要自己编译模块,具体说明可以参见 ipset 站点。

答案4

我是 OP (Jim),我回到这个帖子看看是否有任何新的答案。我也回来亲自感谢 Zoredache 的所有帮助和他为他的答案付出的努力。我已经在 UNIX 环境中工作了很多年,对“Linux”数据包过滤器几乎没有经验,但我知道davr 和 Warner都是错误的,经过这么长时间的等待,我才得出结论,他们不知道正确答案是什么。

所以,再次感谢 Zoredache 的所有帮助!我倾向于同意你关于封锁所有国家的观点,因为这不值得;如果他们愿意,他们可以代理加入。

相关内容