
一、区域封禁解决什么问题
很多站长会发现:访问日志里大量请求来自境外,IP 归属地五花八门,一看就是在扫漏洞。而自己的业务用户 99% 在国内——那么这些境外流量除了消耗服务器资源、污染数据,没有任何价值。
区域封禁就是给站点装一道”地理门禁”:不是我的目标用户所在区域,直接不让进。
二、WAF 是怎么知道 IP 归属地的
靠 GeoIP 数据库。IP 地址是按块分配的,每个块都有注册机构和地域信息。WAF 加载 GeoIP 库(如 MaxMind、ipip.net 等),就能把任意 IP 映射到:
- 国家 / 地区级(准确率很高,99% 以上)
- 省级(大城市较准,小地方有误差)
- 城市级(精度有限,不建议做严格封禁依据)
- 运营商(AS 号维度,可用于识别云厂商出口)
三、区域封禁与 IP 黑白名单的关系
| 对比项 | 区域封禁 | IP 黑白名单 |
|---|---|---|
| 粒度 | 国家/省,粗粒度 | 单个 IP 或网段,细粒度 |
| 维护成本 | 低,选一下即可 | 高,要持续维护列表 |
| 精度 | 受 GeoIP 精度限制 | 精确 |
| 典型用途 | 批量挡境外扫描 | 放行合作方、封禁固定攻击源 |
实战中两者是配合使用的:区域封禁做”粗筛”,IP 名单做”精调”。
四、配置方法
4.1 云 WAF 控制台
配置路径:
控制台 → 防护配置 → 访问控制 → 区域封禁
├─ 封禁模式:黑名单(封指定区域)/ 白名单(只放行指定区域)
├─ 选择区域:中国大陆 / 美国 / 俄罗斯 / ...
├─ 处置动作:拦截 / JS 验证 / 观察
└─ 例外 IP:可添加不受区域限制的 IP
建议:
1. 先选"观察"模式跑 2-3 天,看误伤多少正常用户
2. 确认无误后切"拦截"
3. 把办公网络、合作方 IP 加入例外
4.2 Nginx 侧实现(需 GeoIP 模块)
# 前提:安装 ngx_http_geoip_module
http {
geoip_country /usr/share/GeoIP/GeoIP.dat;
map $geoip_country_code $allowed_country {
default 0;
CN 1; # 只允许中国大陆
}
}
server {
if ($allowed_country = 0) {
return 403;
}
}
注意:Nginx 原生 GeoIP 需要编译相应模块,宝塔环境一般不自带,配置前先确认模块是否可用(`nginx -V 2>&1 | grep geoip`)。
五、使用中的三个坑
- 误伤:使用代理/VPN 的正常用户可能被误判归属地,建议对”疑似”流量用验证码而非硬拦截
- 精度:省市级别误差较大,做省级封禁时要留余量,别把相邻省份也挡了
- 幽灵 IP:部分 IP 库更新滞后,新分配的 IP 可能归属错误,定期更新 GeoIP 库
六、适用场景判断
| 业务类型 | 是否建议区域封禁 |
|---|---|
| 纯国内业务,境外无用户 | 强烈建议,收益明显 |
| 国内外都有业务 | 不建议全封,可对高风险地区加验证 |
| 跨境电商 / 外贸站 | 不可封禁,改用 IP 信誉库 |
| 面向特定省份的区域服务 | 可用省级白名单 |
七、小结
区域封禁是”低成本、高收益”的防护手段:一个开关就能砍掉大量无价值的境外扫描流量,显著降低源站压力。用之前先观察、先加例外,就能把误伤风险压到最低。
