Linuxサーバーで以下のような状況に直面したことはないでしょうか。
- ss では ESTABLISHED と表示されている
- 接続自体は確立している
- しかし通信が返ってこない/処理が進まない
この状態は、
「ネットワークは繋がっているが、通信が成立していない」
という、非常に切り分けが難しいトラブルです。
本記事では、
- ESTABLISHED の正しい意味
- 通信できない代表的な原因
- どこを確認すれば解決と判断できるのか
を、実務トラブルシューティングの視点で解説します。
目次
前提:ESTABLISHEDは「通信できている」ではない
まず誤解されやすいポイントです。
ESTABLISHED とは、
TCPの3ウェイハンドシェイクが完了した状態
を示しているだけです。
つまり、
- データが送れている
- レスポンスが返っている
ことは一切保証されません。
原因1:アプリケーションが詰まっている
最も多い原因です。
以下のような状態では、
- TCP接続は確立
- アプリが処理できず無応答
となります。
- スレッド枯渇
- 外部API待ち
- DBロック待ち
確認方法
ss -antp | grep ESTAB
接続数が増え続けている場合、 アプリ側で詰まりが起きています。
解決の判断基準:
接続数が減少し、レスポンスが返るようになる
原因2:送信・受信バッファが詰まっている
送受信バッファが詰まると、
- ESTABLISHED のまま
- 通信が進まない
状態になります。
確認ポイント
ss -ti
Send-Q / Recv-Q が増え続けている場合、 データが滞留しています。
解決の判断基準:
Send-Q / Recv-Q が減少し、滞留が解消される
原因3:相手側が応答していない
ESTABLISHED は
一方向だけ成立している
可能性もあります。
相手側で、
- アプリ停止
- 高負荷
- FW遮断
が起きていると、 接続は維持されても応答はありません。
確認方法
tcpdump -nn host 相手IP
ACK が返ってこない場合、 相手側に問題があります。
原因4:MTU不一致・フラグメント問題
MTU不一致があると、
- 小さい通信は通る
- 大きい通信で止まる
という現象が起きます。
その結果、 ESTABLISHED のまま通信が進みません。
確認
ping -M do -s 1472 相手IP
解決の判断基準:
フラグメントなしで疎通できる
原因5:SELinuxによる通信制限
SELinuxは、
- 接続は許可
- 処理は拒否
という挙動を取ることがあります。
確認
getenforce
Enforcing の場合は、 audit.log を確認します。
原因6:カーネルリソース枯渇
以下の枯渇でも、 通信は止まります。
- ファイルディスクリプタ不足
- ephemeral port 枯渇
確認
ss -s
接続数が異常に多い場合、 リソース不足を疑います。
切り分けの実務フロー
- ss で ESTABLISHED 数とキューを見る
- tcpdump で双方向通信を確認
- アプリ側ログ・処理状況を確認
- MTU / SELinux / リソース枯渇を疑う
まとめ
- ESTABLISHED=通信成功ではない
- 多くはアプリ or 待ち状態が原因
- キューと応答の有無を見ることが重要
ESTABLISHED なのに通信できない場合、
「ネットワークは問題ない」と切り捨てないことが解決への近道です。
あわせて読みたい


Linuxでポートは開いているのに接続できない理由
Linuxサーバーで以下のような状況に遭遇したことはないでしょうか。 ss や netstat では LISTEN している firewalld / iptables も許可済み それでも接続できない・タイ…
あわせて読みたい


MTU不一致で起きるパケットロスの見抜き方(Linux編)
通信はできている。 しかし、特定の通信だけ失敗する、レスポンスが極端に遅い。 このような症状の原因として非常に多いのが MTU(Maximum Transmission Unit)の不一致…
