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: プロセスID
  • USER: プロセスを実行しているユーザー
  • 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:800.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)

以下は代表的なサービスのポート番号の一覧。

サービス名ポート番号
ftp21
ssh22
telnet23
smtp25
http80
pop3110
imap143
https443
smtps465
imaps993
pop3s995
mysql3306
postgresql5432
redis6379
memcached11211
mongodb27017
elasticsearch9200