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 |
\第一線のプログラマーの行動原理を学べる!/
