LinuxサーバーやPCのネットワーク状態を調査する際、netstat
は非常に強力で基本的なコマンドの一つです。特にnetstat -a
オプション(All)を使用すると、現在待機中(LISTENING)のポートや、確立された接続(ESTABLISHED)など、システムが把握しているすべてのネットワークソケット(通信の窓口)の状態を一覧で表示できます。
しかし、初めて実行すると情報量が多く、どの行が何を意味しているのか分かりにくいかもしれません。
この記事では、Linux環境でnetstat -a
を実行した際の架空の出力結果をもとに、その基本的な見方と、各項目の意味について詳しく解説いたします。
netstat -a
の架空の実行例
まず、netstat -a
コマンドを実行した際の典型的な(架空の)出力例を見てみましょう。
$ netstat -a
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN
tcp 0 0 192.168.1.10:22 198.51.100.50:49876 ESTABLISHED
tcp 0 0 192.168.1.10:80 203.0.113.12:61234 TIME_WAIT
tcp6 0 0 :::443 :::* LISTEN
udp 0 0 0.0.0.0:53 0.0.0.0:*
udp 0 0 192.168.1.10:123 0.0.0.0:*
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags Type State I-Node Path
unix 2 [ ACC ] STREAM LISTENING 30456 /run/systemd/journal/stdout
unix 3 [ ] DGRAM 21789 /run/systemd/notify
...
この出力結果は、大きく「Active Internet connections(インターネット接続)」と「Active UNIX domain sockets(UNIXドメインソケット)」の2部に分かれています。 ネットワーク調査で主に注目するのは、TCPやUDPを含む前者です。
結果の見方(主要なポイント)
インターネット接続の部分は、以下の列で構成されています。
- Proto: プロトコル(
tcp
やudp
など)。 - Recv-Q / Send-Q: 受信・送信キュー(通常は0です)。
- Local Address: 自分のサーバー(ローカル側)のIPアドレスとポート番号。
- Foreign Address: 通信相手(外部側)のIPアドレスとポート番号。
- State: ソケットの状態(
LISTEN
,ESTABLISHED
など)。
ポイント1:「LISTEN」(待機中)状態のポート
State
列がLISTEN
となっている行は、そのPC(サーバー)が外部からの接続を「待機している」状態のサービスを示します。
例: tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
- Local Address が
0.0.0.0:22
: これは「このマシンの**どのIPアドレス(0.0.0.0
)**宛であっても、ポート番号22
番でのTCP通信を受け付けます」という意味です。(ポート22
は通常SSH(セキュアシェル)接続で使われます) - Foreign Address が
0.0.0.0:*
: これは「通信相手は誰でも(0.0.0.0
)、どのポート(*
)からでも構いません」という意味です。 - State が
LISTEN
: このサービスが待機中であることを示します。
例2: tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN
- Local Address が
127.0.0.1:3306
: こちらは、0.0.0.0
とは異なり、127.0.0.1
(ローカルホスト、つまり自分自身)からの接続のみを受け付けています。ポート3306
はMySQL(データベース)でよく使われます。 このように設定することで、外部のPCからは接続できず、サーバー内部のプログラムからのみ接続できる、より安全な状態となります。
ポイント2:「ESTABLISHED」(接続確立中)の状態
State
列がESTABLISHED
となっている行は、現在、実際に外部と通信が行われている接続を示します。
例: tcp 0 0 192.168.1.10:22 198.51.100.50:49876 ESTABLISHED
- Local Address が
192.168.1.10:22
: 自分のPC(192.168.1.10
)の22
番ポート(SSH)が使われています。 - Foreign Address が
198.51.100.50:49876
: 通信相手は、IPアドレス198.51.100.50
の49876
番ポートです。 - State が
ESTABLISHED
: 接続が確立され、現在通信中です。
この行から、「IPアドレス198.51.100.50
の誰かが、このサーバーにSSHでログインしている」という具体的な状況を読み取ることができます。
ポイント3:その他のTCPの状態(TIME_WAIT / CLOSE_WAIT)
TCP通信は接続を終了する際にも複雑な手順を踏むため、LISTEN
やESTABLISHED
以外にもいくつかの一時的な状態があります。
- TIME_WAIT: 接続が終了した後、ネットワーク上で迷子になったパケットが後から届く可能性に備え、ソケットが一定時間(通常1〜2分)待機している状態です。これが大量に発生しない限り、通常は問題ありません。
- CLOSE_WAIT: 相手側(Foreign Address)から接続切断の要求を受け取ったものの、こちら側(Local Address)のプログラムがまだソケットを閉じる処理を完了していない状態です。もしこの状態の接続が長時間(数分以上)残り続ける場合は、プログラム側でソケットを適切に閉じていない不具合(リソースリーク)が疑われることがあります。
ポイント4:UDPとUNIXドメインソケット
- UDP: TCPとは異なり、接続を確立するという概念がない(データを送りっぱなしにする)プロトコルです。そのため、
State
列は基本的に空欄となります。 - UNIX Domain Sockets:
Path
列に/run/systemd/journal/stdout
などのファイルパスが表示されているものです。これらはネットワークを介した通信ではなく、PCの内部(OSやプロセス間)での通信に使用されるものです。
セキュリティ観点での確認
netstat -a
は、セキュリティチェックの第一歩としても非常に有効です。
サーバーを運用する際は、LISTEN
状態のポートを定期的に確認することが重要です。もし、意図していないポート(例えば、開発用に一時的に起動したWebサーバーや、外部に公開する必要のないデータベースなど)が0.0.0.0
(すべてのIP)で待機している場合、それはセキュリティホールとなり、外部からの攻撃対象となる可能性があります。
不要なサービスは停止するか、必要な場合でも127.0.0.1
でのみ待機させるよう設定を見直すことが推奨されます。
補足:より便利なオプション netstat -anp
netstat -a
だけでは、そのポートを「どのプログラムが」使用しているのかまでは分かりません。 そのような場合は、以下のオプションを組み合わせて使用することが一般的です。(実行には管理者権限(sudo
)が必要な場合があります)
-n
(Numeric): IPアドレスやポート番号を、ssh
やhttp
といったサービス名に変換せず、数値のまま表示します。これにより名前解決の時間が短縮され、表示が速くなります。-p
(Program): そのソケットを使用しているプロセスのID(PID)とプログラム名を表示します。
例:sudo netstat -anp | grep LISTEN
このコマンドを実行すると、「待機中のポート」を「どのプログラムが」開いているのかが一目瞭然となり、問題の特定に非常に役立ちます。
まとめ
netstat -a
コマンドは、Linuxシステムのネットワークソケットの状態を網羅的に確認するための基本コマンドです。
LISTEN
: サービスが接続を待機している状態。ESTABLISHED
: 現在、外部と通信が確立している状態。TIME_WAIT
/CLOSE_WAIT
: 接続の終了処理中の状態。
これらの状態(State
)と、どのIP・ポート(Local Address
)で待機しているかに注目することで、サーバーの動作状況の把握や、セキュリティチェック、トラブルシューティングの手がかりを得ることができます。