🐧 Linux 総合学習プラットフォーム
サーバ構築 ・ 中級

ポートと待ち受け状態の確認

サービスが正しく起動しても、想定したポートで待ち受けていなければ通信できません。ss コマンドで「いまどのポートが開いて待ち受けているか」を一覧できます。-l で待ち受け中(LISTEN)のソケット、-t でTCP、-n で名前解決せず番号表示、-p でどのプロセスかを確認します。Webサーバなら 80番、SSHなら 22番が LISTEN になっているのが正常です。

サービスを起動し、ファイアウォールも開けたのに通信できない——そんなとき次に確かめるべきは「サービスが本当に、想定したポートで待ち受けているか」です。ここで鍵になるのがポートという概念です。1台のサーバには多数のサービスが同居できますが、ネットワークから届いた通信を、どのサービスが受け取るのかを区別するために、通信の窓口ごとに番号が割り当てられています。これがポート番号です。たとえばWebサーバ(HTTP)は80番、HTTPSは443番、SSHは22番、といった具合に、サービスごとに使うポートが決まっています。サービスが起動すると、自分の担当ポートを開いて接続を待つ状態になります。この「接続を待っている状態」をLISTEN(待ち受け)と呼びます。

ポート番号の決まりごと

ポート番号は0番から65535番まであり、用途によって大きく3つの帯に分かれています。0番から1023番は「ウェルノウンポート」と呼ばれ、HTTPの80番・HTTPSの443番・SSHの22番・DNSの53番のように、主要なサービスにあらかじめ割り当てられています。この帯のポートで待ち受けるには管理者権限が必要で、一般ユーザの権限ではサービスを起動できません。1024番以降はアプリケーションが比較的自由に使える帯で、たとえば開発中のWebアプリを8080番で動かす、といった使い方をします。サーバを構築するときは「このサービスは何番を使うのか」を意識し、その番号で正しく待ち受けているか、そしてその番号がファイアウォールで開いているかを、セットで確認していくことになります。

ss コマンドで待ち受けを一覧する

いまサーバ上でどのポートが開いて待ち受けているかを調べるのが ss コマンドです。よく使うのは、いくつかのオプションを組み合わせた ss -ltnp という形です。それぞれの意味は次のとおりです。-l は待ち受け中(LISTEN)のソケットだけに絞る指定、-t はTCPのソケットを対象にする指定、-n はポートやアドレスを名前に変換せず番号のまま表示する指定、-p はそのポートをどのプロセスが使っているかを表示する指定です。-p はプロセス情報を見るため管理者権限が要ることが多く、一般ユーザでは sudo ss -ltnp のように sudo を付けます。実行すると、Local Address:Port の列に 0.0.0.0:80 や *:22 のような形で待ち受けポートが並び、Process の列に nginx や sshd といったプロセス名が表示されます。UDPで待ち受けるサービス(DNSなど)も調べたいときは、-t の代わりに -u を使った ss -lunp とします。

出力の読み方

出力で注目するのは、まず State 列が LISTEN になっている行です。これが「いま接続を待っている」ポートです。Local Address:Port の見方も重要で、0.0.0.0:80 や *:80 はすべてのネットワークインターフェースで80番を待ち受けていることを意味し、外部からも接続を受け付けられる状態です。一方 127.0.0.1:80 のように表示されている場合は、ループバック(自分自身)だけで待ち受けており、ほかの端末からは接続できません。Webサーバが localhost からは見えるのに外から見えないとき、ファイアウォールだけでなく、この「待ち受けアドレスがローカルホストに限定されている」可能性も疑う必要があります。IPv6 では :::80 のようにコロンが連なった表記になりますが、考え方は同じです。Process 列を見れば、その80番を本当に意図したWebサーバが握っているのか、別のプロセスが横取りしていないかも分かります。意図しないプロセスがポートを握っていれば、それを止めてから本来のサービスを起動し直す、という対処につながります。

正常な状態の見極め

正しく構築できていれば、Webサーバを起動したサーバでは80番(HTTPSも設定していれば443番)が、SSHを有効にしたサーバでは22番が、それぞれ LISTEN で並んでいるのが正常な姿です。逆に、起動したはずのサービスのポートが ss の一覧に出てこなければ、そのサービスは実際には起動に失敗しているか、別のポートで待ち受けているか、設定で待ち受けが無効になっている、と判断できます。特定のポートだけを手早く見たいときは ss -ltnp | grep :80 のように grep で絞り込むのが実務での常套手段です。すべてのソケットを状態込みで見たいときは ss -a、TCPの確立済み接続まで含めて眺めたいときは ss -t のように、目的に応じてオプションを足し引きします。なお、ss はかつて広く使われた netstat の後継にあたるコマンドで、現在のRHEL系では ss を使うのが標準です。netstat に慣れた人は netstat -ltnp と ss -ltnp がほぼ同じ意味になる、と読み替えると移行しやすいでしょう。

よくある失敗と実務の使いどころ

切り分けの場面でありがちな失敗は、サービスの起動・ファイアウォール・待ち受け状態の3つを混同し、当たりをつけずに手当たり次第に設定をいじってしまうことです。ss はこの切り分けを一段はっきりさせてくれます。「ポートが LISTEN に出ているか」を見れば、問題がサービス側(そもそも起動・待ち受けできていない)なのか、ネットワーク側(待ち受けてはいるが外から届かない=ファイアウォール等)なのかを、明確に分けられるからです。実務での定番の手順は、まず systemctl status でサービスが動いているかを確かめ、次に ss -ltnp で狙ったポートが待ち受けているかを確認し、サーバ自身から curl http://localhost で応答が返るかを見て、それでも外部から繋がらなければファイアウォールを疑う、という順に内側から外側へたどることです。「サービス→ポート→自分からの応答→ファイアウォール」と層を分けて確認する習慣が、原因切り分けの最短経路になります。

この項目に出てくる用語

ポートぽーと
通信の窓口を表す番号。サービスごとに使い分ける。
サービス(デーモン)さーびす
背後で常時動き続け、要求に応えるプログラム。

関連コマンド

sssystemctlcurl

▶ 学習アプリでこの続きを学ぶ・演習する