如何使用 iptables 仅允许美国 IP 地址?

如何使用 iptables 仅允许美国 IP 地址?

我有一个仅与美国访客相关的网站,我想阻止所有非美国访客访问该网站。鉴于我有一个美国 IP 阻止的 CIDR 列表,使用 iptables 执行此操作的最佳方法是什么?

答案1

最简单的方法是默认阻止所有流量,然后仅允许美国范围的流量。我过去曾使用过这个网站来获取各个国家的 IP 范围。在 iptables 中,您可以创建一条 $US_IPS 接受规则,然后定义它们。请注意,这是很多 IP,可能会降低防火墙的速度,具体取决于硬件规格和传入的流量,因为规则每次都必须查看这么多 IP。如果某些特定 IP 经常访问您的防火墙,您可能希望将该规则置于此接受规则之上,这样它就不必每次都处理庞大的 IP 列表。

https://www.countryipblocks.net/country_selection.php

答案2

您应该研究一下 xtables-addons,这是一个为 netfilter(防火墙)代码编写内核模块以增强/扩展其功能的项目。

其中一个模块是 xt_geoip,它可以将国家代码与从各种来源下载的二进制数据库进行匹配,特别是 MaxMind 的 GeoIPCountry 数据库(免费)。

好处?防火墙规则更加简单,而且根据你的设置,性能会好很多。成本?需要耐心和故障排除技能才能让它发挥作用。

一旦构建并加载了此模块,并且将二进制数据库存储在 /usr/share/xt_geoip 中,您就可以编写一条规则来完成您的任务,例如

iptables -I 输入 1 -m geoip !--src-cc US -j DROP

任何不是来自美国源国家代码的流量都将被丢弃(你明白了)。

此页面概述了该过程:

https://www.howtoforge.com/xtables-addons-on-centos-6-and-iptables-geoip-filtering

买者自慎:我发现这个过程对内核版本非常讲究——对我来说,要在 CentOS 6 上运行它,需要找到并运行旧版本(1.37)的模块,并在 ./configure; make 之前禁用 mconfig 文件中的许多功能,因为它们在我的旧发行版中不受支持。

此外,MaxMind(GeoIP 数据供应商)已更改其文件和布局,因此脚本(即使是最新版本)也无法运行。我利用包含更新版本数据转换脚本的公共 docker 镜像使一切恢复正常:

https://hub.docker.com/r/sander1/xtables_geoip

请注意,在深入研究所有这些内容之前,您应该检查 xtables-addons 和 xt_geoip 是否已被接受到您的发行版使用的内核中。我预计,在某个时候,这实际上可能只是通过运行脚本更新数据,然后简单地添加上面描述的规则的问题。

答案3

虽然默认情况下阻止所有内容可能更容易,但这也意味着任何新分配的美国地址也将被阻止,除非您勤于保持表格为最新。

答案4

您可以使用以下页面轻松获取 iptables 的美国 IP。

https://www.ip2location.com/free/visitor-blocker

在该页面中,选择“美利坚合众国”,然后选择“Linux iptables accept”作为输出格式。

相关内容