Featured image of post 私の家庭ネットワークのドメイン名解決ソリューション

私の家庭ネットワークのドメイン名解決ソリューション

快適にインターネットを利用するには、まずDNSの問題を解決する必要があります。

中国にいると、DNSを使う際に2つの問題に直面します。一つはDNS汚染、もう一つはDNSリークです。快適にインターネットを利用するには、まずDNSの問題を解決する必要があります。

DNSリークとは何か

もし今、代理を使ってこの記事を読んでいるなら、まずこのサイトを開いて、自分のDNSリクエストが国内のDNSサーバーに送信されていないか確認してください。

典型的なDNSリーク

簡単に言うと、VPNなどの代理ツールを使用しているとき、自分のリクエストがVPNプロバイダー以外の第三者に見られないと思いますが、ホストのDNSリクエストがオペレーターのDNSサーバーや公共DNSサーバー(アリババ、テンセントなど)に送信されて解決され、あなたの実際のIPアドレスとリクエストしたドメイン名が記録されます。もしDNSリクエストが電報、ウィキリークスなどの敏感なサイトのドメイン名を解決すると、監視者に注意され、警告を受けたり、尋問されたりする可能性があります。1

したがって、DNSリークを防ぐために代理ツールの分流戦略を正しく設定することが非常に重要です。

SmartDNSの設定

DNSリークを防ぐ

DNSはインターネットの道案内役として、最も重要な要件は速さです。この要件を満たすために、家庭ネットワークのDNSサーバーとしてSmartDNSをローカルに導入するのは非常に適しています。SmartDNSの役割と設定のコツ、CDNを最適化してネットワークアクセス速度を向上させる方法については、Sukkaの「私の特別なDNS設定と使用のコツ」で詳しく説明されています。この記事を読む前に、まずその記事を読むことをお勧めします。ここではその内容を繰り返さず、Luciインターフェースでこれらの設定を実現する方法に焦点を当てます。

もしあなたが私と同じようにOpenWRTを使用している場合、SmartDNSのLuci Appは起動するたびにパネルに保存された設定に基づいて新しい設定ファイルを自動生成します。したがって、/etc/smartdnsディレクトリ内の既存の設定ファイルを直接変更せず、すべての変更はLuci App内で行うべきです。

基本的に、SmartDNSの上流は多ければ多いほど良いです。多くの上流はSmartDNSの性能に影響を与えません2し、冗長性を高めることができます。DNSリークを防ぐために、上流を設定する際は、デフォルトグループに外国のDNS上流(もちろん、暗号化されたDNSが望ましい)を追加し、国内のサーバーをdomesticのような独立したグループに分類し、-exclude-default-groupの追加パラメータを付けてデフォルトグループから除外します。

国内上流のグループ設定 参考にできる上流

国内ドメイン名解決の加速

外国の上流を設定すると、DNSリークの問題は解決しますが、デフォルトグループから国内上流を除外したため、新しいドメインにアクセスする際に外国の上流からの結果を待つ必要があり、国内サイトのアクセス速度が遅くなり、CDNが劣化します。

dnsmasq-china-listはFelix Yanのプロジェクトで、現在SmartDNS形式の設定ファイルをMakefileを通じて生成することをサポートしています。すでに誰かがGitHub Actionを使って毎日自動更新しており、直接ダウンロードするだけで利用できます。これらの設定ファイルは、国内DNS上流グループ名がdomesticのときにのみ有効です。

1
2
3
4
5
cd /etc/smartdns
wget https://gcore.jsdelivr.net/gh/Olixn/china_list_for_smartdns@main/accelerated-domains.china.domain.smartdns.conf
wget https://gcore.jsdelivr.net/gh/Olixn/china_list_for_smartdns@main/apple.china.domain.smartdns.conf
wget https://gcore.jsdelivr.net/gh/Olixn/china_list_for_smartdns@main/chinalist.domain.smartdns.conf
wget https://gcore.jsdelivr.net/gh/Olixn/china_list_for_smartdns@main/google.china.domain.smartdns.conf

その後、SmartDNSでこれらの設定ファイルをインポートし、「カスタム設定」欄の末尾に以下の内容を貼り付けます。

1
2
3
4
conf-file /etc/smartdns/accelerated-domains.china.domain.smartdns.conf
conf-file /etc/smartdns/apple.china.domain.smartdns.conf
conf-file /etc/smartdns/chinalist.domain.smartdns.conf
conf-file /etc/smartdns/google.china.domain.smartdns.conf

設定ファイルのインポート

このように設定すると、国内ドメインのアクセス速度は影響を受けず、国外ドメインにアクセスする際もDNSリークの問題は発生しません。

代理なしでのDNSリーク防止

広告ブロック

DNSレベルでの広告ブロックの効果は限定的で、誤ブロックを防ぐことに重点を置くべきです。悪名高い3「中国語圏で最も命中率の高い広告フィルタリスト」を謳うAnti ADは使用せず、他のルールを使用します。個人的に使用しているルールは217heidai/adblockfiltersで、整理された統合ルールです。直接取得して使用できます。

1
wget -O /etc/smartdns/adblock.conf https://gcore.jsdelivr.net/gh/217heidai/adblockfilters@main/rules/adblocksmartdns.conf

最後に設定ファイルをインポートします:

1
conf-file /etc/smartdns/adblock.conf

ルールの自動更新

以下のCrontabを設定することで、毎日午前3時にすべてのルールを自動更新できます。

1
2
3
4
5
0 0 3 * * ?  wget -O /etc/smartdns/adblock.conf https://gcore.jsdelivr.net/gh/217heidai/adblockfilters@main/rules/adblocksmartdns.conf
0 0 3 * * ? wget -O /etc/smartdns/accelerated-domains.china.domain.smartdns.conf https://gcore.jsdelivr.net/gh/Olixn/china_list_for_smartdns@main/accelerated-domains.china.domain.smartdns.conf
0 0 3 * * ? wget -O /etc/smartdns/apple.china.domain.smartdns.conf https://gcore.jsdelivr.net/gh/Olixn/china_list_for_smartdns@main/apple.china.domain.smartdns.conf
0 0 3 * * ? wget -O /etc/smartdns/chinalist.domain.smartdns.conf https://gcore.jsdelivr.net/gh/Olixn/china_list_for_smartdns@main/chinalist.domain.smartdns.conf
0 0 3 * * ? wget -O /etc/smartdns/google.china.domain.smartdns.conf https://gcore.jsdelivr.net/gh/Olixn/china_list_for_smartdns@main/google.china.domain.smartdns.conf

バイパスルーターは使えますか

IPv6を使用しない限り、OpenWRTルーターをメインルーターとして使用する方が良いです。バイパスルーターとして使用する場合、特定のシステム(Windowsのことです)はバイパスルーターがブロードキャストするIPv4 DNSに従わず、オペレーターの光モデムがブロードキャストするIPv6 DNSを使用して解決しようとします。関連するレジストリキーを変更しようとしましたが、効果はありませんでした。仕方なく、オペレーターに来てもらい、光モデムをブリッジモードに変更し、OpenWRTをメインルーターとして使用しました。

Clashルールの上書き

この時点でClashを起動してDNSリークテストを実行すると、おそらく中国のDNSサーバーにDNSリクエストが送信されているのが見えるでしょう。ほとんどのプロバイダーのデフォルト設定は、テンセントやアリババなどの国内大手の暗号化DNSを使用しています。オペレーターのDNSに明示的にリークして詐欺防止センターから電話がかかってくることはないにしても、気になります(強迫症が発動します)。さらに、関連する設定が全くない場合もあります。

幸い、Clash Verge Revを使用している場合は、プロバイダーの設定を容易に上書きできます。ここで私の上書き設定を共有します。これを全体的な拡張設定に貼り付けるだけで、プロバイダーの設定を上書きできます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
dns:
  enable: true
  ipv6: false
  prefer-h3: true
  use-system-hosts: true
  nameserver:
    - "https://dns.cloudflare.com/dns-query"
    - "https://dns.sb/dns-query"
    - "https://dns.google/dns-query"
    - "https://public.dns.iij.jp/dns-query"
    - "https://jp.tiar.app/dns-query"
    - "https://jp.tiarap.org/dns-query"
  nameserver-policy:
    "geosite:cn":
      - system
  fallback:
    - "tls://8.8.4.4"
    - "tls://1.1.1.1"
  proxy-server-nameserver:
    - "https://doh.pub/dns-query"
    - "https://223.5.5.5/dns-query"
  direct-nameserver:
    - system

全体的な拡張設定の変更方法

設定の解析

Mihomoのドキュメント4によれば、DNSリクエストの流れは次のようになっています。

flowchart TD
  Start[クライアントがリクエストを開始] --> rule[ルールのマッチング]
  rule -->  Domain[ドメインベースのルールにマッチ]
  rule --> IP[IPベースのルールにマッチ]

  Domain --> |ドメインが直結ルールにマッチ|DNS
  IP --> DNS[Clash DNSでドメインを解決]

  Domain --> |ドメインが代理ルールにマッチ|Remote[代理サーバーでドメインを解決し、接続を確立]

  Cache --> |Redir-host/FakeIP-Directがヒットしない|NS[名前サーバーポリシーにマッチし、クエリ]
  Cache --> |キャッシュヒット|Get
  Cache --> |FakeIPがヒットしない、代理ドメイン|Remote

  NS --> |マッチ成功| Get[取得したIPでIPルールにマッチ]
  NS --> |マッチしない| NF[名前サーバー/フォールバックで同時にクエリ]

  NF --> Get[取得したIP]
  Get --> |DNS結果をキャッシュ|Cache[(キャッシュ)]
  Get --> S[IPで直結/代理接続を確立]

  DNS --> Redir-host/FakeIP
  Redir-host/FakeIP --> |DNSキャッシュをクエリ|Cache

nameserver-policynameserverfallbackよりも優先され、geosite:cnにあるサイトをシステムDNSで解決するよう指定されており、以前設定したSmartDNSを使用して、ローカルネットワークレベルの応答速度と内蔵の速度測定によるCDN選択を享受できます。一方、geosite:cnにないサイトはnameserver/fallbackで解決され、外国の暗号化された上流を使用して結果の信頼性を確保し、DNSリークを防ぎます。

geoipとgeositeデータベースの置き換え

MihomoはデフォルトでV2Ray公式のgeoipとgeositeデータベースを使用していますが、このデータベースはあまり充実しておらず、更新頻度も遅いです。そこで私はLoyalsoldier/v2ray-rules-datという「強化版」データベースで元のデータベースを置き換えました。geoip.datgeosite.datをダウンロードしてカーネルディレクトリに置くだけです。当然、数行の上書き設定を追加して自動/ワンクリックで更新することもできます。

1
2
3
4
geodata-mode: true
geox-url:
  geoip: "https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geoip.dat"
  geosite: "https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geosite.dat"

Clash Meta For Android

スマートフォン上でのClash Meta For Android(以下Clash)については、上書き設定を行う際にスマートフォンの実際の状況をより考慮する必要があります。

まず、スマートフォン上のClashの上書き設定オプションはデスクトップ版のClash Verge Revほど柔軟ではなく、多くのキーが上書きできません。また、スマートフォンはコンピューターとは異なり、ネットワーク環境を頻繁に切り替える必要があるため、システムDNSも頻繁に変わります。このような場合、ネットワーク環境を変更するたびにClashをオンオフする必要があり、systemが表すDNSを更新する必要があります。したがって、国内の暗号化されたDNSを国内クエリとして固定するのが最善です。

Clashに入り、「設定」->「上書き」以下はすべての上書き設定です:

  • 「DNS」->「ポリシー」:強制的に有効化
  • 「DNS」->「Prefer h3」:有効化済み
  • 「DNS」->「Name Server」:2つの国外暗号化DNSを追加
  • 「DNS」->「Name Serverポリシー」:「キー」欄にgeosite:cnを入力し、「値」欄にhttps://doh.pub/dns-queryを入力

事前にGitHubからgeoip.datgeosite.datをダウンロードし、最後にClash ->「設定」->「Meta Features」に入り、「GeoIPデータベースをインポート」と「GeoSiteデータベースをインポート」機能を使用してそれらをインポートします。

完成

最後にもう一度DNSリークテストを実行して、すべてが正しく設定されていることを確認してください。これで、家庭ネットワークのDNS設定が最適化され、より高速で安全なインターネット体験を楽しむことができます。

DNSのリークがなくなりました


  1. 参考: https://blog.lololowe.com/posts/8f1e/ ↩︎

  2. SmartDNSは設計時に遅延問題を考慮しており、具体的なメカニズムについては「中場休息:SmartDNSは速度測定によるDNS解決の遅延をどのように回避するか」。 ↩︎

  3. Anti ADの光栄な事績をまとめた人がいます。 ↩︎

  4. 引用: https://wiki.metacubex.one/config/dns/diagram/ ↩︎

Licensed under CC BY-NC-SA 4.0
Hugo で構築されています。
テーマ StackJimmy によって設計されています。