【Azure】P2S VPN環境からプロキシ経由でインターネット接続をする検証

Azure環境へのPoint to Site接続(P2S接続)とプロキシ経由でのインターネット接続の動作を確認したかったため、環境を構築し動作確認をしたので、備忘として残しておきます。

スクショとかをしっかり取れていないのと難しいことはあまりしていないため、具体的な設定手順等は省略します。

環境構成

以下のやりたいことに合わせて環境を構成しました。ルーティングはUDRで設定しています。

  • Point to Site接続(P2S)
  • ハブアンドスポーク構成での動作確認(VPN-Gatewayの仮想ネットワークにもFirewallを構成するため、実際はマルチハブアンドスポークの確認が正しい気のかも※)
  • プロキシサーバ経由でのインターネット接続
  • Azure Firewallと静的ルーティングを利用したVnet間のルーティング確認

※マルチハブアンドスポークについてのAzure公式ドキュメントはこちらが参考になるかと思います。

Azure Firewall を使用してマルチ ハブ アンド スポーク トポロジをルーティングする
Azure Firewall をデプロイしてマルチ ハブ アンド スポーク トポロジをルーティングする方法について説明します。

Spoke-Vnet-aとSpoke-Vnet-bで通信を実施する場合、Vnet-Peeringでゲートウェイの利用を設定して通信させることも可能ですが、HUB-VnetにもGatewayが存在している場合の制約でVnet-Peeringへの設定ができない場合を想定しての構成としています。(制約とか構成の正解が分からなくて難しい。)

HUB-Vnet-Aの構成

セグメント

アドレス空間10.0.0.0/16
Firewall-Subnet10.0.1.0/26
Gateway-Subnet10.0.2.0/24

ルーティング

サブネット宛先ネクストホップ
Firewall-SubnetVPN-Gatewayでクライアント端末へ払い出すアドレスプールSpoke-Vnet-bのFirewall

Spoke-Vnet-aの構成

セグメント

アドレス空間10.1.0.0/16
Firewall-Subnet10.1.1.0/26
Gateway-Subnet10.1.2.0/24

ルーティング

サブネット宛先ネクストホップ
Firewall-Subnet0.0.0.0/0HUB-Vnet-AのFirewall
Gateway-Subnet0.0.0.0/0Spoke-Vnet-aのFirewall

Spoke-Vnet-bの構成

セグメント

アドレス空間10.2.0.0/16
Subnet-b10.2.0.0/24

ルーティング

サブネット宛先ネクストホップ
Subnet-b0.0.0.0/0インターネット
Subnet-bVPN-Gatewayでクライアント端末へ払い出すアドレスプールHUB-Vnet-AのFirewall

構成要素について

Azure Firewall

Azure Firewallは、Vnet間でルーティングを行うための要素として利用します。

そのため、Firewallのポリシーとしてはすべての通信を許可する設定を実施します。

VPN-Gateway

仮想ネットワークゲートウェイでVPN接続を実施します。

個人の検証であればSKUは「VpnGw1」で十分です。ゲートウェイのSKUについてのAzure公式ドキュメントは以下になります。

Point to Site(P2S)接続の際の公開する追加ルートについてですが、設定するとVPN接続した端末に設定したルートの情報がVPNトンネルをネクストホップとして載ってくるようになります。

そのため、今回のようにプロキシサーバ経由でのインターネット接続を実施する場合は、VPN接続した端末のルーティングが全てVPNトンネルを向くように公開する追加ルートに設定するのが良いかと思いますが、環境によるかなと思います。

全て通信をVPNトンネルに向ける場合の設定値は、「0.0.0.0/1 , 128.0.0.0/1」です。

アドバタイズルートの設定についての公式ドキュメントのページは以下になります。

プロキシサーバ

プロキシサーバは、仮想マシンにSquidをインストールして構築しています。

ほぼインストール時のデフォルト状態で利用しており、特別な設定等は実施していません。

/etc/squid/squid.confの内容は以下になります。

[hogehoge@Proxy ~]$ sudo cat /etc/squid/squid.conf
#
# Recommended minimum configuration:
#

# Example rule allowing access from your local networks.
# Adapt to list your (internal) IP networks from where browsing
# should be allowed
acl localnet src 0.0.0.1-0.255.255.255  # RFC 1122 "this" network (LAN)
acl localnet src 10.0.0.0/8             # RFC 1918 local private network (LAN)
acl localnet src 100.64.0.0/10          # RFC 6598 shared address space (CGN)
acl localnet src 169.254.0.0/16         # RFC 3927 link-local (directly plugged) machines
acl localnet src 172.16.0.0/12          # RFC 1918 local private network (LAN)
acl localnet src 192.168.0.0/16         # RFC 1918 local private network (LAN)
acl localnet src fc00::/7               # RFC 4193 local private network range
acl localnet src fe80::/10              # RFC 4291 link-local (directly plugged) machines

acl SSL_ports port 443
acl Safe_ports port 80          # http
acl Safe_ports port 21          # ftp
acl Safe_ports port 443         # https
acl Safe_ports port 70          # gopher
acl Safe_ports port 210         # wais
acl Safe_ports port 1025-65535  # unregistered ports
acl Safe_ports port 280         # http-mgmt
acl Safe_ports port 488         # gss-http
acl Safe_ports port 591         # filemaker
acl Safe_ports port 777         # multiling http
acl CONNECT method CONNECT

#
# Recommended minimum Access Permission configuration:
#
# Deny requests to certain unsafe ports
http_access deny !Safe_ports

# Deny CONNECT to other than secure SSL ports
http_access deny CONNECT !SSL_ports

# Only allow cachemgr access from localhost
http_access allow localhost manager
http_access deny manager

# We strongly recommend the following be uncommented to protect innocent
# web applications running on the proxy server who think the only
# one who can access services on "localhost" is a local user
#http_access deny to_localhost

#
# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
#

# Example rule allowing access from your local networks.
# Adapt localnet in the ACL section to list your (internal) IP networks
# from where browsing should be allowed
http_access allow localnet
http_access allow localhost

# And finally deny all other access to this proxy
#http_access deny all
http_access allow all

# Squid normally listens to port 3128
http_port 3128

# Uncomment and adjust the following to add a disk cache directory.
#cache_dir ufs /var/spool/squid 100 16 256

# Leave coredumps in the first cache dir
coredump_dir /var/spool/squid

logformat timefm %{%Y/%m/%d %H:%M:%S}tl %ts.%03tu %6tr %>a %Ss/%03>Hs %<st %rm %ru %[un %Sh/%<a %mt
access_log daemon:/var/log/squid/access.log timefm

#
# Add any of your own refresh_pattern entries above these.
#
refresh_pattern ^ftp:           1440    20%     10080
refresh_pattern ^gopher:        1440    0%      1440
refresh_pattern -i (/cgi-bin/|\?) 0     0%      0
refresh_pattern .               0       20%     4320

サーバでの確認事項としては、今回はgoogleの公開DNS(8.8.8.8)への疎通確認とcurlコマンドでの確認をしていました。

[hogehoge@Proxy ~]$ ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=56 time=1.77 ms
^C
--- 8.8.8.8 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 1.769/1.769/1.769/0.000 ms

[hogehoge@Proxy ~]$ curl www.google.com --head
HTTP/1.1 200 OK
Content-Type: text/html; charset=ISO-8859-1
Content-Security-Policy-Report-Only: object-src 'none';base-uri 'self';script-src 'nonce-IbiUJPYgcb_4SDn9uAO1IQ' 'strict-dynamic' 'report-sample' 'unsafe-eval' 'unsafe-inline' https: http:;report-uri https://csp.withgoogle.com/csp/gws/other-hp
P3P: CP="This is not a P3P policy! See g.co/p3phelp for more info."
Date: Sat, 16 Nov 2024 19:17:07 GMT
Server: gws
X-XSS-Protection: 0
X-Frame-Options: SAMEORIGIN
Transfer-Encoding: chunked
Expires: Sat, 16 Nov 2024 19:17:07 GMT
Cache-Control: private
Set-Cookie: AEC=AZ6Zc-V5hE6hcwi2t-_I-zOnGE-Rglgn6uzVm_EvLOjWZ1_N8Ov6zx7xQRk; expires=Thu, 15-May-2025 19:17:07 GMT; path=/; domain=.google.com; Secure; HttpOnly; SameSite=lax
Set-Cookie: NID=519=mrLoYxDFN88-Eq7GkmEwzWtqKByOxCerEswRTl7N4uQ9xRiUVP34OEq29iPut56lwCszs-J86kFd6itJ4sCC7mV5xQNSC-W-BxLqdaOa_-jowJTj0x2zjDhLeV32la5Ifs_NkenAnk_yWgjW9ZE71ZUbCymlB3PrPDqndNbzkKPkBQDwO0H0LFCTOhHt9SiD; expires=Sun, 18-May-2025 19:17:07 GMT; path=/; domain=.google.com; HttpOnly

リモート環境のクライアント端末

Point to Site(P2S)接続を実施する端末に必要な設定としては、「VPNクライアントのインストール」「VPN接続用の証明書のインストール」「プロキシサーバの利用設定」です。

VPNクライアントのインストールは、VPN-Gatewayのポイント対サイト設定からVPNクライアントをダウンロード可能なので、そこからダウンロードしてインストールを実施すればOKです。※公開する追加ルートの設定を変更したら、再度ダウンロード・インストールが必要になります。

証明書のインストールは、個人の検証レベルであれば「自己署名ルート証明書を作成⇒ルート証明書からクライアント証明書を作成⇒端末にインストール」で問題ありません。

最期にプロキシサーバの設定ですが、こちらはVPN接続に対してプロキシサーバの利用設定を実施する必要があります。

ネットワークとインターネットから「インターネットオプション」を選択します。

「インターネットのプロパティ」から「接続」タブを選択して、「ダイヤルアップと仮想プライベートネットワークの設定」の項目に表示されているVPN接続を選択して、「設定」をクリックします。

「プロキシサーバ」の項目で、プロキシサーバを使用するにチェックを入れて、アドレスとポートを入力すれば完了です。

インターネットへの接続とプロキシログの確認

構築と設定が完了したら、クライアント端末でインターネットへ接続し、プロキシのログを確認し、クライアント端末がプロキシ経由でインターネットへ接続できていることを確認します。

もしVPN-Gatewayの設定でアドバタイズルートですべての通信をVPNトンネルに向けている場合、VPNに接続している状態でインターネットへの接続はできないはずです。

そのため、VPNに接続している状態でインターネットへ接続できない状態からプロキシ等の設定を実施してインターネットに接続できることを確認できれば問題ないかと思います。

squidのログで、VPN接続のアドレスプール(172.16.0.0系)からのアクセスを確認してOKなことを確認します。

[hogehoge@Proxy ~]$ sudo cat /var/log/squid/access.log
2024/11/16 19:39:33 1731785973.511    915 172.16.16.2 TCP_TUNNEL/200 2940 CONNECT www.netflix.com:443 - HIER_DIRECT/3.12.3.40 -
2024/11/16 19:39:35 1731785975.195    719 172.16.16.2 TCP_TUNNEL_ABORTED/200 6443 CONNECT kinesis.us-east-1.amazonaws.com:443 - HIER_DIRECT/3.91.171.225 -
2024/11/16 19:39:37 1731785977.638   3549 172.16.16.2 TCP_TUNNEL/200 74972 CONNECT assets.nflxext.com:443 - HIER_DIRECT/45.57.91.1 -
2024/11/16 19:39:37 1731785977.651   2609 172.16.16.2 TCP_TUNNEL/200 893 CONNECT assets.nflxext.com:443 - HIER_DIRECT/45.57.91.1 -
2024/11/16 19:39:37 1731785977.756    123 172.16.16.2 NONE/503 0 CONNECT notifications.netflix.com:443 - HIER_NONE/- -
2024/11/16 19:39:38 1731785978.557    756 172.16.16.2 TCP_TUNNEL/200 861 CONNECT assets.nflxext.com:443 - HIER_DIRECT/45.57.91.1 -
2024/11/16 19:39:38 1731785978.574   3533 172.16.16.2 TCP_TUNNEL/200 3488 CONNECT assets.nflxext.com:443 - HIER_DIRECT/45.57.91.1 -
2024/11/16 19:39:38 1731785978.615   4440 172.16.16.2 TCP_TUNNEL/200 772616 CONNECT assets.nflxext.com:443 - HIER_DIRECT/45.57.91.1 -
2024/11/16 19:39:39 1731785979.392   4389 172.16.16.2 TCP_TUNNEL/200 2093116 CONNECT assets.nflxext.com:443 - HIER_DIRECT/45.57.91.1 -
2024/11/16 19:39:39 1731785979.680   1051 172.16.16.2 TCP_TUNNEL/200 77686 CONNECT assets.nflxext.com:443 - HIER_DIRECT/45.57.91.1 -
2024/11/16 19:39:39 1731785979.953    550 172.16.16.2 TCP_TUNNEL/200 4812 CONNECT logs.netflix.com:443 - HIER_DIRECT/3.132.37.209 -
2024/11/16 19:39:39 1731785979.953   1368 172.16.16.2 TCP_TUNNEL/200 5117 CONNECT logs.netflix.com:443 - HIER_DIRECT/3.132.37.209 -
2024/11/16 19:39:40 1731785980.221    726 172.16.16.2 TCP_TUNNEL_ABORTED/200 6443 CONNECT kinesis.us-east-1.amazonaws.com:443 - HIER_DIRECT/3.91.171.225 -
2024/11/16 19:39:40 1731785980.237   5195 172.16.16.2 TCP_TUNNEL/200 52847 CONNECT occ-0-3011-116.1.nflxso.net:443 - HIER_DIRECT/190.98.156.219 -
2024/11/16 19:39:40 1731785980.409    160 172.16.16.2 TCP_TUNNEL/200 6383 CONNECT ae.nflximg.net:443 - HIER_DIRECT/184.26.212.122 -
2024/11/16 19:39:40 1731785980.413   5371 172.16.16.2 TCP_TUNNEL/200 167113 CONNECT occ-0-3011-116.1.nflxso.net:443 - HIER_DIRECT/190.98.156.219 -
2024/11/16 19:39:40 1731785980.468     44 172.16.16.2 TCP_TUNNEL/200 5124 CONNECT ae.nflximg.net:443 - HIER_DIRECT/184.26.212.122 -
2024/11/16 19:39:40 1731785980.934  28507 172.16.16.2 TCP_TUNNEL/200 5256 CONNECT accounts.google.com:443 - HIER_DIRECT/74.125.204.84 -
2024/11/16 19:39:40 1731785980.934  15374 172.16.16.2 TCP_TUNNEL/200 8785 CONNECT play.google.com:443 - HIER_DIRECT/172.217.175.238 -
2024/11/16 19:39:40 1731785980.934 153772 172.16.16.2 TCP_TUNNEL/200 7584 CONNECT accountcapabilities-pa.googleapis.com:443 - HIER_DIRECT/142.251.222.10 -
2024/11/16 19:39:40 1731785980.934 389824 172.16.16.2 TCP_TUNNEL/200 1586641 CONNECT www.google.com:443 - HIER_DIRECT/142.250.207.36 -
2024/11/16 19:39:40 1731785980.934 388435 172.16.16.2 TCP_TUNNEL/200 48915 CONNECT play.google.com:443 - HIER_DIRECT/172.217.175.78 -
2024/11/16 19:39:40 1731785980.934  16378 172.16.16.2 TCP_TUNNEL/200 12455 CONNECT ogads-pa.clients6.google.com:443 - HIER_DIRECT/142.250.207.10 -
2024/11/16 19:39:40 1731785980.934   5821 172.16.16.2 TCP_TUNNEL/200 4406 CONNECT geolocation.onetrust.com:443 - HIER_DIRECT/172.64.155.119 -
2024/11/16 19:39:40 1731785980.935   7864 172.16.16.2 TCP_TUNNEL/200 155950 CONNECT www.netflix.com:443 - HIER_DIRECT/3.12.3.40 -
2024/11/16 19:39:40 1731785980.935   2360 172.16.16.2 TCP_TUNNEL/200 5794 CONNECT web.prod.cloud.netflix.com:443 - HIER_DIRECT/3.131.250.78 -
2024/11/16 19:39:40 1731785980.935  16187 172.16.16.2 TCP_TUNNEL/200 13007 CONNECT ogads-pa.clients6.google.com:443 - HIER_DIRECT/142.250.207.10 -
2024/11/16 19:39:40 1731785980.935 393671 172.16.16.2 TCP_TUNNEL/200 8969 CONNECT www.googleapis.com:443 - HIER_DIRECT/142.250.196.138 -
2024/11/16 19:39:40 1731785980.935  15255 172.16.16.2 TCP_TUNNEL/200 9562 CONNECT play.google.com:443 - HIER_DIRECT/172.217.175.238 -
2024/11/16 19:39:40 1731785980.935   5900 172.16.16.2 TCP_TUNNEL/200 6126 CONNECT cdn.cookielaw.org:443 - HIER_DIRECT/104.18.86.42 -
2024/11/16 19:39:40 1731785980.935  87984 172.16.16.2 TCP_TUNNEL/200 4000 CONNECT waa-pa.clients6.google.com:443 - HIER_DIRECT/172.217.161.74 -
2024/11/16 19:39:40 1731785980.935 210256 172.16.16.2 TCP_TUNNEL/200 10556 CONNECT android.clients.google.com:443 - HIER_DIRECT/172.217.175.110 -
2024/11/16 19:39:40 1731785980.935 386484 172.16.16.2 TCP_TUNNEL/200 7872 CONNECT beacons3.gvt2.com:443 - HIER_DIRECT/142.250.207.35 -
2024/11/16 19:39:40 1731785980.935    512 172.16.16.2 TCP_TUNNEL/200 4703 CONNECT www.netflix.com:443 - HIER_DIRECT/3.12.3.40 -
2024/11/16 19:39:40 1731785980.935   3305 172.16.16.2 TCP_TUNNEL/200 21667 CONNECT www.gstatic.com:443 - HIER_DIRECT/172.217.175.35 -
2024/11/16 19:39:40 1731785980.935 393579 172.16.16.2 TCP_TUNNEL/200 7821 CONNECT beacons5.gvt2.com:443 - HIER_DIRECT/216.239.32.116 -
2024/11/16 19:39:40 1731785980.935   3286 172.16.16.2 TCP_TUNNEL/200 5413 CONNECT web.prod.cloud.netflix.com:443 - HIER_DIRECT/3.131.250.78 -
2024/11/16 19:39:40 1731785980.935  19422 172.16.16.2 TCP_TUNNEL/200 9506 CONNECT google.com:443 - HIER_DIRECT/142.251.222.14 -
2024/11/16 19:39:40 1731785980.935   3273 172.16.16.2 TCP_TUNNEL/200 7254 CONNECT content-autofill.googleapis.com:443 - HIER_DIRECT/142.251.42.170 -
2024/11/16 19:39:40 1731785980.935   2299 172.16.16.2 TCP_TUNNEL/200 4856 CONNECT aidsvc.netflix.com:443 - HIER_DIRECT/3.12.3.40 -
2024/11/16 19:39:40 1731785980.935 390398 172.16.16.2 TCP_TUNNEL/200 8221 CONNECT beacons4.gvt2.com:443 - HIER_DIRECT/216.239.32.116 -
2024/11/16 19:39:40 1731785980.935   7869 172.16.16.2 TCP_TUNNEL/200 12761 CONNECT optimizationguide-pa.googleapis.com:443 - HIER_DIRECT/142.250.196.106 -
2024/11/16 19:39:40 1731785980.935   6843 172.16.16.2 TCP_TUNNEL/200 14761 CONNECT cdn.cookielaw.org:443 - HIER_DIRECT/104.18.86.42 -
2024/11/16 19:39:40 1731785980.935  12365 172.16.16.2 TCP_TUNNEL/200 28278 CONNECT ogs.google.com:443 - HIER_DIRECT/172.217.31.142 -
2024/11/16 19:39:40 1731785980.935   3303 172.16.16.2 TCP_TUNNEL/200 4939 CONNECT assets.netflix.com:443 - HIER_DIRECT/3.211.157.115 -
2024/11/16 19:39:40 1731785980.935   1236 172.16.16.2 TCP_TUNNEL/200 5264 CONNECT aidsvc.netflix.com:443 - HIER_DIRECT/3.12.3.40 -

Chat GPTに上記のログを分析してもらった結果も載せておきます。

プロキシログの解析(Chat GPTを利用)

ログを解析し、以下の点を整理しました:

1. 主な通信先

  • Netflix関連:
    • ドメイン: www.netflix.com, assets.nflxext.com, aidsvc.netflix.com, web.prod.cloud.netflix.comなど。
    • 通信が成功したものがほとんどですが、一部(notifications.netflix.com)でNONE/503のエラーが発生。
  • Google関連:
    • ドメイン: accounts.google.com, play.google.com, www.google.com, ogs.google.comなど、多数のGoogleサービスへの通信。
    • すべてTCP_TUNNEL/200で成功。
  • Amazon関連:
    • ドメイン: kinesis.us-east-1.amazonaws.com
    • TCP_TUNNEL_ABORTED/200が2回発生しており、通信が途中で中断。
  • その他:
    • geolocation.onetrust.com, cdn.cookielaw.org など。

2. 通信のステータス

  • 成功 (TCP_TUNNEL/200):
    • 圧倒的多数の通信は成功している。
    • 通信成功例:yamlコードをコピーする2024/11/16 19:39:33 1731785973.511 172.16.16.2 TCP_TUNNEL/200 2940 CONNECT www.netflix.com:443
  • エラー (NONE/503):
    • Netflixのnotifications.netflix.comで発生。sqlコードをコピーする2024/11/16 19:39:37 1731785977.756 172.16.16.2 NONE/503 0 CONNECT notifications.netflix.com:443
  • 中断 (TCP_TUNNEL_ABORTED/200):
    • Amazon Kinesisとの通信で発生。yamlコードをコピーする2024/11/16 19:39:35 1731785975.195 172.16.16.2 TCP_TUNNEL_ABORTED/200 6443 CONNECT kinesis.us-east-1.amazonaws.com:443

3. 通信量 (データ量)

  • 最大通信量:
    • 2093116 bytes: Netflixのassets.nflxext.com。sqlコードをコピーする2024/11/16 19:39:39 1731785979.392 172.16.16.2 TCP_TUNNEL/200 2093116 CONNECT assets.nflxext.com:443
  • 最小通信量:
    • 0 bytes: Netflixのnotifications.netflix.com (エラー)。sqlコードをコピーする2024/11/16 19:39:37 1731785977.756 172.16.16.2 NONE/503 0 CONNECT notifications.netflix.com:443

4. IPアドレスとホスト

  • クライアントIP:
    • 全て172.16.16.2
  • 通信先IP:
    • 各ドメインの接続先IPが細かく分かれている。
    • 例:
      • 3.12.3.40 (www.netflix.com)
      • 45.57.91.1 (assets.nflxext.com)

まとめ

通信量が多いリクエストはNetflixの静的資産(assets.nflxext.com)に集中している。

クライアントは主にNetflixとGoogle関連のサービスに接続を試みている。

Netflix関連のエラー(notifications.netflix.com)やAmazon Kinesisの中断が確認されるが、全体的には通信は正常。

VPNに接続している端末としては、プロキシを経由してインターネットへ通信するため、直接インターネットへ出ようとする通信は失敗します。(VPNに接続していてすべての通信をVPNトンネルに向けている場合、ping 8.8.8.8を打っても失敗することを意味します。)

そのため、クライアント端末としてはプロキシサーバとの通信が成功していることを確認できればOKになります。

コメント

タイトルとURLをコピーしました