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_diagtcp_diag 是一个用于分析统计的模块,可以获得 Linux 内核中第一手的信息,这就确保了 ss 的快捷高效。当然,如果你的系统中没有 tcp_diagss 也可以正常运行,只是效率会变得稍慢。

当服务器的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