如何通过Nginx日志定位异常行为的恶意IP?
美国、香港服务器
如何通过Nginx日志定位异常行为的恶意IP?
01-31 来源:
你想通过 Nginx 日志定位「异常行为」类的恶意 IP,核心是识别日志中偏离正常业务请求的特征(如非法请求方法、恶意 UA、异常状态码、高频 404/499 等),再用 Linux 命令筛选、统计这些特征对应的 IP,最终锁定发起异常行为的恶意源。以下是覆盖所有典型异常行为的定位方法,命令可直接复制执行,适配宝塔 / 原生 Nginx,同时包含「特征解读、误封规避、快速处置」,落地性极强。
一、先明确:异常行为的核心日志特征(定位依据)
「异常行为」区别于 CC、扫描、XSS 等定向攻击,是非业务常规的请求模式,常见特征及对应的恶意行为如下,这是筛选日志的核心:
异常行为类型 核心日志特征(筛选关键词) 对应的恶意行为本质
非法请求方法 PUT/DELETE/TRACE/OPTIONS(正常仅 GET/POST/HEAD) 尝试利用 HTTP 方法漏洞、探测服务器配置、发起攻击
恶意 User-Agent sqlmap/nmap/python-requests/curl/wget/attack/scan/bot/999 自动化攻击工具 / 扫描器发起请求,非正常浏览器访问
高频异常状态码 404(大量不存在的路径)、499(客户端主动断开)、400(非法请求格式)、403(被拦截仍持续请求) 扫描服务器目录结构、恶意爬虫、攻击请求被拦截仍重试
异常请求头 / 空值 User-Agent为空、Referer为恶意站点、Host不匹配(域名劫持 / 伪造) 恶意爬虫、请求伪造、绕过基础防护
短连接 / 高频断开 单 IP 短时间大量499状态码、请求间隔极短且无有效响应 CC 攻击变种(消耗连接资源)、慢连接攻击
二、核心前提:确认日志路径与格式(避免无效操作)
1. 日志路径(快速回顾,适配所有场景)
宝塔 Nginx:/www/wwwlogs/你的域名.com.log(站点专属)
原生 Nginx(yum/apt):/var/log/nginx/access.log
源码编译 Nginx:/usr/local/nginx/logs/access.log
2. 日志格式要求
确保 Nginx 日志包含以下字段(默认格式已覆盖),否则无法提取特征:
$remote_addr:客户端 IP(第一列)
$request_method:请求方法(GET/POST 等)
$status:响应状态码(200/404 等)
$http_user_agent:User-Agent
$request:完整请求行
三、按异常行为类型定位恶意 IP(实战命令)
所有命令遵循「筛选异常特征 → 提取 IP → 统计次数 → 降序排序」逻辑,结果中请求次数靠前、且含异常特征的 IP 即为恶意 IP。
场景 1:定位非法请求方法的恶意 IP
正常业务仅需GET/POST/HEAD,PUT/DELETE等方法均为异常,直接筛选:
bash
运行
# 宝塔版
cat /www/wwwlogs/你的域名.com.log | grep -E "PUT|DELETE|TRACE|OPTIONS" | awk "{print $1}" | sort | uniq -c | sort -nr | head -20
# 原生版
cat /var/log/nginx/access.log | grep -E "PUT|DELETE|TRACE|OPTIONS" | awk "{print $1}" | sort | uniq -c | sort -nr | head -20
场景 2:定位恶意 UA 的攻击 IP(自动化工具 / 扫描器)
攻击工具的 UA 具有明显特征,筛选后可精准锁定自动化攻击源:
bash
运行
# 宝塔版(关键词可按需添加,如scrapy/attack等)
cat /www/wwwlogs/你的域名.com.log | grep -E "sqlmap|nmap|python|curl|wget|scan|attack|bot/999|spider/非法爬虫" | awk "{print $1}" | sort | uniq -c | sort -nr | head -20
# 原生版
cat /var/log/nginx/access.log | grep -E "sqlmap|nmap|python|curl|wget|scan|attack|bot/999|spider/非法爬虫" | awk "{print $1}" | sort | uniq -c | sort -nr | head -20
场景 3:定位高频 404/499 异常状态码的恶意 IP
单 IP 大量请求不存在的路径(404)、频繁断开连接(499),是扫描 / CC 变种攻击的典型特征:
bash
运行
# 宝塔版:定位高频404的IP
cat /www/wwwlogs/你的域名.com.log | grep " 404 " | awk "{print $1}" | sort | uniq -c | sort -nr | head -20
# 宝塔版:定位高频499的IP(CC变种/慢连接攻击)
cat /www/wwwlogs/你的域名.com.log | grep " 499 " | awk "{print $1}" | sort | uniq -c | sort -nr | head -20
# 原生版替换日志路径即可,逻辑一致
场景 4:定位空 UA / 异常请求头的恶意 IP
空 UA 是恶意爬虫的典型特征,Host 不匹配则可能是域名伪造 / 劫持攻击:
bash
运行
# 宝塔版:定位空UA的IP(日志中UA字段为"-")
cat /www/wwwlogs/你的域名.com.log | grep "\"-\" \"-\"" | awk "{print $1}" | sort | uniq -c | sort -nr | head -20
# 宝塔版:定位Host不匹配的IP(替换为你的真实域名)
cat /www/wwwlogs/你的域名.com.log | grep -v "Host: 你的域名.com" | awk "{print $1}" | sort | uniq -c | sort -nr | head -20
场景 5:实时监控异常行为 IP(攻击正在进行时)
实时跟踪日志,动态查看异常请求,即时锁定正在发起攻击的 IP:
bash
运行
# 宝塔版:实时查看所有异常行为日志(非法方法+恶意UA+499)
tail -f /www/wwwlogs/你的域名.com.log | grep -E "PUT|DELETE|sqlmap|nmap| 499 "
# 原生版
tail -f /var/log/nginx/access.log | grep -E "PUT|DELETE|sqlmap|nmap| 499 "
实时判定:日志中同一 IP 连续刷屏出现上述异常特征,直接判定为恶意 IP。
四、命令核心解读(灵活扩展)
掌握以下逻辑,可根据新的异常特征快速修改命令:
grep " 404 ":状态码前后加空格,避免匹配到含 404 的请求路径(如/404.html);
grep -v "Host: 你的域名.com":-v表示「反向匹配」,筛选 Host 头不是你的域名的请求;
grep "\"-\" \"-\"":匹配日志中 UA 字段为-(空值)的行(默认日志中 UA 字段被双引号包裹);
awk "{print $1}":提取第一列的客户端 IP,若配置了真实 IP 透传,此处为攻击者真实 IP。
五、结果解读:精准判定恶意 IP(避免误封)
异常行为的判定标准简单且唯一,结合「次数 + 特征」即可,无需复杂分析:
1. 核心判定依据
只要公网 IP 的请求含「非法方法 / 恶意 UA / 空 UA」特征,无论次数多少,均为恶意 IP(正常用户不会发起此类请求);
高频 404/499:单 IP 404 请求≥20 次,或 499 请求≥10 次,判定为恶意(正常用户偶尔 404 但次数极少);
Host 不匹配:所有 Host 非你的域名的请求 IP,均为异常(可能是域名劫持 / 伪造攻击)。
2. 必排除的正常 IP(仅 3 类)
内网 / 本机 IP:127.0.0.1、192.168.x.x、10.x.x.x(运维测试);
办公 / 测试公网 IP:已知的公司出口 IP、测试机 IP;
CDN 节点 IP:未配置真实 IP 透传时的节点 IP(需先配置透传,再重新排查)。
3. 典型结果示例
bash
运行
# 高频499 IP结果示例
45 113.xx.xx.xx # 该IP 499请求45次,恶意CC变种攻击IP
18 202.xx.xx.xx # 次高频异常IP
3 192.168.1.100 # 内网测试IP,忽略
六、关键保障:提取真实 IP(CDN / 反向代理场景)
若站点接入 CDN / 云 WAF,默认日志会记录 CDN 节点 IP,需先配置 Nginx 透传真实 IP,否则排查结果无效:
1. Nginx 配置(添加在http{}或server{}段)
nginx
# 信任CDN/代理节点IP(添加云厂商CDN段,如阿里云106.0.0.0/8)
set_real_ip_from 127.0.0.1;
set_real_ip_from 106.0.0.0/8;
# 从XFF头提取真实IP
real_ip_header X-Forwarded-For;
real_ip_recursive on;
2. 重启 Nginx 生效
bash
运行
nginx -t && systemctl restart nginx # 原生
nginx -t && bt restart nginx # 宝塔
七、定位后快速处置:封禁异常行为恶意 IP
异常行为多为自动化攻击,锁定 IP 后立即封禁,优先用云安全组(永久生效、云端拦截),物理机用 iptables:
方法 1:单个封禁(iptables)
bash
运行
# 临时封禁(重启失效)
iptables -A INPUT -s 113.xx.xx.xx -j DROP
# 查看封禁规则
iptables -L -n --line-numbers
# 误封解封(替换行号)
iptables -D INPUT 1
方法 2:批量封禁(高效处理大量异常 IP)
bash
运行
# 宝塔版:批量封禁TOP20异常行为IP(以499为例)
cat /www/wwwlogs/你的域名.com.log | grep " 499 " | awk "{print $1}" | sort | uniq -c | sort -nr | head -20 | awk "{print $2}" | while read ip; do iptables -A INPUT -s $ip -j DROP; done
方法 3:云服务器安全组封禁(推荐)
在云控制台(阿里云 / 腾讯云)→ 安全组 → 入方向,添加规则:
源地址:恶意 IP/IP 段;
动作:拒绝;
优先级:最高(如 1)。
八、进阶:Nginx 提前拦截异常行为(从源头减少日志量)
定位是「事后溯源」,更高效的方式是在 Nginx 中直接拦截异常行为,减少攻击请求到达服务器:
nginx
# 在server{}段添加以下规则
# 1. 拦截非法请求方法
if ($request_method !~ ^(GET|POST|HEAD)$) {
return 403;
}
# 2. 拦截恶意UA
if ($http_user_agent ~* "sqlmap|nmap|python|curl|wget|scan|attack|bot/999") {
return 403;
}
# 3. 拦截空UA
if ($http_user_agent = "") {
return 403;
}
# 4. 限制单IP 404次数(避免高频扫描)
limit_req_zone $binary_remote_addr$status zone=404_limit:10m rate=5r/m;
if ($status = 404) {
limit_req zone=404_limit burst=0 nodelay;
}
配置后重启 Nginx,可大幅减少异常请求,降低服务器资源消耗。
总结
通过 Nginx 日志定位异常行为恶意 IP 的核心要点:
筛特征:聚焦非法请求方法、恶意 UA、高频 404/499、空 UA 等异常日志特征;
提 IP 统计:用awk提取 IP,sort | uniq -c按次数排序,锁定高频异常 IP;
保真实:接入 CDN 需配置真实 IP 透传,否则排查结果无效;
快处置:云安全组优先封禁,物理机用 iptables,同时配置 Nginx 规则提前拦截;
避误封:仅排除内网 / 办公 / CDN 节点 IP,其余异常 IP 一律封禁。
这套方法能精准定位所有异常行为的恶意 IP,结合事前拦截和事后溯源,形成完整的防护闭环。
三二互联专业提供香港VPS,美国VPS主机,香港云服务器租用等业务香港美国到大陆CN2 GIA速度最快