接続トラブルシューティング · Clash 技術ブログ

OpenClash で Telegram がプロキシを経由しない場合の修正方法

OpenClash では Web ページを正常に開けるのに Telegram へ接続できず、ダッシュボードにも記録がない場合は、空の「送信元トラフィックアクセス制御」を確認します。その項目を削除してサービスを再起動し、接続記録と WAN の送信経路から検証してください。

  • OpenClash
  • Telegram
  • 送信元トラフィックのアクセス制御
  • nftables
  • 通信の迂回
目次

Web ページはプロキシを使えるのにチャットアプリが接続できない場合、ドメインルール不足とは限りません。ダッシュボードに接続がなければ、ノードを変える前にプロキシに通信が届いているか確認します。空のアクセス制御項目によって通信がプロキシの処理を迂回する場合があるため、設定と実行中のルールの両方が一致する場合にだけ、その空の項目に対処します。

ページはプロキシを使うのにTelegramは直接接続する

同じ端末とネットワークを保ち、Telegram が接続を再試行する際の Dashboard とルーターの WAN(外部ネットワーク)の記録を確認します。Web 通信は OpenClash を通るのに Telegram の記録がなく直接外へ出る場合、後述の空のアクセス制御を調べます。アプリが接続できないだけでは原因を特定できません。

公式 issue #5283 には、ImmortalWrt 25.12.1、fw4/nftables 環境でのこの現象が記録されています。報告では、空の lan_ac_traffic 項目から RETURN(途中で戻る)ルールが生成され、大半の TCP と UDP が Mihomo に入る前に戻っていました。

Dashboard に Telegram が表示され、ルール、ポリシーグループ、送信ノードも示される場合、通信はすでにカーネルへ入っています。この場合はノード、ルール、UDP、DNS の確認へ移り、送信元アクセス制御を削除し続けないでください。

接続記録から通信が止まる場所を確認する

観察結果可能性が高い段階次の手順
Web ページは正常、Telegram の記録はなく、WAN へ直接送信される透過プロキシへ入る前に RETURN している空の送信元トラフィックアクセス制御を確認する
Telegram の記録はあるが DIRECT に一致するルールの選択対象の接続に一致したルールとポリシーグループを確認する
Telegram の記録があり、ノードでエラーが出るプロキシからの送信ノードを固定してから、プロトコル、UDP、ネットワークを確認する
すべてのアプリに記録がないOpenClash による引き継ぎが機能していない動作状態、モード、ファイアウォールの読み込みを確認する

設定を保存し、ルーターの管理経路を残す

今回調査するのは空の項目一つだけです。サブスクリプションの更新、カーネルの切り替え、DNS の変更、ルールの書き換えを同時に行わないでください。一度に変更するのは一項目だけにすることで、再起動前後の Dashboard と WAN の経路から結果を判断できます。

復旧に必要な設定と管理画面へのアクセスを確保する

  1. 現在の設定をエクスポートする

    OpenClash の設定と現在の構成をエクスポートしてルーター以外の場所に保存し、動作モード、プラグインとコアのバージョンを記録します。有効なアクセス制御を誤って削除しても復元できるようにするためです。遠隔作業では、別の LAN 管理経路を確保してください。

  2. 空の項目がある画面をスクリーンショットに保存する

    項目名、有効状態、プロトコル、アドレスファミリー、アクション、すべての一致条件を記録します。

  3. ローカルの管理経路を確認する

    LAN 内からルーターの管理画面を開きます。リモート経路しかない場合は、ファイアウォールと OpenClash を直接再起動しないでください。

  4. テスト端末を固定する

    まず、元の問題を再現していた一台の端末だけで Telegram をテストし、ほかの端末の設定は変更しません。

空の送信元トラフィックアクセス制御項目を確認する

OpenClash の送信元トラフィックのアクセス制御画面を開きます。有効なままで、動作が戻る、またはプロキシを使わない設定なのに、送信元アドレス、宛先アドレス、ポート、インターフェースなどの一致条件がない項目を探してください。以降のルール確認は、この空の項目を対象にします。

項目が特定の端末、ネットワーク範囲、ポートを明示的に指定している場合は、実際の直接接続要件を担っている可能性があります。名前が同じという理由だけで削除しないでください。条件と想定用途を記録してから、残すべきかを判断します。

現在の lan_ac_traffic 設定を読み取り専用で一覧表示する
uci show openclash | grep lan_ac_traffic
公式 issue にある空の項目の形式(比較用)
openclash.@lan_ac_traffic[0]=lan_ac_traffic
openclash.@lan_ac_traffic[0].enabled='1'
openclash.@lan_ac_traffic[0].proto='both'
openclash.@lan_ac_traffic[0].family='both'
openclash.@lan_ac_traffic[0].target='return'

空の項目と判断する条件

  • section の種類が lan_ac_traffic で、現在の enabled が 1 である
  • アクションが return で、プロトコルとアドレスファミリーが TCP、UDP、IPv4、IPv6 を対象にする場合がある
  • 送信元 IP、接続先 IP、ポート、インターフェース、その他の実際の一致条件がない
  • 特定の端末向けに残した明示的な直接接続ポリシーではない

ほぼすべての通信に適用される RETURN ルールを確認する

設定に空の項目があっても、実際にランタイムルールが生成されたことを確認する必要があります。公式報告のルールは 0 から 65535 までの送信元ポートへ一致し、Fake-IP のアドレス範囲を除外していました。redirect または TPROXY より前にあるため、接続が早い段階で返されます。

以下の nft コマンドはルーターの端末で実行し、fw4 の OpenClash チェーンを変更せずに確認します。lan_ac_traffic のコメントがあり、ほぼすべての TCP または UDP に適用される RETURN を探してください。handle は実行中のルールの番号で、再生成のたびに変わり得るため、issue の 803、805 をそのまま使って削除しないでください。

OpenClash 関連の nftables チェーンを読み取り専用で確認する
nft -a list chain inet fw4 openclash
nft -a list chain inet fw4 openclash_mangle

ほぼ全通信を対象とする lan_ac_traffic RETURN がある

出力を保存し、画面へ戻って対応する空の項目を削除します。一時的な handle へ直接依存しないでください。

明示的な送信元または接続先の条件を持つ RETURN だけがある

空の項目から生成された全通信向けルールではないため、そのポリシーの実際の用途を先に確認します。

lan_ac_traffic ルールがない

この記事の操作を中止し、OpenClash による引き継ぎ、ルールの一致、ノード、DNS を確認します。

端末に nft コマンドがない、またはチェーン名が異なる

チェーン名を推測してルールを削除しないでください。バージョンとファイアウォールの情報を保存し、該当するファームウェアのドキュメントに沿って確認します。

空の送信元トラフィックアクセス制御による迂回経路
  1. Telegram が接続を開始する端末のリクエストは本来 OpenClash の透過プロキシへ入る
  2. 空の lan_ac_traffic 項目送信元、接続先、ポート、インターフェースの条件がない
  3. ほぼすべての通信を対象にする RETURN ルールredirect または TPROXY より前に返される
  4. WAN へ直接送信される通信が Mihomo を迂回し、Dashboard に記録されない

空の項目を削除して OpenClash を再起動した後、新しいファイアウォールルールには、この範囲が広すぎる RETURN が含まれないはずです。Telegram の接続が Mihomo に入り、Dashboard に表示されることを確認してください。

空の項目を削除し、OpenClash を再起動する

画面から一時的に削除できない場合は、該当する section の無効化でも復旧できることを報告者が確認しています。以下のインデックスが使えるのは、uci show で空の項目が第 0 項目と明確に表示された端末だけです。インデックスが異なる場合は、実際の値へ変更する必要があります。

最小限の範囲で対処する

  1. 項目が空であることをもう一度確認する

    送信元、接続先、ポート、インターフェースの条件が一つもなく、業務上も直接接続に使う必要がないことを確認します。

  2. LuCI からの削除を優先する

    その空の項目を削除して保存・適用し、ほかのアクセス制御や振り分け項目は変更しません。

  3. OpenClash を再起動する

    設定検証、カーネル、ファイアウォールルールがすべて再読み込みされるまで待ちます。Dashboard を更新するだけでは不十分です。

  4. nftables をもう一度読み取る

    以前の全通信向け lan_ac_traffic RETURN が消えたことを確認してから、Telegram のテストを開始します。

空の項目が第 0 項目であると確認できた場合だけ使用し、インデックスが異なる場合はコピーしない
uci set openclash.@lan_ac_traffic[0].enabled='0'
uci commit openclash
/etc/init.d/openclash restart

Telegram が Mihomo へ入るようになったことを検証する

同じテスト端末で Telegram をもう一度開き、同時に OpenClash Dashboard を確認します。接続が一覧へ表示され始め、一致したルール、ポリシーグループ、実際に使われた送信経路が示される必要があります。アプリが復旧したことだけでは、直接接続でなくなったとは証明できません。

さらに WAN の経路と通常の Web ページを確認します。目標は、Telegram が迂回しなくなり、以前の Web ページも引き続き利用でき、ほかの端末に必要な明示的な直接接続ポリシーを誤って削除していない状態です。再起動直後だけ復旧する場合は、設定同期によって空の項目が再び書き込まれていないか確認してください。

修正の完了基準

  • 再起動後、無条件の lan_ac_traffic RETURN が表示されなくなる
  • Telegram のデスクトップ版またはモバイル版で実際の接続を一度完了できる
  • Dashboard に該当する接続、ルール、ポリシーグループ、送信経路が表示される
  • WAN 側で、この通信が Mihomo を迂回して直接送信されたと表示されなくなる
  • 通常の Web ページ、DNS、ほかの端末が予定どおりに動作し続ける

検証に失敗した場合の確認先

失敗時の症状説明対処する方向
Telegram が引き続き Dashboard に記録されない通信の引き継ぎ前に、まだ迂回しているほかの RETURN、端末のアクセス制御、透過プロキシの入口を確認する
記録は表示されるが、接続に失敗する通信の引き継ぎは復旧済みノード、ルール、UDP、接続先ネットワークを確認する
再起動すると項目が再び表示される設定の生成元が引き続き書き込んでいるバックアップの復元、同期スクリプト、画面に残った設定を確認する
ほかの端末で以前の直接接続が機能しなくなる有効なポリシーを削除しているバックアップを復元し、明示的な条件を持つ項目を作り直す

空の項目がない場合や、有効なルールを誤って削除した場合はどう対処する?

削除後に以前の直接接続端末へ影響した場合は、設定のバックアップを直ちに復元して OpenClash を再起動し、直接接続が必要な送信元、接続先、ポートを明示的な条件として記述します。説明可能な複数のアクセス制御を、無条件の return 項目一つで置き換えないでください。

空の項目や全通信に適用される RETURN がない場合、または Telegram がすでに Dashboard に表示されている場合は、空の項目による途中の戻りは原因から除外できます。その後は接続記録をもとに、ルール、ノード、UDP、DNS、アプリ自身の通信を調べ、nftables の変更は続けないでください。

公開時点でこの issue は未解決のままで、修正を含む安定版も公式記録では確認できません。空の設定を削除する方法はメンテナーの提案です。特定のバージョンへの更新で自動的に直ると断定してはいけません。

ロールバック後に再確認する

  • ルーターの LAN 管理経路と通常のネットワークが復旧している
  • 有効な送信元アクセス制御が、明示的な条件を持つ形で再構築されている
  • OpenClash の再起動後、設定検証とファイアウォールの読み込みに成功している
  • Dashboard とログの証拠に基づいて、次の調査方向を決める

参考資料