Linuxサーバーで以下のような状況に遭遇したことはないでしょうか。
- ss や netstat では LISTEN している
- firewalld / iptables も許可済み
- それでも接続できない・タイムアウトする
この状態は、
「ポートが開いている=通信できる」ではない
ことが原因です。
本記事では、
- なぜ LISTEN でも接続できないのか
- どこで通信が止まっているのか
- 実務での切り分け手順
を、Linux運用目線で体系的に解説します。
目次
前提:LISTEN は「入口がある」だけ
以下の出力を見て安心してしまいがちです。
ss -lntp
LISTEN とは、
接続要求を受け取れる状態
であって、
- 処理できる
- 応答を返せる
ことを保証するものではありません。
原因1:アプリケーションが受け取れていない
よくあるのが、
- accept() 前で詰まっている
- ワーカースレッド枯渇
この場合、
- ポートは LISTEN
- 接続はタイムアウト
という現象が起きます。
確認方法
ss -antp | grep ポート番号
SYN-RECV が大量に溜まっている場合、 アプリ側が処理できていません。
原因2:バックログ(listen queue)が溢れている
Linuxでは、 接続要求は一度キューに積まれます。
このキューが溢れると、
- LISTENしている
- でも接続できない
状態になります。
確認ポイント
ss -lnt
Send-Q / Recv-Q が上限近くの場合、 バックログ不足を疑います。
原因3:ファイアウォールはOKだが途中で落とされている
firewalld や iptables を通っても、
- クラウドFW
- ロードバランサ
- セキュリティグループ
で遮断されているケースは非常に多いです。
確認方法
tcpdump -nn port ポート番号
SYN が来ていなければ、 Linux以前で落とされています。
原因4:バインドアドレスの問題
以下のようなケースです。
- 127.0.0.1 のみで LISTEN
- IPv6 のみで待ち受け
確認
ss -lntp
0.0.0.0 / :: で待ち受けているかを確認します。
原因5:SELinux による通信拒否
SELinux は、
- ポートは開いている
- でも接続は拒否
という挙動をします。
確認
getenforce
Enforcing の場合、 audit.log を必ず確認してください。
原因6:アプリが内部で固まっている
以下のような状態です。
- I/O待ち
- 外部API待ち
- DBロック待ち
この場合、
- ポートは開く
- レスポンスは返らない
という症状になります。
切り分けの基本フロー
- ss で LISTEN と接続状態を見る
- tcpdump で SYN が来ているか確認
- アプリの処理詰まりを疑う
- SELinux / クラウドFW を確認
まとめ
- LISTEN は「入口がある」だけ
- 接続不可はほぼ待ち・詰まり
- ネットワークだけでなくアプリ側も見る
「ポートは開いているのに繋がらない」時、
問題はポートの外ではなく中にあります。
あわせて読みたい


ssとnetstatの使い分け完全整理
Linuxで通信トラブルを調査する際、必ず登場するのが ss と netstat です。 しかし現場では、 どちらを使うべきか分からない 出力の違いが理解できていない 古い手順が…
