「不要なポートが開いていないか確認したい」
・・・サーバー構築やセキュリティ監査の現場では、ポートの開放状況の確認が必須の作業です。
この記事では、Linuxで現在開いているポート(接続待ちのポート)を確認するためのコマンドを体系的に解説します。現代の主流である
ss コマンドや、プロセスを特定する lsof コマンドの実践的な使い方から、ファイアウォールの確認手順までまとめました。ポートとは?IPアドレスとの違い
ポートとは、ネットワーク通信において「どのプログラムと通信するか」を識別するための出入り口(扉)の番号です。IPアドレスを「建物の住所」に例えるなら、ポート番号は「部屋番号(または窓口)」に相当します。Webサイト(HTTP)なら80番、SSHなら22番というように、サービスごとに使うポート番号(ウェルノウンポート)が決められています。サーバー管理においては「意図したポートだけが正しく開いているか」を常に意識する必要があります。
現場でよく使うポート番号の早見表
| ポート番号 | プロトコル | 用途 |
|---|---|---|
| 22 | TCP | SSH(リモートログイン) |
| 25 | TCP | SMTP(メール送信) |
| 53 | TCP/UDP | DNS(名前解決) |
| 80 | TCP | HTTP(Web) |
| 123 | UDP | NTP(時刻同期) |
| 443 | TCP | HTTPS(暗号化Web) |
| 3306 | TCP | MySQL/MariaDB |
現代の標準「ss」コマンドで確認する
かつてはnetstat コマンドが主流でしたが、現代のLinux(RHEL 8/9、AlmaLinux、Ubuntuなど)では、より高速で詳細な情報が取得できる ss コマンドが標準となっています。TCPの接続待ち(LISTEN)ポートを確認する
TCPプロトコルで外部からの接続を待っている(LISTEN状態)ポートを確認するには、以下のオプションを組み合わせて実行します。# ss -atn | grep LISTEN LISTEN 0 128 0.0.0.0:80 0.0.0.0:* LISTEN 0 128 0.0.0.0:22 0.0.0.0:* または # ss -ltn LISTEN 0 128 0.0.0.0:80 0.0.0.0:* LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
オプションの意味は以下の通りです。
・
-a:すべてのソケットを表示・
-t:TCPのみを表示・
-n:名前解決をせず、ポート番号を数字のまま表示・
-l:接続待ち(LISTEN)状態のソケットのみ表示プロセス名も一緒に確認する(-pオプション)
-p オプションを追加すると、そのポートを使っているプロセス名まで一度に確認できます。root権限で実行してください。# ss -atnp | grep LISTEN LISTEN 0 128 0.0.0.0:80 0.0.0.0:* users:(("httpd",pid=1234,fd=4)) LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=5678,fd=3))
users 欄にプロセス名とPIDが表示されます。「80番ポートはhttpdが使用中」といったことが一目で分かります。特定のポートだけ絞り込む
確認したいポートが決まっている場合は、grep で絞り込むのが現場の定番です。# ss -atn | grep ':80 ' LISTEN 0 128 0.0.0.0:80 0.0.0.0:*
TCPとUDPの両方を確認する
DNS(53番)やNTP(123番)など、UDPプロトコルのポートも含めてすべて確認したい場合は、-u オプションを追加します。UDPにはTCPのような「LISTEN」状態がなく、待ち受けポートは「UNCONN」として表示されます。# ss -atnu State Recv-Q Send-Q Local Address:Port Peer Address:Port UNCONN 0 0 0.0.0.0:53 0.0.0.0:* UNCONN 0 0 0.0.0.0:123 0.0.0.0:* LISTEN 0 128 0.0.0.0:80 0.0.0.0:* LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
プロセス名まで特定する「lsof」コマンド
「8080番ポートが開いているけど、一体何のプログラムが使っているんだ?」という原因調査の際に活躍するのが
lsof コマンドです。ポート番号を指定して、そのポートを使っているプロセス(プログラム名)を一発で特定できます。
※すべての情報を取得するため、root権限(sudo)で実行してください。
# lsof -i :80 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME httpd 12345 root 4u IPv4 12345 0t0 TCP *:http (LISTEN) httpd 12346 apache 4u IPv4 12345 0t0 TCP *:http (LISTEN)
ファイアウォールの設定を確認する(firewall-cmd)
サーバー内部ではss コマンドでポートが開いて見えても、「ファイアウォールで弾かれていて外部から繋がらない」というトラブルは現場で非常に多いです。RHEL/AlmaLinux系では
firewall-cmd コマンドで現在許可されているポートを確認できます。# firewall-cmd --list-ports 8080/tcp 443/tcp # サービス名での許可状況も確認できる # firewall-cmd --list-services ssh dhcpv6-client http https
ss で開いているのに外部から繋がらない場合は、まずこのコマンドでファイアウォールの許可状況を確認してみましょう。外部からポートが開いているか確認する(nmapコマンド)
ファイアウォールの設定も確認したうえで、それでも外部から繋がるか確かめたい場合は、クライアント側のPCからnmap コマンドを使用します。※クライアント側のPCで実行してください # nmap -p 80 192.168.1.100
open と表示されれば、通信は正常に到達しています。filtered の場合はファイアウォールでブロックされている可能性が高いです。古い「netstat」コマンドについて(レガシー環境向け)
CentOS 6などの非常に古い環境では、ss コマンドの代わりに netstat コマンドを使用します。使い方のオプションは ss コマンドとほぼ同じです。# netstat -atn
ss を使う習慣をつけましょう。本記事のまとめ
| やりたいこと | コマンド例 |
|---|---|
| TCPの接続待ちポート一覧を見る | ss -atn | grep LISTEN |
| ポートを使っているプロセス名も見る | ss -atnp | grep LISTEN |
| 特定ポートだけ絞り込む | ss -atn | grep :80 |
| UDPも含めた全ポートを見る | ss -atnu |
| 特定ポートを使っているプロセスを調べる | lsof -i :ポート番号 |
| ファイアウォールの許可ポートを確認する | firewall-cmd --list-ports |
| 外部から通信到達できるかテストする | nmap -p ポート番号 IPアドレス |
ポート設定やネットワーク周りのトラブルで、無駄な時間を過ごしていませんか?
「どのポートが開いているか分からない」「ファイアウォールの設定がうまくいかない」といったネットワークの壁は、独学だと解決に何時間もかかってしまいます。
バージョンに振り回されず、現場で通用するWebサーバー構築の"型"を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
登録10秒/自動返信でDL/合わなければ解除3秒
<<関連記事>>
・CentOS7のホスト名設定(nmcliコマンド)
・IPv6アドレスを確認する
・nmapでポートスキャンを実施する
・名前解決の参照順を変更する(/etc/host.conf)
・名前解決の参照順を変更する(/etc/nsswitch.conf)
