SSD Nodes Learn Hosting plans →
ガイド Matt Connor著者 Matt Connor ・更新日 2026-08-26

Linuxのポートとlistenをssで確認する方法

ポートが通信をサービスへ振り分ける仕組みを解説します。ssで待ち受け中のサービスを確認し、ローカルポートと公開ポートの違いも理解できます。

ポートとは何か

ポートは、1 台のサーバーで複数のサービスを同時に実行し、それぞれのネットワークトラフィックが混ざらないようにする番号です。VPS には 1 つの IP アドレスしかなくても、Web サーバー、SSH サーバー、データベースを同時に実行できます。パケットが到着すると、オペレーティングシステムは、それがどのサービス宛てなのかを判断する必要があります。その判断に使うのがポート番号です。Web トラフィックはポート 443、SSH はポート 22 を使用します。IP アドレスはパケットをサーバーまで届け、ポート番号はそのサーバー上の適切なプログラムへ届けます。

ポートは 16 ビットの番号です。16 ビットでは 0 から 65535 までを表せますが、0 は予約されているため、実際に使用するポートは 1 から 65535 までです。1024 未満のポートは「well-known」ポートと呼ばれ、開くには root が必要です。そのため、標準的なサービスはこの範囲を使用します。SSH は 22、HTTP は 80、HTTPS は 443、DNS は 53 です。1024 より大きいポートは、通常のプログラムが自由に使用できます。

ポートには TCP と UDP の 2 種類があり、一方のプロトコルで使用するポート番号は、もう一方のプロトコルで同じ番号を使用する場合とは別扱いです。TCP は接続指向のプロトコルで、SSH、HTTP、データベースなど、ほとんどのサービスが使用します。UDP はコネクションレスで、DNS や一部の VPN などに使用されます。ファイアウォールでポートを開くときは、通常、どちらのプロトコルを許可するかも指定します。たとえば 22/tcp】【。

「listen」はプログラムがポートで接続を待ち受けることを意味します

接続を受け付けるプログラムは、カーネルにポートを「listen」するよう要求します。その時点で、そのポートはマシン上で開かれ、ファイアウォールの制限範囲内で、そこに到達した接続にプログラムが応答します。待ち受けているプログラムがないポートは、接続を拒否します。そのため、セキュリティ確認で最初に確認するのは、何がどこで待ち受けているかです。

これを確認するコマンドは ss です。

sudo ss -tlnp

各フラグは、TCP(t)、待ち受けソケットのみ(l)、ポート番号の数値表示(n。そのため ssh ではなく 22 と表示されます)、および所有プロセス(p)を指定します。一般的な結果は次のとおりです。

State   Recv-Q  Local Address:Port   Process
LISTEN  0       0.0.0.0:22           sshd
LISTEN  0       127.0.0.1:5432       postgres
LISTEN  0       [::]:80              nginx

Process 列には各ポートを所有するプログラムが表示されます。これにより、意図せず起動したままにしていたプログラムを特定できます。

Local Address 列が重要です

各ポートの前に表示されるアドレスを注意して確認してください。どのホストからサービスへ接続できるかが決まるためです。頻繁に出てくるケースは 3 つあります。

0.0.0.0:22 は、このマシンが持つすべての IPv4 アドレスで待ち受けることを意味します。パブリックアドレスも含まれます。ファイアウォールで許可されていれば、IPv4 経由でインターネットからサービスへ接続できます。

[::]:80 は IPv6 について同じ意味を持ちます。パブリックアドレスも含め、すべての IPv6 アドレスで待ち受けます。多くのプログラムはデフォルトでこのアドレスに bind し、Linux では :: ソケットが IPv4 も受け付けることがあります。

127.0.0.1:5432 はループバックのみで待ち受けることを意味します。127.0.0.1 はマシンが自分自身と通信するために使用するアドレスで、他の場所からルーティングできません。ここに bind されたサービスへ接続できるのは同じサーバー上からだけです。ファイアウォールの設定に関係なく、インターネットからは接続できません。上に示した Postgres の行は、この構成により安全です。

実際の原則は明確です。自分のアプリケーションだけが使用するデータベース、キャッシュ、管理パネルは、0.0.0.0 ではなく 127.0.0.1 に bind してください。パブリックアドレスで待ち受けなければ、攻撃者が接続できる入口はありません。

リッスンしていることと到達可能であることは同じではない

混乱を大きく減らすために、もう1つ区別しておきます。マシン上でポートが開いている状態、つまりプログラムがリッスンしている状態と、そのポートに外部から到達できる状態、つまりファイアウォールが通信を許可している状態は異なります。リモートクライアントが接続するには、両方を満たす必要があります。クライアント側から見ると、これら2つの失敗は異なる形で現れます。接続が拒否される場合は何もリッスンしていません。一方、接続がハングしてからタイムアウトする場合は、通常、ファイアウォールがパケットを破棄しています。これは、2つの SSH エラーが示している内容そのものです。

つまり、制御する層は2つあります。各サービスの bind address を設定して、何をリッスンさせるかを決めます。ファイアウォールで、外部から何に到達できるかを決めます。適切に運用されたサーバーでは、両方を使用します。サービスは必要な場所でのみ bind し、ファイアウォールは明示的に許可していない通信をすべて拒否します。ss でリッスン中の内容を確認することが第1段階です。ファイアウォールが許可する内容を決めることが第2段階であり、UFW を使ったファイアウォール入門で説明します。

ここには、見落とすと問題になる微妙な点があります。IPv4 と IPv6 は別々に扱われます。IPv4 だけを対象とするファイアウォールでは、[::] services が IPv6 で公開されたままになります。この具体的な落とし穴については、IPv6 ファイアウォールの落とし穴で説明しています。

FAQ

Linux サーバーで開いているポートを確認するにはどうすればよいですか?

TCP には sudo ss -tlnp、UDP には sudo ss -ulnp を実行します。すべての待ち受けソケット、ポート、バインド先のローカルアドレス、そのソケットを所有するプロセスが一覧表示されます。Local Address 列を確認してください。0.0.0.0 または [::] はサービスがネットワークに公開されていることを示し、127.0.0.1 はそのマシン上でのみ待ち受けていることを示します。

0.0.0.0 と 127.0.0.1 の違いは何ですか?

0.0.0.0 は「すべての IPv4 アドレスで待ち受ける」という意味です。パブリックアドレスも含まれるため、サービスはネットワークから到達可能になります。127.0.0.1 は loopback です。マシンが自身と通信するためのアドレスで、外部からルーティングできません。そのため、これにバインドしたサービスにはローカルからのみアクセスできます。内部サービスは 127.0.0.1 にバインドし、外部に公開されないようにしてください。

サービスを動作させるには、ファイアウォールでポートを開く必要がありますか?

他のマシンからアクセスする必要があるサービスだけに必要です。127.0.0.1 にバインドしたサービスには、外部から到達できないため、ファイアウォールルールは必要ありません。0.0.0.0 または [::] で待ち受けるサービスには、トラフィックを許可するファイアウォールルールが必要です。ルールを追加するまでは、デフォルトで拒否する設定にしてください。

TCP ポートと UDP ポートの違いは何ですか?

TCP は接続指向で、SSH、Web サーバー、データベースなど、ほとんどのサービスで使用されます。UDP はコネクションレスで、DNS や一部の VPN で使用されます。TCP と UDP では、同じ番号でも別のポートです。そのため、53/tcp53/udp は異なります。ファイアウォールルールを記述するときは、22/tcp のようにプロトコルを指定します。