Linuxのポートを確認する方法

ポートとは?

そもそもポートとは何か?
ということから解説したいと思います。

 

ポートとは、IPアドレスを家に例えると、ネットワークとコンピュータを行き来するためのドアになります。このポートを利用してパケットを送受信することで通信を行います。

 

Webサイトへアクセスする際は、「IPアドレス」のみで接続していると思われがちですが、実際は「IPアドレス+ポート番号」で接続しています。

 

ネットワーク上のどのコンピュータに接続するのかをIPアドレスで識別し、そのコンピュータで動いているどのプログラムにアクセスするのかを識別するのに必要なのが、「ポート番号」になります。ポート番号は16ビット整数であり、 0番〜65535番まであります。


ポートの種類

ポートには、ウェルノウンポートという規格が存在し、TCP(Transmission Control Protocol)やUDP(User Datagram Protocol)で使用する有名なサービスやプロトコルには、事前にポート番号(0番〜1023番)が予約されています。

 

特に有名な番号として、下記があります。

TCP 20 FTP (データ)
TCP 21 FTP (制御)
TCP 22 SSH
TCP 23 Telnet
TCP 25 SMTP
UDP 53 DNS
UDP 67 DHCP(サーバ)
UDP 68 DHCP(クライアント)
TCP 80 HTTP
TCP 110 POP3
UDP 123 NTP
TCP 443 HTTPS

 

ただし、このウェルノウンポート番号をそのまま利用すると、セキュリティ上好ましくないケースには、
敢えて任意の番号に変更して利用する場合もあります。
例えば、ポート番号22のSSHなどはデフォルトではなく、他の番号に変更して運用することが多いです。

lsofコマンド:プロセスが使用しているをポートを確認する

プロセスが使用しているポートを確認する方法は、lsofコマンドを利用します。
Linuxでプロセスが利用しているポートを確認することは、不要プログラムが実行されてないか、
不正なバックドアが仕掛けられてないか等を調べ、Linuxのセキュリティ状況を確認する上で非常に重要です。

 

lsofコマンドは、Linuxが使用してるプロセス名や実行ユーザ名を表示することができるコマンドになります。
ポートの利用情報のみを確認したい場合は、オプション「-i」を付けて実行します。

 

また、lsofコマンドで表示できるのは、コマンドを実行するユーザーに対して、
読み取り権限が設定されるファイルに限ります。
つまり、ポートなどの利用情報すべてを確認するためには、rootユーザーでlsofコマンドを実行しなければなりません。

 

■プロセスが使用しているをポートを確認する
プロセスが使用しているポートを一覧表示するには、lsofコマンドにオプション「-i」を付けて実行します。

# lsof -i
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
proftpd 683 nobody 0u IPv4 15203 0t0 TCP *:ftp (LISTEN)
chronyd 685 chrony 1u IPv4 15207 0t0 UDP localhost:323
chronyd 685 chrony 2u IPv6 15208 0t0 UDP localhost:323
php-fpm 925 root 6u IPv4 19066 0t0 TCP localhost:cslistener (LISTEN)
sshd 934 root 3u IPv4 19972 0t0 TCP *:EtherNet/IP-1 (LISTEN)
postgres 949 postgres 3u IPv6 19990 0t0 TCP localhost:postgres (LISTEN)
postgres 949 postgres 4u IPv4 19991 0t0 TCP localhost:postgres (LISTEN)
postgres 949 postgres 8u IPv6 20026 0t0 UDP localhost:48654->localhost:48654

 

■各項目の説明

COMMAND

実行プログラム

PID

プロセス番号

USER

実行ユーザー

NODE

プロトコル

NAME

ポート

(LISTEN)

待ち受け状態

 

■特定のポート番号から使用しているプロセスを表示する
特定のポート番号を使用しているプロセスを確認するには、
lsofコマンドにオプション「-i」を付け「:」(コロン)で区切って特定のポート番号を指定して実行します。
下記の例では、ポート80番がNginxに利用されていることが分かります。

# lsof -i:80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 26810 root 12u IPv4 206674 0t0 TCP *:http (LISTEN)
nginx 26811 nginx 12u IPv4 206674 0t0 TCP *:http (LISTEN)

 

下記例では、ポート3306番がMySQLに利用されていることが分かります。

# lsof -i:3306
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mysqld 1473 mysql 17u IPv6 22561 0t0 TCP *:mysql (LISTEN)

※これらの結果はサーバー環境によって異なります。
 上記と同じ結果を得るにはNginx、MySQLがLinuxにインストールされている必要があります。

ssコマンド:Linuxで接続待ちをしているポートを確認する

Linuxで接続待ちをしているポートを確認するには、ssコマンド、またはnetstatコマンドを利用します。
CentOS7からnetstatコマンドに変わってssコマンドを利用することが推奨されています。
本章ではssコマンドを使用した確認方法を紹介します。
※netstatコマンドの確認方法は、本ページの次章を参照してください。

 

■ssコマンドのオプション

-a 全てのソケットを表示
-n サービス名に変換せずに表示
-t TCP情報のみ表示
-u UDP情報のみ表示

 

■ssコマンドで接続待ちをしているポートを確認する
・TCPポートのみを表示する
ssコマンドにオプション「-atn」を付けて実行します。

# ss -atn
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 100 *:993 *:*
LISTEN 0 100 *:995 *:*
LISTEN 0 128 127.0.0.1:10024 *:*
LISTEN 0 128 127.0.0.1:9000 *:*
LISTEN 0 100 127.0.0.1:10025 *:*
LISTEN 0 100 *:587 *:*
LISTEN 0 100 *:110 *:*
LISTEN 0 128 127.0.0.1:783 *:*
LISTEN 0 100 *:143 *:*
LISTEN 0 128 *:80 *:*
LISTEN 0 128 *:21 *:*
LISTEN 0 128 127.0.0.1:5432 *:*
LISTEN 0 100 *:25 *:*
LISTEN 0 128 *:443 *:*

 

・UDPポートのみを表示する
ssコマンドにオプション「-anu」を付けて実行します。

# ss -anu
State Recv-Q Send-Q Local Address:Port Peer Address:Port
UNCONN 0 0 127.0.0.1:323 *:*
UNCONN 0 0 ::1:323 :::*
ESTAB 0 0 ::1:48654 ::1:48654

 

・TCP、UDPポート両方表示する
ssコマンドにオプション「-atnu」を付けて実行します。

# ss -atnu
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
udp UNCONN 0 0 127.0.0.1:323 *:*
udp UNCONN 0 0 ::1:323 :::*
udp ESTAB 0 0 ::1:48654 ::1:48654
tcp LISTEN 0 100 *:993 *:*
tcp LISTEN 0 100 *:995 *:*
tcp LISTEN 0 128 127.0.0.1:10024 *:*
tcp LISTEN 0 128 127.0.0.1:9000 *:*
tcp LISTEN 0 100 127.0.0.1:10025 *:*
tcp LISTEN 0 100 *:587 *:*
tcp LISTEN 0 100 *:110 *:*
tcp LISTEN 0 128 127.0.0.1:783 *:*
tcp LISTEN 0 100 *:143 *:*
tcp LISTEN 0 128 *:80 *:*
tcp LISTEN 0 128 *:21 *:*
tcp LISTEN 0 128 127.0.0.1:5432 *:*
tcp LISTEN 0 100 *:25 *:*
tcp LISTEN 0 128 *:443 *:*

 

・通信が確立しているポートを表示する
ssコマンドにオプション「-t」を付けて実行します。

# ss -t
State Recv-Q Send-Q Local Address:Port Peer Address:Port
FIN-WAIT-2 0 0 150.95.XXX.XXX:https 174.97.215.128:11774
ESTAB 0 0 150.95.XXX.XXX:https 66.249.79.64:45943
ESTAB 0 0 150.95.XXX.XXX:http 66.249.79.69:61550
ESTAB 0 96 150.95.XXX.XXX:EtherNet/IP-1 221.XXX.XXX.XXX:vrtl-vmf-ds
ESTAB 0 0 150.95.XXX.XXX:https 66.249.79.69:60933
ESTAB 0 0 150.95.XXX.XXX:EtherNet/IP-1 221.XXX.XXX.XXX:gilatskysurfer
ESTAB 0 0 150.95.XXX.XXX:https 66.249.79.67:51637
ESTAB 0 0 150.95.XXX.XXX:EtherNet/IP-1 221.XXX.XXX.XXX:61865

※150.95.XXX.XXX、221.XXX.XXX.XXXにはLinuxのIPアドレスが表示されます。

 

■各項目の説明

Netid

Socketのタイプ
u_str:UNIX Domainソケット
tcp :TCPソケット
udp :UDPソケット

State 通信の状態
Recv-Q 受信キューの数
Send-Q 送信キューの数
Local Address:Port サーバー側のIP又はソケットファイル、ポートを表示
Peer Address:Port 通信している側のIP又はソケットファイル、ポートを表示

netstatコマンド:Linuxで接続待ちをしているポートを確認する

前の章でも触れましたが、CentOS7からは、Linuxで接続待ちをしているポートを確認するには、
netstatコマンドよりもssコマンドを利用することが推奨されています。

 

しかし、
ssコマンドの一部のバージョンでは、TCPとUDPを同時に表示させた場合、
UDPポートがTCPポートとして表示されてしまう既知のバグが存在します。

 

そのような環境ではssコマンドは利用せず、netstatコマンドを利用することが推奨されます。

 

■netstatコマンドのオプション

-a 全てのソケットを表示
-n サービス名に変換せずに表示
-t TCP情報のみ表示
-u UDP情報のみ表示

 

■netstatコマンドで接続待ちをしているポートを確認する
・TCPポートのみを表示する
netstatコマンドにオプション「-atn」を付けて実行します。

# netstat -atn
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:993 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:995 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:10024 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:10025 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:587 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:110 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:783 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:143 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:5432 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN

 

・UDPポートのみを表示する
netstatコマンドにオプション「-anu」を付けて実行します。

# netstat -anu
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
udp 0 0 127.0.0.1:323 0.0.0.0:*
udp6 0 0 ::1:323 :::*
udp6 0 0 ::1:48654 ::1:48654 ESTABLISHED

 

・TCP、UDPポート両方表示する
netstatコマンドにオプション「-atnu」を付けて実行します。

# netstat -atnu
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:993 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:995 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:10024 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:10025 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:587 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:110 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:783 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:143 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:5432 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:9000 127.0.0.1:48142 TIME_WAIT
〜中略〜
udp 0 0 127.0.0.1:323 0.0.0.0:*
udp6 0 0 ::1:323 :::*
udp6 0 0 ::1:48654 ::1:48654 ESTABLISHED

 

・通信が確立しているポートを表示する
ssコマンドにオプション「-t」を付けて実行します。

# netstat -t
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 localhost:cslistener localhost:48232 TIME_WAIT
tcp 0 0 localhost:cslistener localhost:48222 TIME_WAIT
tcp 0 96 v150-95-1:EtherNet/IP-1 221x254x141:vrtl-vmf-ds ESTABLISHED
tcp 0 0 v150-95-XXX-XXX.a:https cpe-174-97-215-12:12582 ESTABLISHED
tcp 0 0 localhost:cslistener localhost:48226 TIME_WAIT
tcp 0 0 localhost:cslistener localhost:48224 TIME_WAIT
tcp 0 0 v150-95-XXX-XXX.a0:http crawl-66-249-79-8:41706 ESTABLISHED
tcp 0 0 v150-95-XXX-XXX.a:https crawl-66-249-79-6:60933 TIME_WAIT
tcp 0 0 v150-95-XXX-XXX.a:https crawl-66-249-79-6:63493 ESTABLISHED
tcp 0 0 v150-95-1:EtherNet/IP-1 221x254x:gilatskysurfer ESTABLISHED
tcp 0 0 v150-95-XXX-XXX.a:https crawl-66-249-79-7:50643 TIME_WAIT
tcp 0 0 v150-95-XXX-XXX.a:https crawl-66-249-79-6:56649 ESTABLISHED
tcp 0 0 localhost:48234 localhost:cslistener ESTABLISHED
tcp 0 0 v150-95-1:EtherNet/IP-1 221x254xXXXxXX.ap:61865 ESTABLISHED
tcp 0 0 localhost:cslistener localhost:48230 TIME_WAIT

※150-95-XXX-XXX.にはLinuxのIPアドレスが表示されます。

 

■各項目の説明

Proto

Socketのタイプ
u_str:UNIX Domainソケット
tcp :TCPソケット
udp :UDPソケット

Recv-Q 受信キューの数
Send-Q 送信キューの数
Local Address サーバー側のIP又はソケットファイル、ポートを表示
Foreign Address 通信している側のIP又はソケットファイル、ポートを表示
State 通信の状態

nmapコマンド:外部からポートがどのポートが開いているか確認する

これまでは、Linuxシステム内でポートを確認する方法を紹介してきましたが、
本章ではLinuxにログインせず、外部からどのポートが開いているか確認する方法を紹介します。

 

<<重要>>
本章で紹介する手順は、自分が管理している機器に対してのみ行ってください。
他人や他組織が管理している機器に行った場合、ハッキング行為と見なされます。
取り扱いには充分に注意してください。

 

外部からどのポートが空いているかを確認するには、Linux環境ではnmapコマンドを使用したポートスキャンを実施します。

 

■nmapコマンド:外部からポートがどのポートが開いているか確認する
nmapコマンドの引数にポートスキャンしたい対象のサーバーIPアドレスやホスト名を指定して実行します。

# nmap 150.XXX.XXX.XXX
Starting Nmap 6.40 ( http://nmap.org ) at 2018-05-23 03:57 JST
Nmap scan report for v150-XXX-XXX-XXX.a088.g.XXX.XXXX.XXX.io (150.XXX.XXX.XXX)
Host is up (0.00068s latency).
Not shown: 992 filtered ports
PORT STATE SERVICE
20/tcp closed ftp-data
21/tcp open ftp
25/tcp open smtp
53/tcp closed domain
80/tcp open http
110/tcp open pop3
443/tcp open https

※例では、IPアドレスを指定していますが、伏せ字にしています。
nmapを実行すると、ポートスキャンした対象のサーバーのどのポートが開いているか一覧表示されます。

 

■外部からポートスキャンがが行えない場合の確認ポイント
Linuxが起動していて、ネットワークにも接続出来ている状態で、
外部からポートスキャンが行えない場合は、以下の点について確認してみてください。

 

・ポートスキャン対象の機器でファイアウォールが有効になっていませんか?(iptables、firewalld等)
・ルーターのポートは開いていますか?
・ファイアウォール機器のポートは開いていますか?
・ポートスキャン対策ソフトが導入されていませんか?