CentOS初心者向け ポート確認コマンド入門


CentOS初心者向け:ポート確認コマンド入門徹底解説

はじめに:なぜポートの確認が必要なのか?

CentOSをはじめとするLinuxサーバーを運用する上で、「ポート」という概念は避けて通れません。しかし、「ポートって何?」「なぜ確認する必要があるの?」と感じる初心者の方も多いのではないでしょうか。

この長い記事では、CentOS初心者の方でも理解できるよう、ポートの基礎から始まり、サーバーの状態を確認するために必須となる様々なポート確認コマンドについて、それぞれの使い方、主要オプション、出力の見方、そして具体的な活用例を、豊富な例を交えて徹底的に解説します。

この記事を読むことで、あなたは以下のことができるようになります。

  • ポートとは何か、なぜ重要なのかを理解できる。
  • サーバーがどのようなサービスを公開(リスニング)しているかを確認できる。
  • 外部から特定のポートにアクセス可能か(ファイアウォールの設定も含む)を確認できる。
  • ネットワークの問題やサービスの起動状態に関するトラブルシューティングの第一歩を踏み出せる。
  • CentOSで広く使われているポート確認コマンド(ss, netstat, nmap, firewall-cmdなど)を使いこなせるようになる。

さあ、ポートとコマンドの世界へ一緒に飛び込みましょう!

ポートとは何か? 比喩で理解する

ポートを理解するために、よく使われる比喩は「建物のドアや窓」です。

インターネット上のサーバーは、一つの大きな建物のようなものです。この建物には様々なサービス(Webサイト、メール、SSH接続など)が提供されています。これらのサービスを利用するために、外部から建物に入り込む必要がありますが、一つの入り口だけでは混乱しますし、どのサービスを利用したいのか分かりません。

そこで、建物にはたくさんのドアや窓が設けられています。これらの「ドアや窓」が「ポート」です。

  • 建物: サーバー
  • 部屋: サーバー上で動いている個々のサービス(Webサーバー、SSHサーバー、データベースなど)
  • ドアや窓: ポート

それぞれのサービスは、特定のポート番号に割り当てられています。例えば、Webサイトを見るためのHTTPサービスは通常ポート番号80、安全な接続のためのHTTPSサービスはポート番号443、サーバーにリモートで安全に接続するためのSSHサービスはポート番号22を使います。

外部のコンピュータ(クライアント)は、サーバーのIPアドレス(建物の住所)と、利用したいサービスのポート番号(ドアや窓の番号)を指定することで、目的のサービスにアクセスします。

サーバー側から見ると、「このポート番号のドアを開けて、外部からの接続を待っていますよ」という状態を「ポートをリスニング(listening)している」と言います。サービスが起動していて、外部からの接続を受け入れる準備ができている状態です。

なぜポート確認が必要なの?

ポートの状態を確認することは、以下のような状況で非常に重要になります。

  1. サービスの稼働確認: Webサーバー(Apache/Nginx)がちゃんと動いて、ポート80や443で接続を待っているか? SSHサーバーがポート22で待機しているか?
  2. トラブルシューティング: サーバーに接続できない、特定のサービスが利用できない。これは、サービスが起動していないのか、別のサービスが同じポートを使っているのか、あるいはファイアウォールでポートが閉じられているのか?
  3. セキュリティ確認: 不必要に開いているポートはないか? 見慣れないポートで何かのサービスがリスニングしていないか? (マルウェアなどが勝手に通信ポートを開くこともあります)
  4. ファイアウォールの設定確認: 設定したファイアウォールルール(ポートを開ける/閉じる)が正しく反映されているか?

このように、ポートの確認はサーバーの状態を把握し、問題を解決するために欠かせないスキルなのです。

ポートの基礎知識

コマンドを学ぶ前に、ポートに関するいくつかの基本的な概念を理解しておきましょう。

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つのカテゴリに分けられます。

  1. ウェルノウンポート (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) など。
  2. 登録済みポート (Registered Ports): 1024~49151
    • IANA (Internet Assigned Numbers Authority) に申請することで、特定のアプリケーションやサービスに割り当てられるポート番号です。
    • root権限がなくてもこれらのポートでサービスをリスニングできます。
    • 例: 1521(Oracle), 3306(MySQL), 5432(PostgreSQL), 8080(HTTP Alternate) など。
  3. 動的ポート / プライベートポート (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 コマンド (ポートスキャン)

これまでに紹介した ssnetstat は、ローカルサーバー自身のポートの状態(どのポートでリスニングしているかなど)を確認するためのコマンドでした。

一方、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 が使われている場合もあります。

これらのコマンドは、「サーバー上でどのポートがリスニングしているか」ではなく、「サーバーのファイアウォール設定として、どのポートへの外部からのアクセスが許可されているか」を確認するものです。

ssnetstat でリスニングしているポートが確認できても、ファイアウォールでそのポートが閉じられていると、外部からは接続できません。逆に、ファイアウォールでポートが開いていても、そのポートで待ち受けているサービスがなければ、やはり外部からの接続はできません。

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

これは、sshhttphttps といったサービス(それぞれ標準のポート番号に対応)が許可されていることを示します。

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 のルールは複雑になることが多いため、初心者の方はまず ssnetstat でリスニングポートを確認し、次に 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で待ち受けているか確認したい

  1. サーバー内部で、サービスがポートをリスニングしているか確認:

    • 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 httpdsystemctl status nginx でサービスの状態を確認してください。
  2. ファイアウォールでポート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 で設定を再読み込みする必要があります(設定変更は慎重に行ってください)。
  3. 外部からポート80/443にアクセス可能かテスト (nmapまたはnc):

    • 別のコンピュータから、またはサーバー自身から外部IPアドレスを使って、ポートが開いているか確認します。
      bash
      $ nmap <サーバーのグローバルIPアドレス> -p 80,443

      または
      bash
      $ nc -zv <サーバーのグローバルIPアドレス> 80 443

      結果が open と表示されれば、外部からポートに到達できることを意味します。filteredclosed の場合は、ファイアウォールの設定やネットワーク経路に問題がある可能性があります。

トラブルシューティングのヒント:

  • ss/netstat でリスニングしていない -> Webサービスが起動していない/エラーになっている。サービスログを確認 (journalctl -u httpd など)。
  • ss/netstat でリスニングしているが、firewall-cmd で許可されていない -> ファイアウォールでブロックされている。firewall-cmd でポートまたはサービスを許可する。
  • ss/netstat でリスニングしており、firewall-cmd でも許可されているが、nmap/ncfilteredclosed になる -> 別のファイアウォール(ルーター、クラウドセキュリティグループなど)やネットワーク経路の問題。

シナリオ2: SSHでサーバーに接続できない

デフォルトのSSHポートは22番です。

  1. サーバー内部で、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 プロセスがリスニングしているか確認します。もし別のポートに変更している場合は、そのポート番号で確認してください。

  2. ファイアウォールでポート22が許可されているか確認 (firewalldの場合):
    bash
    $ sudo firewall-cmd --list-ports
    $ sudo firewall-cmd --list-services

    出力に 22/tcp あるいは ssh が含まれているか確認します。

  3. 外部からポート22にアクセス可能かテスト (nmapまたはnc):
    bash
    $ nmap <サーバーのグローバルIPアドレス> -p 22

    または
    bash
    $ nc -zv <サーバーのグローバルIPアドレス> 22

トラブルシューティングのヒント:

SSH接続はサーバー管理の基本中の基本なので、特に重要な確認です。上記の手順でどこに問題があるかを特定し、必要に応じて sshd サービスを再起動したり、ファイアウォール設定を変更したりします。

シナリオ3: あるアプリケーションが使用しているポートを知りたい

例えば、自分でインストールしたアプリケーションがどのポートで動いているかを知りたい場合など。

  1. アプリケーションのプロセス名を特定: ps aux | grep <アプリケーション名>top コマンドなどでプロセス名やPIDを確認します。
  2. プロセスが使用しているポートを確認: 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: ポート競合が発生していないか確認したい

複数のサービスが同じポートでリスニングしようとすると、通常片方または両方のサービスが起動に失敗します。

  1. 特定のポートが誰に使われているか確認: ss または netstat でそのポート番号を指定して確認します。
    bash
    $ sudo ss -tulnp | grep :8080

    出力が複数行あった場合、複数のプロセスが同じポートでリスニングしようとしている可能性があります(ただし、設定によっては複数のプロセスが連携して同じポートを共有することもあります)。
    もし、期待していないプロセスが表示された場合、そのプロセスがポートを占有している可能性があります。そのプロセスを停止するか、ポート設定を変更する必要があります。

ポートに関する注意点とセキュリティ

ポートの確認は、セキュリティの観点からも非常に重要です。

  • 不要なポートは開けない: サービスを動かしていないポートは、ファイアウォールで閉じておくのが基本です。開いているポートは、攻撃者にとってサーバーへの入り口となり得ます。firewall-cmdiptables を使って、必要最低限のポートのみを許可するように設定しましょう。
  • 既知の脆弱性を持つサービスに注意: nmap -sV などでサービスのバージョン情報を確認し、もし古いバージョンや既知の脆弱性があるバージョンを使っている場合は、アップデートを検討しましょう。
  • 見慣れないポートのリスニング: 定期的に ss -tulnnetstat -tuln でポートの状態を確認し、見慣れないポートで何らかのサービスがリスニングしていないかチェックすることが重要です。マルウェアなどがバックドアとしてポートを開放する可能性があります。もし不明なポートが見つかったら、ss -tulnp でプロセス名を特定し、そのプロセスが正規のものか調査してください。

まとめ:ポート確認スキルを使いこなそう!

この記事では、CentOS初心者の方を対象に、ポートの基本的な概念から、ss, netstat, nmap, firewall-cmd, telnet, nc といった様々なポート確認コマンドの使い方、主要オプション、出力の見方、そして実際の利用シナリオまでを詳しく解説しました。

これらのコマンドは、サーバーの状態把握、サービス稼働確認、そして最も重要なトラブルシューティングにおいて、あなたの強力な武器となります。

  • サーバー内部でリスニングポートを確認するなら: ss (推奨) または netstat
    • 特に ss -tulnp (または sudo ss -tulnp) は、どのプロセスがどのポートで待ち受けているかが一目でわかるため非常に便利です。
  • 外部から見たポートの状態やファイアウォール設定を確認するなら: nmapnc -zv
  • ファイアウォール自体の設定を確認するなら: firewall-cmd (CentOS 7以降) または iptables (レガシー)

最初はコマンドのオプションや出力に戸惑うかもしれませんが、実際にサーバーを操作しながら何度も実行し、出力結果を観察することで、徐々に慣れていきます。

ポート確認は、サーバー管理の第一歩です。このスキルを習得し、安全で安定したサーバー運用を目指しましょう。

もしさらに深く学びたい場合は、各コマンドの man ページ(例: man ss, man nmap)を参照するか、特定のサービス(Apache, Nginx, MySQLなど)のドキュメントで、使用される標準ポートや設定方法について調べてみてください。

あなたのCentOSサーバー管理スキルが、この記事を通してさらに向上することを願っています!


コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール