ss的篡权
- 2020 年 3 月 16 日
- 笔记

SS的篡权
CentOS 7 系统最小化安装时,执行 netstat 时,提示没有此命令?why?
比较奇怪,yum install netstat 后仔细看了下 man 文档。发现 netstat 中默认有这么一句话:
NOTES: This program is obsolete. Replacement for netstat is ss. Replacement for netstat -r is ip route. Replacement for netstat -i is ip -s link. Replacement for netstat -g is ip maddr.
中文意思是:
netstat 这个命令马上就要废弃了,替代命令是 ss。对应的命令是
旧命令 |
新命令 |
---|---|
netstat -r |
ip route |
netstat -i |
ip -s link |
netstat -g |
ip maddr |
为了清晰一些,我做了一张对比图:

226fd4432b5375ccc708a85249bc3fdf.png
ss替换netstat的原因
ss命令 也是用来显示系统处于活动状态的套接字信息,但为什么要废弃 netstat 呢?
1、ss速度快
有好事网友专门做的压力测试,在等同服务器压力条件下,两个工具有明显的性能差别:
netstat -at | wc 耗时 15.60 秒 ss -atr | wc 耗时 5.40 秒(未利用tcp_diag) ss -atr | wc 耗时 0.47 秒(利用tcp_diag)
看来 ss
的实现原理和 netstat
有本质区别。
是的,天下武功唯快不破。ss
快的秘诀在于,它利用到了 TCP 协议栈中 tcp_diag
。tcp_diag
是一个用于分析统计的模块,可以获得 Linux 内核中第一手的信息,这就确保了 ss
的快捷高效。当然,如果你的系统中没有 tcp_diag
, ss
也可以正常运行,只是效率会变得稍慢。
当服务器的socket连接数量变得非常大时,无论是使用 netstat
命令还是直接 cat /proc/net/tcp
,执行速度都会很慢。可能你不会有切身的感受,但请相信我,当服务器维持的连接达到上万个的时候,使用 netstat
等于浪费 生命,而用ss
才是节省时间。
2、 ss 展示更详细的系统性能信息
如 ss 的 man 文档:
ss is used to dump socket statistics. It allows showing information similar to netstat. It can display more TCP and state informations than other tools.
ss
命令可以用来获取 socket 统计信息,它可以显示和 netstat
类似的内容。但ss
的优势在于它能够显示更多更详细的有关TCP和连接状态的信息,而且比netstat
更快速更高效。
3、两者属于不同阵营
几乎所有的Linux系统都会默认包含netstat
命令,但并非所有系统都会默认包含ss
命令。netstat
命令是net-tools
工具集中的一员:
# rpm -q net-tools net-tools-2.0-0.25.20131004git.el7.x86_64
而ss
命令是iproute
工具集中的一员:
# rpm -qf /usr/sbin/ss iproute-4.11.0-25.el7_7.2.x86_64 # rpm -q iproute iproute-4.11.0-25.el7_7.2.x86_64
如果你无法使用ss命令,那么可能是缺少了iproute,需要安装一下:
yum install iproute iproute-doc
net-tools
是一套标准的Unix网络工具,用于配置网络接口、设置路由表信息、管理ARP表、显示和统计各类网络信息等等,但是遗憾的是,这个工具自2001年起便不再更新和维护了。
而新秀 iproute
是一套可以支持IPv4/IPv6
网络的用于管理TCP/UDP/IP网络的工具集,这套工具由Stephen Hemminger负责维护和升级。
从某种意义上说,iproute工具集几乎可以替代掉net-tools工具集,具体的替代方案是这样的:
用途 |
net-tool(被淘汰) |
iproute2 |
---|---|---|
地址和链路配置 |
ifconfig |
ip addr, ip link |
路由表 |
route |
ip route |
邻居 |
arp |
ip neigh |
VLAN |
vconfig |
ip link |
隧道 |
iptunnel |
ip tunnel |
组播 |
ipmaddr |
ip maddr |
统计 |
netstat |
ss |
ss 命令详解
语法
ss [参数] ss [参数] [过滤]
选项
-h, --help 帮助信息 -V, --version 程序版本信息 -n, --numeric 不解析服务名称 -r, --resolve 解析主机名 -a, --all 显示所有套接字(sockets) -l, --listening 显示监听状态的套接字(sockets) -o, --options 显示计时器信息 -e, --extended 显示详细的套接字(sockets)信息 -m, --memory 显示套接字(socket)的内存使用情况 -p, --processes 显示使用套接字(socket)的进程 -i, --info 显示 TCP内部信息 -s, --summary 显示套接字(socket)使用概况 -4, --ipv4 仅显示IPv4的套接字(sockets) -6, --ipv6 仅显示IPv6的套接字(sockets) -0, --packet 显示 PACKET 套接字(socket) -t, --tcp 仅显示 TCP套接字(sockets) -u, --udp 仅显示 UCP套接字(sockets) -d, --dccp 仅显示 DCCP套接字(sockets) -w, --raw 仅显示 RAW套接字(sockets) -x, --unix 仅显示 Unix套接字(sockets) -f, --family=FAMILY 显示 FAMILY类型的套接字(sockets),FAMILY可选,支持 unix, inet, inet6, link, netlink -A, --query=QUERY, --socket=QUERY QUERY := {all|inet|tcp|udp|raw|unix|packet|netlink}[,QUERY] -D, --diag=FILE 将原始TCP套接字(sockets)信息转储到文件 -F, --filter=FILE 从文件中都去过滤器信息 FILTER := [ state TCP-STATE ] [ EXPRESSION ]
【场景一:查看当前用品的网络连接统计】
[root@instance-1 ~]# ss -s Total: 209 (kernel 252) TCP: 15 (estab 5, closed 0, orphaned 0, synrecv 0, timewait 0/0), ports 0 Transport Total IP IPv6 * 252 - - RAW 1 0 1 UDP 4 2 2 TCP 15 10 5 INET 20 12 8 FRAG 0 0 0
【场景二:查看所有打开的网络端口】
[root@instance-1 ~]# ss -l Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port nl UNCONN 0 0 rtnl:kernel * nl UNCONN 0 0 rtnl:NetworkManager/579 * nl UNCONN 0 0 rtnl:NetworkManager/579 * nl UNCONN 768 0 tcpdiag:kernel * nl UNCONN 4352 0 tcpdiag:ss/25263 * nl UNCONN 0 0 xfrm:kernel * nl UNCONN 0 0 selinux:systemd/1 * nl UNCONN 0 0 selinux:kernel *
【场景三:查看所有 socket连接】
ss -a
- 查看
TCP sockets
:-ta
选项; - 查看
UDP sockets
:-ua
选项; - 查看
RAW sockets
:-wa
选项; - 查看
UNIX sockets
:-xa
选项。
【场景四:结合awk统计系统所有状态】
- netstat 统计系统TCP各状态信息
[root@instance-1 ~]# netstat -tan | awk '/^tcp/ {state[$NF]++}END{for(i in state) print i,state[i]}' LISTEN 9 CLOSE_WAIT 1 ESTABLISHED 5
- ss 统计系统TCP各状态信息
[root@instance-1 ~]# ss -atn | awk '{state[$1]++}END{for(i in state) print i,state[i]}' LISTEN 9 CLOSE-WAIT 1 ESTAB 5 State 1
【其它更多案例】
ss -t -a # 显示TCP连接 ss -s # 显示 Sockets 摘要 ss -l # 列出所有打开的网络连接端口 ss -pl # 查看进程使用的socket ss -lp | grep 3306 # 找出打开套接字/端口应用程序 ss -u -a 显示所有UDP Sockets ss -o state established '( dport = :smtp or sport = :smtp )' # 显示所有状态为established的SMTP连接 ss -o state established '( dport = :http or sport = :http )' # 显示所有状态为Established的HTTP连接 ss -o state fin-wait-1 '( sport = :http or sport = :https )' dst 193.233.7/24 # 列举出处于 FIN-WAIT-1状态的源端口为 80或者 443,目标网络为 193.233.7/24所有 tcp套接字 # ss 和 netstat 效率对比 time netstat -at time ss # 匹配远程地址和端口号 # ss dst ADDRESS_PATTERN ss dst 192.168.1.5 ss dst 192.168.119.113:http ss dst 192.168.119.113:smtp ss dst 192.168.119.113:443 # 匹配本地地址和端口号 # ss src ADDRESS_PATTERN ss src 192.168.119.103 ss src 192.168.119.103:http ss src 192.168.119.103:80 ss src 192.168.119.103:smtp ss src 192.168.119.103:25