Linuxのポートが開いているか確認する方法|ss・nc・curlで接続障害を切り分ける

LinuxサーバーにSSH接続できない、Webサイトが表示されない、Dockerで公開したサービスにつながらない。

このようなトラブルでは、「ポートが開いているか」を確認すると原因を絞り込みやすくなります。

ただし、ポートが開いている=外部から必ず接続できるという意味ではありません。サーバー上でサービスが待ち受けているか、ファイアウォールが通信を許可しているか、外部から実際に到達できるかを分けて確認することが重要です。

Linuxでポートを確認するときの基本

まず覚えておきたいのは、次の3段階です。

  1. サーバー上でサービスがポートを待ち受けているか
  2. ファイアウォールが通信を遮断していないか
  3. 外部の端末から実際に接続できるか

例えばWebサイトなら、一般的にHTTPは80番、HTTPSは443番を使用します。

SSHなら通常は22番ですが、セキュリティ対策として別のポート番号に変更している場合もあります。

そのため、「80番が開いているか」だけを見るのではなく、そのポートで何のサービスが動いているのかまで確認する必要があります。

まずはssコマンドで待ち受けポートを確認する

Linuxサーバーでポートを確認するときに便利なのがssコマンドです。

sudo ss -lntp

表示例:

LISTEN 0 511 0.0.0.0:80    0.0.0.0:*    users:(("nginx",pid=1234,fd=6))
LISTEN 0 128 0.0.0.0:22    0.0.0.0:*    users:(("sshd",pid=987,fd=3))

ここで重要なのがLISTENです。

LISTENになっているポートは、サーバー上で何らかのサービスが接続を待ち受けています。

例えば、

0.0.0.0:80

なら、IPv4のすべてのインターフェースで80番ポートを待ち受けている状態です。

一方、

127.0.0.1:80

となっている場合は注意が必要です。

これは基本的にサーバー自身からの接続だけを受け付ける状態なので、外部端末から直接アクセスできないことがあります。

IPv6も確認する

IPv4だけでなくIPv6の待ち受け状態も確認したい場合は、次のコマンドが便利です。

sudo ss -lntp

出力に

[::]:80

のような表示があれば、IPv6側でも80番ポートを待ち受けている可能性があります。

DNSにAAAAレコードを設定しているのにIPv6側でサービスが待ち受けていない、といった構成では接続トラブルにつながることがあります。

特定のポートだけ確認する

例えば80番ポートだけ確認したい場合は、

sudo ss -lntp | grep ':80'

443番なら、

sudo ss -lntp | grep ':443'

SSHの22番なら、

sudo ss -lntp | grep ':22'

と確認できます。

何も表示されない場合、そのポートでサービスが待ち受けていない可能性があります。

例えばNginxを起動したつもりなのに80番ポートが表示されないなら、Nginxが停止している、設定エラーで起動できていない、別のポートを使用しているなどの原因が考えられます。

「ポートが開いている」と「外部から接続できる」は別

ここは初心者が特に混同しやすいポイントです。

例えば、

LISTEN 0 511 0.0.0.0:80

と表示されていても、外部から80番ポートに接続できるとは限りません。

サーバーのファイアウォールやVPS・クラウド側のセキュリティ設定によって通信が遮断されている可能性があるためです。

つまり、

サービス → ポート → ファイアウォール → ネットワーク → 外部端末

という順番で考えると、原因を整理しやすくなります。

UFWでポートが許可されているか確認する

UbuntuなどでUFWを利用している場合は、

sudo ufw status

で現在のルールを確認できます。

例えば、

22/tcp    ALLOW
80/tcp    ALLOW
443/tcp   ALLOW

のようになっていれば、これらの通信を許可するルールが設定されています。

ただし、UFWの状態だけで外部接続の成否を判断することはできません。

サービスが実際に待ち受けているか、VPSやクラウド側にも別のファイアウォール設定がないかなども確認する必要があります。

また、SSHで接続中にUFWの設定を変更すると、自分自身をサーバーから締め出してしまうことがあります。

設定変更前には、現在接続しているSSHポートが許可されているかを必ず確認してください。

ncで外部からポートに接続できるか確認する

サーバー上で待ち受けていることを確認したら、次は別の端末から実際に接続できるかを調べます。

nc(netcat)が利用できる環境なら、

nc -zv example.com 80

のように確認できます。

特定のIPアドレスなら、

nc -zv 192.0.2.1 80

とします。

接続できれば、指定したホストのポートまで通信が到達している可能性が高くなります。

反対に接続できない場合は、サービス、ファイアウォール、ネットワーク設定などをさらに確認します。

なお、ncの表示だけで原因を断定するのではなく、サーバー側のssやファイアウォール設定と合わせて判断することが大切です。

curlでWebサーバーを確認する

Webサイトの場合は、curlも便利です。

HTTPなら、

curl -I http://example.com

HTTPSなら、

curl -I https://example.com

とします。

HTTPステータスが返ってくれば、少なくともWebサーバーまで通信できている可能性があります。

例えば、

HTTP/1.1 200 OK

なら正常なレスポンスの一例です。

一方、

502 Bad Gateway

や

504 Gateway Timeout

などが返る場合、ポート自体には到達していても、Nginxとバックエンドアプリケーションの間に問題がある可能性があります。

つまり、ポートが開いていることと、Webサイトが正常に動作していることは同じではありません。

Dockerの場合はポートマッピングも確認する

Dockerコンテナを利用している場合は、コンテナ内部のポートとホスト側のポートを混同しないように注意します。

まず、

docker ps

を実行します。

例えば、

0.0.0.0:8080->80/tcp

と表示された場合、ホスト側の8080番ポートへの通信がコンテナの80番ポートへ転送される構成です。

この場合、

サーバー:8080
    ↓
Dockerコンテナ:80

という関係になります。

そのため、ホスト側で80番ポートを確認しても、実際に公開しているのが8080番なら期待した結果になりません。

Dockerでは、

docker ps
docker port コンテナ名

などを使って、公開ポートを確認すると切り分けやすくなります。

「Connection refused」と「Timeout」の違い

ポート接続のトラブルでは、エラーメッセージも重要な手がかりになります。

Connection refused

Connection refused

の場合、接続先のサーバーには到達したものの、そのポートで接続を受け付けているサービスが存在しない、または拒否されている可能性があります。

まず、

sudo ss -lntp

で待ち受け状態を確認します。

Nginx、SSH、Dockerなど対象サービスが起動しているかも確認してください。

Connection timed out

Connection timed out

の場合は、通信が途中で遮断されている可能性があります。

ファイアウォール、VPSのセキュリティグループ、ネットワーク、接続先IPの間違いなどを確認します。

もちろん、エラーだけで原因を一つに決めることはできません。

サーバー内部の状態と外部からの接続結果を組み合わせて判断するのが基本です。

ポート接続できないときの確認順

原因を効率よく探すなら、次の順番がおすすめです。

1.対象サービスが起動しているか確認

例えばNginxなら、

sudo systemctl status nginx

SSHなら、

sudo systemctl status ssh

を確認します。

2.ポートを待ち受けているか確認

sudo ss -lntp

対象ポートがLISTENになっているか確認します。

3.待ち受けアドレスを確認

127.0.0.1:8080

なのか、

0.0.0.0:8080

なのかによって、外部からの接続可否が変わることがあります。

4.ファイアウォールを確認

sudo ufw status

などで通信を許可しているか確認します。

5.Dockerなどのポート設定を確認

docker ps

でホスト側にポートが公開されているか確認します。

6.外部端末から接続テスト

ncやcurlなどを利用して、実際に外部から到達できるか確認します。

7.VPS・クラウド側の設定を確認

サーバー内部の設定が問題なくても、VPSやクラウド側のファイアウォール、セキュリティグループなどで通信が遮断されていることがあります。

ポートをむやみに開放しない

「接続できないから、とりあえずポートを全部開ける」という対応は避けましょう。

必要のないポートをインターネットへ公開すると、攻撃対象になる可能性があります。

例えばWebサーバーならHTTP・HTTPS、SSHなら管理に必要なSSHポートなど、必要な通信だけを許可することが基本です。

また、SSHのポートを変更している場合は、変更後のポートをファイアウォールでも許可しておく必要があります。

ポート確認でよくある間違い

80番ポートがLISTENしているのにWebサイトが表示されない

この場合、ポートだけが原因とは限りません。

DNS、Nginxの設定、バックエンドアプリケーション、HTTPS設定などを確認する必要があります。

UFWで許可したのに接続できない

UFW以外にもVPSやクラウド側のファイアウォールが設定されている場合があります。

また、そもそもサービスがポートを待ち受けていない可能性もあります。

Dockerの80番ポートを確認したのに何も表示されない

Dockerでは、

8080:80

のようにホスト側とコンテナ側でポート番号が異なることがあります。

docker psで実際のポートマッピングを確認してください。

ポート確認は「開いているか」だけで判断しない

Linuxのポートトラブルでは、「このポートは開いていますか?」という確認だけでは十分ではありません。

重要なのは、

  • サービスが起動しているか
  • ポートを待ち受けているか
  • どのIPアドレスで待ち受けているか
  • ファイアウォールが許可しているか
  • Dockerなどで正しく転送されているか
  • 外部から実際に到達できるか

を順番に確認することです。

例えばWebサイトなら、

DNS
 ↓
サーバーIP
 ↓
80/443番ポート
 ↓
Nginx
 ↓
アプリケーション

という流れで切り分けると、問題の場所を見つけやすくなります。

ポートが原因だと思って設定を変更する前に、まずssで現在の状態を確認することから始めてみてください。

Linuxで開いているポートを確認するコマンドは?

代表的なのはssです。

sudo ss -lntp

で、TCPの待ち受けポートと、それを使用しているプロセスを確認できます。

ポートがLISTENなら外部から接続できますか?

必ずしも接続できるとは限りません。

サーバーのファイアウォールやVPS・クラウド側のネットワーク設定によって、外部からの通信が遮断されている場合があります。

80番と443番ポートは何に使いますか?

一般的に80番はHTTP、443番はHTTPSに使用されます。

ただし、サーバーの構成によって別のポートを使用することもあります。

Dockerのポートはどう確認しますか?

まず、

docker ps

を実行します。

0.0.0.0:8080->80/tcpのような表示があれば、ホストの8080番ポートからコンテナの80番ポートへ通信を転送している構成です。

類似投稿