lsofコマンド
lsof
コマンドでポートの使用状況を確認できる。
$ lsof -i:ポート番号
-i
オプションでポート番号を指定する。
権限によっては取得できないプロセスがあるので、その場合はroot権限で実行する。
$ sudo lsof -i:ポート番号
例えば80番ポートの使用状況を確認する場合は以下のようにする。
$ sudo lsof -i:80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 3287518 root 6u IPv4 27870381 0t0 TCP *:http (LISTEN)
nginx 3287518 root 7u IPv6 27870382 0t0 TCP *:http (LISTEN)
nginx 3287519 www-data 6u IPv4 27870381 0t0 TCP *:http (LISTEN)
nginx 3287519 www-data 7u IPv6 27870382 0t0 TCP *:http (LISTEN)
nginx 3287521 www-data 6u IPv4 27870381 0t0 TCP *:http (LISTEN)
nginx 3287521 www-data 7u IPv6 27870382 0t0 TCP *:http (LISTEN)
出力結果の各項目は以下の通り。
COMMAND
: プロセスの名前PID
: プロセスIDUSER
: プロセスを実行しているユーザーFD
: ファイルディスクリプタ(ファイルやソケットなどの識別子)TYPE
: ファイルのタイプ(IPv4やIPv6、TCP、UDPなど)DEVICE
: デバイス番号SIZE/OFF
: ファイルのサイズやオフセットNODE
: ファイルやソケットのノード番号NAME
: ファイルやソケットのパスや名前
ssコマンド
ss
コマンドでもポートの使用状況を確認できる。
$ sudo ss -tulpn | grep :<ポート番号>
-tulpn
オプションでTCPのポートの使用状況を確認できる。
書くオプションについては以下の通り。
-t
: TCPのポートの使用状況を確認する-u
: UDPのポートの使用状況を確認する-l
: LISTEN状態のポートの使用状況を確認する-p
: プロセスIDを表示する-n
: ポート番号をサービス名ではなくポート番号で表示する
例えば80番ポートの使用状況を確認する場合は以下のようにする
$ sudo ss -tulpn | grep :80
tcp LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=3287521,fd=6),("nginx",pid=3287519,fd=6),("nginx",pid=3287518,fd=6))
tcp LISTEN 0 511 [::]:80 [::]:* users:(("nginx",pid=3287521,fd=7),("nginx",pid=3287519,fd=7),("nginx",pid=3287518,fd=7))
各列の意味は以下の通り。
$ sudo ss -tulpn | head -n 1
Netid State Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
各項目は以下の通り。
- Netid: プロトコルの種類
- State: ポートの状態
- Recv-Q: 受信キューのバイト数
- Send-Q: 送信キューのバイト数
- Local Address:Port: ローカルアドレスとポート番号
- Peer Address:PortProcess: リモートアドレスとポート番号
- 最終列(ヘッダー無し): プロセスIDとファイルディスクリプタ
PortProcess
は-n
オプションで切り替わる。-n
オプションを指定した場合はポート番号(数値)が表示される。-n
オプションを指定しない場合はポート番号ではなくサービス名が表示される。
例えば80番ポートはhttp
と表示され、上記の例では0.0.0.0:80
が0.0.0.0:http
と表示される。
そのため-n
を指定しない場合はサービス名で絞り込む必要があり、80番ポート(http)で絞りたい場合は以下のようにgrep :http
とする。
$ sudo ss -tulp | grep :http
tcp LISTEN 0 511 0.0.0.0:http 0.0.0.0:* users:(("nginx",pid=3287521,fd=6),("nginx",pid=3287519,fd=6),("nginx",pid=3287518,fd=6))
tcp LISTEN 0 511 [::]:http [::]:* users:(("nginx",pid=3287521,fd=7),("nginx",pid=3287519,fd=7),("nginx",pid=3287518,fd=7))
netstatコマンド
古いバージョンOSでss
コマンドが無い場合はnetstat
コマンドでもポートの使用状況を確認できる。
使い方はss
コマンドと同じ。
$ sudo ss -tulpn | grep :<ポート番号>
外部から接続できるポートを調べる(nmapコマンド)
サーバの外部から接続できるポートを調べるにはnmap
コマンドを使う。
nmap
コマンドがない場合はあらかじめインストールしておく。
[aptの場合]
$ sudo apt install nmap
[yumやdnfの場合]
$ sudo yum install nmap
nmap
コマンドでポートを調べるには引数にサーバを指定して以下のように実行する。
$ nmap localhost
Starting Nmap 7.92 ( https://nmap.org ) at 2024-01-24 19:58 UTC
Nmap scan report for localhost (127.0.0.1)
Host is up (0.0000040s latency).
Other addresses for localhost (not scanned): ::1
All 1000 scanned ports on localhost (127.0.0.1) are in ignored states.
Not shown: 998 closed tcp ports (reset)
PORT STATE SERVICE
22/tcp open ssh
443/tcp open https
Nmap done: 1 IP address (1 host up) scanned in 0.12 seconds
ポート番号とサービス名の対応の確認ための/etc/services
/etc/services
を見ると代表的なサービスの標準ポート番号を確認できる。
$ less /etc/services
(省略)
ftp 21/tcp
ftp 21/udp fsp fspd
ssh 22/tcp # The Secure Shell (SSH) Protocol
ssh 22/udp # The Secure Shell (SSH) Protocol
telnet 23/tcp
telnet 23/udp
(省略)
代表的なサービスのポート番号(TCP)
以下は代表的なサービスのポート番号の一覧。
サービス名 | ポート番号 |
---|---|
ftp | 21 |
ssh | 22 |
telnet | 23 |
smtp | 25 |
http | 80 |
pop3 | 110 |
imap | 143 |
https | 443 |
smtps | 465 |
imaps | 993 |
pop3s | 995 |
mysql | 3306 |
postgresql | 5432 |
redis | 6379 |
memcached | 11211 |
mongodb | 27017 |
elasticsearch | 9200 |
\第一線のプログラマーの行動原理を学べる!/