首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >3 步彻底封杀国外 IP 恶意访问!还不用重新编译 Nginx

3 步彻底封杀国外 IP 恶意访问!还不用重新编译 Nginx

作者头像
民工哥
发布2026-03-24 19:23:03
发布2026-03-24 19:23:03
430
举报

特色专栏

MySQL/PostgreSQL/MongoDB

ElasticSearch/Hadoop/Redis

Kubernetes/Docker/DevOps

Kafka/RabbitMQ/Zookeeper

监控平台/应用与服务/集群管理

Nginx/Git/Tools/OpenStack

大家好,我民工哥!

之前分享过一篇文章关于:如何用 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地址段,导入到指定的文件中,操作如下:

代码语言:javascript
复制
#!/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段变量。

代码语言:javascript
复制
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访问,配置如下。

代码语言:javascript
复制
server {
    listen 80;
    server_name example.com;

    # 允许中国IP访问
    if ($is_china_ip = 0) {
        return 403; # 非中国IP返回403禁止访问
    }

    # 其他配置...
}

拒绝中国IP访问,若需拒绝中国IP访问,将条件取反即可。

代码语言:javascript
复制
server {
    listen 80;
    server_name example.com;

    # 拒绝中国IP访问
    if ($is_china_ip = 1) {
        return 403; # 中国IP返回403禁止访问
    }

    # 其他配置...
}

定期更新IP数据:APNIC 分配的 IP 段可能变更,建议定期(如每天)执行第一步脚本,更新 IP 段数据,并重载 Nginx 配置。

代码语言:javascript
复制
# 更新IP段数据
./ip_update_script.sh

# 重载Nginx配置
nginx -s reload

对比其它IP封禁方案

方案名称

实现方式

核心优点

核心缺点

适用场景

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级防护屏障。

都看到这里了,觉得不错的话,随手点个赞👍 、推荐
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-03-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 民工哥技术之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 对比其它IP封禁方案
    • 关键对比维度说明
  • 结语
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档