Azure Firewall の Proxy の機能がパブリックプレビューで利用できるようになっています。これは Squid のようなフォワードプロキシの機能を提供するもので、UDR によるルーティングの構成なしで Azure Firewall 経由の通信を実現できるようになります。実際に動作を確認し、留意点等をまとめましたので、ご利用の際はご一読いただければ幸いです。
利用シナリオ
- UDR を設定せずに Azure Firewall 経由の通信を実現したい。UDR の場合、サブネット単位での設定となるが、プロキシの場合はクライアント単位での制御が可能。
- Private Link を使わずにオンプレから ER/VPN 経由で Azure PaaS に接続したい (Web トラフィックのみ)
構成図
前提
- 構成図内の各リソースを作成済みであること。
- Azure Firewall Policy を利用していること。
- Azure Firewall と Firewall Policy は Standard または Premium SKU で作成済みであること。[IDPS 等検証のため Primum で実施] ※ Basic SKU での利用はサポートされていません。
Proxy 設定の追加 (Firewall Policy)
Azure Policy の画面にて明示的なプロキシを有効にします。HTTP, HTTPS のポートは同じポートがつかえないため、別々のポート番号を指定する必要があります。
Proxy 設定の追加 (クライアント)
クライアントの Windows Server で [コントロールパネル] -> [インターネットオプション] -> [接続] -> [LAN の設定] -> [LAN にプロキシサーバーを使用する] - [詳細設定] の画面にて Azure Firewall の Private IP アドレスと HTTP,HTTPS ポートを設定します。
動作確認
アプリケーションルールの動作確認 (FQDN)
ブラウザで Web サイトにアクセスしてみます。
HTTP, HTTPS の両方のアクセスが Azure Firewall のプロキシ経由となっていることを確認できます。
アプリケーションルールの動作確認 (URL)
アプリケーションルールの動作確認 (Category)
アプリケーションルールの動作確認 (FQDN Tag)
Teams へのアクセスで必要となりそうな、Office365 Skype と Common の FQDN Tag を許可します。
Web ブラウザで Proxy 経由で Teams にアクセスできました。
FQDN tag のテスト目的で行いましたが、Proxy 経由での Teams 利用は推奨されていませんのでご留意ください。
アプリケーションルールの動作確認 (IDPS)
TLS 検査有効化 (証明書の自動生成を利用) し、IDPS も拒否モードに変更します。
ModHeader というブラウザの拡張機能を使って、User-Agent を "HaxerMen" に上書きします。公開情報にあるとおり、この User-Agent は拒否されるはずです。
https://learn.microsoft.com/ja-jp/azure/firewall/premium-deploy#to-test-idps-for-http-traffic
動作確認してみると想定通り、拒否されてタイムアウトとなりました。
ネットワークルールの動作確認
ネットワークルールでの制御ができるかを確認するため、以下の様なすべての TCP の通信を許可するルールのみを Firewall Policy に作成してみました。アプリケーションルールは削除してあります。
ネットワークルールでは動作せず、以下の様に Web ページに到達できませんでした。
パケットを見てみると、TCP の通信として Azure Firewall と TCP 3way handshake は成功してますが、その後、Azure Firewall にてリクエストが拒否されています。
PAC ファイルの動作確認
以下のように URL が http なら 8080, https なら 8443 というシンプルな PAC ファイル (testproxy.pac) を作成します。
function FindProxyForURL(url) {
if (shExpMatch(url, "http://*")) {
return "PROXY 10.10.0.4:8080";
}
else if (shExpMatch(url, "https://*")) {
return "PROXY 10.10.0.4:8443";
}
return "DIRECT";
}
PAC ファイルの書き方はこちらが参考になりました。
PAC ファイルを BLOB ストレージにアップロードします。
Azure Storage のファイアーウォール設定についてですが、すべてのネットワークから有効 にする必要があるようです。
Firewall Policy にて プロキシの自動構成を有効化し、PAC ファイルの SAS キーを指定し、ポート番号を指定して、適用します。
クライアントの Proxy 設定画面にて 自動構成スクリプトを使用する に http://AzureFirewallのプライベートIP:PACファイルポート/[PACファイル名] を指定します。
ブラウザでアクセスすると Azure Firewall のプロキシ経由で Web サイトにアクセスできました。(FQDN はアプリケーションルールで許可済み)
診断ログ
診断ログ [AzureDiagnostics] を有効化し、AzureDiagnostics テーブルを確認してみます。
Category : AZFWApplicationRule のログに IsExplicitProxyRequest_b という列で Proxy 利用の有無がわかるようになっているようです。現状、IsTlsInspected_b が true だと Proxy を使ってても false と記録されてしまうようです。今後の改善に期待したいと思います。
X-Forwarded-For について
以下の様に接続先の Web サイトにてリクエストのの HTTP ヘッダーの情報を確認してみましたが、Azure Firewall にてクライアントの IP アドレス [192.168.0.4] が X-Forwarded-For として付与されておりました。
GET / HTTP/1.1
X-FORWARDED-PROTO: http
X-FORWARDED-PORT: 80
X-Forwarded-For: 192.168.0.4, 20.27.45.116:1024
X-Original-URL: /
Connection: keep-alive
GET / HTTP/1.1
X-FORWARDED-PROTO: https
X-FORWARDED-PORT: 443
X-Forwarded-For: 192.168.0.4, 20.27.45.116:1024
X-Original-URL: /
Connection: keep-alive
留意点
NSG
Proxy の動作として Azure Firewall のプライベート IP との通信のみで外部サイトに接続可能となりますので、意図的に NSG にて Internet へのアウトバウンドを拒否しているような環境でも、Azure Firewall の Private IP が許可されていれば、Internet 上の Web サイトへ接続できてしまう可能性があります。(接続できるかどうかは Azure Firewall のルール次第となります)
以下の様に NSG のアウトバウンド規則で Azure Firewall の Private IP のみを許可している構成においても、外部の Web サイトにアクセス可能であることを確認できました。
ストレージアカウントのファイアーウォールの設定について
すべてのネットワークから有効 以外の設定として東アジアにストレージアカウントをおいて Azure Firewall のパブリック IP を許可を試してみましたが、Firewall Policy の設定は以下の様なエラーとなりました。
一度、ファイアーウォールの設定を すべてのネットワークから有効 に変更し、Firewall Policy の Proxy の設定が完了した後に、再度、他のファイアーウォール設定 (選択した仮想ネットワークと IP アドレスから有効/無効) にした場合もアプリケーションルール等の更新で同様のエラーが発生しましたので、恒久的にストレージアカウントのファイアーウォールはすべて公開する必要があるようです。