外贸站服务器带宽跑满溯源异常爬虫流量
外贸站通常依赖稳定带宽来承接海外询盘和产品浏览,一旦带宽被异常爬虫跑满,轻则页面加载缓慢,重则直接超时断连。
本文从零开始,手把手教你定位是哪类爬虫在吃带宽、如何封堵,以及收尾后怎么确认问题已解决。
1. 先确认带宽到底被谁占用了
不要凭感觉猜,用实际数据说话。
登录你的服务器(或宝塔面板),执行以下步骤:
1.1 查看当前网络流量排行
如果你有宝塔面板,直接进入“实时监控” -> “网络”,可以看到当前上行/下行速率,以及各进程的流量占用。
如果没有面板,SSH 执行 nethogs 命令(需先安装:apt install nethogs 或 yum install nethogs)。
它会按进程显示实时流量:
sudo nethogs
观察进程名,如果看到 nginx 或 httpd 占满带宽,说明流量进入了 Web 服务,大概率是爬虫或正常用户请求。
如果看到 sshd 异常占用,可能是被爆破或数据窃取。
1.2 使用 iftop 查看 IP 维度的流量
安装 iftop(apt install iftop),运行:
sudo iftop -i eth0
(请将 eth0 替换为你的网卡名,可用 ip link 查看)
i 界面会显示与服务器通信的 IP 地址及各自的流量占比。
找到流量最高的几个 IP,记下来,下一步分析这些 IP 的请求详情。
2. 深入分析 Nginx 日志找出可疑请求
Nginx 访问日志通常存放在 /var/log/nginx/access.log(宝塔的日志路径在 /www/wwwlogs/ 下)。
先查看最近一段时间内哪个 IP 请求最多:
sudo awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -20
这条命令会统计访问次数最多的前 20 个 IP。
如果某个 IP 的请求数远超其他 IP(例如几千次/分钟),那它就是重点怀疑对象。
进一步查看该 IP 的请求详情,特别是 User-Agent 和请求路径:
sudo grep "122.x.x.x" /var/log/nginx/access.log | awk -F'\"' '{print $6}' | sort | uniq -c | sort -nr | head -10
将 IP 替换成实际可疑 IP。
输出的 User-Agent 常见有三类:
- 正常的搜索引擎(如 Googlebot、Bingbot)—— 如果请求频率合理,可忽略;频率过高可以单独调低速率。
- 恶意爬虫(如
python-requests、curl、Scrapy、AhrefsBot等)—— 这种就该封了。 - 空白或伪造 User-Agent —— 典型爬虫特征。
3. 配置 Web 服务器或防火墙拦截异常爬虫
确认是异常爬虫后,根据你的环境选择以下方式之一进行屏蔽。
3.1 宝塔面板用户:使用「防火墙」或「Nginx 免费防火墙」
进入宝塔面板 -> 网站 -> 对应站点 -> 防火墙。
你可以:
- 在“IP 规则”中直接添加禁止 IP。
- 在“User-Agent 规则”中添加屏蔽的字符串,例如
python-requests、curl/(注意不要屏蔽你自己的 curl 测试)、AhrefsBot等。
3.2 非宝塔环境:修改 Nginx 配置
编辑站点配置(通常在 /etc/nginx/sites-enabled/ 下),在 server 块或 location 块中加入:
if ($http_user_agent ~* (python-requests|curl|scrapy|ahrefsbot) ) {
return 403;
}
保存后执行 nginx -t 检查语法,然后 systemctl reload nginx 重载。
3.3 使用 Fail2ban 动态拦截高频 IP
安装 Fail2ban:
sudo apt install fail2ban
创建一个针对 Nginx 的过滤配置 /etc/fail2ban/jail.local:
[nginx-bot]
enabled = true
port = http,https
filter = nginx-bot
logpath = /var/log/nginx/access.log
maxretry = 50
findtime = 60
bantime = 3600
然后创建过滤器 /etc/fail2ban/filter.d/nginx-bot.conf:
[Definition]
failregex = - -.*"GET.*" (404|403|499) .*
ignoreregex =
(这个例子是封返回 404/403 过多的 IP,你可以根据实际调整。
)重启 Fail2ban:sudo systemctl restart fail2ban。
4. 设置监控与告警,避免再次跑满
封堵只是临时的,建议开启带宽超阈值告警。
- 宝塔面板:在“监控”中设置“带宽使用率”告警,超过 80% 时发邮件/短信。
- 命令行用户:可用
vnstat采集流量,配合脚本通过curl调用企业微信或钉钉机器人发送通知。
同时,建议定期检查 access.log 和 error.log,养成查看日志的习惯。
5. 常见踩坑点与验证方法
Q:屏蔽后网站正常访问受影响了怎么办?
A:先检查是否误杀了搜索引擎爬虫。如果是 Googlebot,应该使用 robots.txt 或按频率限流,不要直接封 IP。
Q:为什么封了 IP 带宽还是满?
A:可能是多个 IP 同时爬取,或者攻击来自代理池。建议配合 User-Agent 规则和请求频率限制,并升级到 CDN(如 Cloudflare)来隐藏源站 IP。
Q:如何验证问题已经解决?
A:重复第 1 步,使用 nethogs 或 iftop 观察流量,看到峰值下降且请求数正常;同时检查网站访问速度是否恢复。也可以使用 curl -I 测试首页响应时间。
如果你按照上述步骤操作后,带宽仍然异常,建议检查是否有其他服务(如数据库、邮件发送)异常占用带宽,或联系你的云服务商申请流量分析报告。
延伸阅读:如果你想更系统性地加固外贸站安全,建议继续查看《外贸站服务器安全配置清单》系列文章。