iOS端末で擬似Tunnel With Local Proxyモードを試してみた

# はじめに
本記事はゼットスケーラー株式会社としては初の[Advent Calender 2023](https://qiita.com/advent-calendar/2023/zscaler)の一つとして投稿しています。以下の免責事項をご理解の上、記事を読んで頂けると幸いです。
本記事は、ネタ的には何度もコスった少し古いものですが、今でも遜色なく利用ができるので改めてこの場でもご紹介させて下さい。検証データも2021年のものになります。

# 免責事項
本記事のコンテンツや情報において、可能な限り正確な情報を掲載するよう努めておりますが、 誤情報が入り込んだり、情報が古くなったりすることもあり、必ずしもその内容の正確性および完全性を保証するものではございません。そのため、本記事をエビデンスとしたゼットスケーラーへの問い合わせなどはご対応致しかねることをご理解頂けると幸いです。掲載内容はあくまで個人の意見であり、ゼットスケーラーの立場、戦略、意見を代表するものではありません。当該情報に基づいて被ったいかなる損害について、一切責任を負うものではございませんのであらかじめご了承ください。

 # iOS端末におけるZscalerへの接続方法
 基本的にはiOSでZscalerへの接続を行うには、Zscaler Client Connector(ZCC)を利用することを推奨しています。
 このZCCには転送モードがいくつかあるのですが、iOSの場合は **Tunnelモード** がメインとなり、Tunnel With Local Proxy(TWLP)のような少し複雑なことは出来ません。([参照](https://help.zscaler.com/client-connector/best-practices-zscaler-client-connector-and-vpn-client-interoperability))

原因として、ZCCからPushするForwarding Profile PACをiOSでは認識できないことです。
実際のユースケースでも多い、PACを使って実現するDomainベースのBypassであったり、一部の通信をオンプレのProxyに指定するような要件を満たせなくなります。
ZCCのトラフィック転送モードについてはこちらの[リンク](https://help.zscaler.com/client-connector/configuring-forwarding-profiles-zscaler-client-connector#forwarding-profile-action-zia)をご参照下さい。

# iOS端末でPACを読み込ませるには
ここで諦めてはいけません。iOSには[Global HTTP Proxy](https://developer.apple.com/documentation/devicemanagement/globalhttpproxy)というものがあります。
これは、iOSのProfileにProxyの設定が可能なので、ここにPACファイルのURLを指定すれば良いのです。
今回はこれを使って、TWLPのモードを擬似的に再現してみたいと思います。

# 準備
プロファイルなどの設定ツールを利用可能ですが、今回はラボ用なので、Apple Configuratorを使いました。
• Apple Bussiness Manager (企業向け)
https://support.apple.com/ja-jp/guide/apple-business-manager/welcome/web
**• Apple Configurator (個人、検証向け)**
https://support.apple.com/ja-jp/guide/apple-configurator-2/welcome/mac
• Apple School Manager (学校向け)
https://support.apple.com/ja-jp/guide/apple-school-manager/welcome/web

# Step1
Apple Configuratorを使って、iOS端末をSupervised Deviceに変更します。
参照
https://support.apple.com/en-us/HT202837

![Screenshot 2023-12-05 at 23.59.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/220363/189cd3f7-d1cf-d878-8e20-7bb0c32a5b70.png)

# Step2
Global HTTP Proxy のProxy PAC URLにPACファイルのURLを添付します。これでiOS側のProxy設定はおしまいです。
実際のPACの設定は、検証結果に記載します。

![Screenshot 2023-12-06 at 0.00.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/220363/65d58504-82dc-3453-ada4-6c4a4a4a647f.png)

# Step3
iOS端末にZCCをインストールして、実際の通信をみてみます。

# 全体のフロー
ここで全体のトラフィックフローのイメージを説明します。
まず、アプリケーション(ブラウザなど)から出たトラフィックは一度Global HTTP Proxyの設定を見にゆきます。このときに、PACの記載でDirectと記載があるものは、ZCCで拾いZIAへと流されます。
ここで、PACでOn-Premise Proxyを指定している場合は、そのまま指定されたon-premise Proxyへ転送されます。
ZCCが起動していなければ、そのままDirectでインターネットに抜けてゆきます。

ZCCに入った通信も、App Profile PACやZCCポータルのVPN GW Bypassで、ZIAへ転送されずにBypassすることが可能です。

![Screenshot 2023-12-06 at 0.03.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/220363/8a32e93a-a98b-fbb9-74fc-d593ffc47936.png)

# テスト結果＆PACの設定
テスト結果です。全体の絵を見ながらPACでどんな設定を入れたかを見てゆきます。
テスト環境では、AWS上にSquidを立てて、Global HTTP Proxyで読み込ませたPACには、送信元のGlobal IPを見るサイト① Browserleaks.comをこのProxy当ての通信として設定します。このとき、SquidはデフォルトのTCP3128を利用したのですが、iOSのZCCはWebポートのTCP80/443のみZIA転送の対象とするので、ここではそのままDirectで抜けます。
そして、App Profile PACには、おなじみの②cman.jpをDirect指定します。

![Screenshot 2023-12-06 at 0.16.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/220363/6bb602fb-51db-aa48-3014-eff7e7f2780d.png)

これにより、以下のトラフィックフローを実現することが出来ました。
①Browserleaks.comは、AWSのSquid経由で通信を確認
②cman.jpはZCCからダイレクトでインターネットへ出ていったことを確認。150.91.165.81はテスト環境のGlobal IP。
③その他のインターネット通信はZIAを経由

![Screenshot 2023-12-06 at 0.26.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/220363/6ef6b55f-2e88-a1b4-13db-0defac7bbf55.png)

# 注意点
こちらの構成のご利用にあたり、いくつか注意点があります。
・Trusted/Untrusted の条件が使えないので、Forwarding Profile PACの切り替えが出来ない

その他注意事項
• Zscaler の Root Certificate の配布は、MDM 経由実施する必要がある。(リンさんの[記事](https://qiita.com/ylin/items/417b3bdd70bcc05d88e8)を参照)
• VPNとの併用は、異なるVPNの種類であれば可能。(Per-app, personalなど) [Zscaler Help](https://help.zscaler.com/z-app/best-practices-zscaler-app-and-vpn-client-interoperability#recommended-forwarding-action-iOS) より。

# おまけ
よくありそうな、IDPの通信をオンプレProxy経由にしてみる。以下はokta.comを指定。

![Screenshot 2023-12-06 at 0.36.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/220363/23d907de-9af2-3f91-3ad6-9b6cf0cde473.png)

iOS端末は、WiFi接続してSwitchを繋いでいたので、Networkでパケットキャプチャを実施。
![Screenshot 2023-12-06 at 0.36.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/220363/d70e3746-907e-358b-18f4-0ca0c2ce62d6.png)

IDPのオンプレProxy転送の設定を入れたPACファイルの設定。
![Screenshot 2023-12-06 at 0.36.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/220363/feac0365-5fcc-3aa3-7166-3da6743e2a75.png)


# まとめ
Zscalerの良さの一つであるトラフィック転送方法の柔軟さがiOSではうまく出せていないことが課題でした、今回は、条件があえばPCのような柔軟な使い方が可能であることをお伝えしました。