目次:
ネットワーク接続またはアプリケーション固有の問題をトラブルシューティングする場合、最初に確認することの1つは、システムで実際に使用されているポートと、特定のポートでリッスンしているアプリケーションです。
この記事では、
netstat
、
ss
、および
lsof
コマンドを使用して、どのサービスがどのポートでリッスンしているかを調べる方法について説明します。 この手順は、macOSなどのすべてのLinuxおよびUnixベースのオペレーティングシステムに適用されます。
リスニングポートとは
ネットワークポートは、その番号、関連するIPアドレス、およびTCPやUDPなどの通信プロトコルの種類によって識別されます。
リスニングポートは、アプリケーションまたはプロセスがリッスンするネットワークポートであり、通信エンドポイントとして機能します。
各リスニングポートは、ファイアウォールを使用して開いたり閉じたり(フィルタリング)できます。 一般的に、開いているポートは、リモートロケーションからの着信パケットを受け入れるネットワークポートです。
2つのサービスが同じIPアドレスの同じポートをリッスンすることはできません。
たとえば、ポート
80
と
443
でリッスンするApache Webサーバーを実行していて、Nginxをインストールしようとすると、HTTPポートとHTTPSポートが既に使用されているため、後者の起動に失敗します。
netstat
リッスンポートを確認する
netstat
は、ネットワーク接続に関する情報を提供できるコマンドラインツールです。
ポートおよびソケットステータスを使用するサービスを含め、リッスンされているすべてのTCPまたはUDPポートを一覧表示するには、次のコマンドを使用します。
sudo netstat -tunlp
このコマンドで使用されるオプションの意味は次のとおりです。
-
-t
-TCPポートを表示します。-u
-UDPポートを表示します。-n
ホストを解決する代わりに数値アドレスを表示します。-l
リスニングポートのみを表示します。-p
リスナーのプロセスのPIDと名前を表示します。 この情報は、rootまたはsudoユーザーとしてコマンドを実行した場合にのみ表示されます。
出力は次のようになります。
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 445/sshd tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN 929/master tcp6 0 0:::3306:::* LISTEN 534/mysqld tcp6 0 0:::80:::* LISTEN 515/apache2 tcp6 0 0:::22:::* LISTEN 445/sshd tcp6 0 0:::25:::* LISTEN 929/master tcp6 0 0:::33060:::* LISTEN 534/mysqld udp 0 0 0.0.0.0:68 0.0.0.0:* 966/dhclient
この場合の重要な列は次のとおりです。
-
Proto
ソケットが使用するプロトコル。Local Address
-プロセスがリッスンするIPアドレスとポート番号。PID/Program name
-PIDとプロセスの名前。
sudo netstat -tnlp | grep:22
出力は、このマシンではポート22がSSHサーバーによって使用されていることを示しています。
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 445/sshd tcp6 0 0:::22:::* LISTEN 445/sshd
出力が空の場合、ポートで何もリッスンしていないことを意味します。
PID、プロトコル、状態などの基準に基づいてリストをフィルタリングすることもできます。
netstat
は廃止され、
ss
および
ip
置き換えられましたが、それでもネットワーク接続をチェックするために最も使用されるコマンドです。
ss
リスニングポートの確認
ss
は新しい
netstat
です。
netstat
機能の一部が欠けていますが、TCP状態が多く公開されており、わずかに高速です。 コマンドオプションはほとんど同じなので、
netstat
から
ss
への移行は難しくありません。
ss
ですべてのリスニングポートのリストを取得するには、次のように入力します。
sudo ss -tunlp
出力は、
netstat
によって報告される出力とほぼ同じです。
State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd", pid=445, fd=3)) LISTEN 0 100 0.0.0.0:25 0.0.0.0:* users:(("master", pid=929, fd=13)) LISTEN 0 128 *:3306 *:* users:(("mysqld", pid=534, fd=30)) LISTEN 0 128 *:80 *:* users:(("apache2", pid=765, fd=4), ("apache2", pid=764, fd=4), ("apache2", pid=515, fd=4)) LISTEN 0 128:22:* users:(("sshd", pid=445, fd=4)) LISTEN 0 100:25:* users:(("master", pid=929, fd=14)) LISTEN 0 70 *:33060 *:* users:(("mysqld", pid=534, fd=33))
lsof
リスニングポートの確認
lsof
は、プロセスによって開かれたファイルに関する情報を提供する強力なコマンドラインユーティリティです。
Linuxでは、すべてがファイルです。 ソケットは、ネットワークに書き込むファイルと考えることができます。
lsof
タイプを使用して、リスニングしているすべてのTCPポートのリストを取得するには:
sudo lsof -nP -iTCP -sTCP:LISTEN
使用されるオプションは次のとおりです。
-
-n
ポート番号をポート名に変換しません。-p
ホスト名を解決せず、数値アドレスを表示します。-iTCP -sTCP:LISTEN
-TCP状態がLISTENのネットワークファイルのみを表示します。
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 445 root 3u IPv4 16434 0t0 TCP *:22 (LISTEN) sshd 445 root 4u IPv6 16445 0t0 TCP *:22 (LISTEN) apache2 515 root 4u IPv6 16590 0t0 TCP *:80 (LISTEN) mysqld 534 mysql 30u IPv6 17636 0t0 TCP *:3306 (LISTEN) mysqld 534 mysql 33u IPv6 19973 0t0 TCP *:33060 (LISTEN) apache2 764 www-data 4u IPv6 16590 0t0 TCP *:80 (LISTEN) apache2 765 www-data 4u IPv6 16590 0t0 TCP *:80 (LISTEN) master 929 root 13u IPv4 19637 0t0 TCP *:25 (LISTEN) master 929 root 14u IPv6 19638 0t0 TCP *:25 (LISTEN)
ほとんどの出力列の名前は一目瞭然です。
-
COMMAND
、PID
、USER
ポートに関連付けられたプログラムを実行している名前、pid、およびユーザー。NAME
ポート番号。
特定のポート(ポート
3306
など)でリッスンしているプロセスを見つけるには、次を使用します。
sudo lsof -nP -iTCP:3306 -sTCP:LISTEN
出力は、ポート
3306
がMySQLサーバーによって使用されていることを示しています。
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME mysqld 534 mysql 30u IPv6 17636 0t0 TCP *:3306 (LISTEN)
詳細については、lsofのマニュアルページを参照し、このツールの他のすべての強力なオプションについてお読みください。
結論
システムで使用されているポートを確認するために使用できるいくつかのコマンドと、特定のポートでリッスンするプロセスを見つける方法を示しました。
ターミナル