你的服务器被某个地区的恶意流量骚扰,最直接的办法就是封掉那个地区的IP段,主流方案有CDN层拦截、系统防火墙封禁、面板插件过滤三种,下面按操作成本从低到高给你拆开讲。
先说清楚,封IP到底封的是什么
很多人以为封IP是封单个地址,这本身没错,但针对“某个地区”这个维度,实际操作上封的是IP段,一个地区会拥有若干连续的IP地址范围,这些范围由区域互联网注册机构分配,像亚太地区的APNIC、欧洲的RIPE NCC,它们维护着全球IP归属数据库。
服务器接收到访客请求时,会读取对方的来源IP,然后对照IP归属库判断这个IP属于哪个国家或地区,命中目标地区就拒绝连接,这套识别的底层能力叫GeoIP,翻译过来就是“地理IP定位”,实现它不需要你自己维护数据库,云服务商和面板工具都已经内置好了接口。
理解了这个原理,你就明白了封禁的粒度取决于IP库的精确度,对普通站长来说,按国家和地区封禁已经完全够用,不需要细分到城市,除非你用的是商业级IP库。
用Cloudflare在边缘节点直接拦截
如果你的服务器套了Cloudflare免费版或付费版,这是最省事、性能损耗为零的方案,因为请求在到达你的源站之前,就已经被Cloudflare全球网络处理了,恶意流量根本摸不到你服务器的真实IP。
操作路径:
登录Cloudflare控制台,进入你的域名,点击左侧菜单“安全性”下的“WAF”,选择“创建规则”,规则名称随便写个“block某国”,字段选择“国家/地区”,运算符选择“等于”,值下拉选择你要封的国家英文名,比如美国就是United States,操作选择“阻止”,然后部署即可。
这套规则最大优势是秒级生效,不需要重启服务器,也不消耗你的带宽和CPU,但有个前提条件,你的域名必须已经托管到Cloudflare,也就是DNS解析走它的网络。
有个细节很多人容易忽略:Cloudflare免费版也支持这个功能,但创建规则的数量有限,好像是5条,如果你是做外贸站,想把十几个国家都封了,可能要考虑升级或改用别的方法。
用Linux防火墙命令做系统级封锁
华为云服务器、简米云ECS或者你自己托管的物理机,只要系统是Linux,就可以用firewalld或iptables配合GeoIP模块实现精准封锁,这个方案的优势是完全免费、不依赖第三方平台,但需要你有一点命令行基础。
以CentOS系统为例,操作分三步:
第一步,安装xtables-addons扩展,它提供了geoip匹配模块:
yum install xtables-addons
第二步,下载GeoIP数据库到指定目录,这一步会自动抓取全球IP段数据:
/usr/libexec/xtables-addons/xt_geoip_download
第三步,创建封禁规则,下面这条命令表示丢弃所有来自美国的入站流量:
iptables -A INPUT -m geoip --src-cc US -j DROP
如果你是Debian或Ubuntu系统,思路完全一样,只是包管理器从yum换成apt,插一句,这个方案更适合有独立运维能力的团队使用,因为它要求你熟悉SSH操作,还要定期更新IP数据库,否则新分配的IP段会漏掉。
更贴近实际的做法是,很多人会把封禁逻辑写进开机脚本里,服务器重启后自动加载规则,官方文档里也提到,iptables规则默认重启后丢失,这一点你要记得处理。
使用宝塔面板的防火墙插件,点几下鼠标搞定
国内的中小站长用宝塔面板的比例相当大,它的官方应用商店里有一个叫“宝塔防火墙”的插件,在“安全”菜单里就能找到,这个插件内置了IP归属地数据库,可以直接按国家勾选封禁。
进入防火墙插件的“地区”标签页,你会看到一张世界地图,想封哪个国家就点哪个国家,然后保存,面板会自动把规则写入到Nginx或Apache的配置里,生成效果等同于在服务器层面拒绝了这些地区的访问。
宝塔面板具体怎么安装这个插件,这里不展开,面板内右上角“应用商店”搜索“防火墙”三个字就能看到。它的默认设置是封禁入站请求,不会影响你服务器主动向外发起连接,所以不用担心里面的软件源更新会挂掉。
和命令行相比,面板方案适合刚接触服务器的人,看完界面就知道自己封了什么,不会出现输错命令把自己SSH端口也封了的尴尬情况。
三种方案横向对比,看你适合哪一种
抛开理论概念,直接看实际配置时会遇到的问题:
| 对比维度 | Cloudflare WAF | 系统防火墙+GeoIP | 宝塔防火墙插件 |
|---|---|---|---|
| 操作难度 | 低,面板点选 | 高,需命令行 | 低,界面点选 |
| 生效速度 | 秒级 | 秒级 | 秒级 |
| 资源占用 | 无 | 微弱 | 微弱 |
| 是否需要第三方 | 需要域名托管 | 不需要 | 不需要 |
| 数据库更新 | 自动 | 手动 | 自动 |
| 适用场景 | 已用CF加速的站点 | 独立服务器 | 宝塔环境 |
选型建议: 如果你手上本身就有Cloudflare在跑,优先用第一种;如果你是独立服务器且技术水平过关,第二种最自由;如果你是刚入行,用宝塔把IP段挡在门外是性价比最高的路径。
还有一种情况你是不是也在纠结,就是单纯用安全组或者防火墙规则来阻止某个IP段,坦白说,云控制台的安全组确实能加规则,但让你手动填一长串IP段很容易出错,而且云平台一般也没有按国家筛选的功能,所以这里不推荐作为首选方案。
封禁之后的运维细节,很多老手也会踩坑
封IP不是配完规则就完事的,后续有几件小事值得你养成习惯。
第一个坑是把你自己也封了。 有相当一部分人在测试规则时,直接把自己当前用的IP段封掉,结果下一秒SSH断开,人进不去服务器,只能跑去机房或云后台的VNC登录才能解封,稳妥的做法是,先查一下你当前的出口IP属于哪个地区,不要把自己的地区勾上。
第二个坑是误伤正常访客。 国内面向海外用户的站点,你在后台开启了某个国家的屏蔽后,如果恰好这个国家的用户是你客户群体,等于亲手把订单往外推,封禁前可以先用访问日志分析一下那个地区的流量构成,判断是攻击多还是正常请求多。
第三个坑是IP数据库时效性。
无论GeoIP还是面板的库,数据都是定期更新的,会存在一定滞后,比如某个地区新分配了一个IP段,库文件里还没收录,这个段的访客就能穿透封禁,宝塔面板会在后台定期获取新版库,手动方案的你要记住自己写了定时任务没有,别指望防火墙能自动更新。
还有个容易被忽略的点,就是日志里看到大量来自那个地区的请求时,如果你没有设置自动封禁策略,这些流量会一直消耗你的系统资源,顺手在Web服务器层加个访问频率限制,比如Nginx的limit_req模块,能让封禁的防护效果更立体。
那些网络上的疑问,一次在这里说明白
问:cloudflare地区封禁和服务器防火墙封禁,哪个更准确?
答:Cloudflare的IP库更新频率远高于普通开源库,而且它是按ASN号码匹配的,能精准识别IP归属,准确率较高,但如果你想在源站层面再加一道保险,两者是可以共存的,互相不冲突。
问:封了某个地区的IP会影响搜索引擎收录吗?
答:目前来看,搜索引擎蜘蛛的爬取来源主要集中在少数几个机房IP段,不会因为你封禁某个国家就停止抓取,但你要确认你封的那个地方不是搜索引擎数据中心所在位置,比如Googlebot使用的IP确实有一部分在美国,如果你连美国也封了,谷歌收录就会出问题,如果主要是针对国内业务,百度蜘蛛的IP是分布在国内的,不影响。
问:华为云服务器没有宝塔面板的情况下,还有别的简单办法吗?
答:华为云控制台的“安全组”里可以直接配置入方向规则,来源填你要封的IP段,协议端口选择全部,策略选择拒绝,你可以在网上搜一下“IP段计算器”,把国家对应的IP段填进去就行,只不过这个过程稍微有点手动,胜在稳定可控。
把某一地区的IP挡在服务器之外,本质上是给自己的站点加一道地理围栏,Cloudflare的WAF规则、Linux防火墙、宝塔插件都是实现它的路径,无论选择哪一种技术方案,都要确保能精准识别访客身份、可快速回滚配置、留有容错余地,比起费劲去封单一攻击IP,按地区封锁往往更能一劳永逸地解决持续性的区域骚扰。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/665073.html





