Apache日志IP分析需先提取高频异常IP(如4xx/5xx、短时密集请求),再用GeoIP定位地理与ASN信息,结合mod_evasive或fail2ban实时拦截,同时警惕代理/CDN导致的X-Forwarded-For失真问题。

Apache日志中记录的IP地址是追踪异常流量最直接的线索。关键在于准确提取、聚合和关联IP行为,而非单纯查看单条记录。
从access.log提取高频异常IP
异常流量常表现为大量4xx/5xx响应、极短时间内的密集请求或非常规User-Agent。可使用awk+sort+uniq快速筛选:
-
统计每IP请求次数(按降序):
awk '{print $1}' /var/log/apache2/access.log | sort | uniq -c | sort -nr | head -20 -
只看返回500/404的IP(示例):
awk '$9 ~ /^(404|500)$/ {print $1}' /var/log/apache2/access.log | sort | uniq -c | sort -nr -
结合时间戳查最近10分钟高频IP(需日志含标准时间格式):
awk -v d="$(date -d '10 minutes ago' '+%d/%b/%Y:%H:%M')" '$4 > "["d {print $1}' /var/log/apache2/access.log | sort | uniq -c | sort -nr
用GeoIP定位IP地理归属
知道IP段后,需进一步判断是否来自特定地区或已知恶意ASN。Apache本身不内置GeoIP,但可通过mod_geoip2模块或外部工具辅助:
-
安装maxminddb-tools后,用mmdblookup查单个IP:
mmdblookup --file /usr/share/GeoIP/GeoLite2-Country.mmdb --ip 203.123.45.67 country names en -
批量解析IP列表(如top100.ip)并导出国家+AS信息:
while read ip; do echo "$ip $(mmdblookup --file GeoLite2-ASN.mmdb --ip $ip autonomous_system_number 2>/dev/null | tr -d '"\n') $(mmdblookup --file GeoLite2-Country.mmdb --ip $ip country iso_code 2>/dev/null | tr -d '"\n')"; done ip_geo.csv - 注意:免费版GeoLite2需定期更新数据库(每月下载一次)
结合mod_evasive或fail2ban做实时拦截
仅分析日志是被动响应,应联动防护模块实现自动封禁:
-
mod_evasive配置示例(在httpd.conf中):
DOSHashTableSize 3097
DOSPageCount 2
DOSSiteCount 50
DOSPageInterval 1
DOSSiteInterval 1
DOSBlockingPeriod 600 - fail2ban通过正则匹配access.log中的攻击特征(如扫描路径、SQLi关键词),自动调用iptables或firewalld封禁IP
- 建议将fail2ban的jail.local中apache-badbots规则启用,并自定义logpath指向你的access.log路径
注意代理与CDN带来的IP失真
真实用户IP可能被Nginx反向代理、Cloudflare或阿里云WAF隐藏,此时$1不是客户端真实IP:
-
检查Apache是否记录X-Forwarded-For(XFF)头:
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined_xff
并在VirtualHost中启用该格式 - 若使用Cloudflare,应启用mod_remoteip,并配置RemoteIPHeader X-Forwarded-For + trusted proxies(填入Cloudflare IP段)
- 误信XFF会导致封禁CDN节点IP,反而影响正常用户——务必验证可信代理链
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










