ss是专为高并发设计的网络连接查看工具,5万连接仅需0.3秒,直接读取内核socket数据,远快于netstat;ss -tuln必须同时含-t(tcp)、-u(udp)、-l(监听)、-n(数字格式),缺一不可,否则丢失协议端口、无法显示监听状态或因dns解析卡顿。

你需要在Linux系统中快速、准确地查看网络连接状态,又不想被netstat在高并发下卡住15秒,ss命令就是专为这个场景设计的替代工具——它直接读取内核socket数据,5万连接仅耗0.3秒,且默认预装于CentOS 7+、Ubuntu 22.04+等主流发行版。
查监听端口:为什么ss -tuln必须带这四个字母
执行 ss -tuln 查看所有正在监听的TCP和UDP端口。
漏掉任意一个参数都会导致关键信息丢失或命令变慢:【-t和-u必须同时出现,否则看不到DNS或NTP这类UDP监听端口】;不加-l就只显示已建立连接,根本找不到谁在等连接;-n强制数字格式,避免DNS解析卡顿——尤其当/etc/hosts配置异常时,ss -tul可能挂住10秒以上。
如果只关心IPv4,末尾补-4:sudo ss -tulnp -4,否则双栈环境下[::]:22这类IPv6地址会混在结果里干扰判断。
查已建立连接:ss -tun 和 ss -tn state established 不是一回事
方法一:运行 ss -tun 查看所有非监听TCP/UDP连接。
它包含CLOSE_WAIT、TIME_WAIT、FIN_WAIT1等全部状态,适合排查连接泄漏——比如CLOSE-WAIT多说明本地方应用没调close()。
方法二:运行 ss -tn state established 显式筛选真正通信中的ESTABLISHED连接。
字段第5列Peer Address:Port就是客户端IP和端口,能直接定位活跃通信对端。注意:state listen只对-l有效,用在非监听命令里会静默失效。
查进程归属:必须用sudo才能看到其他用户的信息
第一步:执行 sudo ss -tulnp 显示所有监听和已连接的TCP/UDP套接字,并附带进程名、PID和用户。
第二步:在输出中找形如 users:(("nginx",pid=1234,fd=6)) 的字段,其中pid是进程ID,fd是文件描述符编号。
第三步:若提示“Permission denied”,说明当前用户无权访问部分进程信息,【必须用sudo或root权限执行,普通用户无法看到其他用户的进程绑定关系】。
按端口精准过滤:别用grep :80,要用内置语法
查别人连你80端口:ss -tn 'dport = :80'。
查你主动用80当源端口:ss -tn 'sport = :80'。
用grep :80会误匹配192.168.80.1这种IP,也漏掉源端口为80的连接;而内置过滤支持sport/dport/src/dst等关键词,IPv6地址含方括号也能正确处理。











