ss 命令:显示 Linux TCP/UDP 网络/套接字信息
ss 命令用于显示套接字统计信息。它可以显示 PACKET 套接字、TCP 套接字、UDP 套接字、DCCP 套接字、RAW 套接字、Unix 域套接字等的统计信息。它允许显示类似于netstat 命令的信息。它可以显示比其他工具更多的 TCP 和状态信息。它是一种用于跟踪 TCP 连接和套接字的新型、非常有用且更快(与 netstat 相比)的工具。SS 可以提供有关以下方面的信息:
- 所有 TCP 套接字。
- 所有 UDP 套接字。
- 所有建立的 ssh / ftp / http / https 连接。
- 所有连接到 X 服务器的本地进程。
- 按状态(如连接、同步、SYN-RECV、SYN-SENT、TIME-WAIT)、地址和端口进行过滤。
- 所有 tcp 套接字都处于 FIN-WAIT-1 状态以及更多。
一些 Linux 发行版认为 nestat 命令已弃用,因此应逐步淘汰,转而使用更现代的替代命令,例如 ss 命令。大多数 Linux 发行版都附带 ss 和许多监视工具。熟悉此工具有助于增强您对系统套接字中发生的事情的理解,并使您能够找到性能问题的可能原因。
如何使用 ss 命令显示套接字摘要
列出当前已建立、已关闭、孤立和等待的 TCP 套接字,输入:
# ss -s
示例输出:
Total: 734 (kernel 904) TCP: 1415 (estab 112, closed 1259, orphaned 11, synrecv 0, timewait 1258/0), ports 566 Transport Total IP IPv6 * 904 - - RAW 0 0 0 UDP 15 12 3 TCP 156 134 22 INET 171 146 25 FRAG 0 0 0
如何在 Linux 上使用 ss 命令显示所有开放的网络端口
# ss -l
示例输出:
ss -l Recv-Q Send-Q Local Address:Port Peer Address:Port 0 0 127.0.0.1:smux *:* 0 0 127.0.0.1:10024 *:* 0 0 127.0.0.1:10025 *:* 0 0 *:3306 *:* 0 0 *:http *:* 0 0 *:4949 *:* 0 0 *:domain *:* 0 0 *:ssh *:* 0 0 *:smtp *:* 0 0 127.0.0.1:rndc *:* 0 0 127.0.0.1:6010 *:* 0 0 *:https *:* 0 0 :::34571 :::* 0 0 :::34572 :::* 0 0 :::34573 :::* 0 0 ::1:rndc :::*
键入以下内容以查看使用打开套接字的进程:使用ss 命令和grep 命令
# ss -pl
找出负责打开套接字/端口#4949 的进程:
示例输出:
# ss -lp | grep 4949
0 0 *:4949 *:* users:(("munin-node",3772,5))
munin-node(PID # 3772)负责打开端口# 4949。您可以访问 /proc/3772 目录获取有关此进程的更多信息(例如使用的内存、用户、当前工作目录等):
# cd /proc/3772
# ls -l
显示所有 TCP 套接字
# ss -t -a
显示所有 UDP 套接字
# ss -u -a
显示所有 RAW 套接字
# ss -w -a
显示所有 UNIX 套接字
# ss -x -a
示例输出:
显示所有已建立的 SMTP 连接
# ss -o state established '( dport = :smtp or sport = :smtp )'
显示所有已建立的 HTTP 连接
# ss -o state established '( dport = :http or sport = :http )'
查找所有连接到 X 服务器的本地进程
# ss -x src /tmp/.X11-unix/*
列出所有处于 FIN-WAIT-1 状态的 TCP 套接字
列出我们的 httpd 到网络 202.54.1/24 的所有处于 -FIN-WAIT-1 状态的 TCP 套接字,并查看它们的计时器:
# ss -o state fin-wait-1 '( sport = :http or sport = :https )' dst 202.54.1/24
如何使用 TCP 状态过滤套接字?
语法如下:
## tcp ipv4 ## ss -4 state FILTER-NAME-HERE ## tcp ipv6 ## ss -6 state FILTER-NAME-HERE
其中 FILTER-NAME-HERE 可以是以下任意一个,
- 已确立的
- 同源
- 同步接收
- 鳍等待-1
- 鳍等待2
- 等待时间
- 关闭
- 关闭等待
- 最后确认
- 听
- 结束
- all:以上所有状态
- 已连接:除侦听和关闭之外的所有状态
- synchronized:除 syn-sent 之外的所有连接状态
- bucket:显示状态,作为微套接字维护,即 time-wait 和 syn-recv。
- big:与bucket状态相反。
ss 命令示例
键入以下命令来查看关闭套接字:
ss -4 state closing
Recv-Q Send-Q Local Address:Port Peer Address:Port 1 11094 75.126.153.214:http 175.44.24.85:4669
如何匹配远程地址和端口号?
使用以下语法:
ss dst ADDRESS_PATTERN ## Show all ports connected from remote 192.168.1.5## ss dst 192.168.1.5 ## show all ports connected from remote 192.168.1.5:http port## ss dst 192.168.1.5:http ss dst 192.168.1.5:smtp ss dst 192.168.1.5:443
找出远程 123.1.2.100:http 与我们本地虚拟服务器的连接:
# ss dst 123.1.2.100:http
示例输出:
State Recv-Q Send-Q Local Address:Port Peer Address:Port ESTAB 0 0 75.126.153.206:http 123.1.2.100:35710 ESTAB 0 0 75.126.153.206:http 123.1.2.100:35758
如何匹配本地地址和端口号?
ss src ADDRESS_PATTERN ### find out all ips connected to example.com ip address 75.126.153.214 ### ## Show all ports connected to local 75.126.153.214## ss src 75.126.153.214 ## http (80) port only ## ss src 75.126.153.214:http ss src 75.126.153.214:80 ## smtp (25) port only ## ss src 75.126.153.214:smtp ss src 75.126.153.214:25
如何将本地和/或远程端口与数字进行比较?
使用以下语法:
## Compares remote port to a number ## ss dport OP PORT ## Compares local port to a number ## sport OP PORT
其中 OP 可以是下列之一:
- <=或le:小于或等于端口
- >=或ge:大于或等于端口
- ==或eq:等于端口
- !=或ne:不等于端口
- <或gt:小于端口
- >或lt:大于端口
- 注意:le、gt、eq、ne 等在 unix shell 中使用,并且也被接受。
示例
################################################################################### ### Do not forget to escape special characters when typing them in command line ### ################################################################################### ss sport = :http ss dport = :http ss dport \> :1024 ss sport \> :1024 ss sport \< :32000 ss sport eq :22 ss dport != :22 ss state connected sport = :http ss \( sport = :http or sport = :https \) ss -o state fin-wait-1 \( sport = :http or sport = :https \) dst 192.168.1/24
ss 命令选项摘要
Usage: ss [ OPTIONS ] ss [ OPTIONS ] [ FILTER ] -h, --help this message -V, --version output version information -n, --numeric don't resolve service names -r, --resolve resolve host names -a, --all display all sockets -l, --listening display listening sockets -o, --options show timer information -e, --extended show detailed socket information -m, --memory show socket memory usage -p, --processes show process using socket -i, --info show internal TCP information -s, --summary show socket usage summary -4, --ipv4 display only IP version 4 sockets -6, --ipv6 display only IP version 6 sockets -0, --packet display PACKET sockets -t, --tcp display only TCP sockets -u, --udp display only UDP sockets -d, --dccp display only DCCP sockets -w, --raw display only RAW sockets -x, --unix display only Unix domain sockets -f, --family=FAMILY display sockets of type FAMILY -A, --query=QUERY, --socket=QUERY QUERY := {all|inet|tcp|udp|raw|unix|packet|netlink}[,QUERY] -D, --diag=FILE Dump raw information about TCP sockets to FILE -F, --filter=FILE read filter information from FILE FILTER := [ state TCP-STATE ] [ EXPRESSION ]
ss 与 netstat 命令速度
使用 time 命令运行两个程序并汇总系统资源使用情况。键入 netstat 命令如下:
# time netstat -at
示例输出:
real 2m52.254s user 0m0.178s sys 0m0.170s
现在,尝试 ss 命令:
# time ss -atr
示例输出:
real 2m11.102s user 0m0.124s sys 0m0.068s
注意:两个输出均取自在 RHEL v6.x amd64 上运行的反向代理加速服务器。有关更多信息,请通过键入以下命令查看 ss 命令手册页:有关 ss 和 iproute2 的信息,
$ man ss
请参阅https://wiki.linuxfoundation.org/networking/iproute2 。