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

FlClash Android:システム DNS が空で名前解決に失敗

Android のネットワークが一時的に DNS サーバーを報告しないと、旧版の FlClash ではドメイン名を解決できない場合があります。まず VPN を停止した状態での直接接続と DNS ログを比較し、v0.8.99 の修正を確認したうえで検証し、元に戻せる状態を保ちます。

  • FlClash
  • Android
  • システム DNS
  • 名前解決
  • v0.8.99
目次

スマートフォンにVPN接続中と表示されても、ドメイン名でページを開けない場合は、通常のネットワークが使えるか確認します。システムが一時的に名前解決サーバーを通知しない場合、サブスクリプション設定の誤り、ノードの切断では対処が異なります。同じネットワークと接続先でVPNの有効化前後の結果を記録し、バージョンの修正対象と他の原因を区別します。

接続中なのに、Android でドメイン名を解決できないのはなぜ?

AndroidでVPN接続後にページやノードのドメイン名を解決できない状況を記録し、同じドメインへの直接接続とFlClash内のリクエストを比較してログを確認します。スマートフォンのネットワーク、システムDNSの受け渡し、設定した上流サーバー、ノードの接続のいずれでも失敗は起こり得ます。空リストの条件に一致する場合に進めてください。

FlClash v0.8.99 は、Android のネットワークが一時的に DNS サーバーを通知しない場合の名前解決失敗を修正しています。旧版のログにある空の [DNS] updateDns や udp://: は手がかりになりますが、直接接続との比較も必要です。Android の通信障害すべてがこの原因とは限りません。

この修正は、Android のネットワークが一時的に DNS サーバーを報告せず、FlClash がその経路でドメインを解決できなくなる場合を対象にします。Windows、macOS、Linux の一般的な DNS 障害や、Android の設定ミス、ノード故障、プライベート DNS 障害にそのまま当てはめないでください。

VPN 無効時の直接接続との比較と、空の DNS の手掛かり

直接接続できるなら、元の Profile とノードで再び有効にし、FlClash 経由のドメイン名だけが解決に失敗するか確認します。旧版のログで [DNS] updateDns が空、または解決先が udp://: となっていれば、公式コミットの説明と照合できます。ただし、そのログがなくてもこの経路を除外はできません。

Android の LinkProperties.getDnsServers() は、現在のネットワークリンクから報告された DNS サーバーの一覧を返します。一時的に空になることが、この記事で確認する入力条件です。ユーザーが自ら dns.nameserver を空にしたという意味ではありません。

設定で手動入力するnameserverとnameserver-policyはプロキシの設定ですが、AndroidのプライベートDNSはシステム設定です。これらの項目だけを変更しても、システムが空のDNS一覧をクライアントに報告する問題を検証できるとは限りません。

再現に必要な最小限の比較を残す

  1. 設定と障害発生時の状態を記録する

    FlClash の完全な版、Android の版、回線の種類、現在の Profile とノード、最初の失敗時刻、接続・回線変更・復旧のどこで起きたかを記録します。ログと実際のドメイン通信結果を残し、記録前にノード変更、DNS 変更、キャッシュ削除を同時に行わないでください。

  2. VPN を停止して直接接続を試す

    同じ Wi-Fi またはモバイル回線で実在する HTTPS サイトにアクセスし、スマートフォンの通信とシステムの名前解決が正常か確認します。

  3. 元の設定で再テストする

    FlClash を有効にしたら、同じ Profile、ノード、対象サイトを維持し、ログの最初の DNS エラーと実際の接続結果を確認します。

  4. 空のDNS一覧による障害の条件に当てはまるか確認する

    直接接続は正常で、FlClash 経由のドメイン名だけ失敗し、バージョンと空の DNS に関する手がかりも一致する場合に限り、v0.8.99 の修正を確認します。

確認結果と次の対応

確認できた状態次の手順
FlClash VPN を停止しても、同じ回線でドメイン名を解決できない直接接続でも名前解決できない場合は、携帯の回線、ルーター、通信事業者の DNS を復旧します。FlClash の更新だけを解決策にしないでください。
直接接続は正常で、旧版 FlClash の DNS ログに空の updateDns または udp://: が出る今回の修正に該当する手がかりです。バックアップ後に公式 v0.8.99 を確認します。
特定のノードか一つのドメイン名だけ失敗し、他の通信は正常ノードのアドレス、上流 DNS、ルール、接続先サービスを確認します。システム全体の DNS 一覧が空だと推測しないでください。
Android のプライベート DNS が到達不能と表示される、または別の VPN が通信を引き受けているまずシステムのプライベート DNS と VPN の状態を確認し、設定を記録してから一度に一つの条件だけ変えて比較します。
空の DNS リストで通常のフォールバックが働かなくなる理由
修正前は、Android サービスから Go のコアに渡す空リストが空文字列になり、strings.Split で分割すると空のアドレスが一つ生成されていました。Mihomo はこれを udp://: というネームサーバーとして扱うため、システムのリゾルバーがサーバー設定済みと誤認し、既定のフォールバックを使えませんでした。v0.8.99 では、空リストをそのまま渡します。

公式 APK で v0.8.99 へ更新し、元の設定を残す

最初に FlClash のローカルバックアップ機能で現在の設定を保存し、バックアップファイルの場所を確認します。購読元と選択中の Profile も記録してください。購読トークン、ノードのパスワード、個人用アドレスがバックアップに含まれる場合があります。元のファイルを公開 issue やオンライン変換サイトへアップロードしないでください。

プロジェクトの README には arm64-v8a、armeabi-v7a、x86_64 のパッケージが載っています。他人の機種名からアーキテクチャを推測したり、未確認のミラーから取得したりしないでください。

更新前に FlClash VPN を停止し、通常のインターネット接続が使えることを確かめます。更新時はアプリデータと事前のバックアップを残し、データベースの消去やすべての Profile の削除は行わないでください。この修正のためだけに購読の DNS をむやみに変更したり、出所不明の公開サーバーを指定したりする必要もありません。

v0.8.99 のコード変更は、システムの DNS 一覧が空ならそのまま空として渡し、リゾルバーの通常のフォールバックを働かせるものです。すべての端末に特定の DNS アドレスを強制する変更ではありません。実際の原因が上流サーバーへの到達不能や設定ミスなら、更新とは別に調査が必要です。

クライアントのバージョンだけを変えて検証する

  1. アップグレード前の設定と結果を記録する

    ローカルバックアップと失敗時のログを保存し、同じ回線、Profile、ノード、対象サイトを記録します。設定変更の効果をバージョン更新の効果と取り違えないためです。

  2. 配布元とアーキテクチャを確認する

    chen08209/FlClash プロジェクトの正式な v0.8.99 Release を開き、端末の ABI に合う Android APK を選んで、端末の通常のアプリ更新手順でインストールします。

  3. FlClash VPNを再び有効にする

    Profile と設定が残っていることを確認し、FlClash VPN を再度有効にします。更新前と同じノードとサイトを使い続けてください。

  4. DNS と実際の通信結果を比較する

    ドメイン名のクエリログ、接続履歴、HTTPS ページが最後まで読み込まれるかを確認します。VPN アイコンやノードの遅延値だけで成功と判断しないでください。

通信が安定した状態と回線変更後の DNS を確認する

アプリに v0.8.99 と表示され、現在の Profile、ノード、回線種別が更新前の記録と一致することを確認します。まず安定した通常の回線で同じ実在する HTTPS サイトにアクセスし、FlClash の DNS クエリ、リクエスト、またはログ画面で、そのドメイン名の解決結果と送信先を照合してください。

その後、普段の利用でWi-Fiとモバイル通信が自然に切り替わったときや、切断後に再接続したときに、同じ対象を再確認します。公式コミットが対処しているのは、ネットワークが空のDNSサーバー一覧を報告する瞬間です。通常のネットワークで常にDNSサーバーがある場合、一度の成功で分かるのは現在の接続が使えることだけで、前述の空の一覧による障害が修正された証拠にはなりません。

更新後のログに今回の無効なサーバーを示す痕跡が出ず、ドメイン名の解決と実際の HTTPS リクエストがどちらも復旧したら、その端末での再テストは成功と記録できます。名前解決は成功するのにページだけ開かない場合は、ルール、ノード、接続履歴、接続先サービスを確認し、すべてのタイムアウトを空のシステム DNS の問題として扱わないでください。

検証チェックリスト

  • クライアントはプロジェクトの正式な v0.8.99 Release から取得し、Android APK のアーキテクチャは端末に適合している
  • 更新前のバックアップが残り、元の Profile、ノード、オーバーライド設定を照合できる
  • 同じ回線と対象について、VPN 停止時の直接接続と VPN 有効時の結果を記録した
  • FlClash でドメイン名を解決でき、実在する HTTPS ページが完全に読み込まれ、接続履歴に想定どおりの送信先が表示される
  • 普段の回線切り替えや再接続後に DNS と通信を再確認し、今回の空アドレスによる失敗がログに出ない

v0.8.99 でも失敗する場合、どう切り戻して証拠を報告する?

まず FlClash で VPN を停止し、Android が通常の通信に戻り、ドメイン名の解決と HTTPS リクエストができることを確認します。通常の通信も失敗するなら、クライアントの再インストールを繰り返さず、現在の Wi-Fi、モバイル回線、プライベート DNS の状態に応じてシステムの接続を直してください。

調査のために Profile、オーバーライド、その他の設定を変えた場合は、今回変更した項目だけを元に戻し、事前のバックアップで元の値を確認します。アプリのデータをすべて消したり、唯一のバックアップを上書きしたり、システム DNS を出所不明のサーバーへ強制的に向けたりしないでください。旧版に戻すと今回の不具合が再発する可能性があるため、バックアップを残したうえでの一時的な選択肢にとどめてください。

v0.8.99 でも [DNS] updateDns が空、または udp://: が出る場合は、プロジェクトの issue に Android と FlClash のバージョン、回線種別、VPN 停止時との比較、同じ Profile での最小再現手順、最初の関連ログを報告してください。

回線切り替え前後の結果も記録します。投稿前に購読トークン、ノードのパスワード、個人のドメイン名、端末識別子を伏せ、元のバックアップと完全なログは端末内に保管してください。

nameserver-policy: system に一致するドメイン名だけが失敗するなら、今回の空リストの不具合と直結させないでください。プロジェクトの過去の issue #1393 には v0.8.88 プレリリース版で似た udp://: ログが記録されていますが、設定上の発生条件とバージョンが異なります。現在の症状の証拠は別に整理してください。

参考資料