应先交叉验证高频IP、并发连接与防火墙拦截记录三组信号确认是否真被恶意扫描,再针对性封禁并叠加CC防护、端口收敛及WAF规则。

服务端口被恶意扫描不是故障,而是持续性攻击行为,直接表现为CPU飙升、连接数暴涨、502/504频发、日志里大量404或异常路径请求。处理关键不在“修”,而在“判准+拦准+防住”。
先确认是不是真被扫描,别把慢脚本当攻击
很多所谓“被扫”其实是PHP卡死、Redis清库、数据库锁表导致的假象。必须交叉验证三组信号:
- 查访问日志高频IP:用tail -n 1000 /www/wwwlogs/your-site.com/access.log | awk '{print $1}' | sort | uniq -c | sort -nr | head -10,看有没有单IP每秒十几二十次且路径随机(如/phpmyadmin/、/wp-json/wp/v2/users/)
- 查并发连接是否卡在Nginx层:netstat -an | grep :80 | grep ESTABLISHED | wc -l 如果远超300,但ps aux | grep 'php-fpm' | wc -l 只有十几个,说明是CC类扫描
- 查宝塔防火墙拦截记录:进「安全 → 防火墙 → 今日拦截记录」,同一IP反复触发「目录遍历」「SQL注入特征」规则,才是典型扫描
封IP要封对位置,否则白忙一场
宝塔黑名单不生效,90%是因为没理清流量路径。常见坑点:
- 开了CDN或反向代理后,真实IP被替换成CDN节点IP——必须在Nginx主配置里加real_ip_header X-Forwarded-For;和set_real_ip_from 1.2.3.4/32;(填你CDN网段)
- 开了IP白名单却漏写自己办公IP,结果连后台都进不去——检查「安全 → 防火墙 → 白名单」是否包含你的出口IP
- 黑名单重启即失效——点「导出」备份规则,或改用fail2ban做持久化封禁(它写入iptables,重启不丢)
单IP封禁效果有限,得打组合拳
扫描器常用代理池轮换IP,光靠手动加黑名单意义不大。必须叠加策略:
- 在宝塔「安全 → 防火墙 → CC防护」中,把阈值调低至10次/60秒,并勾选「登录失败5次自动封锁」
- 用ufw或nftables关掉所有非必要端口:比如停掉vsftpd(21端口)、禁用Telnet(23端口)、关闭SMBv1(445端口),只留SSH(建议改非标端口)、HTTP/HTTPS
- 对HTTP/HTTPS端口启用WAF规则:拦截User-Agent含sqlmap、dirbuster、gobuster的请求;屏蔽访问/phpmyadmin/、/wp-admin/setup-config.php等敏感路径的全部来源
日常盯住这三处,比事后救火管用
扫描不会突然爆发,总有苗头。每天花两分钟看:
- /var/log/auth.log:grep “Failed password” 看SSH爆破次数
- netstat -tulnp | grep LISTEN:确认有没有陌生进程监听了不该开的端口(比如Redis默认6379暴露公网)
- 宝塔「监控」页的「网络连接数」曲线:如果凌晨三点稳定爬升到400+,基本就是定时扫描器在干活


















