双剑合璧:APNIC官方数据 + 双层封禁,让境外扫描彻底消失!

无需编译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%

重要注意事项

  1. CDN用户特别提醒
    如果使用Cloudflare等CDN,需要在Nginx中配置真实IP获取:nginxset_real_ip_from 0.0.0.0/0; real_ip_header X-Forwarded-For; real_ip_recursive on;
  2. 应急恢复方案
    准备紧急解锁脚本,防止误封自己:bash# emergency-unlock.sh iptables -P INPUT ACCEPT iptables -F systemctl restart nginx echo “紧急解锁完成,请立即检查!”
  3. IPv6支持
    如需IPv6支持,在APNIC脚本中添加IPv6处理逻辑。

总结

通过「防火墙粗筛 + Nginx精筛」的双层封禁策略,我们实现了:

✅ 性能最大化:80%恶意流量在防火墙层被丢弃
✅ 资源消耗最小:Nginx只处理合法流量
✅ 维护简单:基于APNIC官方数据,全自动更新
✅ 可靠性高:单层失效不影响整体防护

这种方案特别适合:

  • 业务仅面向中国用户的网站
  • 高并发、易受扫描的业务系统
  • 追求极致性能和安全性的运维场景

行动起来吧!用官方数据+原生工具,构建你的高性能「数字国境线」。

转载:感谢您对路丁路笔记个人博客网站平台的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人站长或者朋友圈,但转载请说明文章出处“来源路丁路笔记”。https://ludinglu.com/jiaocheng/728.html
上一篇