宝塔面板“禁止海外访问”实为ip段匹配模拟地域判断,非真实gps定位;常见失效原因包括站点级开关未开启、ip库过期、cdn隐藏真实ip;需全局与站点两级开关同时启用才生效,且不可同时开启禁止国内外访问。

宝塔面板本身不直接支持“按国家封禁海外IP”,所谓“禁止海外访问”本质是用IP段匹配模拟地域判断,准确率取决于IP库质量与更新频率——它不是真查GPS坐标,而是查这个IP属于哪个国家分配的网段。
为什么「禁止海外访问」开关开了却还有国外IP能进来
常见原因有三个:
- Nginx免费防火墙的「全局设置」开了,但目标站点的「站点级开关」没开——两个都得开才生效
- IP地理库过期,比如俄罗斯新分配的
95.108.0.0/16段还没收录,就会漏放 - 用户用的是CDN(如Cloudflare),真实IP被隐藏,防火墙看到的是CDN节点IP(多在国内或美西),无法识别源地址
验证是否生效:在网站日志里搜access.log中非国内IP的200响应,如果仍有大量US、JP等国家码,说明拦截失败。
用Nginx免费防火墙插件开启「禁止海外访问」
这是最省事、也最常用的方式,适合绝大多数HTTP/HTTPS站点:
- 进「软件商店」搜
Nginx免费防火墙,安装后点击「设置」 - 在「全局设置」页,把
禁止海外访问设为开启 - 返回「网站」列表,点进你要保护的站点 → 「设置」→ 左侧选「防火墙」→ 同样开启
禁止海外访问 - 保存后重载Nginx,不用重启服务器
注意:禁止海外访问和禁止国内访问不能同时开,否则只剩127.0.0.1和内网段能连,网站将完全不可达。
手动导入国家IP段实现更稳定屏蔽
当需要绕过IP库延迟、或明确知道攻击源集中在某国时,直接导入CIDR网段更可靠:
- 去
ipdeny.com下载目标国家的.zone文件,例如us.zone - 用SSH登录服务器,执行:
ipset -N usip hash:net创建规则集 - 逐行导入:
while read ip; do ipset -A usip $ip; done - 加iptables规则:
iptables -I INPUT -p tcp -m set --match-set usip src -j DROP
这种方式不依赖Nginx模块,对所有端口生效(包括宝塔面板自身),但缺点是每次IP段更新都要手动重载,且不区分HTTP/HTTPS流量。
return 444 配合 default_server 拦截IP直连(防恶意解析)
海外IP能访问你的网站,有时根本不是冲着域名来的,而是直接用你的服务器IP访问——这常被用于恶意解析、SEO劫持或广告联盟误判。光封国家没用,得先断掉IP直连入口:
- 进「网站」→「添加站点」,域名填你的公网IP(如
123.123.123.123),根目录可设为/www/wwwroot/default - 点该站点「设置」→「配置文件」,确保
server_name就是这个IP,并含default_server标记 - 在
server { }块里加一行:return 444; - 保存后点「重载Nginx」
return 444比403或404更彻底——它不发任何响应包,客户端直接超时,连扫描器都难判断服务是否存在。这点容易被忽略,但恰恰是防止IP被滥用的第一道防线。











