用 netstat 或 ss 提取目标端口的客户端 ip 并统计频次:netstat -anp 2>/dev/null | grep ':80' | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr;ss -tun state established '( dport = :80 )' 同理,更高效准确;注意代理场景需查应用层日志。

用 netstat 查看端口连接来源 IP 并统计频次
直接执行 netstat -anp | grep :<port></port> 可看到指定端口(如 :80)的所有连接,但原始输出里 IP 和端口混在一起,需要提取客户端 IP 并去端口号。常见错误是直接 awk '{print $5}',结果会把 192.168.1.100:54321 整段当 IP,导致统计失效。
正确做法是先切分、再取 IP 部分:
netstat -anp 2>/dev/null | grep ':80' | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr
-
2>/dev/null忽略权限不足导致的报错(比如非 root 看不到其他用户进程) -
cut -d: -f1按冒号分割,只取 IP 段,丢弃源端口 -
sort | uniq -c | sort -nr统计并按数量倒序排列
用 ss 替代 netstat 获取更准更快的连接信息
ss 是 netstat 的现代替代,内核态直接读取,不依赖 /proc/net,速度快且在高并发时更可靠。但默认不显示进程名,需加 -tunlp 才能匹配 netstat -anp 行为。
查 80 端口的来源 IP 统计:
ss -tun state established '( dport = :80 )' | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr
-
state established过滤仅已建立连接,避免 TIME_WAIT 干扰统计 -
dport = :80表示目标端口是 80(即服务监听端口),对应的是客户端连进来的连接 - 注意:如果服务监听在多个地址(如
0.0.0.0:80),这条命令仍有效;但若只监听127.0.0.1:80,则外部 IP 不会出现
遇到 NAT 或代理时,真实客户端 IP 可能藏在 HTTP Header 里
上面所有命令查到的都是 TCP 层的直连 IP。如果前端有 Nginx、HAProxy、云 LB 或 Docker bridge,你看到的可能是代理 IP(如 10.0.1.5),而非用户真实 IP。
这时必须结合应用层日志:
- Nginx 默认记录
$remote_addr,但该值是直连 IP;要获取真实 IP,需确保配置了set_real_ip_from并启用real_ip_header X-Forwarded-For - 查 Nginx access.log 中最常出现的客户端 IP:
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -20 - 注意:
$1是log_format中定义的第一个字段,若自定义过格式,需确认是否真为 IP 字段
高频连接 IP 可能是扫描或攻击,需快速响应
统计出某个 IP 占比异常高(比如单 IP 占 80% 连接),不能只看数字,得判断是否合理:
- 内网环境常见:Kubernetes Pod IP、容器网络段(如
10.244.x.x)、宿主机健康检查探针 - 公网环境需警惕:短时间突增连接 + 无规律 URI + 高 4xx/5xx 错误率 → 很可能在暴力探测或 CC 攻击
- 临时封禁可快速用
iptables:iptables -I INPUT -s 192.168.1.200 -j DROP
,但记得保存规则(iptables-save)并评估是否影响正常业务
真正难的不是查 IP,而是区分“这是运维脚本在轮询”还是“这是黑客在爆破”。日志时间戳、User-Agent、请求路径分布,比单纯 IP 统计更有判别力。










