跳至内容

Nginx 怎么设置“只允许某个国家的 IP 访问网站”

发布日期:
作者:
评论数:1 评论

该教程适用于通过apt(debian仓库)方式安装的nginx。

要在 Nginx 中设置“只允许某个国家的 IP 访问网站”,需要借助 GeoIP2 模块 来识别访客的 IP 所属国家,然后基于此设置访问规则。

安装 geoip2 模块(如已安装请忽略):

sudo apt update
sudo apt install libnginx-mod-http-geoip2

安装 geoip2 模块后,系统里面会有下面这个文件:

/usr/lib/nginx/modules/ngx_http_geoip2_module.so

现在可以配置 geoip2只允许某个国家 IP 访问网站,并拒绝其他国家的访问。以下是配置步骤:

第 1 步:下载 GeoIP2 数据库

创建一个目录来存放数据库:

sudo mkdir -p /etc/nginx/geoip2

下载 GeoLite2-Country 数据库 .mmdb 文件并放入存放数据库的目录:

sudo wget -O /etc/nginx/geoip2/GeoLite2-Country.mmdb https://github.com/P3TERX/GeoLite.mmdb/raw/download/GeoLite2-Country.mmdb

第 2 步:配置 geoip2 参数

这里以只允许中国ip访问网站为例,在 /etc/nginx/nginx.conf 中的 http {} 区块添加下面加粗部分的内容:

http {
    # 加载 GeoIP2 国家数据库
    geoip2 /etc/nginx/geoip2/GeoLite2-Country.mmdb {
        auto_reload 5m;
        $geoip2_country_code default=ZZ source=$remote_addr country iso_code;
    }

    map $geoip2_country_code $allowed_country {
        default no;
        CN yes;  # 只允许中国ip
    }

    ...
}

如果需要配置允许多个国家,例如允许中国和美国,就在 CN yes; 下面多加一行 US yes; 即可。

如果要只拒绝中国ip,将里面的 default 后面改成 yesCN 改成 no 即可。

查看ISO 3166-1 alpha-2标准的国家代码,可以参考:https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes

第 3 步:在你的网站配置中限制非中国 IP

例如 /etc/nginx/sites-available/default ,添加下面加粗部分的内容,非中国ip访问会返回403 Forbidden:

server {
    listen 80;
    server_name domian.com;

    root /usr/share/nginx/html;
    index index.php index.html index.htm;

    # 拒绝非中国ip访问
    if ($allowed_country = no) {
        return 403;
    }

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
    }
}

第 4 步:重启 Nginx 生效

先检查配置是否正确:

sudo nginx -t

然后重启Nginx:

sudo systemctl restart nginx

可选:自动更新GeoLite2-Country.mmdb

用 root 用户添加定时任务:

sudo crontab -e

添加以下定时任务(每天凌晨 3 点更新):

0 3 * * * wget -q -O /etc/nginx/geoip2/GeoLite2-Country.mmdb https://github.com/P3TERX/GeoLite.mmdb/raw/download/GeoLite2-Country.mmdb

含义说明:

字段含义
0 3 * * *每天凌晨 3 点执行
wget -q -O安静下载并覆盖保存为目标文件

你也可以换一个时间,比如 2 点或 4 点。


可选:立即测试更新是否成功

你可以手动执行这行命令,看看是否正常:

wget -q -O /etc/nginx/geoip2/GeoLite2-Country.mmdb https://github.com/P3TERX/GeoLite.mmdb/raw/download/GeoLite2-Country.mmdb

成功后你可以用 ls -l 查看文件时间:

ls -l /etc/nginx/geoip2/GeoLite2-Country.mmdb

GeoIP2 自动生效无需重启 Nginx

由于在 geoip2 配置中启用了:

auto_reload 5m;

这表示 Nginx 会每 5 分钟检查一次 .mmdb 文件有没有变化,发现变化就自动重新加载,无需手动重启服务。

回复 Mia (Area 52) 取消回复

您的邮箱地址不会被公开。 必填项已用 * 标注