Linux 基礎之基礎網絡ss命令
- 一、ss命令簡述
- 二、ss命令實用案例
- 示例1:顯示TCP連接: ss -atn
- 示例2:顯示當前 Sockets 概要信息: ss -s
- 示例3:顯示所有TCP的Listen狀態的socket:ss -atl
- 示例4:顯示正在監聽的TCP程序的process:ss -altp
- 示例5:顯示所有established的HTTP連接:ss -o state established '( dport = :http or sport = :http )'
- 示例6:查看ipv4指定過濾規則的socket:ss -4 state FILTER-NAME
- 示例 7:查看源端口爲22的socket信息:ss -iom state established '( sport = :ssh )'
- 示例8 :通過 dst/src/dport/sprot 語法來過濾連接的來源和目標,來源端口和目標端口。
一、ss命令簡述
ss
(Socket Statistics)Socket統計;ss命令可以獲取socket統計信息。它的功能和netstat類似。
1. ss命令特性
- ss比netstat更快速源於在於它能夠顯示更爲詳細的TCP和Socket連接狀態的信息。
- 當服務器的socket連接數量變得非常大時,無論是使用netstat命令還是直接cat /proc/net/tcp,執行速度都會很慢。
- ss利用到了TCP協議棧中tcp_diag。tcp_diag是一個用於分析統計的模塊,可以獲得Linux 內核中最新的數據,進而就確保了ss的快速高效。(ss在沒有 tcp_diag,ss也可以正常運行)
2. ss 和 netstat 效率對比
[root@localhost ~]# time netstat -at
real 0m0.038s
user 0m0.008s
sys 0m0.013s
[root@localhost ~]# time ss -at
real 0m0.006s
user 0m0.003s
sys 0m0.003s
從上面的執行效率可以清晰地看到,ss命令的執行速度是netstat的6倍(不同環境可能執行效率不一樣),可以看到ss 命令的執行之快的優勢,體現的尤爲突出。也爲我們的工作解決執行節省時間(即使當服務器效率較低時)。
3.ss 命令的使用格式
ss
命令默認統計所有建立的連接(不包含監聽的端口),包括 tcp, udp, and unix socket 三種類型的連接;
[root@example opt]# ss --help
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 # 解析主機名,把 IP 解釋爲域名,把端口號解釋爲協議名稱
-a, --all display all sockets #顯示所有Socket
-l, --listening display listening sockets #顯示監聽的Socket
-o, --options show timer information
-e, --extended show detailed socket information #顯示詳細的Socket信息
-m, --memory show socket memory usage #顯示Socket內存使用
-p, --processes show process using socket #顯示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 #顯示進程SELinux 安全山下文
-z, --contexts display process and socket SELinux security contexts #顯示進程和Socket 的SELinux 安全山下文
-N, --net switch to the specified network namespace name
-4, --ipv4 display only IP version 4 sockets #顯示ipv4 的Sockets
-6, --ipv6 display only IP version 6 sockets #顯示ipv6 的Sockets
-0, --packet display PACKET sockets #顯示packet 的Sockets
-t, --tcp display only TCP sockets #顯示TCP 協議 的Sockets
-S, --sctp display only SCTP sockets #顯示STCP 的Sockets
-u, --udp display only UDP sockets #顯示UDP 的Sockets
-d, --dccp display only DCCP sockets
-w, --raw display only RAW sockets
-x, --unix display only Unix domain sockets
--vsock display only vsock sockets
-f, --family=FAMILY display sockets of type FAMILY
FAMILY := {inet|inet6|link|unix|netlink|vsock|help}
-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命令實用案例
示例1:顯示TCP連接: ss -atn
[root@localhost ~]# ss -atn # -a:所有連接 -t:TCP 連接 -n: 不解析名稱
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:111 *:*
LISTEN 0 5 192.168.122.1:53 *:*
LISTEN 0 128 *:22 *:*
LISTEN 0 128 127.0.0.1:631 *:*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 128 127.0.0.1:6010 *:*
LISTEN 0 128 127.0.0.1:6011 *:*
示例2:顯示當前 Sockets 概要信息: ss -s
[root@localhost ~]# ss -s
Total: 653 (kernel 1354)
TCP: 16 (estab 2, closed 1, orphaned 0, synrecv 0, timewait 0/0), ports 0
Transport Total IP IPv6
* 1354 - -
RAW 0 0 0
UDP 8 6 2
TCP 15 9 6
INET 23 15 8
FRAG 0 0 0
示例3:顯示所有TCP的Listen狀態的socket:ss -atl
[root@localhost ~]# ss -alt
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:sunrpc *:*
LISTEN 0 5 192.168.122.1:domain *:*
LISTEN 0 128 *:ssh *:*
LISTEN 0 128 127.0.0.1:ipp *:*
LISTEN 0 100 127.0.0.1:smtp *:*
LISTEN 0 128 127.0.0.1:x11-ssh-offset *:*
LISTEN 0 128 :::sunrpc :::*
LISTEN 0 128 :::ssh :::*
LISTEN 0 128 ::1:ipp :::*
LISTEN 0 100 ::1:smtp :::*
LISTEN 0 128 ::1:x11-ssh-offset :::*
示例4:顯示正在監聽的TCP程序的process:ss -altp
[root@localhost ~]# ss -altp
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:sunrpc *:* users:(("rpcbind",pid=6174,fd=4),("systemd",pid=1,fd=47))
LISTEN 0 5 192.168.122.1:domain *:* users:(("dnsmasq",pid=7202,fd=6))
LISTEN 0 128 *:ssh *:* users:(("sshd",pid=6798,fd=3))
LISTEN 0 128 127.0.0.1:ipp *:* users:(("cupsd",pid=6796,fd=12))
LISTEN 0 100 127.0.0.1:smtp *:* users:(("master",pid=7145,fd=13))
LISTEN 0 128 127.0.0.1:x11-ssh-offset *:* users:(("sshd",pid=13154,fd=9))
示例5:顯示所有established的HTTP連接:ss -o state established ‘( dport = :http or sport = :http )’
[root@localhost ~]# ss -o state established '( dport = :http or sport = :http )'
Netid Recv-Q Send-Q Local Address:Port Peer Address:Port
注意:命令格式,字符之間需要有空格;可以是服務名稱,或端口號,(如:http;80)
示例6:查看ipv4指定過濾規則的socket:ss -4 state FILTER-NAME
FILTER-NAME: | Description |
---|---|
established | 活躍狀態 |
syn-sent | 發送 |
syn-recv | 接收 |
fin-wait-1 | FIN-WAIT-1狀態 |
fin-wait-2 | FIN-WAIT-2狀態 |
time-wait | 等待關閉 |
closed | 已關閉 |
close-wait | 關閉 |
last-ack | |
listen | 正在監聽 |
closing | 正在關閉 |
all | 所有以上狀態 |
connected | 除了listen and closed的所有狀態 |
synchronized | 所有已連接的狀態除了syn-sent |
bucket | 顯示狀態爲maintained as minisockets,如:time-wait和syn-recv. |
big | 和bucket相反. |
查詢處於 FIN-WAIT-1狀態的源端口爲 80或者 443,目標網絡爲 192.168.2/24所有 tcp套接字
[root@localhost ~]# ss -o state fin-wait-1 '( sport = :http or sport = :https )' dst 192.168.2/24
Netid Recv-Q Send-Q Local Address:Port Peer Address:Port
示例 7:查看源端口爲22的socket信息:ss -iom state established ‘( sport = :ssh )’
# -o, --options 顯示時間信息
# -m, --memory 顯示 socket 使用的內存
# -i, --info 顯示更多 TCP 內部的信息
[root@localhost ~]# ss -iom state established '( sport = :ssh )'
Netid Recv-Q Send-Q Local Address:Port Peer Address:Port
tcp 0 48 192.168.2.128:ssh 192.168.2.1:56434 timer:(on,238ms,0) # -o
skmem:(r0,rb369280,t0,tb87040,f1792,w2304,o0,bl0,d0) sack cubic wscale:8,7 rto:240 rtt:39.96/3.157 ato:52 mss:1460 rcvmss:1168 advmss:1460 cwnd:10 bytes_acked:76797 bytes_received:50548 segs_out:1111 segs_in:1874 send 2.9Mbps lastsnd:2 lastrcv:4 lastack:4 pacing_rate 5.8Mbps unacked:1 rcv_rtt:122063 rcv_space:29364 # -m
示例8 :通過 dst/src/dport/sprot 語法來過濾連接的來源和目標,來源端口和目標端口。
8.1 匹配遠程地址(dst)和端口號(dport):
[root@localhost ~]# ss dst 192.168.5/24 # 查詢源地址爲192.168.5/24網段的socket 數據
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
tcp ESTAB 0 48 192.168.5.128:ssh 192.168.5.1:56434
192.168.5.1:56434
$ ss dst 192.168.5.120:http # 查詢遠程地址爲192.168.5.120,端口爲80的Socket
$ ss dst 192.168.5.120:443
8.2 匹配本地地址(src)和端口號(sport)
[root@localhost ~]# ss src 192.168.5/24 # 查詢源地址爲192.168.5/24網段的socket 數據
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
tcp ESTAB 0 48 192.168.5.128:ssh
8.3 匹配指定端口範圍的socket數據:
格式: ss [dport|sport] Option port
Option | 說明 |
---|---|
le(<=) | 小於等於 |
ge(>=) | 大於等於 |
lt(<) | 小於 |
gt(>) | 大於 |
eq(==) | 等於 |
ne(!=) | 不等於 |
# 查詢遠端端口號大於50的TCP的Socket
[root@localhost ~]# ss -t dport ge 50
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 48 192.168.5.128:ssh 192.168.5.1:56434
總結:
由於ss命令的性能出色且功能豐富,可以使用ss
命令替代 netsate
命令成爲我們日常查看 socket 相關信息的利器。常見的ss命令使用方式,基本如上,更多的需我們結合自己的能力不斷地在工作中總結。歡迎在留言區與我討論。