仅允许 2 个国家/地区的 IP 访问服务器的最佳方式

仅允许 2 个国家/地区的 IP 访问服务器的最佳方式

我有一个带有 apache2 和 3 个虚拟主机的 VPS,我看到很多 ip 试图访问不存在的资源,我还看到很多 ssh 错误的用户和密码绑定访问服务器,所以我需要只允许传入流量到一个国家,并且还允许所有谷歌广告 ip 访问网站和所有谷歌机器人 ip、谷歌爬虫等等,也许还有其他优秀爬虫的所有其他 ip。

我阅读了实现此目的的各种方法,htacces、iptables、nftables(最好是 iptables,因为它可以同时管理 ipv4 和 1pv6)、github ipset-country 以及其他一些方法。

但我需要知道什么是最好的,因为我也读到过它会消耗 vps 的资源。我也在 Maxmind 中创建了一个免费帐户并拥有密钥,但我很困惑,我读了很多但还不确定什么是我需要的最佳方式,只允许 1 或 2 个国家/地区访问我的服务器。

Ubuntu 18.04 Apache/2.4.29

答案1

这里存在多层次的问题,且可能的答案是相互交错的。

从技术角度来看,iptables 和 nftables 之间没有太大区别——甚至可以使用另一个来实现。您可能还想看看更高级的管理工具firewalld。ipset 功能是个好主意,因为它允许过滤大量 ips 列表而不会对性能造成太大影响。请注意,fail2ban 等工具使用 iptables、nftables 和 ipsets。

从功能角度来看,将整个国家列入白名单可能很困难,如果您尝试这样做,很可能会错过一些子网并意外阻止对您服务器的访问。当然,将一个国家列入黑名单并不容易。对于 http / https,我建议根据性能需求适时列入黑名单。但是,您采用哪种方法取决于您对谁应该和不应该访问您的服务器的确定程度。

与其完全手动维护白名单或黑名单,最简单的管理方法是使用类似 fail2ban 的工具并启用内置过滤器,这样恶意行为者在多次点击不存在的 URL 后就会自动被禁止。Fail2ban 将减少即时流量,然后您可以查看日志并确定是否需要使用防火墙规则或直接 iptables 规则等永久阻止某些地址(或子网)。

对于 ssh,我建议只将绝对需要 ssh 的地址列入白名单,将其他所有地址列入黑名单。如果不这样做,我见过每小时数千到数万次无用的 ssh 攻击。如果您不确定传入的 ssh 地址,端口敲击可能会有所帮助,但设置起来可能很复杂。

如果您使用 iptables/nftables(由firewalld 和/或fail2ban 管理)进行阻止,您的服务器将无法被目标访问并且似乎消失了,而攻击者通常会放弃并继续前进。

像 htaccess 这样的程序会阻止访问,但不会为您节省太多性能,因为 Web 服务器仍需响应,并且您的服务器仍会成为攻击者的目标。fail2ban 之类的程序还具有动态响应的优势,而 htaccess 通常是静态的。

答案2

长话短说。如果根据您对问题的评论,您只是在问哪种工具更适合阻止/允许大量 IP 地址,在 OS 防火墙和 Apache mod_access 之间进行选择,那么防火墙无疑是更合适的工具。无论您使用哪一个,iptables/ipsetnftables,至少对于您的情况而言,它们没有功能差异。


这两种工具都没有提到“国家”。互联网协议中没有“国家”这样的术语。我不确定是否有可能获得“分配”给某个国家的所有 IP 前缀的当前列表。如何定义“与 IP 关联的国家”关系甚至并不总是显而易见的。如果德国的某个人在 AWS us-west-1 中运行 VM,你会将他使用的 IP 与德国还是美国关联?各种 VPN 服务也给游戏增加了一些复杂性。因此,无论你选择哪种工具,你都需要发明自己的方式来填充和维护权限列表,决定为自己您应该允许哪些 IP 地址。您可以从 GeoIP 服务获得一些帮助,但您不应该仅仅依赖它们。

请注意Apache HTTPd 手册总是说你应该避免使用.htaccess并将所有配置放入服务器配置文件中。.htaccess 仅用于大规模网络托管,客户无法通过任何方式编辑服务器配置文件。如果您是服务器管理员,可以编辑主服务器httpd.conf或其中明确包含的文件,请不要使用.haccess并禁用它(AllowOverride None)。

这是尤其重要对于你的情况,因为 .htaccess 被搜索和解析每次请求时,如果你把大量的 IP 前缀列表放进去,它会显著降低你的服务器速度,无论是“允许”还是“拒绝”请求。这就是为什么我一直在考虑“防火墙与 mod_access 指令”的原因[将哪个放入服务器配置中并不是放入 .htaccess]”。但是,如果mod_access(正确地)这样使用,维护列表会很不方便,因为任何更改都至少需要重新加载服务器。而iptables/ipsetnftables都允许使用 IP 集,这些 IP 集很容易动态更新,并且不会减慢每个请求的速度(那么多)。


关于 的说明fail2ban。它使用iptables/ipsetnftables作为后端,它只是一个动态构建规则的工具。如果您预先有一个具体的规则列表,则不需要 fail2ban。此外,当规则列表很大时,它的行为会非常出乎意料。例如,我遇到过一个案例,当时对运行 fail2ban 的服务器发起了 DDoS 攻击,而 fail2ban 使问题更糟糕如果没有它,情况会是这样的。这是因为它将列表构建为大约 26000 个条目,但 fail2ban 似乎从未测试过如此大的列表。当我们尝试重新启动它时,它会在一个小时内逐一删除规则,然后它实际上重新启动了,然后它又开始在一个小时内逐一添加规则。在超载的服务器上。

相关内容