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コマンドを利用します。
■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
■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
■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
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)