
— 特色专栏 —
大家好,我民工哥!
之前分享过一篇文章关于:如何用 Nginx 禁止国外 IP 访问网站。
这种方法是通过 NGINX 的 ngx_http_geoip2 模块来禁止国外 IP 访问网站,需要下载安装 geoip2 扩展依赖,添加 ngx_http_geoip2 模块,还得编译 Nginx 等一系统的操作。
今天,给大家介绍一个无需编译 Nginx 也能实现封禁国外 IP 方法。

这个方法就是通过使用亚太网络信息中心(APNIC)的官方 IP 数据,然后,配合 Nginx 原生功能实现精准拦截,非常方便。
废话不多说,直接上教程,三步操作即可:
1、获取中国IP段数据
APNIC 负责亚太地区IP地址分配,它的公开数据文件中记录了所有分配给中国大陆的 IP 地址段。
我们可以可通过以下方式获取最新数据:
访问 APNIC 官方统计页面(http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest),下载最新数据文件delegated-apnic-latest。

然后,通过使用脚本解析文件,提取中国IPv4和IPv6地址段,导入到指定的文件中,操作如下:
#!/bin/bash
wget -c http://ftp.apnic.net/stats/apnic/delegated-apnic-latest
cat delegated-apnic-latest | awk -F'|' '/CN/&&/ipv4/ {print $4 "/" 32-log($5)/log(2)}' > ipv4.txt
cat delegated-apnic-latest | awk -F'|' '/CN/&&/ipv6/ {print $4 "/" 32-log($5)/log(2)}' > ipv6.txt
2、将 IP 段导入 Nginx 配置
Nginx 原生支持通过 geo 指令实现基于 IP 的访问控制。
然后,我们结合APNIC数据,将中国IP段导入Nginx配置。
定义IP段变量:在Nginx配置文件的http块中,使用map指令定义中国IP段变量。
http {
map $remote_addr $is_china_ip {
default 0;
#导入IPv4中国IP段
include /path/to/ipv4.txt;
#导入IPv6中国IP段(如需)
include /path/to/ipv6.txt;
}
}
注意:ipv4.txt和ipv6.txt需按Nginx map指令格式调整,每行一个IP段,如 10.0.0.1/24 1;。
3、配置 Nginx 拦截规则
在Nginx的server块中,根据$is_china_ip变量配置拦截规则。
允许中国IP访问,若需仅允许中国IP访问,配置如下。
server {
listen 80;
server_name example.com;
# 允许中国IP访问
if ($is_china_ip = 0) {
return 403; # 非中国IP返回403禁止访问
}
# 其他配置...
}
拒绝中国IP访问,若需拒绝中国IP访问,将条件取反即可。
server {
listen 80;
server_name example.com;
# 拒绝中国IP访问
if ($is_china_ip = 1) {
return 403; # 中国IP返回403禁止访问
}
# 其他配置...
}
定期更新IP数据:APNIC 分配的 IP 段可能变更,建议定期(如每天)执行第一步脚本,更新 IP 段数据,并重载 Nginx 配置。
# 更新IP段数据
./ip_update_script.sh
# 重载Nginx配置
nginx -s reload
方案名称 | 实现方式 | 核心优点 | 核心缺点 | 适用场景 |
|---|---|---|---|---|
Nginx原生allow/deny | 直接配置allow/deny指令,支持CIDR网段 | 原生支持,配置简单直接;无需额外模块 | 规则数量多时性能下降;需手动维护IP列表;规则顺序敏感 | 小规模IP封禁、简单路径级访问控制 |
iptables系统防火墙 | Linux系统级规则链过滤,支持IP/网段/协议 | 系统层面拦截,性能高;可过滤内部网络流量 | 规则顺序严格依赖配置顺序;内部攻击防护弱;配置复杂度高 | 系统级防火墙、内部网络防护、端口级封禁 |
ngx_http_geoip2_module | 基于MaxMind GeoIP2数据库生成地理位置变量 | 支持国家/城市级精细控制;可结合Nginx变量实现动态策略。 | 需安装第三方模块及数据库;配置复杂;需定期更新数据库 | 基于地理位置的访问控制、区域定向服务 |
Fail2ban动态封禁 | 监控Nginx日志,通过模式匹配自动更新防火墙规则 | 自动化封禁,减少人工干预。支持动态调整封禁时长。可联动邮件告警。 | 依赖日志分析准确性;可能误判正常流量;需配置复杂规则链 | 动态攻击防护、自动化封禁、日志驱动型防护 |
Nginx+Redis/Lua动态方案 | 通过Lua脚本或Redis存储动态加载封禁IP列表 | 支持分布式环境共享黑名单;毫秒级黑名单查询;可扩展复杂逻辑 | 需额外组件支持;配置开发成本高;需维护Redis集群 | 分布式系统、高并发动态封禁、集群化防护 |
APNIC数据+ipset方案 | 基于APNIC官方IP数据生成中国IP段,通过ipset+iptables实现 | 基于权威IP数据,覆盖全面;支持10万+IP段高性能处理;可定时自动更新 | 需定期更新IP数据;配置复杂;依赖系统工具链 | 大规模地理围栏防护、中国专属防火墙、高性能IP过滤 |
性能表现:ipset方案在处理大规模IP段时性能最优(支持10万+规则),原生allow/deny在规则数量多时性能下降明显。
自动化能力:Fail2ban和Nginx+Redis方案支持动态封禁,而原生allow/deny需手动维护。
精准度:geoip2模块支持国家/城市级精细控制,APNIC数据方案基于权威IP分配数据。
维护成本:原生方案维护成本低但扩展性弱,动态方案需额外组件支持但自动化程度高。
适用场景:小规模场景推荐原生allow/deny,大规模地理围栏推荐APNIC+ipset,动态攻击防护推荐Fail2ban或Nginx+Redis。
建议根据实际业务规模、运维能力及防护需求选择方案,并定期更新IP数据(如APNIC数据)以确保防护有效性。
本文介绍的方案,无需第三方模块,纯原生实现降低运维复杂度。
通过依赖权威数据源,确保IP覆盖的准确性与时效性。
而且,性能损耗极低,适合高并发场景。
同样适用于需要快速部署地理围栏、合规性访问控制或防御境外攻击的场景,为Web服务提供轻量级、高可靠的IP级防护屏障。
