从被动防御到主动反制的最佳实践
目录导读
全网扫描行为的本质与危害
Q:什么是全网扫描行为?为什么它比普通攻击更危险?

全网扫描行为是指攻击者利用自动化工具(如Nmap、Masscan、Zmap等),对互联网上大量IP地址的特定端口或服务进行批量探测的行为,据Censys 2024年报告,全球每秒钟有超过280万次扫描请求,其中约37%来自已知恶意扫描节点。
核心危害包括:
- 暴露攻击面:扫描会映射出你的服务器开放端口、服务版本、中间件信息
- 触发连锁攻击:检测到漏洞后,平均13分钟内跟进利用脚本(Mandiant 2024数据)
- 消耗带宽与计算资源:单次DDoS型扫描可达50Gbps流量冲击
- 合规风险:PCI DSS、等保2.0等标准明确要求对非法探测进行拦截和审计
常见扫描类型识别指南
Q:如何区分正常访问与恶意扫描?
| 扫描类型 | 典型特征 | 检测关键词 |
|---|---|---|
| 水平端口扫描 | 同一IP扫描多个端口(如22、80、443、3389) | sequential port probe |
| 垂直端口扫描 | 多IP对同一端口发起探测 | distributed scan |
| 服务指纹扫描 | 发送畸形HTTP头、ICMP时间戳请求 | banner grabbing |
| 协议扫描 | 非标准协议组合(如TCP SYN到UDP端口) | protocol anomaly |
| 爬虫式扫描 | 遍历目录路径 /.git, /wp-admin, /phpmyadmin |
path traversal probe |
识别工具推荐:
- 开源:Fail2ban结合自定义日志规则
- 付费:Cloudflare WAF的“扫描保护”模块
- 自建:ELK Stack + Suricata IDS
五大核心拦截策略
策略1:防火墙层——白名单+速率限制
#iptables 示例:限制单个IP每分钟新增连接数(SSH端口)
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 -j DROP
- 首选方案:云平台安全组(AWS Security Group、阿里云安全组)设置仅开放必要端口
- 进阶:部署端口敲门(Port Knocking)服务,如fwknop
策略2:网络层——IP信誉数据库+动态黑名单
- 集成AbuseIPDB、Greynoise等威胁情报源
- 使用ipset(Linux)或blocklist.de自动更新恶意IP
- 配置示例(Nginx):
geo $block_scan { include /etc/nginx/blacklist.conf; # 每5分钟更新 } if ($block_scan) { return 444; # 无响应断开 }
策略3:应用层——智能WAF规则
- 虚拟补丁:对CVE-2024-XXXX等漏洞建立签名规则
- 行为分析:设置请求速率阈值(如每个IP/1秒最多50个请求)
- 特色技术:JS挑战(JS Challenge)——对可疑IP先返回JavaScript计算验证,通过后放行
- 推荐工具:ModSecurity(开源WAF)+ OWASP CRS规则集
策略4:域名层——隐藏真实服务器
- CDN前置:Cloudflare、Akamai的Anycast网络吸收扫描流量
- CNAME伪装:将www.domain.com解析到CDN,真实服务器仅接受CDN回源IP
- TLS指纹过滤:使用JA3指纹,只允许浏览器常见指纹(如Chrome 120的JA3)
策略5:主动反制——蜜罐与扫描陷阱
- 部署Honeypot系统(如T-Pot):在非业务端口设置陷阱,吸引扫描并记录攻击者信息
- 虚假响应:例如对3306端口返回伪造的MySQL banner,诱导攻击者投入资源
- 发送TCP RST包:对明显扫描行为主动重置连接(需注意误伤)
实战配置案例
场景:某电商平台每日被扫描超过8万次,需在10分钟内完成拦截
步骤1:日志分析定位扫描模式
# 使用GoAccess分析Nginx日志,发现/wordpress路径被高频访问
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -20
步骤2:自动阻断(Fail2ban + 自定义规则)
[wordpress-scan] enabled = true filter = wordpress-scan action = iptables[name=WPSCAN, port=http, protocol=tcp] maxretry = 10 findtime = 60 bantime = 86400
- 在
filter.d/wordpress-scan.conf中定义正则匹配404路径(如/wp-admin?=1)
步骤3:部署Cloudflare Zero Trust Access
- 将真实服务器切换为仅允许Cloudflare回源IP(194.26.192.0/19等)
- 启用Bot Fight Mode自动拦截已知扫描器
效果验证
- 拦截率从42%提升至96%(剩余4%为高级伪装扫描)
- 服务器平均负载从3.8降至1.1
常见问题解答
Q1:如何区分搜索引擎蜘蛛与恶意扫描?
A:验证IP反解析是否为对应搜索引擎(如Googlebot的IP通常反向解析为 *.googlebot.com),并检查User-Agent的完整性,恶意扫描常伪造UA或使用Nmap默认字符串。
Q2:拦截扫描会误伤正常用户吗?
A:风险存在,建议采用梯度防御:首次触发仅限速(返回429状态码),重复触发才封禁,并设置白名单(动态IP需支持CIDR段)。
Q3:面对每天超过百万次的分布式扫描(如Shodan)怎么破?
A:放弃完全阻断(成本过高),重点保护核心资产:
- 对数据库、管理后台使用双因子认证
- 将所有管理端口隐藏在VPN之后
- 对非关键服务用honeypot重定向攻击流量
Q4:免费工具能否达到企业级拦截效果?
A:可以,但需组合使用,推荐方案:Cloudflare CDN免费版(限速+JS挑战)+ Fail2ban(服务器端)+ AbuseIPDB黑名单自动同步。
Q5:扫描拦截后需要保留日志多久?
A:依据法律法规(如GDPR要求个人数据存储不超过必要时间),建议:
- 正常日志保留30天
- 扫描攻击日志保留90天(用于溯源)
- 审计日志保留180天(等保2.0要求)
延伸阅读资源:
- OWASP Automated Threats to Web Applications
- 《Web安全开发指南》第五章:自动化攻击防御
- 论坛讨论区:r/netsec 关键词"scan mitigation"