ss / netstat(ソケット状態の確認)
『ss』はソケットの状態を高速に表示する Linux の標準ネットワーク診断コマンドです。かつては『netstat』(net-tools パッケージ)が広く使われていましたが、現在の主要ディストリビューションでは ss(iproute2 パッケージ)が推奨ツールとなっています。ss -tlnp で待機中のポートを一覧表示し、LISTEN / ESTABLISHED / TIME_WAIT といった接続状態を読み取ることで、サーバーのポート開放状況や不審な接続をすばやく把握できます。
構文
# ----------------------------------------------- # ss の主要オプション # ----------------------------------------------- # ss [オプション] [フィルター] # → ソケットの状態を一覧表示します # -t : TCP ソケットのみ表示します(--tcp) # -u : UDP ソケットのみ表示します(--udp) # -l : LISTEN 状態のソケットのみ表示します(--listening) # -n : ホスト名・サービス名を解決せず数値で表示します(--numeric) # -p : ソケットを使用しているプロセス名と PID を表示します(--processes) # -a : すべての状態のソケットを表示します(--all) # -s : ソケット統計のサマリーを表示します(--summary) # ----------------------------------------------- # よく使う組み合わせ(ss) # ----------------------------------------------- # ss -tlnp # → TCP で LISTEN 中のポートとプロセスを数値で表示します # → サーバーが待機しているポートを確認する最も基本的な使い方です # ss -tunlp # → TCP・UDP の両方で LISTEN 中のポートとプロセスを表示します # ss -s # → TCP・UDP・UNIX ソケットの統計サマリーを表示します # ss state established # → ESTABLISHED 状態(通信中)の接続を一覧表示します # ss state listening # → LISTEN 状態のソケットを一覧表示します # ----------------------------------------------- # netstat との対応(参考) # ----------------------------------------------- # netstat -tlnp → ss -tlnp # netstat -tunlp → ss -tunlp # netstat -an → ss -an # netstat -s → ss -s
構文一覧
| オプション・コマンド | 説明 |
|---|---|
ss -tlnp | TCP で LISTEN 中のポートとプロセスを数値で表示します。待機ポートの確認に最もよく使われるコマンドです。 |
ss -tunlp | TCP・UDP の両方で LISTEN 中のポートとプロセスを一覧表示します。UDP サービス(DNS・NTP など)も含めて確認できます。 |
ss -an | すべての状態のソケットを数値で表示します。ESTABLISHED・TIME_WAIT・CLOSE_WAIT なども含めて一括確認できます。 |
ss -s | TCP・UDP・UNIX ソケットの統計サマリーを表示します。接続数の全体像を素早く把握できます。 |
ss state established | ESTABLISHED(接続確立・通信中)の状態のソケットのみ表示します。 |
ss state listening | LISTEN(接続待機中)の状態のソケットのみ表示します。 |
ss -tnp dst :443 | 宛先ポート 443 への TCP 接続を表示します。特定ポートへの通信を絞り込めます。 |
ss -tnp sport = :80 | 送信元ポート 80 のソケットを表示します。特定サービスの接続状況を確認できます。 |
| 接続状態の意味 | |
LISTEN | 接続を待機している状態です。サーバーがクライアントからの接続要求を受け付けられる状態を示します。 |
ESTABLISHED | 接続が確立され、データの送受信が行われている状態です。通常の通信中を示します。 |
TIME_WAIT | 接続終了後に一定時間(通常 60 秒)待機している状態です。遅延パケットへの対処のために残ります。大量発生するとポート枯渇の原因になります。 |
CLOSE_WAIT | 相手側が接続を終了したが、こちら側がまだ閉じていない状態です。アプリケーションのバグで大量に残ることがあります。 |
SYN_SENT | TCP の 3 ウェイハンドシェイクを開始し、SYN パケットを送信して応答を待っている状態です。 |
SYN_RECV | SYN を受信し、SYN-ACK を返して ACK を待っている状態です。SYN フラッド攻撃時に大量に現れます。 |
FIN_WAIT1 / FIN_WAIT2 | 接続終了処理の途中の状態です。通常は短時間で消えます。 |
使用例
LISTEN しているポートを確認する
# ----------------------------------------------- # 待機中のポートとプロセスを確認します # ----------------------------------------------- # TCP で LISTEN 中のポートとプロセス名を数値で表示します # (草薙京が動かすサーバーのポート確認を想定) ss -tlnp
実行するコマンドは次の通りです。
$ ss -tlnp
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=1024,fd=3))
LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=2048,fd=6))
LISTEN 0 511 0.0.0.0:443 0.0.0.0:* users:(("nginx",pid=2048,fd=7))
LISTEN 0 128 127.0.0.1:3306 0.0.0.0:* users:(("mysqld",pid=3072,fd=21))
TCP・UDP 両方の待機ポートを確認する
# ----------------------------------------------- # TCP と UDP 両方の LISTEN ポートを表示します # ----------------------------------------------- # -u を追加することで UDP も含めて確認できます # (八神庵がサーバー構成を調べる場面を想定) ss -tunlp
実行するコマンドは次の通りです。
$ ss -tunlp
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
udp UNCONN 0 0 0.0.0.0:68 0.0.0.0:* users:(("dhclient",pid=512,fd=6))
udp UNCONN 0 0 127.0.0.53:53 0.0.0.0:* users:(("systemd-r",pid=640,fd=14))
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=1024,fd=3))
tcp LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=2048,fd=6))
TIME_WAIT の数を確認する
# ----------------------------------------------- # TIME_WAIT 接続の数を数えます # ----------------------------------------------- # TIME_WAIT 状態の行数をカウントします # 大量の TIME_WAIT はポート枯渇の予兆になります # (テリー・ボガードがサーバー負荷調査をする場面を想定) ss -an | grep TIME-WAIT | wc -l
実行するコマンドは次の通りです。
$ ss -an | grep TIME-WAIT | wc -l 47
特定ポートへの接続を確認する
# ----------------------------------------------- # 特定ポートの接続状況を絞り込みます # ----------------------------------------------- # ポート 443 へ ESTABLISHED 状態の接続を表示します # (不知火舞がポート 443 への接続を調査する場面を想定) ss -tnp state established '( dport = :443 or sport = :443 )'
実行するコマンドは次の通りです。
$ ss -tnp state established '( dport = :443 or sport = :443 )'
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
ESTABLISHED 0 0 192.168.1.10:54832 203.0.113.50:443 users:(("curl",pid=8800,fd=5))
ESTABLISHED 0 0 192.168.1.10:54901 203.0.113.51:443 users:(("nginx",pid=2048,fd=12))
接続統計のサマリーを確認する
# ----------------------------------------------- # ソケット統計のサマリーを表示します # ----------------------------------------------- # TCP・UDP・UNIX ソケットの全体統計を確認します # (アンディ・ボガードがサーバー全体の状態を素早く確認する場面を想定) ss -s
実行するコマンドは次の通りです。
$ ss -s Total: 312 TCP: 28 (estab 15, closed 8, orphaned 0, timewait 7) Transport Total IP IPv6 RAW 0 0 0 UDP 5 4 1 TCP 20 16 4 INET 25 20 5 FRAG 0 0 0
概要
『ss』は Linux カーネルの netlink ソケット経由でカーネル内部から直接情報を取得するため、netstat より高速に動作します。netstat は net-tools パッケージに含まれており、最新のディストリビューションではデフォルトでインストールされていないことが多いため、今後は ss を使う習慣をつけておくとよいでしょう。ポートの開放状況の確認は firewalld や ufw のルールと組み合わせて読み解くことが重要です。LISTEN していても firewalld / ufw でブロックされていれば外部からアクセスできませんし、逆にポートを開放していても対象サービスが LISTEN していなければ通信は届きません。ss でソケットの状態を確認しながら、ファイアウォール設定と照らし合わせることで、ネットワーク設定の問題を効率よく切り分けられます。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。