ssコマンドはソケットの使用状況を調べることができます。net-toolsパッケージのnetstatコマンドと似たような情報を得ることができます。
net-toolsパッケージは非推奨となったため、現在はnet-toolsから移行する形でiprouteパッケージ(iproute2パッケージ)のssコマンドを利用してソケットの使用状況を調べます。
ssの名前はsockstat、つまりsocket statisticsの略になります。
目次
- 1 ssコマンドの構文
- 2 listen状態ではないソケットを表示(オプションなし)
- 3 ヘッダーを表示しない(-Hオプション)
- 4 全てのソケットを表示(-aオプション)
- 5 listen状態のソケットを表示(-lオプション)
- 6 サービス名等を数字で表示(-nオプション)
- 7 アドレスを名前解決して表示(-rオプション)
- 8 統計情報を表示(-sオプション)
- 9 イベントが起きたときのソケットを監視(-Eオプション)
- 10 FAMILYを指定(-fオプション等)
- 11 ソケットタイプを絞り込む(-Aオプション等)
- 12 ファイルからフィルタを読み込む(-Fオプション)
- 13 ソケットを利用しているプロセスを表示(-pオプション)
- 14 タイマー情報を表示(-oオプション)
- 15 ソケットのメモリー使用情報を表示(-mオプション)
- 16 詳細なソケット情報を表示(-eオプション)
- 17 ソケットのTCP内部情報を表示(-iオプション)
- 18 ToS情報を表示(--tosオプション)
- 19 cgroup情報を表示(--cgroupオプション)
- 20 inetソケットオプションを表示(--inet-sockoptオプション)
- 21 参考
ssコマンドの構文
ssコマンドの構文
1 |
ss [options] [ FILTER ] |
フィルタの構文
1 |
FILTER := [ state <STATE-FILTER> ] [ <EXPRESSION> ] |
ssコマンドでのFILTERを用いた例
1 2 3 4 5 6 7 |
ss state connected ss state connected dport :22 ss state connected dst 192.168.0.10 ss state connected dst 192.168.0.10 dport :22 ss dport :22 ss '( dst 192.168.0.10 or dst 192.168.0.9 ) and dport :22' ss '( dst 192.168.0.10 or dst 192.168.0.9 ) dport :22' # andは省略可 |
ssコマンドでフィルタを用いる場合、解釈する文字列によってはシェルで解釈される場合があるので、必要に応じて引用符で囲む必要があります。
しかし、'state <STATE-FILTER>'の部分はstateという文字列でコマンドラインオプションのような解釈の処理を行うため、'state'と'<STATE-FILTER>'のトークンをまとめて、引用符で囲んではいけません。
1 2 |
ss 'state established' # NG ss 'state' 'established' # このような記述は少々冗長ですがOK |
STATE-FILTER
state <STATE-FILTER>のように記述します。
1 2 |
STATE-FILTER := <TCP-state> | all | connected | synchronized | bucket | big TCP-state := established | syn-sent | syn-recv | fin-wait-1 | fin-wait2 | closed | close-wait | last-ack | listening | closing |
all : 全ての状態
connected : listeningとclosedを除いた全ての状態
synchronized : syn-sentを除いた全てのconnectedの状態
bucket : minisocketとして維持されている状態(例:time-wait, syn-rec)
big : bucketを除いた全ての状態
EXPRESSION
複数のEXPRESSIONは暗黙的に"and"で結合されます。
Subexpressionとして括弧"()"を用いることができます。例:dst 127.0.0.1 ( dport = :3000 dev = lo )
EXPRESSIONで用いるものは以下のものになります。
1 2 3 4 5 6 |
{dst | src} [=] HOST {dport | sport} [OP] [FAMILY:]:PORT dev [=|!=] DEVICE fwmark [=|!=] MASK cgroup [=|!=] PATH autobound |
- {dst | src} [=] HOST
宛先または送信元のホストがマッチするかどうか - {dport | sport} [OP] [FAMILY:]:PORT
宛先ポートまたは送信元ポートと比較して条件に合うかどうか
OPは比較演算子で"=", "<", "<=", "=", "!=", ">=", ">" - dev [=|!=] DEVICE
使用しているデバイスにマッチするかどうか - fwmark [=|!=] MASK
fwmark値がマッチするかどうか - cgroup [=|!=] PATH
cgroupとパスがマッチするかどうか - autobound
送信元アドレスのポートまたはパスが自動で割り当てられたものかどうか
演算子を省略すると"="になります。また、ほとんどの演算子はエイリアス(別名)もあります。
1 2 3 4 5 6 7 8 9 |
= == eq != ne neq > gt < lt >= ge geq <= le leq ! not | || or & && and |
ホスト名の構文
ホスト名の構文
1 2 |
HOST := [FAMILY:]ADDRESS[:PORT] FAMILY := unix | link | netlink | vsock | inet | inet6 |
FAMILYはssコマンドの-fオプションで指定できます。ただし、一つしか指定できません。
FAMILYによって、ADDRESSとPORTを指定する形式は変わります。
良く知られているPORT名は例えば、:sshのようにサービス名で指定できます。そのリストは/etc/servicesで確認できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
$ cat /etc/services | grep -v '^#' | head -n 20 tcpmux 1/tcp # TCP port service multiplexer echo 7/tcp echo 7/udp discard 9/tcp sink null discard 9/udp sink null systat 11/tcp users daytime 13/tcp daytime 13/udp netstat 15/tcp qotd 17/tcp quote chargen 19/tcp ttytst source chargen 19/udp ttytst source ftp-data 20/tcp ftp 21/tcp fsp 21/udp fspd ssh 22/tcp # SSH Remote Login Protocol telnet 23/tcp smtp 25/tcp mail time 37/tcp timserver |
listen状態ではないソケットを表示(オプションなし)
ssコマンドはオプションなしの場合、listen状態ではないソケットを表示します。
コマンド例と実行結果
1 2 3 4 5 6 |
$ ss | head -n5 Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process u_dgr ESTAB 0 0 /run/systemd/notify 15843 * 0 u_dgr ESTAB 0 0 /run/systemd/journal/dev-log 15867 * 0 u_dgr ESTAB 0 0 /run/systemd/journal/socket 15869 * 0 u_str ESTAB 0 0 * 93901 * 93900 |
ヘッダーを表示しない(-Hオプション)
-Hオプションはヘッダーを表示しません。sortコマンド等と一緒に利用するときに用いるときに便利です。
コマンド例と実行結果
1 2 3 4 5 6 |
$ ss -H | head -n5 u_dgr ESTAB 0 0 /run/systemd/notify 15843 * 0 u_dgr ESTAB 0 0 /run/systemd/journal/dev-log 15867 * 0 u_dgr ESTAB 0 0 /run/systemd/journal/socket 15869 * 0 u_str ESTAB 0 0 * 93901 * 93900 u_str ESTAB 0 0 * 22708 * 22709 |
この記事ではソケットの状態の種類をざっと確認するために以下のコマンドを利用したいと思います。
例えば、以下でssコマンドのオプションなしの場合にlisten状態のソケットがないことを確認できます。
1 2 3 |
$ ss -H | sed -r 's/ +/ /g' |sort -k2 | uniq -f1 -w5 u_str ESTAB 0 0 * 117367 * 0 icmp6 UNCONN 0 0 *:ipv6-icmp *:* |
UNCONNはunconnectedの略になり、TCPだとCLOSEDの状態を表します。
全てのソケットを表示(-aオプション)
-aオプションは全てのソケットを表示することができます。
コマンド例と実行結果
1 2 3 4 |
$ ss -H -a | sed -r 's/ +/ /g' | sort -k2 | uniq -f1 -w5 u_str ESTAB 0 0 * 117367 * 0 u_str LISTEN 0 10 @/home/ubuntu/.cache/ibus/dbus-g6fjYcfM 23754 * 0 udp UNCONN 0 0 0.0.0.0:55317 0.0.0.0:* |
listen状態のソケットを表示(-lオプション)
-lオプションはオプションなしのときに表示されなかったlisten状態のソケットを表示できます。
コマンド例と実行結果
1 2 3 |
$ ss -H -l | sed -r 's/ +/ /g' |sort -k2 | uniq -f1 -w5 u_str LISTEN 0 10 @/home/ubuntu/.cache/ibus/dbus-g6fjYcfM 23754 * 0 udp UNCONN 0 0 0.0.0.0:55317 0.0.0.0:* |
サービス名等を数字で表示(-nオプション)
-nオプションはサービス名を数字で表示することができます。
コマンド例と実行結果
1 2 3 4 5 6 |
$ ss -a 'dport ssh' Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process tcp ESTAB 0 0 192.168.224.10:49648 192.168.224.9:ssh $ ss -n -a 'dport ssh' Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process tcp ESTAB 0 0 192.168.224.10:49648 192.168.224.9:22 |
アドレスを名前解決して表示(-rオプション)
-rオプションはアドレスを名前解決して表示できます。
コマンド例と実行結果
1 2 3 4 5 6 |
$ ss -a 'dport ssh' Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process tcp ESTAB 0 0 192.168.224.10:49648 192.168.224.9:ssh $ ss -r -a 'dport ssh' Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process tcp ESTAB 0 0 ubuntu-VirtualBox:49648 testhost.aaadomain.test:ssh |
統計情報を表示(-sオプション)
-sオプションは統計情報を表示できます。
コマンド例と実行結果
1 2 3 4 5 6 7 8 9 10 |
$ ss -s Total: 742 TCP: 5 (estab 1, closed 0, orphaned 0, timewait 0) Transport Total IP IPv6 RAW 1 0 1 UDP 9 7 2 TCP 5 4 1 INET 15 11 4 FRAG 0 0 0 |
イベントが起きたときのソケットを監視(-Eオプション)
イベントが起きたときのソケットを監視できます。
破棄されたソケットを表示していきます。
Ctrl+cで終了します。
コマンド例と実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$ ss -E | sed -r 's/ +/ /g' Netid State Recv-Q Send-Q Local Address:Port Peer Address:PortProcess udp UNCONN 0 -1 0.0.0.0:* 0.0.0.0:* udp UNCONN 0 -1 0.0.0.0:* 0.0.0.0:* udp UNCONN 0 -1 0.0.0.0:* 0.0.0.0:* udp UNCONN 0 -1 0.0.0.0:* 0.0.0.0:* udp UNCONN 0 -1 0.0.0.0:* 0.0.0.0:* udp ESTAB 0 -1 192.168.224.10:34142 192.168.224.254:domain udp ESTAB 0 -1 192.168.224.10:55414 192.168.224.254:domain udp ESTAB 0 -1 127.0.0.1:52540 127.0.0.53:domain ~~以下省略~~ ^C $ |
FAMILYを指定(-fオプション等)
FAMILYを一つ指定できます。指定できるFAMILYはunix, inet, inet6, link, netlink, vsock, xdpになります。
コマンド例と実行結果
1 2 3 4 5 6 |
$ ss -a -f inet6 Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process icmp6 UNCONN 0 0 *:ipv6-icmp *:* udp UNCONN 0 0 [::]:mdns [::]:* udp UNCONN 0 0 [::]:60730 [::]:* tcp LISTEN 0 128 [::1]:ipp [::]:* |
-fオプションはエイリアスとしてそれぞれのFAMILYを指定できる別オプションがあります。これらのオプションを複数使用してもそのうちの一つしか機能しません。
1 2 3 4 5 6 |
ss -4 # -f inet ss -6 # -f inet6 ss -0 # -f link ss -x # -f unix ss --vsock # -f vsock ss --xdp # -f xdp |
ソケットタイプを絞り込む(-Aオプション等)
-Aオプションはソケットタイプをコンマでリストして、ソケットタイプを絞り込むことができます。
指定できるタイプは
all, inet, tcp, udp, raw, unix, packet, netlink, unix_dgram, unix_stream, unix_seqpacket, packet_raw, packet_dgram, dccp, sctp, vsock_stream, vsock_dgram, xdpがあります。
また、ソケットタイプの前に"!"をつけることでそのタイプを絞り込みから除外できます。
例えば、
1 |
ss -a -A 'all,!tcp' |
は全てのソケットからTCPソケットを除外して表示できます。
コマンド例と実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
$ ss -H -a -A 'all' | sed -r 's/ +/ /g' |sort -k1 | uniq -w3 icmp6 UNCONN 0 0 *:ipv6-icmp *:* nl UNCONN 0 0 audit:-778244016 * p_dgr UNCONN 0 0 arp:enp0s3 * p_raw UNCONN 0 0 *:enp0s3 * tcp ESTAB 0 0 192.168.224.10:49648 192.168.224.9:ssh u_dgr ESTAB 0 0 * 15844 * 15845 udp ESTAB 0 0 192.168.224.10%enp0s3:bootpc 192.168.224.254:bootps u_seq LISTEN 0 4096 /run/udev/control 15875 * 0 $ $ ss -H -a -A 'all,!tcp' | sed -r 's/ +/ /g' |sort -k1 | uniq -w3 icmp6 UNCONN 0 0 *:ipv6-icmp *:* nl UNCONN 0 0 audit:-778244016 * p_dgr UNCONN 0 0 arp:enp0s3 * p_raw UNCONN 0 0 *:enp0s3 * u_dgr ESTAB 0 0 * 15844 * 15845 udp ESTAB 0 0 192.168.224.10%enp0s3:bootpc 192.168.224.254:bootps u_seq LISTEN 0 4096 /run/udev/control 15875 * 0 |
ソケットタイプの一部は簡単なオプションで絞り込むことができ、複数の使用も可能です。
1 2 3 4 5 |
ss -t # TCP ss -u # UDP ss -d # DCCP ss -w # RAW ss -S # SCTP |
ファイルからフィルタを読み込む(-Fオプション)
-Fオプションはファイルからフィルタを読み込むことができます。
dns_ssh_filter
1 2 3 |
( src * sport :domain ) or ( src * dport :ssh ) |
コマンド例と実行結果
1 2 3 4 5 6 7 |
$ ss -a -F dns_ssh_filter Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process udp UNCONN 0 0 127.0.0.54:domain 0.0.0.0:* udp UNCONN 0 0 127.0.0.53%lo:domain 0.0.0.0:* tcp LISTEN 0 4096 127.0.0.53%lo:domain 0.0.0.0:* tcp LISTEN 0 4096 127.0.0.54:domain 0.0.0.0:* tcp ESTAB 0 0 192.168.224.10:49648 192.168.224.9:ssh |
補足として、利用しているポートのサービス名とポート番号の対応は以下の通りです。
1 2 3 4 5 6 |
$ cat /etc/services | grep -e 'ssh' -e 'domain' ssh 22/tcp # SSH Remote Login Protocol domain 53/tcp # Domain Name Server domain 53/udp domain-s 853/tcp # DNS over TLS [RFC7858] domain-s 853/udp # DNS over DTLS [RFC8094] |
dns_ssh_filterのフィルタの記述方法は別の方法でも記述できます。
例えば、論理演算の分配則のようにsrc *をまとめて
1 |
src * and ( sport :domain or dport :ssh ) |
のように記述できます。また、ssコマンドはandを省略できるため、
1 |
src * ( sport :domain or dport :ssh ) |
のように記述できます。
ソケットを利用しているプロセスを表示(-pオプション)
-pオプションを用いるとソケットを利用しているプロセスが表示されるようになります。
コマンド例と実行結果
1 2 3 |
$ ss -a -p 'dport :ssh' Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process tcp ESTAB 0 0 192.168.224.10:49648 192.168.224.9:ssh users:(("ssh",pid=11881,fd=3)) |
タイマー情報を表示(-oオプション)
-oオプションを用いるとタイマー情報が表示されるようになります。
コマンド例と実行結果
1 2 |
$ ss -a -o 'dport :ssh' | grep timer tcp ESTAB 0 0 192.168.224.10:49648 192.168.224.9:ssh timer:(keepalive,77min,0) |
ソケットのメモリー使用情報を表示(-mオプション)
-mオプションを用いるとソケットのメモリー使用情報が表示されるようになります。
コマンド例と実行結果
1 2 3 4 |
$ ss -a -m 'dport :ssh' Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process tcp ESTAB 0 0 192.168.224.10:49648 192.168.224.9:ssh skmem:(r0,rb131072,t0,tb87040,f0,w0,o0,bl0,d1) |
詳細なソケット情報を表示(-eオプション)
-eオプションを用いると詳細なソケット情報が表示されるようになります。
コマンド例と実行結果
1 2 3 |
$ ss -a -e 'dport :ssh' Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process tcp ESTAB 0 0 192.168.224.10:49648 192.168.224.9:ssh timer:(keepalive,68min,0) uid:1000 ino:165546 sk:383 cgroup:/user.slice/user-1000.slice/[email protected]/app.slice/app-org.gnome.Terminal.slice/vte-spawn-eba212e5-b201-4d72-b587-f00a08e628c3.scope <-> |
ソケットのTCP内部情報を表示(-iオプション)
-iオプションを用いるとソケットのTCPの内部情報が表示されるようになります。
コマンド例と実行結果
1 2 3 4 |
$ ss -a -i 'dport :ssh' Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process tcp ESTAB 0 0 192.168.224.10:49648 192.168.224.9:ssh cubic wscale:7,7 rto:216 rtt:12.717/17.694 ato:40 mss:1448 pmtu:1500 rcvmss:1448 advmss:1448 cwnd:10 bytes_sent:4905 bytes_acked:4906 bytes_received:6292 segs_out:31 segs_in:35 data_segs_out:13 data_segs_in:24 send 9.11Mbps lastsnd:2280248 lastrcv:2280248 lastack:2280248 pacing_rate 18.2Mbps delivery_rate 35.6Mbps delivered:14 app_limited busy:184ms rcv_rtt:5.5 rcv_space:14480 rcv_ssthresh:64088 minrtt:0.325 |
ToS情報を表示(--tosオプション)
--tosオプションを用いるとToS(Type of Service)情報が表示されるようになります。
コマンド例と実行結果
1 2 3 |
$ ss -a --tos 'dport :ssh' Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process tcp ESTAB 0 0 192.168.224.10:49648 192.168.224.9:ssh tos:0x10 class_id:0x6 |
cgroup情報を表示(--cgroupオプション)
--cgroupオプションを用いるとcgroup情報が表示されるようになります。
コマンド例と実行結果
1 2 3 |
$ ss -a --cgroup 'dport :ssh' Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process tcp ESTAB 0 0 192.168.224.10:49648 192.168.224.9:ssh cgroup:/user.slice/user-1000.slice/[email protected]/app.slice/app-org.gnome.Terminal.slice/vte-spawn-eba212e5-b201-4d72-b587-f00a08e628c3.scope |
inetソケットオプションを表示(--inet-sockoptオプション)
--inet-sockoptオプションを用いるとinetソケットオプション情報が表示されるようになります。
コマンド例と実行結果
1 2 3 4 |
$ ss -a --inet-sockopt 'dport :ssh' Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process tcp ESTAB 0 0 192.168.224.10:49648 192.168.224.9:ssh inet-sockopt: ( is_icsk mc_loop mc_all) |