Linux環境では、現在のTCP接続状況を確認するための複数のコマンドが利用可能です。接続ステータス、送信元/宛先IPアドレス、ポート番号などの情報を取得できます。
1. netstat コマンド(従来型ツール)
netstat -tunap
-
オプション説明:
-
-t:TCP接続情報を表示 -
-u:UDP接続情報を表示(任意) -
-n:名前解決を無効化(ホスト名ではなくIPアドレスを表示) -
-a:すべての接続状態を表示(リッスン中および非リッスン中を含む) -
-p:プロセス情報を表示(root権限が必要) -
出力例:
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1234/sshd
tcp 0 0 192.168.1.10:22 203.0.113.5:12345 ESTABLISHED 5678/sshd
- 重要なフィールド:
State:接続状態(LISTEN、ESTABLISHED、TIME_WAITなど)PID/Program name:接続を使用しているプロセス(-pオプションと権限が必要)
補足:最新のシステムでは
netstatが非推奨となっており、ssを使用することが推奨されます。
2. ss コマンド(推奨代替ツール)
ss -tunap
-
オプション説明:
netstatと同様の機能を持つが、パフォーマンスが向上 -
出力例:
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=1234,fd=3))
tcp ESTAB 0 0 192.168.1.10:22 203.0.113.5:12345 users:(("sshd",pid=5678,fd=3))
- 利点:
- 高速な実行性能
- デフォルトでより多くのカーネル情報を表示(タイマー情報など)
3. lsof コマンド(プロセスが開いたファイル/接続の確認)
sudo lsof -i tcp
-
機能:TCP接続と対応するプロセス、ユーザー情報をリスト表示
-
出力例:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 1234 root 3u IPv4 12345 0t0 TCP *:ssh (LISTEN)
sshd 5678 root 3u IPv4 67890 0t0 TCP 192.168.1.10:ssh->203.0.113.5:12345 (ESTABLISHED)
4. 接続状態の集計
ss -tun | awk '{print $1}' | grep -v "State" | sort | uniq -c
-
機能:各種状態のTCP接続数を集計(
ESTABLISHED、TIME_WAITなど) -
出力例:
5 LISTEN
12 ESTABLISHED
3 TIME-WAIT
5. 接続変化のリアルタイム監視
watch -n 1 "ss -tunap | grep ESTAB"
- 機能:確立された接続(
ESTABLISHED)を1秒ごとに更新表示
6. 特定ポートの接続確認
ss -tunap | grep ':22' # SSHポート(22)の接続を確認
主要TCP接続状態の解説
| 状態 | 意味 |
|---|---|
LISTEN |
サーバーがポートをリッスン中 |
ESTABLISHED |
アクティブな接続(データ転送中) |
TIME\_WAIT |
接続終了後、リモートがACKを受信したことを保証するための待機状態(高負荷時の短時間接続で発生) |
CLOSE\_WAIT |
接続が正しくクローズされていない(アプリケーションコードの確認が必要) |
SYN\_SENT |
クライアントが接続要求を送信中(ネットワーク問題やファイアウォールブロックの可能性) |
留意事項
-
権限要件:プロセス情報(
-pオプション)を表示するには、sudoまたはroot権限が必要です。 -
ツールのインストール:
ssやlsofが存在しない場合、パッケージマネージャーでインストール可能です:
sudo apt install iproute2 lsof # Debian/Ubuntu
sudo yum install iproute lsof # CentOS/RHEL
- パフォーマンス分析:多数の
TIME_WAIT接続が見られる場合は、カーネルパラメータの調整(net.ipv4.tcp_tw_reuseなど)が必要になることがあります。
これらのコマンドを使用することで、システムのTCP接続状態を詳細に把握し、ネットワークやアプリケーション層の問題を迅速に特定できます。