最准确的方法是通过 ss 或 netstat 统计当前 ESTABLISHED 状态的 TCP 连接数,提取远程 IP 并聚合排序;日志方式仅能按秒级窗口近似估算,需注意时间精度与噪声过滤。

直接统计“并发访问量最高”的 IP,关键不是看日志里谁出现次数多,而是看同一时刻有多少连接来自同一个 IP。日志本身是离散记录,无法直接反映瞬时并发状态;真正能体现并发的,是当前活跃的 TCP 连接。所以得结合 netstat 或 ss 获取实时连接状态,再用 awk 聚合分析。
从实时网络连接中统计并发最高的 IP
这是最贴近“并发”本意的做法——查当前 ESTABLISHED 状态的连接数:
-
基础命令(推荐 ss,比 netstat 更快更现代):
ss -tn state established | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr | head -10
说明:ss 列出所有已建立的 TCP 连接;$5 是远程地址(如 192.168.1.100:54321);cut 提取 IP 部分;后续就是标准计数+排序。 -
用 netstat 的等效写法:
netstat -ant | awk '$6 == "ESTABLISHED" {print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr | head -10
注意:netstat 输出字段位置可能因系统略有差异,$6 通常是状态列,$5 是远程地址;若不匹配,可用netstat -ant | head -5先确认列序。
如果必须依赖 access.log(模拟“高并发请求”场景)
日志没有时间精度保证,但可按秒级窗口近似估算短时密集访问——适合排查突发流量或爬虫攻击:
-
提取带时间戳的行(以 Apache/Nginx 默认格式为例):
日志第 4 字段类似[29/Jul/2026:17:25:33 +0800],先抽取出精确到秒的时间点:awk '{gsub(/[][]/, "", $4); print $1, $4}' access.log | sort -k2,2 -
统计每秒内各 IP 的请求数(单秒峰值):
awk '{gsub(/[][]/, "", $4); t=$4; ip=$1; count[t","ip]++} END {for (key in count) if (count[key] > 50) print key, count[key]}' access.log | sort -t, -k3 -nr | head -10
说明:用t","ip作复合键,统计每个“时间+IP”组合出现次数;最后筛选出单秒内超 50 次的异常行为。
过滤干扰、提升准确性
无论用连接态还是日志,都要排除常见噪声:
- 跳过本地回环和内网地址(避免监控、健康检查干扰):
... | awk '!/^127\.|^10\.|^172\.(1[6-9]|2[0-9]|3[0-1])\.|^192\.168\./ {print}' - 排除已知爬虫 UA 或固定路径(如 /healthz、/favicon.ico):
grep -v -E "(healthz|favicon\.ico|HeadlessChrome|python-requests)"放在管道早期 - 对 IPv6 地址做兼容处理(若环境混合):
awk '{match($5, /([0-9a-fA-F:]+)(:[0-9]+)?/, arr); print arr[1]}'替代简单 cut
快速定位 Top 1 IP 并查看其详情
找到最大并发 IP 后,常需进一步分析它在干什么:
- 查该 IP 最近 20 条请求(日志方式):
awk '$1 == "203.0.113.5" {print}' access.log | tail -20 - 查该 IP 当前所有连接状态:
ss -tn state established '( dport = :80 or dport = :443 )' | awk '$5 ~ /^203\.0\.113\.5:/ {print $1,$2,$5,$6}' - 查该 IP 请求最多的 URL:
awk '$1 == "203.0.113.5" {print $7}' access.log | sort | uniq -c | sort -nr | head -5


















