netstatで接続状況を確認しよう
ストーリー
「先輩、自分のPCがどのサーバーと通信しているか確認する方法ってありますか?」
「netstat や ss コマンドを使えば、現在の接続状況が一目で分かるよ」
「接続状況?どんな情報が見えるんですか?」
「どのポートが開いているか、どのIPと通信中か、接続の状態は何か。セキュリティ診断でも使う重要なコマンドだね」
netstat / ss とは
一言で言うと
自分のコンピュータのネットワーク接続状況を表示するコマンド
- 現在どのポートが開いているか
- どのIPアドレスと通信しているか
- 接続の状態(待ち受け、確立、終了待ちなど)
netstat vs ss
| コマンド | 説明 |
|---|---|
netstat | 古くからあるコマンド(Windows、Mac、Linux で使える) |
ss | Linux の新しいコマンド(netstat より高速) |
Linuxでは ss の使用が推奨されています。本レッスンでは両方を紹介します。
基本的な使い方
Linux: ss コマンド
bash
# TCP/UDP の接続とリッスン中のポートを表示
ss -tulnWindows / Mac: netstat コマンド
bash
# 接続とリッスン中のポートを表示
netstat -anss コマンドのオプション
| オプション | 意味 |
|---|---|
-t | TCPの接続を表示 |
-u | UDPの接続を表示 |
-l | LISTEN状態(待ち受け中)のみ表示 |
-n | ポート番号を数字で表示(名前解決しない) |
-p | プロセス名も表示(要root権限) |
-a | すべての接続を表示 |
よく使う組み合わせ
bash
# 待ち受け中のTCP/UDPポート一覧
ss -tuln
# すべてのTCP接続(待ち受け+確立)
ss -tan
# プロセス名付きで表示(要root)
sudo ss -tulnp出力の読み方
ss -tuln の出力例
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 0.0.0.0:80 0.0.0.0:*
LISTEN 0 128 0.0.0.0:443 0.0.0.0:*
LISTEN 0 128 127.0.0.1:3306 0.0.0.0:*
各列の意味
| 列 | 意味 |
|---|---|
| State | 接続の状態 |
| Recv-Q | 受信キュー(受信待ちデータ量) |
| Send-Q | 送信キュー(送信待ちデータ量) |
| Local Address:Port | 自分のIPアドレス とポート |
| Peer Address:Port | 相手のIPアドレスとポート |
Local Address の読み方
| アドレス | 意味 |
|---|---|
0.0.0.0:80 | すべてのネットワークインターフェースでポート80を待ち受け |
127.0.0.1:3306 | ローカルホスト(自分自身)からのみポート3306を待ち受け |
192.168.1.10:22 | 特定のIPでポート22を待ち受け |
Peer Address の読み方
| アドレス | 意味 |
|---|---|
0.0.0.0:* | まだ接続相手がいない(LISTEN状態) |
203.0.113.50:54321 | 特定のIPと通信中 |
接続の状態(State)
TCP接続にはさまざまな状態があります。
| 状態 | 意味 |
|---|---|
LISTEN | 接続を待ち受けている |
ESTABLISHED | 接続が確立している(通信中) |
TIME_WAIT | 接続終了後の待機状態 |
CLOSE_WAIT | 相手からの切断を受けて終了待ち |
SYN_SENT | 接続要求を送信中 |
SYN_RECV | 接続要求を受信中 |
よく見る状態
LISTEN → サーバーが起動して待ち受けている
ESTABLISHED → 現在通信中
TIME_WAIT → 通信が終わった直後(しばらくすると消える)
確立中の接続を確認する
ss -tan の出力例
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
ESTABLISHED 0 0 192.168.1.10:22 192.168.1.100:54321
ESTABLISHED 0 0 192.168.1.10:443 203.0.113.50:45678
TIME_WAIT 0 0 192.168.1.10:80 203.0.113.60:34567
この出力から分かること:
- ポート22(SSH)が待ち受け中で、192.168.1.100 から接続されている
- ポート443(HTTPS)で 203.0.113.50 と通信中
- ポート80(HTTP)で 203.0.113.60 との通信が終了した直後
実践:よく使うシナリオ
シナリオ1: Webサーバーが起動しているか確認
bash
ss -tln | grep :80出力例:
LISTEN 0 128 0.0.0.0:80 0.0.0.0:*
ポート80がLISTEN状態なら、Webサーバーは起動しています。
シナリオ2: 特定のポートを使っているプロセスを特定
bash
sudo ss -tulnp | grep :3000出力例:
LISTEN 0 128 *:3000 *:* users:(("node",pid=12345,fd=21))
ポート3000はNode.jsプロセス(PID 12345)が使用しています。
シナリオ3: 外部との通信を確認
bash
ss -tan | grep ESTABLISHED現在確立している接続だけを表示します。
Windows での netstat
Windows では ss の代わりに netstat を使います。
cmd
rem 接続とポートの一覧
netstat -an
rem 確立中の接続のみ
netstat -an | findstr ESTABLISHED
rem プロセスIDも表示
netstat -anoオプション
| オプション | 意味 |
|---|---|
-a | すべての接続とポートを表示 |
-n | 数字で表示(名前解決しない) |
-o | プロセスIDを表示 |
セキュリティの観点から
ss / netstat はセキュリティ診断でも重要なコマンドです。
確認すべきポイント
| 確認項目 | チェック方法 |
|---|---|
| 不要なポートが開いていないか | ss -tuln で確認 |
| 不審な接続がないか | ss -tan で ESTABLISHED を確認 |
| 意図しないプロセスがポートを使っていないか | sudo ss -tulnp で確認 |
注意が必要なケース
LISTEN 0.0.0.0:3306 → MySQLが全てのインターフェースで公開されている(危険な可能性)
LISTEN 127.0.0.1:3306 → ローカルのみ(安全)
データベースなど外部に公開すべきでないサービスは、127.0.0.1(ローカルホスト)でのみリッスンすべきです。
まとめ
| ポイント | 内容 |
|---|---|
| ss / netstat | ネットワーク接続状況を表示するコマンド |
| -tuln | TCP/UDPのリッスンポートを数字で表示 |
| LISTEN | 接続を待ち受けている状態 |
| ESTABLISHED | 接続が確立し通信中 |
| Local / Peer Address | 自分と相手のIP:ポート |
チェックリスト
- ss コマンドの基本的な使い方が分かる
- 主要なオプション(-t, -u, -l, -n)を理解した
- LISTEN と ESTABLISHED の違いが分かる
- 出力結果からどのポートが開いているか読み取れる
- セ キュリティ観点での確認ポイントを知っている
次のステップへ
netstat / ss でネットワーク接続状況を確認する方法が分かりました。
次はStep 5のチェックポイントクイズです。ネットワークコマンドの知識を総確認しましょう。
推定読了時間: 25分