[障害対応の振り返り] プロキシの多重ネストで混乱:ノードマシンに怪しいリクエストが連発、本機のほぼ全ノードが接続不能に

今回は本当に奇妙で、ほぼ一晩まるごと無駄にして、最後になってようやく「問題はノード自体ではなく、ローカルのプロキシが“ネストしていた”」のだと分かりました。

現象は最初からかなり変でした:

  • ノード機のオーナーに「いったい何が起きてるの?」と聞かれ、バックエンド側に連続した奇妙なリクエストがずっと来ていると言われた。
  • こちらのローカル環境からは、ほとんどどのノードにも接続できない。
  • さらに不可解なのは、ローカルのプロキシ設定をどう変えても、ノード機側ではその連続リクエストが継続して見え続けていたこと。

最初はいろいろ疑いました。例えば:

  • ノード自体が死んでいる
  • サブスクリプション内容がおかしい
  • ルールの書き間違い
  • DNS やシステムプロキシの切り替えが中途半端
  • 何かのプログラムが裏で狂ったようにリトライしている

ところが最終的に切り分けてみると、核心はプロキシのループバック / ネストプロキシでした。

もう少し具体的に言うと、その時ローカルで動いていたのは mihomo が1つではなく、2つ同時に走っていました:

  • 1つは、現在 Sparkle が正常に起動している mihomo
  • もう1つは、古い残骸として残っていた孤児プロセス

その結果、トラフィックの経路が「短絡」したみたいにローカルでぐるぐる回る、非常に不可解な状態になっていました:

  • ローカル設定を変えても、実際にトラフィックを握っているのが「自分が思っている core」とは限らない
  • 一部のリクエストが重複転送・重複ヒットし、ノード機側からは連続する奇妙なリクエストに見える
  • その一方でローカル側は、大量のノードが利用不可に見え、ほぼ全部つながらないように振る舞う

後になってようやく腑に落ちました。これは単純に「ノードが壊れた」話ではなく、ローカルプロキシがローカルプロキシをかぶせてしまった / 残留 core が1層乗った状態だったのです。

古い残留プロセスを消してから Sparkle を開き直すと、システム内は次の構成に戻りました:

  • Sparkle のメインプロセスが1つ
  • それが起動した mihomo の子プロセスが1つ

これで正常になりました。

今回の教訓はかなり直接的です:

  1. 「ノード側に奇妙な連続リクエスト + ローカルからほぼ全ノードが通らない」を見たとき、遠端だけを疑わない。
  2. まずローカルでプロキシ core がいくつ動いているか確認する。特に mihomo のようなものに残留孤児プロセスがないか。
  3. ネストやループが起きると、症状はものすごくオカルトっぽく見えるが、実態はローカルのトラフィック経路が崩壊しているだけ。

もし今後また似た状況に遭遇したら、最初の反応としてまずこれを確認すべきだと思います:

  • 動いている mihomo はいくつあるか
  • 誰が親プロセスで、誰が孤児プロセスか
  • どのインスタンスが本当に 7890/7891/7892 をリッスンしているか
  • システムプロキシがまた自分自身を指していないか

理不尽だけど、いい勉強になりました。