ss的篡权_java

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 -rip route
netstat -iip -s link
netstat -gip maddr

为了清晰一些,我做了一张对比图:

ss的篡权_java_02

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
地址和链路配置ifconfigip addr, ip link
路由表routeip route
邻居arpip neigh
VLANvconfigip link
隧道iptunnelip tunnel
组播ipmaddrip maddr
统计netstatss

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