🐧 Linux 総合学習プラットフォーム
プロセス監視/障害対応 ・ 中級

ネットワーク疎通の切り分け

「つながらない」障害は、どの層で止まっているかを順に切り分けます。まず ping で相手まで届くかを確認し、応答がなければ経路や相手の死活を疑います。届くのに接続できないときは、相手側のサービスが目的のポートで待ち受けているかが問題です。ss -tlnp で自分のサーバが開いているポートとプロセスを確認し、ファイアウォールやサービスの起動状態を合わせて見ていくと、原因の層を絞り込めます。

「サーバにつながらない」「アプリから接続できない」――このネットワーク障害は、初学者にとって最大の難所だ。原因がどこにあるか分かりにくいからだ。

だが、見方を変えれば道は開ける。つながらない原因は「経路のどこか」「相手の死活」「相手のサービス」「ファイアウォール」など、いくつかの層に分かれている。

💡
ポイントつながらない原因は層に分かれている。下の層から一段ずつ確認すれば、必ずどこで止まっているかを切り分けられる。

下の層から順に1つずつ確認していけば、必ずどこで止まっているかを切り分けられる。

当てずっぽうに設定を変える前に、どの層まで到達できているかを観測で確かめる。この層ごとの切り分けが、ネットワーク障害対応の核心だ。

下の層から一段ずつ上がる1. 経路と死活ping2. サービス層(ポートで待ち受け?)ss -tlnp3. 待ち受けアドレス(127.0.0.1 か 0.0.0.0 か)ss -tlnp4. ファイアウォールfirewall-cmd

📡 第一段階:そもそも相手まで届いているか

最初に確認するのは、そもそも相手のホストまでパケットが届くかどうかだ。これを調べるのが ping だ。

ping 192.168.1.10 や ping example.com のように相手を指定すると、相手に小さなパケットを送って応答が返るかを繰り返し試す。

応答が返れば、少なくともネットワークの経路は通じており、相手のホストは生きている(死活が正常)と分かる。

ping -c 4 example.com ……-c で回数を指定。Linuxの ping は止めるまで送り続けるので、回数指定か Ctrl + c で終了する。

Linuxの ping は止めるまで送り続けるので、Ctrl + c で終了する。回数を決めたいときは ping -c 4 example.com のように -c で指定する。

終了時には、送ったパケット数・受け取った数・損失率(packet loss)と、往復にかかった時間(round-trip time)の統計が表示される。

損失率が0%で時間も安定していれば経路は健全、ときどき損失が出たり時間が大きくばらついたりするなら、経路のどこかが不安定だと読み取れる。

ping に応答がない場合、原因の候補は3つだ。「ネットワークの経路が切れている」「相手のホストが落ちている(死活異常)」「途中のルータやファイアウォールが ping を遮断している」のいずれかである。

ここで切り分けを進めるには、まず自分のサーバ自身のネットワーク設定(IPアドレスが正しく振られているか)を ip a で確認し、デフォルトゲートウェイなど近い相手には届くかを試して、どこから先で途切れるかを見る。

つまずきセキュリティ上 ping(ICMP) だけをブロックするサーバも多い。「ping が通らない=完全にダウン」とは限らず、次のポート確認で判断する。

なお、セキュリティ上の理由で ping(ICMP) だけを意図的にブロックしているサーバも多い。そのため「ping が通らない=完全にダウン」とは限らない点には注意する。その場合は次の段階のポート確認で判断する。

🚪 第二段階:相手は生きているのに、つながらない

ping は通る(相手は生きている)のに目的のサービスにつながらない――実際にはこれがもっとも多いパターンだ。

この場合、問題はネットワークそのものではなく、その上で動くサービスの層にある。確認すべきは「相手のサーバで、目的のサービスが、目的のポートで待ち受けているか」だ。

🔗
たとえポートは建物の部屋番号。住所(IP)まで荷物が届いても、その部屋(ポート)に誰もいなければ受け取ってもらえない。

ポートとは、1台のサーバ上で複数のサービスを区別するための番号だ。たとえばWebのHTTPは80番、HTTPSは443番、SSHは22番、といったように、サービスごとに使う番号が決まっている。

相手にパケットは届いていても、そのポートで誰も待ち受けていなければ、接続は拒否される。

🔌 第三段階:そのポートで、誰が待ち受けているか

サーバ側で「どのポートが、どのプロセスによって待ち受けられているか」を確認する定番が ss(socket statistics)だ。

ソケットとは、ネットワーク通信の出入り口を表す抽象的な仕組みだ。Linuxではこのソケットもファイルと同じように扱われ、プロセスはソケットをファイルディスクリプタ(開いているファイルやソケットに割り振られる管理番号)として保持する。

ss -tlnp ……-t TCP / -l 待ち受けのみ / -n 数字表示 / -p プロセス付き。目的のポートでサービスが上がっているか即座に分かる。

ss はそうしたソケットの状態を高速に一覧する。よく使う組み合わせが ss -tlnp で、それぞれ -t(TCP)、-l(LISTEN=待ち受け中のものだけ)、-n(ポートを名前に変換せず数字のまま速く表示)、-p(待ち受けているプロセス名とPIDも表示)を意味する。

これを実行すると、たとえば 0.0.0.0:80 で nginx が待ち受けている、といった行が並び、「目的のポートでサービスが上がっているか」を即座に確認できる。

ここでよくある原因が2つに切り分けられる。

0.0.0.0:80すべての宛先で待ち受け外部からも到達できるOK127.0.0.1:80ローカルだけで待ち受けサーバ上からは通るが外部からは届かない待ち受けアドレスの欄でどちらかを判別する

1つは、目的のポートが ss -tlnp の一覧に出てこないケース。これはサービス自体が起動していない(あるいは別のポートで上がっている)ことを意味し、journalctl -u サービス名 でそのサービスの起動失敗ログを確認する。

もう1つは、ローカル(127.0.0.1)でだけ待ち受けていて、外部からのアドレス(0.0.0.0 など)で待ち受けていないケース。この場合、サーバ上からはつながるのに外部からはつながらない、という症状になるので、サービスの待ち受けアドレス設定を見直す。

つまずき127.0.0.1 でだけ待ち受けていると、サーバ上からは通るのに外部からは届かない。待ち受けアドレスの欄で 127.0.0.1 か 0.0.0.0 かを必ず見る。

どちらなのかは、待ち受けアドレスの欄(127.0.0.1:80 なのか 0.0.0.0:80 なのか)で判別できる。

🧱 第四段階:最後に残る容疑者、ファイアウォール

サービスは正しいポートで待ち受けている(ss で確認できる)のに外部からつながらない場合、残る容疑者がファイアウォールだ。

サーバ自身のファイアウォール(firewalld や iptables、ufw など)が目的のポートへの通信を遮断していると、サービスは上がっていても外から到達できない。

firewall-cmd --list-all ……RHEL系で現在許可されているポートやサービスを確認。目的のポートが無ければ、それが原因。

RHEL系なら firewall-cmd --list-all で現在許可されているポートやサービスを確認でき、目的のポートが許可されていなければ、それが原因だ。

コツクラウドではサーバ自身のファイアウォールに加え、クラウド側のセキュリティグループ(仮想ファイアウォール)も開ける必要がある。両方確認する。

クラウド環境では、サーバ自身のファイアウォールに加えて、クラウド側のセキュリティグループ(仮想ファイアウォール)でもポートを開ける必要があるため、両方を確認する。

🪜 4つの段階を一段ずつ上がる

ネットワーク障害は、必ず下の層から順に切り分ける。

まず ping で相手まで届くか(経路と死活)を見る。届くなら ss -tlnp で目的のポートが待ち受けているか(サービスの起動と待ち受けアドレス)を見る。待ち受けているのに外からつながらなければファイアウォール(firewall-cmd やセキュリティグループ)を確認する。

この階段を1段ずつ上がることで、漠然と「つながらない」だった問題が、「経路の問題」「サービスが落ちている」「待ち受けアドレスの設定ミス」「ポートが塞がれている」のどれなのかへと、明確に切り分けられる。

どの層まで到達できたかを毎回はっきりさせるのが、遠回りしないコツだ。

この項目に出てくる用語

ポートぽーと
通信の宛先を区別する番号。サービスは特定ポートで待ち受ける。
ファイルディスクリプタふぁいるでぃすくりぷた
プロセスが開いているファイルやソケットを指す番号。上限がある。

関連コマンド

sslsof

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