在日常运维或排查网络问题时,我们常常需要知道:有哪些客户端正在连接我的服务?连接数是否异常?是否存在恶意扫描或 DDoS 行为?
本文将教你使用一条简洁高效的 Linux 命令组合,统计连接到本机某个端口(如 19092)的所有客户端 IP 地址,并按连接数排序,帮助你快速掌握当前网络连接状况。
🎯 本文目标
我们希望通过以下命令,实现:
✅ 找出所有连接到本机 19092 端口的客户端 IP
✅ 统计每个客户端的连接数量
✅ 按连接数从高到低排序,显示前 10 名
使用的完整命令如下:
ss -tnp '( dport = 19092 )' | awk '{print $5}' | grep -oE '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' | sort | uniq -c | sort -nr | head
⚠️ 注意:原问题中误写为 sport = 19092,我们会在后文说明其错误,并修正为 dport = 19092。
🔍 命令总览
ss -tnp '( dport = 19092 )' | \
awk '{print $5}' | \
grep -oE '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' | \
sort | \
uniq -c | \
sort -nr | \
head
这条命令由多个工具通过管道 | 连接而成,每一部分都承担特定任务。下面我们逐段解析。
🧩 第一步:ss -tnp '( dport = 19092 )'
作用:
列出所有 目标端口为 19092 的 TCP 连接。
参数解释:
ss:socket statistics,现代版 netstat,更快更强大。
-t:只显示 TCP 连接。
-n:不解析主机名和服务名(显示数字 IP 和端口)。
-p:显示与连接相关的进程信息(如哪个程序在监听)。
( dport = 19092 ):过滤表达式,表示“目标端口(destination port)等于 19092”。
📌 关键点:
dport 是“目标端口”,即数据包发往的端口。
如果你的服务监听 19092(如 Kafka、自定义应用),那么客户端连接你时,目标端口就是 19092。
所以我们要查的是 dport = 19092,而不是 sport = 19092!
❌ 错误示例:ss -tnp 'sport = 19092'
这表示“本机作为客户端,使用 19092 作为源端口去连接别人”,这是出站连接,不是我们关心的“别人连我”。
✅ 正确写法:'( dport = 19092 )'
示例输出:
ESTAB 0 0 192.168.1.100:19092 192.168.1.200:54321 users:(("java",pid=1234,fd=56))
ESTAB 0 0 192.168.1.100:19092 192.168.1.201:54322 users:(("java",pid=1234,fd=57))
🧩 第二步:awk '{print $5}'
作用:
提取每行的第 5 个字段 —— 客户端的 IP 和端口(Peer Address:Port)。
在 ss 输出中,字段如下:
State Rec-Q Send-Q Local Address:Port Peer Address:Port Process
所以 $5 是 192.168.1.200:54321 或 [::ffff:192.168.1.201]:54322(IPv4 映射 IPv6 格式)
输出:
192.168.1.200:54321
192.168.1.201:54322
🧩 第三步:grep -oE '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+'
作用:
从上一步的字符串中,只提取 IPv4 地址部分。
参数解释:
-E:启用扩展正则表达式(Extended Regular Expression)。
-o:只输出匹配的部分,而不是整行。
正则模式:[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+
匹配形如 192.168.1.200 的 IPv4 地址。
📌 为什么需要这一步?
因为 $5 可能是:
192.168.1.200:54321 → 提取 192.168.1.200
[::ffff:192.168.1.201]:54322 → 正则仍能匹配出 192.168.1.201
✅ grep -oE 能自动忽略前缀和后缀,只提取出纯 IP。
输出:
192.168.1.200
192.168.1.201
🧩 第四步:sort
对提取出的所有 IP 地址进行排序。
为什么?因为下一步 uniq 要求相同的行必须相邻才能去重计数。
输出(排序后):
192.168.1.200
192.168.1.200
192.168.1.201
🧩 第五步:uniq -c
作用:
统计连续重复行的出现次数。
-c:在每行前加上计数。
输出:
2 192.168.1.2001 192.168.1.201
表示 192.168.1.200 有 2 个连接,192.168.1.201 有 1 个。
🧩 第六步:sort -nr
作用:
按数值逆序排序(从大到小)。
-n:按数值排序(而不是字典序)。
-r:逆序(降序)。
输出:
2 192.168.1.2001 192.168.1.201
连接数最多的排在最前面。
🧩 第七步:head
默认显示前 10 行。
适用于连接数非常多时,只关注“Top 10”客户端。
✅ 最终输出示例
23 192.168.1.10015 192.168.1.1018 10.0.0.503 172.16.0.1
说明:
192.168.1.100 建立了 23 个到 19092 端口的连接,可能是高频访问或异常行为。
可用于排查:是否被攻击?是否客户端重连频繁?
🛠️ 实际应用场景
场景 | 用途 |
---|---|
Kafka 监控 | 查看哪些客户端连接 |
Web 服务排查 | 分析访问量大的客户端 |
安全审计 | 发现异常 IP 频繁连接 |
性能调优 | 判断是否需要限流或负载均衡 |
💡 小贴士:如何改成其他端口?
只需替换端口号即可:
ss -tnp '( dport = 9092 )' | awk '{print $5}' | grep -oE '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' | sort | uniq -c | sort -nr | head
或者写成函数:
count_clients() {local port=$1ss -tnp "( dport = $port )" | awk '{print $5}' | grep -oE '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' | sort | uniq -c | sort -nr | head
}# 使用
count_clients 19092
🚫 常见错误提醒
| 查的是“我连别人”,不是“别人连我” ❌ |
忘记引号 | shell 报错:syntax error near unexpected token |
不加 | 无法正确统计非连续重复项 |
✅ 总结
我们通过这条命令:
ss -tnp '( dport = 19092 )' | awk '{print $5}' | grep -oE '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' | sort | uniq -c | sort -nr | head
实现了:
✅ 精准筛选目标端口为 19092 的连接
✅ 提取客户端 IP 地址(兼容 IPv4 和 IPv4 映射 IPv6)
✅ 统计每个客户端的连接数
✅ 按连接数降序排列,显示 Top 10
这是一条非常实用的运维命令,建议收藏或加入监控脚本中。
📚 延伸阅读
man ss
:查看ss
所有过滤语法(支持src
,dst
,port
,sport
,dport
等)lsof -i :19092
:另一种查看端口连接的方式- 使用
awk
正则提取 IP:match($5, /([0-9]{1,3}\.){3}[0-9]{1,3}/, arr); print arr[0]