Ubuntu

Ubuntu18.04 ssコマンドの日本語翻訳風

Ubuntu

今、ポートの状態がどうなっているのか…時々とっても気になる。どのポートが開いてるんだっけ?どのプロセスがそのポートを使ってるんだっけ?ってなる度に検索するんだけど、そこに書かれたコマンドをなんか適当に使ってみているだけで、スカッと欲しいものを取れる感じもしない…

広告


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>によって書かれました(しかし、他の人によって使用されるかもしれません)。

さいごに

書かれていることの半分が分からない…。もっと知識を広げていかないと、問題が発生したときに何が起こっているのか分からない、対処もできない。ウチで組んでいるルーターも、本当にちゃんと守りを固められているのか判断ができない、多分大丈夫なんだろう状態。これをきっかけにして、少しずつ進もう。

広告

コメントはこちらから お気軽にどうぞ ~ 投稿に関するご意見・感想・他