iPhoneに構成プロファイルを追加して暗号化DNSを強制的に使う
1. なぜ暗号化DNSを使うのか
従来のDNSクエリは通常、暗号化されていません。そのため、通信事業者やネットワーク上のほかの中継地点によってDNSがハイジャックされたり、名前解決の結果を書き換えられたりして、ユーザーが別のIPアドレスへ誘導される可能性があります。場合によっては、目的のWebサイトへ正常にアクセスできなくなることもあります。
WebサイトがHTTPSを使っていても、DNSクエリからアクセス先のドメイン名が漏れる可能性があり、HTTPS接続が確立する前にDNSの応答を操作されるおそれもあります。さらに皮肉なことに、HTTPS証明書の信頼性をめぐっても、中国関連の認証機関が問題を起こしたことがあります。2015年には、CNNICが発行した中間証明書を利用して、MCS HoldingsがGoogleのドメインを対象とする証明書を無断で発行しました。その後、主要ブラウザーはCNNICの証明書に対する信頼を取り消す措置を取りました。2016年以降は、中国の認証局WoSignと、その関連機関StartComも、無断発行や証明書の発行日の遡及などの問題により、Google ChromeやMozilla Firefoxの信頼ストアから段階的に除外されました。
今の信用度を考えると、街中でモバイルバッテリーを借りようとしても、QRコードを読み取れないんじゃないかと思うくらいです。
だからこそ、DNSハイジャックや名前解決結果の改ざんといったリスクに備え、DoHによる暗号化DNSを使うのは合理的な対策です。相手が「信頼できる」と言っているからといって、技術的なリスクへの対策をやめる理由にはなりません。
自宅のネットワークなら、比較的簡単に実現できます。ルーターやNAS上でDNSサーバーを動かし、AliDNSやCloudflareのパブリック暗号化DNSを利用する構成も可能です。ルーターが端末に配布するDNSサーバーのアドレスを、自宅のDNSサーバーに設定すればよいわけです。
ところが、スマートフォンでは少し面倒です。Wi-FiならDNSサーバーを手動で指定できますが、通常は223.5.5.5のような従来型DNSのIPアドレスを設定するだけです。https://dns.alidns.com/dns-queryのような暗号化DNSのURLを、そのまま指定することはできません。
さらに、iPhoneでは標準の設定画面からモバイル通信のDNSサーバーを自由に指定できません。プロキシアプリでDNSの処理を上書きする方法もありますが、個人的にはあまりスマートな方法だとは感じません。ドメインによっては設定が部分的にしか適用されないこともあります。できれば、システムレベルでDNSを指定したいところです。
2. 構成プロファイルの役割
Appleが公式にサポートしているDNS設定の仕組みを利用すれば、自分で構成プロファイルを作成し、使用するDNSサーバーを指定できます。公式のフォーマットに沿って作成し、iPhoneにインストールすればよいだけです。署名も、脱獄も、アプリへのパッケージ化も必要ありません。ただし、自分で作成したプロファイルには赤字の警告が表示されることがあります。そこは今回は気にしないことにします。
中国国内で使うため、今回はAliDNSのDoHサービスを指定しました。フォーマットを自分で調べるのは面倒だったので、ChatGPTに作成を頼みました。要点は、AliDNSのDoHアドレスhttps://dns.alidns.com/dns-queryを含むDNS設定のJSON宣言をBase64でエンコードし、構成プロファイルに組み込むことです。URLだけをBase64に変換するわけではありません。
細かいところまで自分で調べたくない場合は、AIにiOS用のDNS構成プロファイルを作成してもらう方法もあります。その際は、DoHサービスのURLを指定すること、そしてiOS 27以降では従来のDNS設定ペイロードが非推奨となり、宣言型管理のcom.apple.configuration.network.dns-settingsを使うことを明確に伝えておくとよいでしょう。
以下が構成プロファイルのソースコードです。UTF-8で保存し、拡張子を.mobileconfig にしてください。
なお、この設定では AllowFailover: false
としています。AliDNSのDoHサービスに障害が発生すると、DNS名前解決ができず、インターネット全体が切断されたように見える可能性があります。その場合は構成プロファイルを削除する必要があります。ユーザー体験としてはあまりよくありませんが、AliDNSの障害はまれですし、自分でインストールした設定なので、削除も簡単です。今回はこのままにしておきます。
iOS 27以降向け。古いiOSでは従来の DNSSettingsペイロードを使用します。
1<?xml version="1.0" encoding="UTF-8"?>
2<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3<plist version="1.0">
4<dict>
5 <key>PayloadContent</key>
6 <array>
7 <dict>
8 <key>PayloadType</key>
9 <string>com.apple.declarations</string>
10 <key>PayloadVersion</key>
11 <integer>1</integer>
12 <key>PayloadIdentifier</key>
13 <string>local.chatgpt.alidns.declarations</string>
14 <key>PayloadUUID</key>
15 <string>0FFA3358-E1D6-4F55-9946-42FC8DB1792D</string>
16 <key>PayloadDisplayName</key>
17 <string>AliDNS Declarative DNS</string>
18 <key>PayloadDescription</key>
19 <string>Locally installs an Apple declarative encrypted DNS settings declaration for AliDNS DoH.</string>
20 <key>Declarations</key>
21 <array>
22 <data>
23 eyJUeXBlIjoiY29tLmFwcGxlLmNvbmZpZ3VyYXRpb24u
24 bmV0d29yay5kbnMtc2V0dGluZ3MiLCJJZGVudGlmaWVy
25 IjoiMzQwN0E5RjQtOUIyNS00QkUwLUI4MTktODZDQUU4
26 NEJFN0I4IiwiU2VydmVyVG9rZW4iOiIzN0JCQ0IyQi1D
27 N0RCLTQ3OEEtQTg3RS03NDEwMUQwNDcwMkUiLCJQYXls
28 b2FkIjp7IlZpc2libGVOYW1lIjoiQWxpRE5TIEVuY3J5
29 cHRlZCBETlMiLCJETlNTZXR0aW5ncyI6eyJETlNQcm90
30 b2NvbCI6IkhUVFBTIiwiU2VydmVyVVJMIjoiaHR0cHM6
31 Ly9kbnMuYWxpZG5zLmNvbS9kbnMtcXVlcnkiLCJBbGxv
32 d0ZhaWxvdmVyIjpmYWxzZX19fQ==
33 </data>
34 </array>
35 </dict>
36 </array>
37 <key>PayloadDescription</key>
38 <string>Apple declarative DNS settings for AliDNS DoH. Applies to all networks; remove this profile to revert.</string>
39 <key>PayloadDisplayName</key>
40 <string>AliDNS Declarative DNS</string>
41 <key>PayloadIdentifier</key>
42 <string>local.chatgpt.alidns.declarative.profile</string>
43 <key>PayloadUUID</key>
44 <string>301BFAB9-5324-43AD-AF0B-46B6C8FA0FED</string>
45 <key>PayloadVersion</key>
46 <integer>1</integer>
47 <key>PayloadType</key>
48 <string>Configuration</string>
49 <key>PayloadRemovalDisallowed</key>
50 <false/>
51</dict>
52</plist>
3. 注意点
- VPNではありません: 暗号化DNSを設定するだけで、すべての通信がVPNトンネルを通るわけではありません。
- プロキシ設定ではありません: プロキシノード、ルーティングルール、通信の振り分けルールは設定していません。
- ルート証明書ではありません: 独自の認証局証明書をインストールするものではありません。
- MDMへの登録ではありません: 組織のMDMサービスに端末を登録する設定は含まれていません。
- ネットワーク制限を回避するものではありません: DoHはDNSクエリの通信を保護するものであり、アクセス先のWebサイトに接続できることを保証するものでも、プロキシの代わりになるものでもありません。
- 広告を自動的にブロックするものではありません: 広告ブロックには、必要に応じてAdGuardなどを組み合わせる必要があります。
4. 削除方法
ネットワークに問題が発生した場合や、元のDNS設定に戻したい場合は、iPhoneの設定画面からインストール済みの構成プロファイルを削除してください。削除後のDNSの動作は、iOS、接続中のネットワーク、プロキシアプリなどの設定によって決まります。
