如何使用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。 我想阻止所有的子网,只是打开美国的内部。

如果数据包匹配“接受”,则立即被接受。 如果它与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 

创build一个新的链,发送所有的stream量到链中,对所有美国子网使用RETURN,并在链中最后一条规则DROP其他所有。 这应该是更好的方法,因为更less的条件检查将完成。

 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 

将您的默认策略设置为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 ... 

但是,如果你决定做大量的阻塞,你应该看看能够以非常快的速度处理非常大的列表的ipset 。

使用ipset,你可以有一个单一的iptable规则作用于一个集合。 不需要每个子网的规则。

但是,在ipset的主stream内核上还是没有支持。 你需要自己编译模块。 说明可以在ipset站点find。

我是OP(吉姆),我回到这个线程,看看是否有任何新的答案。 我也回来亲自感谢Zoredache的所有帮助和他在答复中的努力。 我已经在UNIX环境中工作了很多年,对“Linux”数据包filter有很less或没有经验,但是我知道davr和华纳是不正确的,并且在我等待他们回来并赎回他们自己,他们不知道正确的答案是什么。

所以,再次感谢您Zoredache所有的帮助! 我倾向于同意你关于阻止所有国家,这是不值得的; 他们也可以代理,如果他们也想。