プロセスがどのポートを使用しているかを調べる
netstatコマンドはポートやネットワークの情報を調べるコマンドです。
netstatには様々なオプションがあるのでそれらを指定して知りたい情報を調べます。
TCPやUDPのポート状態、ListenかEstablished? プロセスがどのポートを使用しているか?などを調べることが多いです。
netstatコマンドとオプション
netstatの結果を見るのに必要な前提知識
まずはポートについて説明します。簡単なポートについての説明はこちらの記事を参照してください。
ポートはネットワークの出入口でトランスポート層のTCPやUDPがどのアプリケーション同士が通信しているのかを識別するために使用しています。
TCPはIPプロトコルの上位層にあるプロトコルでIPがデータの配送先を決定するプロトコルとするなら、TCPはデータがきちんと配送されたか?を確認してアプリケーション同士の通信を確立する役割があります。各ポートには各アプリケーションが対応しているので、例えばTCP80番ポートへの通信が来たらapacheに渡すとか、chromeの通信はTCP54784番から通して接続するというようになっています。
上図にあるようにポートには状態があります。
- Established:通信が確立している接続中の状態。2者間の通信路が作られている
- Listening:プロセスがポートにいて通信待ちの状態
- Time_wait:通信終了の合図(FIN)を送り、相手からFINを受信して通信終了待機中
- Close_wait:通信終了の合図(FIN)を受け取った側:通信終了待機中
このような状態がいくつもありますが、重要なのはEstablishedとListeningです。
まとめると
- ポートにはポート番号という識別番号が割り振られている
- 各ポートにはアプリケーションが紐づけされている
- TCPやUDPはポート番号でアプリケーションを識別する
- ポートには状態Listen、Establishedなどの状態がある。
netstatコマンドで状態をみる
linuxのnetstatコマンドについて説明します。
-n 名前変換しない
-nオプションを入れるとlocalhost→127.0.0.1のようにIPアドレスを名前変換しないで数字のまま表示してくれます。IPアドレスを確認することのほうが多いので入れることが多いです。
$netstat
tcp 0 0 localhost:4081 localhost:3708 ESTABLISHED
$netstat -n
tcp 0 0 127.0.0.1:4081 127.0.0.1:3708 ESTABLISHED
-a Listen状態のポートも表示
デフォルトではEstablishedのポートしか表示しませんがaオプションを入れるとListen状態のポートも表示できます。サーバーではミドルウェアがlisten状態で待機しているのでaオプションは入れることが多いです。
$netstat
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
-t, -u TCP,UDPのポートを表示
-tや-uと指定することでTCP,UDPを表示できます。
-pでプロセスIDやパスを表示
ポートと紐づいたPID・プロセスを表示するのに-pを使います。
$netstat-t
tcp 0 104 192.168.0.11:22 192.168.0.10:5176 ESTABLISHED 22894/sshd: pi [pri
$netstat-tp
tcp 0 104 192.168.0.11:22 192.168.0.10:5176 ESTABLISHED 22894/sshd: pi [pri
その他のオプション
- -c 一秒おきに更新する
- -v 詳細を表示する
- -e ユーザとiノードを表示
- -l listenポートのみを表示
ポートとは別の情報表示
- -r ルーティングテーブルを表示する
- -i インターフェースの状態を表示する
-iではインターフェースの問題を知ることができます。
表示されるステータスの意味として、
- RX 受信
- TX 送信
- OK 正常
- ERR エラー
- DRP 破棄
- OVR オーバーロード
となります。
類似のコマンド
lsof -i:ポート
lsofコマンドでポート番号からどのプロセスが利用しているかを調べられます。