Linuxのポート状況を確認する

Linux入門マニュアルが無料ダウンロードできます。

ダウンロードはこちらをクリック

Linuxのポート状況を確認する

Linuxのポート確認には、lsof、ss、netstat、nmap等、
得たい情報やLinuxの状況によって、
様々なコマンドを利用して確認する方法があります。
そんな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などはデフォルトポートではなく
他の番号に変更して運用することが多いです。

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

Linuxで接続待ちをしているポートを確認するには、
ssコマンド、またはnetstatコマンドを利用します。
※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アドレスが表示されます。

■ssコマンド実行結果の各項目説明
Netid Socketのタイプ
u_str:UNIX Domainソケット
tcp :TCPソケット
udp :UDPソケット
State 通信の状態
Recv-Q 受信キューの数
Send-Q 送信キューの数
Local Address:Port サーバー側のIP又はソケットファイル、ポートを表示
Peer Address:Port 通信している側のIP又はソケットファイル、ポートを表示

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

前の章でも触れましたが、
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


・通信が確立しているポートを表示する
netstatコマンドにオプション「-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アドレスが表示されます。

■netstatコマンド実行結果の各項目説明
Proto Socketのタイプ
u_str:UNIX Domainソケット
tcp :TCPソケット
udp :UDPソケット
Recv-Q 受信キューの数
Send-Q 送信キューの数
Local Address サーバー側のIP又はソケットファイル、ポートを表示
Foreign Address 通信している側のIP又はソケットファイル、ポートを表示
State 通信の状態

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

Linuxでプロセスが使用しているポートを確認するには「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


■lsofコマンド実行結果の各項目説明
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にインストールされている必要があります。

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

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

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

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

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

# 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を実行すると、ポートスキャンした対象のサーバーの
どのポートが開いているか一覧表示されます。

■nmapコマンド:ポートのスキャン範囲を指定して開いているポートを確認する
下記例では、ポート1〜99までを指定してポートスキャンを行っています。
# nmap -p 1-99 150.XXX.XXX.XXX

Starting Nmap 6.40 ( http://nmap.org ) at 2019-11-26 15:23 JST
Nmap scan report for 192.168.0.10
Host is up (0.0000030s latency).
Not shown: 97 closed ports
PORT   STATE SERVICE
21/tcp open  ftp
80/tcp open  http

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

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

・ルーターのポートは開いていますか?
・ファイアウォール機器のポートは開いていますか?
・ポートスキャン対策ソフトが導入されていませんか?
本ページの解説を動画でご覧頂けます。
好評なら今後も動画アップしますのでよろしくおねがいします。

Linux内のサービスのポート番号をファイルで確認する(/etc/services)

Linuxで稼働するサービスは、
デフォルトでサービス固有のポート番号が使用されます。
例えば、httpならTCPポートの80番、httpsなら443番などです。

これらのポート番号を把握するには、
サービス独自の設定ファイルを確認しなければなりませんが、
一般的に想定されているポート番号は、/etc/servicesファイルに記載されています。

/etc/servicesファイルには、
各行ごとにサービス名とポート番号/プロトコル名が記載されています。
# view /etc/services
 /etc/services:
# $Id: services,v 1.55 2013/04/14 ovasik Exp $
#
# Network services, Internet style
# IANA services version: last updated 2013-04-10
#
# Note that it is presently the policy of IANA to assign a single well-known
# port number for both TCP and UDP; hence, most entries here have two entries
# even if the protocol doesn't support UDP operations.
# Updated from RFC 1700, ``Assigned Numbers'' (October 1994).  Not all ports
# are included, only the more common ones.
#
# The latest IANA port assignments can be gotten from
#       http://www.iana.org/assignments/port-numbers
# The Well Known Ports are those from 0 through 1023.
# The Registered Ports are those from 1024 through 49151
# The Dynamic and/or Private Ports are those from 49152 through 65535
#
# Each line describes one service, and is of the form:
#
# service-name  port/protocol  [aliases ...]   [# comment]

tcpmux          1/tcp                           # TCP port service multiplexer
tcpmux          1/udp                           # TCP port service multiplexer
rje             5/tcp                           # Remote Job Entry
rje             5/udp                           # Remote Job Entry
echo            7/tcp
echo            7/udp
discard         9/tcp           sink null
discard         9/udp           sink null
systat          11/tcp          users
systat          11/udp          users
daytime         13/tcp
daytime         13/udp
qotd            17/tcp          quote
qotd            17/udp          quote
msp             18/tcp                          # message send protocol (historic)
msp             18/udp                          # message send protocol (historic)
chargen         19/tcp          ttytst source
chargen         19/udp          ttytst source
ftp-data        20/tcp
ftp-data        20/udp
# 21 is registered to ftp, but also used by fsp
ftp             21/tcp

〜中略〜

netrjs-3        73/udp                          # Remote Job Service
netrjs-4        74/tcp                          # Remote Job Service
netrjs-4        74/udp                          # Remote Job Service
finger          79/tcp
finger          79/udp
http            80/tcp          www www-http    # WorldWideWeb HTTP
http            80/udp          www www-http    # HyperText Transfer Protocol
http            80/sctp                         # HyperText Transfer Protocol
kerberos        88/tcp          kerberos5 krb5  # Kerberos v5
kerberos        88/udp          kerberos5 krb5  # Kerberos v5
supdup          95/tcp
supdup          95/udp
hostname        101/tcp         hostnames       # usually from sri-nic
hostname        101/udp         hostnames       # usually from sri-nic
iso-tsap        102/tcp         tsap            # part of ISODE.
csnet-ns        105/tcp         cso             # also used by CSO name server

以下省略


※但し、各種サービスの設定ファイルでポート番号を任意に変更できるため、
 ここに記載されているポートで実際にサービスが動いているとは限りません。



P.S
Linuxのポート状況を確認するなど、より高度な現場のLinux技術をマスターしたいなら

詳しくはこちらをクリック

P.P.S
Linux入門マニュアルが無料ダウンロードできます。

ダウンロードはこちらをクリック


<<関連記事>>
・CentOS7のホスト名設定(nmcliコマンド)
・IPv6アドレスを確認する
・nmapでポートスキャンを実施する
・名前解決の参照順を変更する(/etc/host.conf)
・名前解決の参照順を変更する(/etc/nsswitch.conf)