CentOS初心者向け:ポート確認コマンド入門徹底解説
はじめに:なぜポートの確認が必要なのか?
CentOSをはじめとするLinuxサーバーを運用する上で、「ポート」という概念は避けて通れません。しかし、「ポートって何?」「なぜ確認する必要があるの?」と感じる初心者の方も多いのではないでしょうか。
この長い記事では、CentOS初心者の方でも理解できるよう、ポートの基礎から始まり、サーバーの状態を確認するために必須となる様々なポート確認コマンドについて、それぞれの使い方、主要オプション、出力の見方、そして具体的な活用例を、豊富な例を交えて徹底的に解説します。
この記事を読むことで、あなたは以下のことができるようになります。
- ポートとは何か、なぜ重要なのかを理解できる。
- サーバーがどのようなサービスを公開(リスニング)しているかを確認できる。
- 外部から特定のポートにアクセス可能か(ファイアウォールの設定も含む)を確認できる。
- ネットワークの問題やサービスの起動状態に関するトラブルシューティングの第一歩を踏み出せる。
- CentOSで広く使われているポート確認コマンド(
ss
,netstat
,nmap
,firewall-cmd
など)を使いこなせるようになる。
さあ、ポートとコマンドの世界へ一緒に飛び込みましょう!
ポートとは何か? 比喩で理解する
ポートを理解するために、よく使われる比喩は「建物のドアや窓」です。
インターネット上のサーバーは、一つの大きな建物のようなものです。この建物には様々なサービス(Webサイト、メール、SSH接続など)が提供されています。これらのサービスを利用するために、外部から建物に入り込む必要がありますが、一つの入り口だけでは混乱しますし、どのサービスを利用したいのか分かりません。
そこで、建物にはたくさんのドアや窓が設けられています。これらの「ドアや窓」が「ポート」です。
- 建物: サーバー
- 部屋: サーバー上で動いている個々のサービス(Webサーバー、SSHサーバー、データベースなど)
- ドアや窓: ポート
それぞれのサービスは、特定のポート番号に割り当てられています。例えば、Webサイトを見るためのHTTPサービスは通常ポート番号80、安全な接続のためのHTTPSサービスはポート番号443、サーバーにリモートで安全に接続するためのSSHサービスはポート番号22を使います。
外部のコンピュータ(クライアント)は、サーバーのIPアドレス(建物の住所)と、利用したいサービスのポート番号(ドアや窓の番号)を指定することで、目的のサービスにアクセスします。
サーバー側から見ると、「このポート番号のドアを開けて、外部からの接続を待っていますよ」という状態を「ポートをリスニング(listening)している」と言います。サービスが起動していて、外部からの接続を受け入れる準備ができている状態です。
なぜポート確認が必要なの?
ポートの状態を確認することは、以下のような状況で非常に重要になります。
- サービスの稼働確認: Webサーバー(Apache/Nginx)がちゃんと動いて、ポート80や443で接続を待っているか? SSHサーバーがポート22で待機しているか?
- トラブルシューティング: サーバーに接続できない、特定のサービスが利用できない。これは、サービスが起動していないのか、別のサービスが同じポートを使っているのか、あるいはファイアウォールでポートが閉じられているのか?
- セキュリティ確認: 不必要に開いているポートはないか? 見慣れないポートで何かのサービスがリスニングしていないか? (マルウェアなどが勝手に通信ポートを開くこともあります)
- ファイアウォールの設定確認: 設定したファイアウォールルール(ポートを開ける/閉じる)が正しく反映されているか?
このように、ポートの確認はサーバーの状態を把握し、問題を解決するために欠かせないスキルなのです。
ポートの基礎知識
コマンドを学ぶ前に、ポートに関するいくつかの基本的な概念を理解しておきましょう。
TCPポートとUDPポート
ポートは、インターネット上でデータを送受信する際に使用される2つの主要なプロトコル「TCP (Transmission Control Protocol)」と「UDP (User Datagram Protocol)」それぞれに存在します。
- TCP (Transmission Control Protocol): 信頼性のあるコネクション指向のプロトコルです。データを送る前に相手との接続を確立し、データが正しく届いたか確認しながら送ります。データが欠けたり順序が入れ替わったりしないように制御するため、Webアクセス(HTTP/HTTPS)、ファイル転送(FTP)、リモートログイン(SSH)など、信頼性が重視される通信で使われます。
- UDP (User Datagram Protocol): コネクションレスで信頼性の保証がないプロトコルです。データを一方的に送りつけ、相手が受け取ったかどうかの確認や再送は行いません。このため、TCPよりも高速です。ストリーミング配信、オンラインゲーム、DNS(Domain Name System)など、リアルタイム性や速度が重視される通信で使われます。
ポート番号はTCPとUDPで独立しています。例えば、TCPのポート80とUDPのポート80は、技術的には別々のポートとして扱われます。多くの標準的なサービスはTCPポートを使用しますが、DNSはUDPポート53、SNMPはUDPポート161など、UDPを使用するサービスもあります。
ポート確認コマンドを使う際にも、TCPポートを確認するのか、UDPポートを確認するのかを指定する必要がある場合が多いです。
ポート番号の分類
ポート番号は0から65535までの範囲があり、用途によって大きく3つのカテゴリに分けられます。
- ウェルノウンポート (Well-known Ports): 0~1023
- OSや主要なサービス(HTTP, SSH, FTPなど)に割り当てられている、国際的に予約されたポート番号です。
- root権限がないとこれらのポートでサービスをリスニングできません。
- 例: 20(FTP Data), 21(FTP Control), 22(SSH), 23(Telnet), 25(SMTP), 53(DNS), 80(HTTP), 110(POP3), 143(IMAP), 443(HTTPS) など。
- 登録済みポート (Registered Ports): 1024~49151
- IANA (Internet Assigned Numbers Authority) に申請することで、特定のアプリケーションやサービスに割り当てられるポート番号です。
- root権限がなくてもこれらのポートでサービスをリスニングできます。
- 例: 1521(Oracle), 3306(MySQL), 5432(PostgreSQL), 8080(HTTP Alternate) など。
- 動的ポート / プライベートポート (Dynamic/Private Ports): 49152~65535
- 特定の用途には割り当てられていない、自由に使用できるポート番号です。
- クライアントがサーバーのサービスに接続する際に、クライアント側が一時的に使用するポート(エフェメラルポート)としてよく使われます。
サーバー上で特定のサービスがどのポートで動いているかを確認する際には、これらの範囲を意識しておくと、それが一般的なサービスなのか、あるいは独自の設定なのかを推測する手がかりになります。
/etc/services
ファイル
Linuxシステムには、ポート番号とサービス名、プロトコルの対応がリストアップされた /etc/services
というテキストファイルがあります。
“`bash
$ cat /etc/services | head -n 10
/etc/services:
$Id: services,v 1.40 2019/11/27 13:49:46 christos Exp $
Network services, Internet style
Note that it is presently the policy of PRC and ISI to assign a single
well-known port number per service; hence the zillions of entries like
ftp-data 20/tcp
ftp 21/tcp
ssh 22/tcp # SSH Remote Login Protocol
telnet 23/tcp
“`
このファイルを見ると、例えばSSHは22/tcp、Telnetは23/tcp、HTTPは80/tcpといった標準的な対応が確認できます。ポート確認コマンドの出力でポート番号だけでなくサービス名が表示されるのは、多くの場合このファイルを参照しているからです。
ただし、このファイルはあくまで「標準的な対応リスト」であり、実際にサーバー上で動いているサービスが必ずしもこの通りのポートを使っているとは限りません。特に登録済みポートや動的ポートの範囲では、アプリケーションの設定によって様々なポートが使われます。
ポート確認コマンドの紹介
CentOSでポートの状態を確認するために使用される主なコマンドをいくつか紹介します。それぞれに得意なことや、より新しい・古いといった違いがあります。
1. ss
コマンド (推奨)
ss
(socket statistics) コマンドは、現在アクティブなソケット(ネットワーク接続の終点)に関する情報を表示します。これは、netstat
コマンドの後継として開発されたコマンドで、大規模なシステムでも高速に動作するという特徴があります。CentOS 7以降のバージョンでは、通常デフォルトでインストールされており、ポート確認の主要なツールとして推奨されています。
基本構文:
bash
ss [オプション]
オプションを指定しない場合、ss
は確立済みの(ESTABLISHED)TCP接続などを表示します。しかし、ポートがリスニング状態にあるかなどを確認するには、通常オプションを指定する必要があります。
主要なオプション:
-a
,--all
: 全てのソケット(リスニング状態、確立済み、閉じようとしているなど)を表示します。ポートがリスニングしているか確認する際によく使います。-l
,--listening
: リスニング状態のソケットのみを表示します。特定のポートでサービスが待ち受けているかを確認するのに非常に便利です。-t
,--tcp
: TCPソケットのみを表示します。-u
,--udp
: UDPソケットのみを表示します。-n
,--numeric
: ポート番号やIPアドレスをサービス名やホスト名に変換せず、数字のまま表示します。変換処理が不要になるため、高速に表示できますし、正確なポート番号を確認できます。特に理由がなければ-n
オプションを使うのがおすすめです。-p
,--processes
: そのソケットを使用しているプロセス(プログラム)の名前とPID (Process ID) を表示します。どのプロセスがどのポートを使っているかを知るために重要です。このオプションを使用するにはroot権限が必要です。-s
,--summary
: ソケットの統計情報を表示します(合計数など)。-r
,--resolve
: ポート番号をサービス名に、IPアドレスをホスト名に変換します。デフォルトの挙動ですが、明示的に指定することもあります。-n
の逆の動作です。
よく使う組み合わせ:
ss -tuln
: TCP (-t
) と UDP (-u
) の、リスニング状態 (-l
) のソケットを、数字で (-n
) 表示する。サーバーが待ち受けているポートを知りたい場合に最もよく使う組み合わせです。ss -antp
: 全ての (-a
) TCP (-t
) ソケットを、数字で (-n
) 表示し、関連プロセスも表示 (-p
) する。現在の全てのTCP接続と、それを使っているプロセスを知りたい場合に便利です。ss -s
: 現在のソケット状態のサマリーを表示。
具体的な使用例:
例1: リスニング状態のTCP/UDPポートを数字で表示
bash
$ ss -tuln
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
tcp LISTEN 0 128 [::]:22 [::]:*
udp UNCONN 0 0 127.0.0.1:323 0.0.0.0:*
udp UNCONN 0 0 127.0.0.1:60114 0.0.0.0:*
udp UNCONN 0 0 [::1]:323 [::]:*
- 出力の見方:
Netid
: プロトコル (tcp または udp)State
: ソケットの状態 (LISTEN: 待ち受け中, ESTAB: 確立済み, UNCONN: UDPなど接続状態を持たないものなど)Recv-Q
: 受信キューにあるバイト数またはパケット数Send-Q
: 送信キューにあるバイト数またはパケット数Local Address:Port
: ローカル(サーバー自身)のIPアドレスとポート番号。0.0.0.0
は「すべてのIPv4アドレス」を意味し、[::]
は「すべてのIPv6アドレス」を意味します。特定のIPアドレスではなく0.0.0.0
や[::]
にバインドしている場合、そのサーバーのどのIPアドレスに対してもそのポートで接続を受け付ける設定になっていることを示します。Peer Address:Port
: 接続相手(リモート)のIPアドレスとポート番号。リスニング状態の場合は0.0.0.0:*
や[::]:*
となり、「どのIPアドレス、どのポートからの接続も受け付ける準備ができている」ことを意味します。
この例では、TCPポート22 (0.0.0.0:22
と [::]:22
) がリスニング状態であることがわかります。これはSSHサービスが起動している可能性が高いことを示唆します。UDPポート323 (127.0.0.1:323
と [::1]:323
) もリスニングしています。これは通常、chronyd
などのNTPサービスがローカルホスト (127.0.0.1
や [::1]
) からの要求を待ち受けていることを示します。
例2: リスニング状態のソケットと関連プロセスを表示
rootユーザーまたは sudo
を使用します。
bash
$ sudo ss -tulnp
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=859,fd=3))
tcp LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=859,fd=4))
udp UNCONN 0 0 127.0.0.1:323 0.0.0.0:* users:(("chronyd",pid=687,fd=5))
udp UNCONN 0 0 127.0.0.1:60114 0.0.0.0:* users:(("dhclient",pid=1049,fd=10))
udp UNCONN 0 0 [::1]:323 [::]:* users:(("chronyd",pid=687,fd=6))
- 出力の見方:
Process
: そのソケットを開いているプロセスの情報が表示されます。(("プロセス名",pid=プロセスID,fd=ファイルディスクリプタ))
という形式です。- この例では、TCPポート22はPID 859の
sshd
プロセスが、UDPポート323はPID 687のchronyd
プロセスが使用していることがわかります。これにより、どのサービスがどのポートを使っているかを特定できます。
例3: 特定のポートを使用しているソケットを検索 (grep
と組み合わせる)
ポート80 (HTTP) を使用しているソケットを確認したい場合。
bash
$ ss -tulnp | grep :80
もしWebサーバー (ApacheやNginx) が起動していれば、以下のような出力が得られる可能性があります。
bash
tcp LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=1234,fd=6))
これにより、ポート80がリスニング状態であり、nginx
というプロセスが使用していることがわかります。
例4: 特定のプロトコルとポート番号でフィルタリング
ss
コマンド自体にもフィルタリング機能がありますが、初心者には grep
を使う方が直感的かもしれません。より高度なフィルタリングが必要な場合は ss
のフィルタリングオプションを調べると良いでしょう (ss -t '( dport = :80 or sport = :80 )'
など)。
ss
コマンドの利点:
- 高速: 大量の接続があるサーバーでも素早く情報を表示できます。
- 豊富な情報: ソケットの状態、キュー情報、プロセス情報など、詳細な情報を取得できます。
- 新しい開発:
netstat
に代わる推奨コマンドとして積極的に開発・メンテナンスされています。
ss
コマンド使用の注意点:
- プロセス情報を表示するにはroot権限が必要です (
-p
オプション)。
2. netstat
コマンド (レガシー)
netstat
(network statistics) コマンドは、ネットワーク接続、ルーティングテーブル、インターフェース統計、マスカレード接続などを表示するコマンドです。ss
よりも古くから存在しており、広く使われていますが、大規模なシステムではパフォーマンスに問題が出ることがあります。CentOS 8以降ではデフォルトでインストールされなくなったため、使用するには net-tools
パッケージのインストールが必要な場合があります。
なぜ netstat
は非推奨なのか?
netstat
は /proc
ファイルシステムをスキャンして情報を収集します。接続数が多くなると、このスキャンに時間がかかり、システムリソースを消費する可能性があります。一方、ss
はNetlinkソケットという、より効率的な方法でカーネルから直接情報を取得するため、高速に動作します。
しかし、netstat
は依然として多くのシステム管理者にとって馴染み深いコマンドであり、機能も豊富なので、知っておく価値はあります。
基本構文:
bash
netstat [オプション]
オプションを指定しない場合、netstat
はアクティブな非サーバー接続(クライアント側として確立した接続など)を表示します。ポートがリスニングしているかを確認するにはオプションが必須です。
主要なオプション:
ss
と似ていますが、微妙な違いがあります。
-a
,--all
: 全ての接続とリスニングポートを表示します。-l
,--listening
: リスニング状態のソケットのみを表示します。-t
,--tcp
: TCP接続のみを表示します。-u
,--udp
: UDP接続のみを表示します。-n
,--numeric
: ポート番号やIPアドレスをサービス名やホスト名に変換せず、数字のまま表示します。こちらも-n
オプションを付けて使うのが一般的です。-p
,--programs
: そのソケットを使用しているプログラムの名前とPIDを表示します。このオプションを使用するにはroot権限が必要です。-r
,--route
: ルーティングテーブルを表示します(ポート確認とは直接関係ありませんが、よく使われます)。-i
,--interfaces
: ネットワークインターフェースの統計情報を表示します(これもポート確認とは直接関係ありません)。
よく使う組み合わせ:
netstat -tuln
: TCP (-t
) と UDP (-u
) の、リスニング状態 (-l
) のポートを、数字で (-n
) 表示する。ss -tuln
と同様によく使われます。netstat -antp
: 全ての (-a
) TCP (-t
) 接続を、数字で (-n
) 表示し、関連プログラムも表示 (-p
) する。netstat -s
: ネットワークプロトコルの統計情報を表示します。
具体的な使用例:
例1: リスニング状態のTCP/UDPポートを数字で表示
bash
$ netstat -tuln
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 :::22 :::* LISTEN
udp 0 0 127.0.0.1:323 0.0.0.0:*
udp 0 0 127.0.0.1:60114 0.0.0.0:*
udp 0 0 ::1:323 :::*
- 出力の見方:
Proto
: プロトコル (tcp または udp)Recv-Q
: 受信キューSend-Q
: 送信キューLocal Address
: ローカルのIPアドレスとポート番号。0.0.0.0
はすべてのIPv4アドレス、:::
はすべてのIPv6アドレス。ポート番号は:
の後に表示されます。Foreign Address
: リモート(接続相手)のIPアドレスとポート番号。リスニング状態の場合は0.0.0.0:*
や:::*
となります。State
: 接続状態 (LISTEN: 待ち受け中, ESTABLISHED: 確立済み など)。UDPはコネクションレスのため、Stateが表示されないか、UNCONN
と表示されることがあります。
この例では、ss -tuln
と同様にTCPポート22 (0.0.0.0:22
と :::22
) がリスニング状態であることがわかります。
例2: リスニング状態のソケットと関連プロセスを表示
rootユーザーまたは sudo
を使用します。
bash
$ sudo netstat -tulnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 859/sshd
tcp 0 0 :::22 :::* LISTEN 859/sshd
udp 0 0 127.0.0.1:323 0.0.0.0:* 687/chronyd
udp 0 0 127.0.0.1:60114 0.0.0.0:* 1049/dhclient
udp 0 0 ::1:323 :::* 687/chronyd
- 出力の見方:
PID/Program name
: プロセスIDとプログラム名が表示されます。- この例では、PID 859の
sshd
がTCPポート22を、PID 687のchronyd
がUDPポート323を使用していることがわかります。netstat
の出力では、PIDとプログラム名が/
で区切られて表示されます。
例3: 特定のポートを使用しているソケットを検索 (grep
と組み合わせる)
ポート80 (HTTP) を使用しているソケットを確認したい場合。
bash
$ netstat -tulnp | grep :80
もしWebサーバーが起動していれば、以下のような出力が得られる可能性があります。
bash
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1234/nginx
netstat
の出力フォーマットは ss
とは異なりますが、含まれる情報は似ています。
CentOS 8以降で netstat
が使えない場合:
CentOS 8以降では netstat
はデフォルトでインストールされていません。使用したい場合は、以下のコマンドで net-tools
パッケージをインストールする必要があります。
bash
$ sudo dnf install net-tools
netstat
コマンドの利点:
- 歴史が長く、情報源が多い。
- 一部のオプション (
-r
や-i
) はss
よりも簡潔な情報を提供する場合がある。
netstat
コマンド使用の注意点:
- 大規模環境では
ss
より低速になる可能性がある。 - CentOS 8以降ではデフォルトでインストールされていない場合がある。
- プロセス情報を表示するにはroot権限が必要です (
-p
オプション)。
どちらを使うべきか?
CentOS 7以降であれば、特に理由がなければ ss
コマンドを使うことをお勧めします。しかし、既存のスクリプトで netstat
が使われている場合や、一時的に netstat
を使用したい場合は、net-tools
をインストールして利用することも可能です。最終的には、それぞれのコマンドの出力フォーマットに慣れて、状況に応じて使い分けるのが最も実用的です。
3. nmap
コマンド (ポートスキャン)
これまでに紹介した ss
や netstat
は、ローカルサーバー自身のポートの状態(どのポートでリスニングしているかなど)を確認するためのコマンドでした。
一方、nmap
はネットワークスキャンツールであり、別のコンピュータ(ターゲット)に対して、どのポートが開いているか、そこでどのようなサービスが動作しているかを外部から確認するために使用します。つまり、ファイアウォールを隔てて、サーバーの公開されているポートを確認する際に非常に強力なツールです。
注意点: nmap
は強力なツールであり、許可なく他者のシステムに対してスキャンを実行することは不正アクセス行為とみなされる可能性があります。必ず自身が管理するシステムや、許可を得たシステムに対してのみ使用してください。
CentOSにはデフォルトではインストールされていないことが多いです。インストールするには sudo dnf install nmap
を実行します。
基本構文:
bash
nmap [スキャンタイプ] [オプション] <ターゲット>
主要なオプション:
<ターゲット>
: スキャン対象のIPアドレス、ホスト名、またはネットワーク範囲を指定します (例:localhost
,192.168.1.100
,scanme.nmap.org
)。-sT
: TCP SYNスキャン(デフォルトのrootユーザー用スキャンタイプ)。ターゲットに接続を確立せず、SYNパケットを送って応答を見ることでポートが開いているかを確認します。ステルス性が比較的高いですが、完全な接続は行わないため、一部のファイアウォールやIDSに検知されにくい場合があります。-sU
: UDPスキャン。UDPポートが開いているか確認します。UDPはコネクションレスなので、開いているかどうかの判断がTCPより難しい場合があります。-p <ポート指定>
: スキャンするポートを指定します。- 例:
-p 80
: ポート80のみ - 例:
-p 22,80,443
: ポート22, 80, 443 - 例:
-p 1-1023
: ポート1から1023まで - 例:
-p-
: すべてのポート (1-65535)
- 例:
-A
: オペレーティングシステム検出、バージョン検出、スクリプトスキャン、tracerouteなどを有効にします。ターゲットに関する詳細な情報を取得できますが、時間がかかります。-v
: 詳細表示 (Verbose)。スキャンの進行状況などが表示されます。
具体的な使用例:
例1: ローカルホストに対してTCPポートのスキャン(よく使うウェルノウンポート)
bash
$ nmap localhost
またはIPアドレスで指定。
bash
$ nmap 127.0.0.1
実行すると、一般的なウェルノウンポートを中心にTCPスキャンが実行されます。
“`bash
Starting Nmap 7.80 ( https://nmap.org ) at 2023-10-27 10:00 JST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000090s latency).
Other addresses for localhost (not scanned): ::1
Not shown: 997 closed ports
PORT STATE SERVICE
22/tcp open ssh
25/tcp open smtp
3306/tcp open mysql
Nmap done: 1 IP address (1 host up) scanned in 0.10 seconds
“`
- 出力の見方:
PORT
: ポート番号とプロトコル (tcp/udp)STATE
: ポートの状態 (open: 開いている, closed: 閉じている, filtered: ファイアウォールなどでブロックされていて状態不明, unfiltered: アクセスは可能だが開いているかは不明)SERVICE
: そのポートで一般的に使われるサービス名 (/etc/services
やnmap独自のデータベースを参照)
この例では、ローカルホストのTCPポート22, 25, 3306が open
状態であることがわかります。これは、これらのポートが外部からの接続を受け付けている可能性があることを示唆します(ローカルホストへの接続は通常ファイアウォールを通りませんが、外部からのスキャンではファイアウォールの設定が結果に影響します)。
例2: 特定のポート範囲をスキャン
ポート80, 443, 8080が外部から開いているか確認したい場合。
bash
$ nmap <ターゲットのIPアドレス> -p 80,443,8080
例: ターゲットIPが 192.168.1.100
の場合。
“`bash
$ nmap 192.168.1.100 -p 80,443,8080
Starting Nmap 7.80 ( https://nmap.org ) at 2023-10-27 10:05 JST
Nmap scan report for 192.168.1.100
Host is up (0.0001s latency).
PORT STATE SERVICE
80/tcp open http
443/tcp open https
8080/tcp closed http-alt
Nmap done: 1 IP address (1 host up) scanned in 0.08 seconds
“`
この結果から、ターゲットサーバーのポート80と443は外部からアクセス可能 (open
) であるが、ポート8080は閉じている (closed
) ことがわかります。もしポートが filtered
と表示された場合は、ファイアウォールによってスキャンがブロックされている可能性があります。
例3: UDPポートをスキャン
UDPポート53 (DNS) が開いているか確認したい場合。
bash
$ nmap <ターゲットのIPアドレス> -sU -p 53
例4: バージョン情報を取得するスキャン
ポートが open
な場合に、そこで動作しているサービスの種類やバージョンを推測したい場合。
“`bash
$ nmap <ターゲットのIPアドレス> -p 22,80,443 -sV
Starting Nmap 7.80 ( https://nmap.org ) at 2023-10-27 10:10 JST
Nmap scan report for 192.168.1.100
Host is up (0.0002s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.0 (protocol 2.0)
80/tcp open http Apache httpd 2.4.37 ((centos))
443/tcp open ssl/http Apache httpd 2.4.37 ((centos))
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 0.50 seconds
“`
-sV
オプションを使うと、Serviceカラムに加えてVERSIONカラムが表示され、検出されたサービスの詳細情報が表示されます。これにより、例えばWebサーバーがApacheのどのバージョンで動いているかなどを知ることができます。セキュリティの観点から、古いバージョンのサービスは脆弱性を持つ可能性があるため、バージョン情報は重要です。
nmap
コマンドの利点:
- 外部から見たポートの状態を確認できる。
- ポートの状態だけでなく、サービスの種類やバージョン、OSの種類などを推測できる。
- 幅広いスキャンタイプやオプションが用意されている。
nmap
コマンド使用の注意点:
- 自身が管理するシステム以外への無許可のスキャンは違法となる可能性がある。
- ファイアウォールやIDSに検知される可能性がある。
- スキャン対象やオプションによっては時間がかかる場合がある。
4. firewall-cmd
/ iptables
(ファイアウォール関連)
ポートが外部からアクセス可能かどうかは、そのサーバーで動作しているファイアウォールの設定に大きく依存します。CentOS 7以降では firewalld
というファイアウォール管理ツールが標準で使われることが多く、その設定を確認するには firewall-cmd
コマンドを使用します。古いシステムでは iptables
が使われている場合もあります。
これらのコマンドは、「サーバー上でどのポートがリスニングしているか」ではなく、「サーバーのファイアウォール設定として、どのポートへの外部からのアクセスが許可されているか」を確認するものです。
ss
や netstat
でリスニングしているポートが確認できても、ファイアウォールでそのポートが閉じられていると、外部からは接続できません。逆に、ファイアウォールでポートが開いていても、そのポートで待ち受けているサービスがなければ、やはり外部からの接続はできません。
firewall-cmd
(CentOS 7以降)
firewalld
の設定を確認します。
例1: 許可されているポートのリストを表示
bash
$ sudo firewall-cmd --list-ports
出力例:
ports: 22/tcp 80/tcp 443/tcp
これは、ファイアウォールでTCPポート22, 80, 443へのアクセスが許可されていることを示します。
例2: 許可されているサービスのリストを表示
firewalld
では、ポート番号だけでなく、ssh
, http
, https
のようなサービス名でルールを管理することもできます。
bash
$ sudo firewall-cmd --list-services
出力例:
services: cockpit dhcpv6-client ssh http https
これは、ssh
、http
、https
といったサービス(それぞれ標準のポート番号に対応)が許可されていることを示します。
firewall-cmd
コマンドが示すこと:
- これは「ファイアウォールがこれらのポートへの接続を許可するように設定されている」ことを示すだけであり、そのポートで実際にサービスが動いている(リスニングしている)ことや、ポートが実際に開いていることを保証するものではありません。
ポートが開いているか(リスニングしているか)と、ファイアウォールで許可されているか、の両方を確認することが重要です。
iptables
(レガシー)
iptables
はより低レベルなファイアウォール管理コマンドです。CentOS 7以降でもバックエンドとして使われることがありますが、通常は firewalld
経由で設定します。古いシステムや特定の状況でのみ直接操作することがあります。
例: 現在のiptablesルールを表示
bash
$ sudo iptables -L -n
-L
: ルールをリスト表示-n
: IPアドレスやポート番号を数字で表示(名前解決しない)
出力は複雑ですが、Chain INPUT
セクションで、外部からの入力接続に対するルールを確認できます。ACCEPT
というターゲットのルールで、特定のポートが許可されているかを確認できます。
bash
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:80
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:443
...
この例では、TCPポート22, 80, 443への新規接続 (state NEW
) が ACCEPT
されていることがわかります。
iptables
コマンドが示すこと:
- これも「iptablesルールとしてこれらのポートへの接続が許可されている」ことを示すだけであり、実際にサービスがリスニングしていることや、ポートが実際に開いていることを保証するものではありません。
iptables
のルールは複雑になることが多いため、初心者の方はまず ss
や netstat
でリスニングポートを確認し、次に firewall-cmd
(firewalld
を使っている場合) でファイアウォール設定を確認する、という流れで進めるのがおすすめです。
5. telnet
/ nc
(netcat) (接続テスト)
これらのコマンドは、特定のIPアドレスとポート番号に対して実際に接続を試みることで、そのポートが開いているか、応答があるかを確認するために使用できます。
telnet
本来はリモートログインのためのコマンドですが、特定のポートへのTCP接続テストにもよく使われます。
基本構文:
bash
telnet <IPアドレスまたはホスト名> <ポート番号>
例: Webサーバーのポート80に接続テスト
bash
$ telnet example.com 80
- 接続に成功した場合:
Trying 93.184.216.34...
Connected to example.com.
Escape character is '^]'.
このようにConnected to ...
と表示されたら、指定したIPアドレスの指定したポートが開き、接続を受け入れていることを意味します。接続が確立されたので、何かHTTPリクエスト(例:GET / HTTP/1.1
を入力してEnterを2回押す)を送ってみることもできます。終了するにはCtrl + ]
を押してからquit
と入力します。 - 接続に失敗した場合:
Trying 93.184.216.34...
telnet: connect to address 93.184.216.34: Connection refused
telnet: Unable to connect to remote host: Connection refused
または
Trying 93.184.216.34...
telnet: connect to address 93.184.216.34: Connection timed out
Connection refused
は、ターゲットホストはそのポートに到達できたが、どのプロセスもそのポートでリスニングしていなかった(または接続を積極的に拒否した)ことを示唆します。
Connection timed out
は、ターゲットホスト自体に到達できないか、途中のネットワーク機器(ルーターやファイアウォールなど)によって接続がブロックされていることを示唆します。
telnet
の注意点:
- TCP接続のテストにのみ使用できます。UDPポートのテストはできません。
- 多くのシステムでセキュリティ上の理由からデフォルトでインストールされなくなってきています。必要であれば
sudo dnf install telnet
でインストールします。
nc
(netcat)
nc
または netcat
は、TCP/UDP接続を扱うための多機能なツールです。ポートスキャンや接続テストにも使用できます。telnet
より柔軟性があります。
基本構文 (接続テスト):
bash
nc -zv <IPアドレスまたはホスト名> <ポート番号またはポート範囲>
-z
: スキャンモード(接続を確立せず、リスニングしているかのみをテスト)-v
: 詳細表示
例: Webサーバーのポート80と443に接続テスト
bash
$ nc -zv example.com 80 443
出力例:
example.com [93.184.216.34] 80 (http) open
example.com [93.184.216.34] 443 (https) open
ポート番号の範囲を指定することもできます。
bash
$ nc -zv example.com 78-82
example.com [93.184.216.34] 80 (http) open
nc: connect to example.com port 78 (tcp): Connection refused
nc: connect to example.com port 79 (tcp): Connection refused
nc: connect to example.com port 81 (tcp): Connection refused
nc: connect to example.com port 82 (tcp): Connection refused
この例では、ポート80のみが open
で、他のポートは Connection refused
となっています。
UDPポートのテスト:
UDPポートをテストするには -u
オプションを追加します。
bash
$ nc -zuv <IPアドレスまたはホスト名> <UDPポート番号>
UDPは接続テストが難しく、nc
の -z
オプションでは単にパケットを送信してエラーが返ってこないかを確認するだけなので、TCPほど確実な結果が得られない場合があります。
nc
コマンドの利点:
- TCP/UDP両方のテストが可能。
- ポート範囲指定が可能。
- 多機能であり、ポートテスト以外にも様々なネットワーク操作に使用できる。
nc
コマンド使用の注意点:
- システムによってはデフォルトでインストールされていない場合があります。必要であれば
sudo dnf install nmap-ncat
またはsudo dnf install netcat
などでインストールします(パッケージ名はディストリビューションによって異なることがあります)。
具体的な利用シナリオとコマンドの組み合わせ
これまでに紹介したコマンドを組み合わせて、実際のサーバー管理でよく遭遇する状況でのポート確認方法を見ていきましょう。
シナリオ1: Webサーバー (Apache/Nginx) が起動してポート80/443で待ち受けているか確認したい
-
サーバー内部で、サービスがポートをリスニングしているか確認:
- Webサーバー(Apacheなら
httpd
、Nginxならnginx
)が起動していれば、通常TCPポート80と443で待ち受けているはずです。ss
またはnetstat
を使います。
bash
$ ss -tuln | grep -E ':80|:443'
または
bash
$ sudo ss -tulnp | grep -E '(:80|:443)' # プロセス名も確認する場合 (要sudo)
grep -E ':80|:443'
は、出力行に:80
または:443
を含むものをフィルタリングしています。
出力例(リスニングしている場合):
tcp LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=1234,fd=6))
tcp LISTEN 0 511 0.0.0.0:443 0.0.0.0:* users:(("nginx",pid=1235,fd=6))
もし何も表示されない、あるいはStateがLISTEN以外であれば、Webサーバープロセスが起動していないか、別のポートで待ち受けている、または起動に失敗している可能性があります。systemctl status httpd
やsystemctl status nginx
でサービスの状態を確認してください。
- Webサーバー(Apacheなら
-
ファイアウォールでポート80/443が許可されているか確認 (firewalldの場合):
- Webサーバーが内部でリスニングしていても、ファイアウォールでブロックされていれば外部からはアクセスできません。
bash
$ sudo firewall-cmd --list-ports
$ sudo firewall-cmd --list-services
出力で80/tcp
,443/tcp
あるいはhttp
,https
が含まれているか確認します。含まれていない場合は、sudo firewall-cmd --add-port=80/tcp --permanent
のようにポートを追加し、sudo firewall-cmd --reload
で設定を再読み込みする必要があります(設定変更は慎重に行ってください)。
- Webサーバーが内部でリスニングしていても、ファイアウォールでブロックされていれば外部からはアクセスできません。
-
外部からポート80/443にアクセス可能かテスト (nmapまたはnc):
- 別のコンピュータから、またはサーバー自身から外部IPアドレスを使って、ポートが開いているか確認します。
bash
$ nmap <サーバーのグローバルIPアドレス> -p 80,443
または
bash
$ nc -zv <サーバーのグローバルIPアドレス> 80 443
結果がopen
と表示されれば、外部からポートに到達できることを意味します。filtered
やclosed
の場合は、ファイアウォールの設定やネットワーク経路に問題がある可能性があります。
- 別のコンピュータから、またはサーバー自身から外部IPアドレスを使って、ポートが開いているか確認します。
トラブルシューティングのヒント:
ss/netstat
でリスニングしていない -> Webサービスが起動していない/エラーになっている。サービスログを確認 (journalctl -u httpd
など)。ss/netstat
でリスニングしているが、firewall-cmd
で許可されていない -> ファイアウォールでブロックされている。firewall-cmd
でポートまたはサービスを許可する。ss/netstat
でリスニングしており、firewall-cmd
でも許可されているが、nmap/nc
でfiltered
やclosed
になる -> 別のファイアウォール(ルーター、クラウドセキュリティグループなど)やネットワーク経路の問題。
シナリオ2: SSHでサーバーに接続できない
デフォルトのSSHポートは22番です。
-
サーバー内部で、SSHサービスがポート22でリスニングしているか確認:
bash
$ ss -tuln | grep :22
または
bash
$ sudo ss -tulnp | grep :22 # プロセス名も確認する場合 (要sudo)
出力例(リスニングしている場合):
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=859,fd=3))
tcp LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=859,fd=4))
sshd
プロセスがリスニングしているか確認します。もし別のポートに変更している場合は、そのポート番号で確認してください。 -
ファイアウォールでポート22が許可されているか確認 (firewalldの場合):
bash
$ sudo firewall-cmd --list-ports
$ sudo firewall-cmd --list-services
出力に22/tcp
あるいはssh
が含まれているか確認します。 -
外部からポート22にアクセス可能かテスト (nmapまたはnc):
bash
$ nmap <サーバーのグローバルIPアドレス> -p 22
または
bash
$ nc -zv <サーバーのグローバルIPアドレス> 22
トラブルシューティングのヒント:
SSH接続はサーバー管理の基本中の基本なので、特に重要な確認です。上記の手順でどこに問題があるかを特定し、必要に応じて sshd
サービスを再起動したり、ファイアウォール設定を変更したりします。
シナリオ3: あるアプリケーションが使用しているポートを知りたい
例えば、自分でインストールしたアプリケーションがどのポートで動いているかを知りたい場合など。
- アプリケーションのプロセス名を特定:
ps aux | grep <アプリケーション名>
やtop
コマンドなどでプロセス名やPIDを確認します。 - プロセスが使用しているポートを確認:
ss -tulnp
またはnetstat -tulnp
にプロセス名やPIDを使ってgrep
フィルタリングをかけます。
bash
$ sudo ss -tulnp | grep <アプリケーション名またはPID>
例: Javaアプリケーションの場合、プロセス名の一部やjava
で検索します。
bash
$ sudo ss -tulnp | grep java
出力例:
tcp LISTEN 0 50 127.0.0.1:8080 0.0.0.0:* users:(("java",pid=5678,fd=123))
これで、Javaプロセスがポート8080でリスニングしていることがわかります。
シナリオ4: ポート競合が発生していないか確認したい
複数のサービスが同じポートでリスニングしようとすると、通常片方または両方のサービスが起動に失敗します。
- 特定のポートが誰に使われているか確認:
ss
またはnetstat
でそのポート番号を指定して確認します。
bash
$ sudo ss -tulnp | grep :8080
出力が複数行あった場合、複数のプロセスが同じポートでリスニングしようとしている可能性があります(ただし、設定によっては複数のプロセスが連携して同じポートを共有することもあります)。
もし、期待していないプロセスが表示された場合、そのプロセスがポートを占有している可能性があります。そのプロセスを停止するか、ポート設定を変更する必要があります。
ポートに関する注意点とセキュリティ
ポートの確認は、セキュリティの観点からも非常に重要です。
- 不要なポートは開けない: サービスを動かしていないポートは、ファイアウォールで閉じておくのが基本です。開いているポートは、攻撃者にとってサーバーへの入り口となり得ます。
firewall-cmd
やiptables
を使って、必要最低限のポートのみを許可するように設定しましょう。 - 既知の脆弱性を持つサービスに注意:
nmap -sV
などでサービスのバージョン情報を確認し、もし古いバージョンや既知の脆弱性があるバージョンを使っている場合は、アップデートを検討しましょう。 - 見慣れないポートのリスニング: 定期的に
ss -tuln
やnetstat -tuln
でポートの状態を確認し、見慣れないポートで何らかのサービスがリスニングしていないかチェックすることが重要です。マルウェアなどがバックドアとしてポートを開放する可能性があります。もし不明なポートが見つかったら、ss -tulnp
でプロセス名を特定し、そのプロセスが正規のものか調査してください。
まとめ:ポート確認スキルを使いこなそう!
この記事では、CentOS初心者の方を対象に、ポートの基本的な概念から、ss
, netstat
, nmap
, firewall-cmd
, telnet
, nc
といった様々なポート確認コマンドの使い方、主要オプション、出力の見方、そして実際の利用シナリオまでを詳しく解説しました。
これらのコマンドは、サーバーの状態把握、サービス稼働確認、そして最も重要なトラブルシューティングにおいて、あなたの強力な武器となります。
- サーバー内部でリスニングポートを確認するなら:
ss
(推奨) またはnetstat
- 特に
ss -tulnp
(またはsudo ss -tulnp
) は、どのプロセスがどのポートで待ち受けているかが一目でわかるため非常に便利です。
- 特に
- 外部から見たポートの状態やファイアウォール設定を確認するなら:
nmap
やnc -zv
- ファイアウォール自体の設定を確認するなら:
firewall-cmd
(CentOS 7以降) またはiptables
(レガシー)
最初はコマンドのオプションや出力に戸惑うかもしれませんが、実際にサーバーを操作しながら何度も実行し、出力結果を観察することで、徐々に慣れていきます。
ポート確認は、サーバー管理の第一歩です。このスキルを習得し、安全で安定したサーバー運用を目指しましょう。
もしさらに深く学びたい場合は、各コマンドの man
ページ(例: man ss
, man nmap
)を参照するか、特定のサービス(Apache, Nginx, MySQLなど)のドキュメントで、使用される標準ポートや設定方法について調べてみてください。
あなたのCentOSサーバー管理スキルが、この記事を通してさらに向上することを願っています!