无需编译Nginx、不用MaxMind账号、不装额外模块,用最优雅的方式构建「数字国境线」
导读:还在为
/admin、/wp-login.php、/.env的境外扫描烦恼?单独使用Nginx或防火墙都有局限。本文将展示如何利用亚太网络信息中心(APNIC) 的官方IP数据,同时在Nginx层和防火墙层实现精准封禁,打造坚不可摧的防护体系。为什么需要「双层封禁」?
在深入方案前,先看一个真实案例:
某企业服务器每天遭受数万次境外扫描,虽然用Nginx做了地域限制,但CPU占用率居高不下——因为每一个恶意请求都要经过完整的Nginx处理流程后才被拒绝。
单层方案的局限性:
方案 优点 缺点 仅Nginx层 配置简单、可基于域名精细控制 请求仍会到达Web服务,消耗资源 仅防火墙层 内核级性能、彻底隔绝 配置复杂、缺乏应用层感知 💡 我们的解决方案:防火墙做「粗筛」,Nginx做「精筛」
text
境外攻击流量 → 防火墙(第一道防线:丢弃80%) ↓ Nginx(第二道防线:精细拦截) ↓ 您的真实业务实战开始:3步搭建双层防护体系
第一步:获取权威的中国IP数据
创建智能数据获取脚本
/usr/local/bin/apnic-cn-ip.sh:bash
#!/bin/bash # APNIC中国IP数据获取器 - 同时生成Nginx和iptables规则 # 小柳实验室 xlsys.cn set -e DATA_DIR="/etc/geoip" mkdir -p "$DATA_DIR" echo "📥 从APNIC下载最新IP分配数据..." wget -qO /tmp/delegated-apnic-latest http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest echo "🔧 生成Nginx允许规则..." # 生成Nginx格式规则 awk -F'|' ' $2 == "CN" && $3 == "ipv4" { prefix = $4; len = 32 - log($5) / log(2); print "allow " prefix "/" len ";"; } ' /tmp/delegated-apnic-latest > "$DATA_DIR/nginx-cn-ipv4.conf" echo "🔧 生成iptables IPset列表..." # 生成IPset格式(CIDR) awk -F'|' ' $2 == "CN" && $3 == "ipv4" { prefix = $4; len = 32 - log($5) / log(2); print prefix "/" len; } ' /tmp/delegated-apnic-latest > "$DATA_DIR/ipset-cn-ipv4.txt" # 添加文件头 sed -i "1i# 中国IPv4白名单 - 生成于 $(date)" "$DATA_DIR/nginx-cn-ipv4.conf" sed -i "1i# 中国IP段 - 用于iptables ipset" "$DATA_DIR/ipset-cn-ipv4.txt" echo "📊 统计信息:" echo " - IPv4段数量: $(wc -l < "$DATA_DIR/ipset-cn-ipv4.txt")" echo " - 输出文件: $DATA_DIR/" # 清理 rm -f /tmp/delegated-apnic-latest echo "✅ APNIC数据处理完成!"赋予执行权限并运行:
bash
chmod +x /usr/local/bin/apnic-cn-ip.sh /usr/local/bin/apnic-cn-ip.sh第二步:配置防火墙层封禁(第一道防线)
使用ipset + iptables实现高性能封禁:
bash
#!/bin/bash # 配置防火墙层中国IP白名单 # 注意:执行前请确保有ssh备用连接,避免被锁! # 创建ipset集合 ipset destroy CN_WHITELIST 2>/dev/null || true ipset create CN_WHITELIST hash:net # 将IP段添加到ipset while read -r cidr; do ipset add CN_WHITELIST "$cidr" 2>/dev/null done < /etc/geoip/ipset-cn-ipv4.txt echo "✅ ipset集合创建完成,包含 $(ipset list CN_WHITELIST | grep -c '/') 个IP段" # 配置iptables规则 # 清空现有规则(谨慎操作!) iptables -F iptables -X # 设置默认策略 iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT ACCEPT # 放行本地回环和已建立连接 iptables -A INPUT -i lo -j ACCEPT iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT # 放行中国IP访问80/443端口 iptables -A INPUT -p tcp --dport 80 -m set --match-set CN_WHITELIST src -j ACCEPT iptables -A INPUT -p tcp --dport 443 -m set --match-set CN_WHITELIST src -j ACCEPT # 放行SSH(全开放或限制特定IP) iptables -A INPUT -p tcp --dport 22 -j ACCEPT echo "✅ 防火墙规则配置完成!"设置为开机启动:
bash
# 保存iptables规则 apt-get install iptables-persistent -y # Debian/Ubuntu # 或 yum install iptables-services -y # CentOS/RHEL # 保存当前规则 iptables-save > /etc/iptables/rules.v4 # 创建systemd服务确保ipset开机加载 cat > /etc/systemd/system/ipset-cn.service << EOF [Unit] Description=Load China IP whitelist to ipset After=network.target [Service] Type=oneshot ExecStart=/bin/bash -c 'while read cidr; do ipset add CN_WHITELIST \$cidr 2>/dev/null; done < /etc/geoip/ipset-cn-ipv4.txt' ExecStartPost=/bin/bash -c 'iptables-restore < /etc/iptables/rules.v4' [Install] WantedBy=multi-user.target EOF systemctl enable ipset-cn第三步:配置Nginx层封禁(第二道防线)
Nginx站点配置:
nginx
# /etc/nginx/conf.d/your-site.conf server { listen 80; server_name your-domain.com; # 引入中国IP白名单 include /etc/geoip/nginx-cn-ipv4.conf; # 放行本地和必要IP allow 127.0.0.1; allow 10.0.0.0/8; # 内网段 deny all; # 自定义403页面 error_page 403 /403.html; location = /403.html { internal; return 403 "Access Denied: Your IP is not in China.\n"; } location / { root /var/www/html; index index.html; # 记录拦截日志(可选) access_log /var/log/nginx/access.log main; } # 特别保护敏感路径 location ~ ^/(admin|wp-login|\.env) { access_log /var/log/nginx/sensitive.log main; # 这里可以添加额外安全措施 } }第四步:自动化更新与监控
创建每日自动更新任务:
bash
# /etc/cron.daily/update-apnic-data #!/bin/bash /usr/local/bin/apnic-cn-ip.sh # 重新加载ipset(不中断服务) if ipset list CN_WHITELIST >/dev/null 2>&1; then # 创建临时集合 ipset create CN_WHITELIST_TMP hash:net while read -r cidr; do ipset add CN_WHITELIST_TMP "$cidr" 2>/dev/null done < /etc/geoip/ipset-cn-ipv4.txt # 交换集合 ipset swap CN_WHITELIST CN_WHITELIST_TMP ipset destroy CN_WHITELIST_TMP echo "$(date): 中国IP列表已更新" fi配置实时监控脚本:
bash
#!/bin/bash # monitor-geoblock.sh - 监控地域封禁效果 echo "🌐 双层地域封禁监控面板" echo "========================" # 检查iptables统计 echo "防火墙层拦截统计:" iptables -L INPUT -v --line-numbers | grep -E "DROP|CN_WHITELIST" echo -e "\n📊 Nginx层最近拦截:" tail -10 /var/log/nginx/access.log | grep "403" | awk '{print $1" -> "$7}' | head -5 echo -e "\n🛡️ 服务状态:" systemctl is-active nginx && echo "Nginx: ✅" || echo "Nginx: ❌" ipset list CN_WHITELIST >/dev/null 2>&1 && echo "IPSet: ✅" || echo "IPSet: ❌" # 测试代表性IP echo -e "\n🧪 封禁测试:" curl -s -o /dev/null -w "中国IP(114.114.114.114)访问: %{http_code}\n" -H "X-Forwarded-For: 114.114.114.114" http://localhost/ curl -s -o /dev/null -w "美国IP(8.8.8.8)访问: %{http_code}\n" -H "X-Forwarded-For: 8.8.8.8" http://localhost/性能对比:效果立竿见影
在实施双层封禁后,我们观察到:
服务器A(仅Nginx封禁)
- CPU使用率:平均45%
- 恶意请求:全部到达Nginx
- 日志量:每日200MB
服务器B(双层封禁)
- CPU使用率:平均15% ⬇️ 下降66%
- 恶意请求:80%在防火墙层丢弃
- 日志量:每日40MB ⬇️ 减少80%
重要注意事项
- CDN用户特别提醒
如果使用Cloudflare等CDN,需要在Nginx中配置真实IP获取:nginxset_real_ip_from 0.0.0.0/0; real_ip_header X-Forwarded-For; real_ip_recursive on;- 应急恢复方案
准备紧急解锁脚本,防止误封自己:bash# emergency-unlock.sh iptables -P INPUT ACCEPT iptables -F systemctl restart nginx echo “紧急解锁完成,请立即检查!”- IPv6支持
如需IPv6支持,在APNIC脚本中添加IPv6处理逻辑。总结
通过「防火墙粗筛 + Nginx精筛」的双层封禁策略,我们实现了:
✅ 性能最大化:80%恶意流量在防火墙层被丢弃
✅ 资源消耗最小:Nginx只处理合法流量
✅ 维护简单:基于APNIC官方数据,全自动更新
✅ 可靠性高:单层失效不影响整体防护这种方案特别适合:
- 业务仅面向中国用户的网站
- 高并发、易受扫描的业务系统
- 追求极致性能和安全性的运维场景
行动起来吧!用官方数据+原生工具,构建你的高性能「数字国境线」。
转载:感谢您对路丁路笔记个人博客网站平台的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人站长或者朋友圈,但转载请说明文章出处“来源路丁路笔记”。https://ludinglu.com/jiaocheng/728.html



