关键不是删日志,而是快速识别模式、锁定来源、判断意图;重点看access.log结构化线索,结合error.log交叉验证,聚焦高频404+非常规路径、异常UA、空Referer、单IP高并发等特征。

排查 Apache 日志中大量无效请求,关键不是删日志,而是快速识别模式、锁定来源、判断意图——是误配置、扫描攻击,还是爬虫失控?重点看访问日志(access.log)的结构化线索,结合错误日志(error.log)交叉验证。
先筛出“无效请求”的典型特征
无效请求不等于 404,而是指明显非正常用户行为的高频、低价值请求。常见表现包括:
-
高频 404 + 非常规路径:如
/phpmyadmin/、/wp-admin/install.php、/.git/config、/robots.txt后紧接一堆随机目录 -
非常规 HTTP 方法:
OPTIONS、PUT、DELETE出现在无 API 接口的站点上 -
User-Agent 异常:空字符串、含
sqlmap、nuclei、gobuster、masscan等工具名,或重复出现同一 UA 却来自不同 IP -
Referer 为空但请求密集:大量
-(表示无 referer)+ 短间隔 + 相同 URI 模式 - 单 IP 短时间高并发:1 秒内几十次请求,且多为不同路径,响应码多为 404 或 403
用命令快速定位可疑 IP 和行为
不用打开完整日志,直接在终端执行以下组合命令:
- 查最近 1000 行中出现最多的异常 404 请求(含路径和 UA):
tail -1000 /var/log/apache2/access.log | awk '$9 == 404 {print $1, $7, $12}' | sort | uniq -c | sort -nr | head -20 - 统计 TOP 10 扫描型 IP(排除静态资源,聚焦可疑后缀):
awk '$9 == 404 && $7 ~ /\.(php|asp|jsp|cgi|env|bak|swp)$/ {print $1}' /var/log/apache2/access.log | sort | uniq -c | sort -nr | head -10 - 抓取含已知漏洞探测关键词的请求:
grep -i "phpmyadmin\|wp-login\|shell\.php\|cmd\.jsp\|etc/passwd" /var/log/apache2/access.log | head -15 - 检查是否来自同一代理或 CDN 节点(注意 X-Forwarded-For 是否被伪造):
awk '{if ($1 ~ /^10\.|^172\.1[6-9]\.|^172\.2[0-9]\.|^172\.3[0-1]\.|^192\.168\./) print $0}' /var/log/apache2/access.log | head -10(若发现大量私网 IP,说明前端代理未透传真实 IP)
确认是否真实攻击,还是配置/路由问题
不能一概封禁,先排除自身原因:
-
检查 .htaccess 或主配置中的重写规则:是否存在误写的
RewriteRule导致大量内部跳转失败?比如循环重定向会记为多次 404 或 500 -
查看 error.log 对应时间点:如果 access.log 中某 IP 大量 404,error.log 同一时刻是否有
[rewrite:trace3]或Request exceeded the limit of 10 internal redirects?这是配置错误,不是攻击 -
核对 DocumentRoot 和 Alias 设置:运行
grep -E "(DocumentRoot|Alias)" /etc/apache2/sites-enabled/*,确认网站根目录没指向空目录或错误路径 -
检查是否暴露了测试文件:比如
/test.php、/info.php被公开,引来自动化探测
后续应对建议
确认是恶意扫描后,可分层处理:
-
临时阻断:用
iptables或ufw封禁 IP 段(如ufw deny from 203.208.60.97),适合单点攻击 -
限速防护:启用
mod_evasive或 Nginx 前置限流,防暴力遍历 -
隐藏痕迹:关闭 Server 签名(
ServerTokens Prod)、禁用目录列表(Options -Indexes)、移除默认测试页 - 长期监控:将上述筛选命令写成脚本,配合 cron 每小时执行,输出到告警文件;或接入 ELK 做可视化聚合


















