业务仅服务中国大陆用户时,可通过 APNIC 官方 IP 数据配合 Nginx 原生功能,3 步精准拦截境外 IP 攻击,无需编译 Nginx、注册 MaxMind 账号或安装额外模块。

为什么推荐 APNIC 方案?

对比项

MaxMind GeoIP2

手动维护 IP

APNIC 官方方案

是否免费

❌ 需注册账号

✅ 是

✅ 完全公开免费

是否需编译 Nginx

⚠️ 需要

✅ 否

✅ 否(原生支持)

数据权威性

商业数据库

易过时

✅ 亚太官方机构发布

适用系统

依赖模块

通用

✅ 所有 Linux + 任意 Nginx 版本

注:相比其他 Nginx 动态封禁方案,该方案更简单方便,适配国内外 IP 直接封堵的需求(后续将推出防火墙结合 APNIC 的进阶方案)。

实战:3 步实现 “仅限中国大陆访问”

本方案适用于:任何 Linux 系统 + 任何来源的 Nginx(官方源、宝塔、LNMP、手动编译等)

第一步:获取中国大陆 IP 段(来自 APNIC 官方)

APNIC 每天更新各国 IP 分配清单,地址永久免费开放:http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest

  1. 下载或查看数据

bash

运行

# 下载到文件
wget http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest
# 直接输出到终端
curl -sSL https://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest
  1. 创建自动转换脚本(保存为/usr/local/bin/gen-cn-allow.sh

bash

运行

#!/bin/bash
# 从 APNIC 官方数据生成 Nginx allow 规则
# 小柳实验室  xlsys.cn
# 适用于任意 Linux 系统(CentOS/Ubuntu/Debian/Alma/Rocky 等)
OUTPUT_DIR="/etc/nginx/conf.d"
mkdir -p "$OUTPUT_DIR"
echo "正在下载 APNIC 最新数据..."
wget -qO- http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest | \
awk -F'|' '
  $2 == "CN" && $3 == "ipv4" {
    prefix = $4;
    len = 32 - log($5) / log(2);
    print "allow " prefix "/" len ";";
  }
  $2 == "CN" && $3 == "ipv6" {
    print "allow " $4 "/" $5 ";";
  }' > /tmp/cn_allow.list
# 分离 IPv4 和 IPv6(避免混合导致 Nginx 报错)
grep -E 'allow [0-9]+\.' /tmp/cn_allow.list > "$OUTPUT_DIR/china-ipv4.conf"
grep -E 'allow [0-9a-fA-F:]+' /tmp/cn_allow.list > "$OUTPUT_DIR/china-ipv6.conf"
# 添加注释头
sed -i "1i# Auto-generated from APNIC — $(date)" "$OUTPUT_DIR/china-ipv4.conf"
sed -i "1i# Auto-generated from APNIC — $(date)" "$OUTPUT_DIR/china-ipv6.conf"
rm -f /tmp/cn_allow.list
echo "✅ 中国 IP 白名单已生成:"
echo "   IPv4: $OUTPUT_DIR/china-ipv4.conf"
echo "   IPv6: $OUTPUT_DIR/china-ipv6.conf"
  1. 赋权并运行

bash

运行

chmod +x /usr/local/bin/gen-cn-allow.sh
sudo /usr/local/bin/gen-cn-allow.sh
  1. 配置每日自动更新(防止新 IP 段遗漏)

bash

运行

echo "0 3 * * * root /usr/local/bin/gen-cn-allow.sh >/dev/null 2>&1" | sudo tee /etc/cron.d/update-cn-ip

第二步:配置 Nginx 仅放行中国 IP

编辑站点配置文件(如/etc/nginx/conf.d/your-site.conf):

nginx

server {
    listen 80;
    listen [::]:80;
    server_name your-domain.com;
    # 引入中国 IP 白名单(顺序很重要!)
    include /etc/nginx/conf.d/china-ipv4.conf;
    include /etc/nginx/conf.d/china-ipv6.conf;
    # 可选:放行本地回环(避免自己被拦)
    allow 127.0.0.1;
    allow ::1;
    # 拒绝所有未匹配的请求
    deny all;
    location / {
        root /var/www/html;
        index index.html;
        # 你的其他配置...
    }
}

关键规则:Nginx 按顺序匹配allow/deny,必须先写allow,再写deny all


第三步:重载生效 & 验证

bash

运行

# 检查语法
nginx -t
# 重载配置(平滑生效,不影响在线用户)
nginx -s reload
# 或 systemctl reload nginx

验证方法:

  • 国内手机 4G 访问 → 应正常打开

  • 使用境外代理或 VPS 访问 → 应返回 403 Forbidden

  • 查看日志:tail -f /var/log/nginx/access.log | grep '403'

重要注意事项

  1. CDN 用户特别提醒:使用 Cloudflare、阿里云 CDN、腾讯云 CDN 等服务时,用户真实 IP 会被隐藏,Nginx 仅能识别 CDN 节点 IP(多为境外),直接启用规则会导致所有用户被拦截。

    • 解决方案:在 CDN 后台开启 “回源携带真实 IP”(如 Cloudflare 的 CF-Connecting-IP),或改用 CDN 自带的地域封禁功能。

  2. IPv6 支持按需启用:若服务器未启用 IPv6,可删除listen [::]:80;china-ipv6.conf引用。

  3. 性能影响极小:中国大陆 IP 段约 6000 + 条,Nginx 使用高效前缀匹配,实测无明显延迟。

其他方案对比(供参考)

方案

优点

缺点

推荐场景

本文方案(APNIC + allow/deny)

免费、开源、无需模块、全平台兼容

需定期更新 IP 段

自主运维、无 CDN、追求可控

CDN 地域封禁

5 分钟上线、自动更新、抗 DDoS

依赖第三方、高级功能收费

已接入 CDN 的网站

iptables + ipset

内核层拦截,性能极高

配置复杂,Docker/NAT 环境需调试

高并发、安全敏感业务

GeoIP2(MaxMind)

支持国家 / 城市级判断

需账号、需编译 Nginx