今、ポートの状態がどうなっているのか…時々とっても気になる。どのポートが開いてるんだっけ?どのプロセスがそのポートを使ってるんだっけ?ってなる度に検索するんだけど、そこに書かれたコマンドをなんか適当に使ってみているだけで、スカッと欲しいものを取れる感じもしない…
netstat…ポートの状態を確認しようと検索するとたいてい出てくるコマンド。でも、ssの方が新しいらしいらしいので、こっちを覚える方がいいのかなって思った。ところが日本語の manpage を探してみたけれど見つからない。多分、絶対にある。あるんだろうけど見つからない。なので自分用に翻訳し、自分で使うことにした。
結論として、自分としてよく使いそうな感じなのは…
# 使用しているポートを表示してくれる
$ ss -A tcp,udp,raw state listening state unconnected
# 使用しているポートとプロセスを表示してくれる
$ sudo ss -p -A tcp,udp,raw state listening state unconnected
※ -n を加えると、ポート番号が数字で表示される。
だった。
ssなんちゃって翻訳
もとのページはこちら。
http://manpages.ubuntu.com/manpages/bionic/en/man8/ss.8.html
日本語版はなかったので、Google先生を活用したなんちゃって翻訳をしてみた。
一部、どんな効果が現れるのかを訳注で記載。また、知識が足らずGoogle先生の翻訳結果をそのまま載せているだけの部分が多数ある。
名前
ss - もう一つの万能ソケット調査
書式
ss [options] [ FILTER ]
説明
ssはソケット統計をダンプするために使用されます。netstatと同様の情報を表示できます。他のツールよりも多くのTCPおよび状態情報を表示できます。
オプション
オプションが使用されていない場合、ssは接続を確立しているオープンな非リスニングソケット(例 TCP/UNIX/UDPなど)のリストを表示します。
-h, --help
オプションの要約を表示します。
-V, --version
バージョン情報を出力します。
-H, --no-header
見出し行を差し止めます。
-n, --numeric
サービス名の解決をしません。
訳注) mysql → 3306 とポート番号表示になる。
-r, --resolve
数字のアドレス/ポートを解決します。
訳注) 127.0.0.1 → localhost.localdomain 等の名前になる。
-a, --all
リスニングと非リスニング(TCPでは確立された接続を意味します)ソケットの両方を表示します。
訳注) 全ての状態(LISTEN,UNCONN,TIME-WAIT等)が表示される。
-l, --listening
リスニングソケットのみを表示します(デフォルトで省略されます)。
訳注) 状態がLISTENとUNCONNのソケットが表示される。
-o, --options
タイマー情報を表示する。TCPプロトコル向けに以下のフォーマットで出力します。
timer:(<timer_name>,<expire_time>,<retrans>)
訳注) 確立済みのソケットで timer:(keepalive,118min,0) 等が表示される。
<timer_name>
タイマーの名前で、5種類あります。
on: これらいずれかを意味します: tcp retrans timer, tcp early retrans timer, tail loss probe timer
keepalive: tcp keep alive timer
timewait: timewait stage timer
persist: zero window probe timer
unknown: noe of the above timers
<expire_time>
タイマーの有効期限。
<retrans>
再送発生回数。
-e, --extended
詳細なソケット情報を表示します。出力フォーマットは:
uid:<uid_number> ino:<inode_number> sk:<cookie>
訳注) 行末に uid:999 ino:41790 sk:103 等が表示される。
timer:(timewait,59sec,0) ino:0 sk:283 のような例もあった。
<uid_number>
ソケットが属するユーザーID
<inode_number>
VFSにおけるソケットのinode番号。
訳注) VFS は Virtual File System。socket構造体は、VFS-inode構造体の一部であり、ソケットの割り当てはVFS-inodeの割り当てを意味する。
<cookie>
ソケットのUUID。
-m, --memory
ソケットのメモリ使用量を表示します。出力フォーマットは:
skmem:(r<rmem_alloc>,rb<rcv_buf>,t<wmem_alloc>,tb<snd_buf>,f<fwd_alloc>,w<wmem_queued>,o<opt_mem>,bl<back_log>)
訳注) 行末に skmem:(r0,rb212992,t0,tb212992,f0,w0,o0,bl0,d0) 等が表示される。dに関する説明はなかった。
<rmem_alloc>
パケットを受信するために割り当てられたメモリ。
<rcv_buf>
パケットの受信に割り当て可能な総メモリ。
<wmem_alloc>
パケットの送信に使用されるメモリ(レイヤー3に送信済み)。
<snd_buf>
パケットの送信に割り当て可能な総メモリ。
<fwd_alloc>
ソケットによってキャッシュとして割り当てられたが、まだパケットの受信/送信には使用されていないメモリ。
パケットの送受信にメモリが必要な場合、追加のメモリを割り当てる前にこのキャッシュのメモリが使用されます。
<wmem_queued>
パケットの送信に割り当てられたメモリ(レイヤー3に送信されていない)。
<opt_mem>
ソケットオプションの保存に使用されるメモリ、たとえば、TCP MD5署名のキー。
<back_log>
skバックログキューに使用されるメモリ。プロセスコンテキストで、プロセスがパケットを受信していて、新しいパケットを受信した場合、それはskバックログキューに入れられるため、プロセスはすぐに受信できます。
-p, --processes
ソケットを使用するプロセスを表示します。
訳注) 行末に users:(("systemd",pid=3858,fd=2),("systemd",pid=3858,fd=1)) 等が表示される。全てのプロセスを表示するにはroot権限が必要です。
-i, --info
内部TCP情報を表示します。以下のフィールドが表示されるかもしれません:
訳注) 確立済みのソケットの次の行に表示される。
ts
タイムスタンプオプションが設定されている場合、文字列「ts」を表示する。
sack sack
オプションが設定されている場合、文字列「sack」を表示します。
ecn
輻輳通知オプションが設定されている場合、文字列「ecn」を表示します。
ecnseen
受信したパケットにsaw ecnフラグが見つかった場合、文字列「ecnseen」を表示します。
fastopen
fastopenオプションが設定されている場合、文字列「fastopen」を表示します。
cong_alg
輻輳アルゴリズム。デフォルトの輻輳アルゴリズムは「cubic」です。
wscale:<snd_wscale>:<rcv_wscale>
ウィンドウスケールオプションが使用されている場合、このフィールドにはスケール送信ファクトリと受信スケールファクトリが表示されます。
rto:<icsk_rto>
tcp再送信タイムアウト値で、単位はミリ秒です。
backoff:<icsk_backoff>
指数バックオフ再送信に使用され、実際の再送信タイムアウト値はicsk_rto << icsk_backoffです。
rtt:<rtt>/<rttvar>
rttは平均往復時間、rttvarはrttの平均偏差で、単位はミリ秒です。
ato:<ato>
ackタイムアウト、単位はミリ秒、遅延ackモードに使用されます。
mss:<mss>
最大セグメントサイズです。
cwnd:<cwnd>
輻輳ウィンドウサイズです。
pmtu:<pmtu>
パスMTU値です。
ssthresh:<ssthresh>
tcp輻輳ウィンドウのスロースタートしきい値です。
bytes_acked:<bytes_acked>
確認されたバイト数です。
bytes_received:<bytes_received>
受信したバイト数です。
segs_out:<segs_out>
送信されたセグメントです。
segs_in:<segs_in>
受信したセグメントです。
send <send_bps>bps
出力bpsです。
lastsnd:<lastsnd>
最後のパケットが送信されてからの時間。単位はミリ秒です。
lastrcv:<lastrcv>
最後のパケットが受信されてからの時間。単位はミリ秒です。
lastack:<lastack>
最後のackが受信されてからの時間。単位はミリ秒です。
pacing_rate <pacing_rate>bps/<max_pacing_rate>bps
ペーシング率と最大ペーシング率。
rcv_space:<rcv_space>
TCP内部自動チューニングソケット受信バッファーのヘルパー変数です。
-K, --kill
ソケットを強制的に閉じます。このオプションは、正常に閉じられたソケットを表示し、カーネルが閉じることをサポートしていないソケットを静かにスキップします。IPv4およびIPv6ソケットのみをサポートします。
-s, --summary
要約統計を表示します。このオプションは、さまざまなソースから概要を取得するソケットリストを解析しません。ソケットの量が非常に大きいため、/proc/net/tcpの解析が苦痛な場合に便利です。
訳注) 統計を一覧形式で表示するようです。
-Z, --context
-pオプションだけでなくプロセスのセキュリティコンテキストを表示します。
netlink(7)ソケットの場合、開始プロセスコンテキストは次のように表示されます:
1. 有効なpidがプロセスコンテキストを示している場合。
2. 宛先がカーネル(pid=0)の場合、カーネルの初期コンテキストを表示します。
3. カーネルまたはネットリンクユーザーによって一意の識別子が割り当てられている場合、コンテキストを「使用不可」として表示します。 これは通常、プロセスには複数のnetlinkソケットがアクティブです。
訳注) このオプションを付けて実行してみたら、ss: SELinux is not enabled. と表示され結果は表示されませんでした。SELinuxという保護機構から情報を取り出すモノであって、Ubuntu系はAppArmorだから使えそうもありません。
-z, --contexts
-Zオプションとしてだけでなく、ソケットコンテキストも表示します。 ソケットコンテキストは、関連するiノードから取得され、カーネルが保持する実際のソケットコンテキストではありません。 ソケットは通常、作成プロセスのコンテキストでラベル付けされますが、表示されるコンテキストはポリシーロール、適用されるタイプおよび/または範囲の移行ルールを反映するため、有用なリファレンスです。
訳注) -Zオプション同様、SELinuxが必要でした。
-N NSNAME, --net=NSNAME
指定されたネットワーク名前空間名に切り替えます。
訳注) Network Namespace を使うと、ネットワーク設定を完全に切り分けてルーティングテーブルを別に持ったりできる模様。試してみられなかった。
-b, --bpf
ソケットBPFフィルターを表示します(これらの情報を取得できるのは管理者のみです)。
訳注) ウチの環境ではsudoを付ける・付けないで変化は見えなかった。
-4, --ipv4
IPv4ソケットのみを表示する(-f inet の別名)。
-6, --ipv6
IPv6ソケットのみを表示する(-f inet6 の別名)。
-0, --packet
PACKETソケットを表示する(-f link の別名)。
-t, --tcp
TCPソケットを表示する。
-u, --udp
UDPソケットを表示する。
-d, --dccp
DCCPソケットを表示する。
-w, --raw
RAWソケットを表示する。
-x, --unix
Unix domainソケットを表示する(-f unix の別名)。
訳注) 同一ホスト内で行うプロセス間通信の模様。
-S, --sctp
SCTPソケットを表示する。
--vsock
vsockソケットを表示する(-f vsock の別名)。
-f FAMILY, --family=FAMILY
指定されたソケットを表示します。現在、次のファミリがサポートされています。 unix、inet、inet6、link、netlink、vsock。
-A QUERY, --query=QUERY, --socket=QUERY
コンマで区切られた、ダンプするソケットテーブルのリスト。 次の識別子が利用できます: all, inet, tcp, udp, raw, unix, packet, netlink, unix_dgram,
unix_stream, unix_seqpacket, packet_raw, packet_dgram, dccp, sctp, vsock_stream, vsock_dgram
-D FILE, --diag=FILE
何も表示せず、フィルターを適用した後、TCPソケットに関する未加工の情報をFILEにダンプします。 FILEが-の場合、stdoutが使用されます。
-F FILE, --filter=FILE
FILEからフィルター情報を読み取ります。 FILEの各行は、単一のコマンドラインオプションのように解釈されます。 FILEが-の場合、stdinが使用されます。
FILTER := [ state STATE-FILTER ] [ EXPRESSION ]
フィルターに関する詳細については、公式文書をご覧ください。
STATE-FILTER
STATE-FILTERにより、一致する任意の状態セットを構築できます。 その構文は、キーワードstateとexcludeとそれに続く状態の識別子を並べたものです。
訳注) ss state listening state established とか、
ss exclude listening といった使い方ができました。
使用可能な識別子は次の通りです:
全ての基本的なTCPの状態: established, syn-sent, syn-recv, fin-wait-1, fin-wait-2, time-wait, closed, close-wait, last-ack, listening, closing
all - 全ての状態
connected - リスニングとクローズを除くすべての状態
訳注) unconnected も使えました。
synchronized - syn-sentを除くすべての接続状態
bucket - ミニソケットとして保持される状態、つまり、time-waitおよびsyn-recv
big - bucketの対向
訳注) bucketの反対というのがどうにも分からずにいます。
使用例
ss -t -a
全てのTCPソケットを表示します。
ss -t -a -Z
全てのTCPソケットをプロセスのSELinuxセキュリティコンテキストと共に表示します。
ss -u -a
全てのUDPソケットを表示します。
ss -o state established '( dport = :ssh or sport = :ssh )'
全ての確立したssh接続を表示します。
ss -x src /tmp/.X11-unix/*
X serverに接続している全てのローカルプロセスを見つけます。
ss -o state fin-wait-1 '( sport = :http or sport = :https )' dst 193.233.7/24
我々のネットワーク193.233.7/24に向けた全てのFIN-WAIT-1状態のTCPソケットとこれらのタイマーを見ます。
関連項目
ip(8),
RFC 793 - https://tools.ietf.org/rfc/rfc793.txt (TCP states)
著作権
ssはAlexey Kuznetsov<kuznet@ms2.inr.ac.ru>によって書かれました。
このマニュアルページは、DebianプロジェクトのためにMichael Prokop <mika@grml.org>によって書かれました(しかし、他の人によって使用されるかもしれません)。
さいごに
書かれていることの半分が分からない…。もっと知識を広げていかないと、問題が発生したときに何が起こっているのか分からない、対処もできない。ウチで組んでいるルーターも、本当にちゃんと守りを固められているのか判断ができない、多分大丈夫なんだろう状態。これをきっかけにして、少しずつ進もう。
コメントはこちらから お気軽にどうぞ ~ 投稿に関するご意見・感想・他