4G 時代から、セルラーネットワークの音声機能は従来のパケット交換システムをサポートせず、IP ネットワークに置き換えられました。これは、現在の純 LTE またはそれ以上のネットワーク(NR)での音声通話が本質的に VoIP で実現されていることを意味します。これにより、次のような機会が生まれました:なぜ VoIP をキャリアのセルラーネットワーク内で実現する必要があるのでしょうか?私たちは、外部ネットワークからこの IP ベースのコアネットワークにアクセスし、モバイル音声およびマルチメディア機能を使用することができます。これが UMA(Unlicensed Mobile Access)であり、今日私たちが知っている「Wi-Fi Call / VoWiFi」です。
Wi-Fi Call の本質は、キャリアの GAN(一般アクセスネットワーク)への IPSec トンネルを確立し、そこから IMS コアネットワークに接続して音声およびマルチメディアサービスを伝送することです。
現状#
Wi-Fi Call を使用するのは非常に簡単です。iOS の場合、設定 > セルラー > キャリア > Wi-Fi 通話で有効にするだけです。一方、Android はシステムの断片化のために異なる場合がありますが、一般的には「通話」アプリの設定で Wi-Fi 通話をオンにします。
注意が必要なのは、キャリアは顧客を常に平等に扱うわけではないということです。eSIM と同様に、多くのキャリアは後払いの顧客(正確には長期サービス契約を持つ顧客)にのみこの機能を提供し、プリペイドの顧客は使用できません。
地元にいるとき、Wi-Fi Call の唯一の役割は、セルラー信号が不良な地域で安定した通話と SMS を得る手助けをすることかもしれません。Wi-Fi Call を使用する顧客に対して、セルラーネットワークとは異なる特典パッケージを提供するキャリアはごくわずかです。
しかし、海外にいると状況は異なります。Wi-Fi Call はキャリアのコアネットワークに直接接続され、ローミングを回避するため、かなりのローミング料金を節約できます。しかし、キャリアにとっては、これが収入の損失を引き起こします。そのため、彼らは海外での Wi-Fi Call の使用を阻止する制限を設けることがあります。特定の地域で Wi-Fi Call の使用を阻止するキャリアも、現地の規制やその他の要因による場合があります。
変化#
キャリアはどのようにしてあなたの位置を知るのでしょうか?一般的には主に 2 つの方法があります:1 つはモバイルデバイス内蔵のアクセス制限、もう 1 つはキャリアの IMS にアクセスする際の IP Geo 情報です。
モバイルデバイスの制限#
現代の iOS および Android デバイスには、各キャリアが提供するネットワークプロファイルがあり、そこにはキャリアやネットワーク接続に関するさまざまな情報が定義されています。たとえば、4G / 5G ネットワークへの接続を許可するか、ネットワークアクセスポイント(APN)、ネットワークキャリアの表示名などです。iOS の IPCC(iOS キャリアプロファイル)は、Wi-Fi Call の地域制限を含む、より多くの機能を提供しています。
たとえば、香港のキャリアは一般的に Wi-Fi Call を香港内でのみ使用できるように制限しています。あなたは香港のプロキシを使ってキャリアのコアネットワークに接続すればいいのではないかと思うかもしれません。しかし、実際にはどんなプロキシを使っても Wi-Fi Call には接続できないことがわかります。これは、iOS の IPCC がデバイスが現在香港にいると認識した場合にのみ Wi-Fi Call への接続を試みることを制限しているためです。そして、iOS の「地域検出」は GPS とは関係なく、別の判断メカニズムに基づいています:
- セルラーネットワークに接続されているデバイスの場合、基地局情報を使用して位置を判断します。
- セルラーネットワークに接続されていないデバイスの場合、ネットワーク情報を使用して位置を判断します。
セルラーネットワークに接続されたデバイスがある場合、iOS は基地局から MNC / MCC を取得し、現在の地域を知ることができます。セルラー機能を持たないデバイスを使用している場合や、ネットワークがない状態や飛行機モードにある場合、iOS はネットワークベースの地域検出を使用し、具体的にはhttps://gspe1-ssl.ls.apple.com/pep/gccから返される国コードを使用して判断します。
したがって、デバイスを飛行機モードにし、Apple のネットワーク地域検出 API を指定した地域のネットワークプロキシを介してアクセスさせることで、キャリアがデバイスに設定した Wi-Fi Call の制限を回避できます。
では、もっと直接的な方法はないのでしょうか?あります。設定 > プライバシーとセキュリティ > 位置情報サービス > システムサービスで「Wi-Fi 通話」(中国本土販売モデルでは「WLAN 通話」と呼ばれます)の位置情報権限をオフにするだけです。ただし、セルラー基地局に基づく地域検出を回避するために、依然として電話を飛行機モードにしておく必要があります。
2023-08-25 更新:その後の実践により、このオプションは iOS の Wi-Fi Call 検出に影響を与えないことがわかりました。この機能は e-911 の地理的位置検出と伝送に使用される可能性があります。
GAN 接続制限#
デバイス制限はほとんどの場合 iOS デバイスにのみ有効ですが、一部のキャリアはより徹底的な制限のために、GAN 接続時に接続される IP Geo を制限しています。たとえば、香港の ClubSIM は、IPCC でデバイスが香港にいる場合のみ接続を許可するだけでなく、香港の IP のみがアクセスできるように制限しています。
さらに、中国本土の読者は国家のネットワークファイアウォール(GFW)の問題も心配する必要があります。2022 年下半期、GFW は一部の T-Mobile の Wi-Fi Call 接続ポイントの IP アドレスを遮断し、多くの人々が Wi-Fi Call が途切れたり、まったく接続できなかったりしました。遮断されていない IP を探して接続するために、さまざまな方法を試さざるを得ませんでした。
IP 制限を回避するのはもちろん簡単です。ネットワークプロキシを使用すれば解決できます。しかし、デフォルトでは、Wi-Fi Call の IPSec トラフィックはローカル VPN(従来の VPN やアプリケーションが作成した VPN インターフェースを含む)を介してルーティングされません。Android ユーザーは root 後に iptables を使用してこの問題を解決できますが、iOS は 16.4 以前はこれを実現できませんでした。しかし、iOS 16.4 以降、状況は変わりました。iOS は、セルラー IP サービスのトラフィックを Network Extension を介してルーティングするための新しい API を提供し、Surge for iOS がこれを最初にサポートしました。読者が iOS 16.4 以上を満たし、Surge の最新機能のサブスクリプションを持っている場合、次のモジュールを追加するだけで実現できます:
(2023-08-25 更新:現在、この機能は新しい Surge バージョンでは機能せず、最初にこの機能を追加した Surge バージョンに戻っても機能しません。iOS が NE によるシステムの基盤接続の取得を再度制限した可能性があります)
#!name= Enable Wi-Fi Call for Local VPN
#!desc= ローカルVPN上でWi-Fi Callトラフィックをプロキシすることを許可
#!system=ios
[General]
include-all-networks = true
include-cellular-services = true
Wi-Fi Call トラフィックをより細かく制御したい場合、たとえばデュアル SIM スマートフォンで異なる国の SIM カードを使用している場合は、以下の Surge の分流ルールを参考にしてください。
デバイス自体がゲートウェイプロキシ(ゲートウェイレベルの透過プロキシ、さまざまなバイパスルーターソリューションを含む)を使用している読者は、ゲートウェイプロキシにいくつかのルールを追加するだけで実現できます。しかし、さまざまな理由でデバイスのトラフィックをすべてゲートウェイプロキシを通過させたくない場合は、少しルーティングの魔法が必要です。
戦略ルーティング#
この記事の最初で述べたように、Wi-Fi Call の本質は IPSec トンネルであり、IPSec トンネルは 500 UDP および 4500 UDP ポートを使用します。これら 2 つのポートのトラフィックをゲートウェイでマークし、プロキシまたはバイパスルーターに転送するだけで済みます。もしあなたがバイパスゲートウェイプロキシソリューションを使用していて、メインゲートウェイが Linux ベースのコントロールプレーンである場合、この記事の著者のソリューションを参考にできます。著者は UniFi Dream Machine Pro をメインゲートウェイとして使用し、Surge for Mac をバイパスプロキシとして使用しています。しかし、この部分を理解すれば、その考え方はどのデバイスにも共通しています。
#!/usr/bin/env bash
# Pre Env
touch /run/routing-zero-wifi-call.lock
if [ -f /run/routing-zero-wifi-call.lock ]; then
iptables -t mangle -D PREROUTING -p udp -m multiport --dports 500,4500 -s 10.1.1.0/24 ! -d 10.1.1.0/24 -j WIFI_CALL
iptables -t mangle -F WIFI_CALL
iptables -t mangle -X WIFI_CALL
ip r flush table wificall
ip ru d fwmark 0x65
sed -i "/wificall/d" /etc/iproute2/rt_tables
fi
# Create Routing Table
echo "101 wificall" >> /etc/iproute2/rt_tables
# Create Routing Rules
ip ru a fwmark 0x65 lookup wificall
ip r a default via 10.1.1.233 dev br0 table wificall
# Set Firewall Mark
iptables -t mangle -N WIFI_CALL
iptables -t mangle -A WIFI_CALL -s 10.1.1.233/32 -j RETURN
iptables -t mangle -A WIFI_CALL -p udp -m multiport --dports 500,4500 -j MARK --set-mark 0x65
iptables -t mangle -A PREROUTING -p udp -m multiport --dports 500,4500 -s 10.1.1.0/24 ! -d 10.1.1.0/24 -j WIFI_CALL
ここで、10.1.1.0/24
は LAN ネットワークの IP セグメントで、10.1.1.233
は Surge for Mac があるデバイスの IP アドレスです。私たちの考えは、全体のサブネット内で、バイパスプロキシゲートウェイから送信されたものを除き、すべてのターゲットポートが 500 および 4500 UDP ポートで、ターゲット IP がローカルネットワークでないトラフィックをバイパスゲートウェイに転送することです。方法は、すべての条件を満たすトラフィックにファイアウォールマーク(FwMark)を設定し、これらのマークが付けられたトラフィックをメインゲートウェイがバイパスプロキシゲートウェイに転送するようにすることです。
その後、プロキシプログラムにいくつかのルールを追加して、すべての 500 UDP および 4500 UDP のトラフィックをそのターゲット IP Geo に基づいて対応する国のプロキシを使用して転送するようにします。著者が US / HK / UK カードの Wi-Fi Call を使用する例を挙げます:
[Proxy Group]
US Wi-Fi Call = select, US Proxy 1, US Proxy 1
HK Wi-Fi Call = select, HK Proxy 1, HK Proxy 2
UK Wi-Fi Call = select, UK Proxy 1, UK Proxy 2
...
[Rule]
AND,((GEOIP,US),(AND,((PROTOCOL,UDP),(OR,((DEST-PORT,500),(DEST-PORT,4500)))))), US Wi-Fi Call
AND,((GEOIP,HK),(AND,((PROTOCOL,UDP),(OR,((DEST-PORT,500),(DEST-PORT,4500)))))), HK Wi-Fi Call
AND,((GEOIP,GB),(AND,((PROTOCOL,UDP),(OR,((DEST-PORT,500),(DEST-PORT,4500)))))), UK Wi-Fi Call
...
Clash や他の主流のプロキシソフトウェアにも似たような論理判断ルールがありますので、自分で修正して使用することができます。
IMS 状態#
注意が必要なのは、一部のキャリア、たとえば香港のすべてのキャリア(CSL 系を除く、ClubSIM などのサブブランドを含む)は、音声接続のみを実現しており、マルチメディアシステムには接続していないということです。これは、セルラーネットワークにまったく接続されていない場合、SMS を受信できないことを意味します!これらのキャリアは非常に文字通りに顧客に Wi-Fi「Call」を実現しています。
設定 > 一般 > このデバイスについてで「キャリア」をクリックすると、表示情報を切り替え、Wi-Fi Call 状態で IMS 状態を確認できます。
以下は 2023.04.14 の更新です
世の中は変わりやすいもので、iOS 16.4 の更新後に CMHK 54.0 の IPCC が更新され、この IPCC は CMHK が Wi-Fi Call 状態で SMS を送受信できることを許可しました。ついに完全な形になりました!