使用Nginx禁止国外IP访问网站的设置教程

ShowUNow 发布于 2025-03-13 558 次阅读


写在前面

在上一篇文章中,我们讲到如何通过智能DNS解析来分地域使不通地区的ip通过不同的方式访问我们的网站。但是如果有人通过修改系统hosts文件来强制将域名指定到另一个IP上,那么我们上篇文章所属的方法就会被绕过。

所以这篇文章可以实现的目的就是,当有人想通过修改系统hosts文件来绕过我们的设定好的DNS解析时,就会返回403(或者其他你想返回的特定页面)。从而达到强制访客使用我们想用的方式来访问。

教程

本文以Debian 11系统为例,使用的是腾讯云的系统模板。

1. 打开Nginx的配置文件

通常,Nginx的配置文件位于 /etc/nginx/nginx.conf 或 /etc/nginx/conf.d/default.conf。使用文本编辑器(如vi或nano)打开配置文件。

nano /etc/nginx/nginx.conf 

2. 在配置文件中添加IP黑名单规则

在 http部分中添加以下内容,用于定义IP黑名单

http {
    ...
    geoip_country /path/to/GeoIP.dat; #把这部分修改为 GeoIP.dat的具体路径
    map $geoip_country_code $allowed_country {
        default no;
        CN yes;
    }
}

本人使用的腾讯云提供的Debian 11系统中自带GeoIP.dat,路径为/usr/share/GeoIP/GeoIP.dat 。其他云厂商的请各位自行检查。若没有的话,你可以从MaxMind网站下载免费的GeoIP数据文件,其中包含国家和IP地址的映射关系。

3. 修改服务器配置

在服务器配置部分(server块)中添加以下内容

server {
    ...
    if ($allowed_country = no) {
        return 403;
    }
    ...
}

如果设置为 return 444; 则什么也不返回,就算是错误页面的流量也刷不掉。

这将在每次请求时检查客户端的IP地址,如果不在允许的国家列表中,将返回403 Forbidden错误。当然你也可以通过修改return 的内容来实现返回其他特定的html页面。

4. 保存配置文件并重新加载Nginx

sudo nginx -t
sudo nginx -s reload

之后你可以通过修改一下系统hosts文件来检测一下是否生效!

临时起意搭建的博客,不知道能坚持下去多久。
最后更新于 2025-03-19