在目前衆多較新的 Linux 發行版中,已經移除了 net-tools 套件,ifconfig、route、netstat、arp 等一系列工具均沒法使用。缺乏這些工具,在對系統進行管理時,會不會變得舉步維艱呢?服務器
答案是:不會。官方既然刪除了 net-tools 套件,就會有新的替代方案。好比:在 CentOS 7.6 中,官方就使用了 iproute-4.11.0-14.el7.x86_64 替代了 net-tools 相關版本。新的工具 ip 代替了 ifconfig, ss 代替了 netstat。這兩個工具都是系統管理中很是重要的工具。接下來將在 CentOS Linux release 7.6.1810 (Core) 對 ss 工具進行實踐。dom
ss 是 socket statistics 的縮寫。顧名思義,ss 命令能夠用來獲取socket 統計信息,它能夠顯示與 netstat 相似的內容。但 ss 的優點在於它可以顯示更多更詳細的有關TCP和鏈接狀態的信息,並且比netstat更快速更高效。ssh
當服務器的socket鏈接數量變得很是大時,不管是使用netstat命令仍是 cat /proc/net/tcp,執行速度都會很慢。可能你不會有切身的感覺,但請相信我,當服務器維持的鏈接達到上萬個的時候,使用 netstat 等於浪費生命,而用 ss 纔是最正確的選擇。socket
天下武功惟快不破。 ss 快的祕訣在於,他利用了TCP協議棧中 tcp_diag. tcp_diag 是一個用於分析統計的模塊,能夠得到 Linux 內核中第一手的信息,這就確保了ss的快捷高效。固然,若是你的系統中沒有 tcp_diag, ss 也能夠正常運行,只是效率會變得稍慢,但仍然比 netstat 要快。tcp
說到這裏,你們是否是很是激動了?是否是都想躍躍欲試了?ide
按照常規 Linux 學習路線,咱們先查看一下系統幫助。工具
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 # 顯示全部的 sockets -l, --listening display listening sockets # 顯示監聽的 sockets -o, --options show timer information # 顯示定時器信息 -e, --extended show detailed socket information # 顯示詳細的 socket 信息 -m, --memory show socket memory usage # 顯示內存的使用狀況 -p, --processes show process using socket # 顯示使用套接字的進程 -i, --info show internal TCP information # 顯示 tcp 內部信息 -s, --summary show socket usage summary # 顯示套接字(socket)使用概況 -b, --bpf show bpf filter socket information -E, --events continually display sockets as they are destroyed -Z, --context display process SELinux security contexts -z, --contexts display process and socket SELinux security contexts -N, --net switch to the specified network namespace name -4, --ipv4 display only IP version 4 sockets # 僅顯示 IPv4 的套接字 -6, --ipv6 display only IP version 6 sockets # 僅顯示 IPv6 的套接字 -0, --packet display PACKET sockets # 顯示 PACKET 套接字 -t, --tcp display only TCP sockets # 僅顯示 TCP 套接字 -S, --sctp display only SCTP sockets # 僅顯示 SCTP 套接字 -u, --udp display only UDP sockets # 僅顯示 UDP 套接字 -d, --dccp display only DCCP sockets # 僅顯示 DCCP 套接字 -w, --raw display only RAW sockets # 僅顯示 RAW 套接字 -x, --unix display only Unix domain sockets # 僅顯示 Unix 套接字 --vsock display only vsock sockets -f, --family=FAMILY display sockets of type FAMILY FAMILY := {inet|inet6|link|unix|netlink|vsock|help} # 顯示 FAMILY 類型的套接字,FAMILY可選 Unix, inet, inet6, link , netlink -K, --kill forcibly close sockets, display what was closed -H, --no-header Suppress header line -A, --query=QUERY, --socket=QUERY QUERY := {all|inet|tcp|udp|raw|unix|unix_dgram|unix_stream|unix_seqpacket|packet|netlink|vsock_stream|vsock_dgram}[,QUERY] -D, --diag=FILE Dump raw information about TCP sockets to FILE -F, --filter=FILE read filter information from FILE # 從文件中都去過濾信息 FILTER := [ state STATE-FILTER ] [ EXPRESSION ] STATE-FILTER := {all|connected|synchronized|bucket|big|TCP-STATES} TCP-STATES := {established|syn-sent|syn-recv|fin-wait-{1,2}|time-wait|closed|close-wait|last-ack|listen|closing} connected := {established|syn-sent|syn-recv|fin-wait-{1,2}|time-wait|close-wait|last-ack|closing} synchronized := {established|syn-recv|fin-wait-{1,2}|time-wait|close-wait|last-ack|closing} bucket := {syn-recv|time-wait} big := {established|syn-sent|fin-wait-{1,2}|closed|close-wait|last-ack|listen|closing}
命令:ss -at學習
結果:this
State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 *:ssh *:*
命令:ss -s
結果:spa
Total: 558 (kernel 1020) TCP: 5 (estab 1, closed 0, orphaned 0, synrecv 0, timewait 0/0), ports 0 Transport Total IP IPv6 * 1020 - - RAW 1 0 1 UDP 2 1 1 TCP 5 3 2 INET 8 4 4 FRAG 0 0 0
命令:ss -l
結果:
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port nl UNCONN 0 0 rtnl:NetworkManager/13282 * nl UNCONN 0 0 rtnl:kernel * *
命令:ss -lp
結果:
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port nl UNCONN 0 0 audit:auditd/3760 * u_dgr UNCONN 0 0 /var/run/chrony/chronyd.sock 26487 * 0 users:(("chronyd",pid=3918,fd=5)) udp UNCONN 0 0 ::1:323 :::* users:(("chronyd",pid=3918,fd=2)) u_seq LISTEN 0 128 /run/udev/control 18173 * 0 users:(("systemd-udevd",pid=2040,fd=3),("systemd",pid=1,fd=42))
命令:ss -au
結果:
State Recv-Q Send-Q Local Address:Port Peer Address:Port UNCONN 0 0 127.0.0.1:323 *:* UNCONN 0 0 ::1:323 :::*
命令:ss -t -o state established dst 172.31.2.25
結果:
Recv-Q Send-Q Local Address:Port Peer Address:Port 0 64 172.31.2.101:ssh 172.31.2.25:61159 timer:(on,461ms,0)
命令:ss -ato state established src 172.31.2.102
結果:
Recv-Q Send-Q Local Address:Port Peer Address:Port 0 64 172.31.2.102:ssh 172.31.2.25:61179 timer:(on,398ms,0)
state 能夠參考如下:
STATE-FILTER := {all|connected|synchronized|bucket|big|TCP-STATES} TCP-STATES := {established|syn-sent|syn-recv|fin-wait-{1,2}|time-wait|closed|close-wait|last-ack|listen|closing} connected := {established|syn-sent|syn-recv|fin-wait-{1,2}|time-wait|close-wait|last-ack|closing} synchronized := {established|syn-recv|fin-wait-{1,2}|time-wait|close-wait|last-ack|closing} bucket := {syn-recv|time-wait} big := {established|syn-sent|fin-wait-{1,2}|closed|close-wait|last-ack|listen|closing}
命令:ss dst 172.31.2.25:61895
結果:
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port tcp ESTAB 0 64 172.31.2.100:ssh 172.31.2.25:61895
不指定端口號則匹配全部,查看本地的以此類推。
命令: ss -a4tlp
結果:
State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 *:ssh *:* users:(("sshd",pid=4716,fd=3)) LISTEN 0 100 127.0.0.1:smtp *:* users:(("master",pid=4926,fd=13))
咱們很方便的就能從結果中找到相關的有用信息,好比:pid,fd。
4.1 ss 是 Linux 中很是有用的工具,在系統管理過程當中頗有必要掌握。
4.2 擁抱改變,接受現實,用學習來迎接新的挑戰,沒有了 netstat, 咱們使用 ss 工具同樣能完成以前的工做。