pacファイルをIISに配置し、そのpacファイルを利用することで、特定URL向け通信をプロキシ経由にする構成を試してみました。
構成図
以下のように構成して、bonjiri-blog.com 向けの通信だけプロキシ経由となるようにします。
準備
まず、AzureのVMやそれを構築するために必要なリソースをAzureCLIで作成します。
#任意のパラメータを定義
$rg_name = "RG-Test-pac"
$location = "japaneast"
$vnet_name = "Vnet-Test-pac"
$vnet_address = "10.12.0.0/24"
$subnet1_name = "Subnet-Client"
$subnet1_address = "10.12.0.0/26"
$subnet2_name = "Subnet-Proxy"
$subnet2_address = "10.12.0.64/26"
$nsg1_name = "NSG-Test-Client"
$nsg2_name = "NSG-Test-Proxy"
$nsgrule1_name = "AllowRDP"
$nsgrule1_name = "AllowSSH"
$my_gip = (Invoke-WebRequest https://ipinfo.io/ip).content
$nsgrule_sourceip = $my_gip + "/32"
$nsgrule1_port = 3389
$nsgrule1_priority = 200
$nsgrule2_port = 22
$nsgrule2_priority = 200
$pip1_name = "PIP-VM-Test-Client"
$nic1_name = "NIC-VM-Test-Client"
$pip2_name = "PIP-VM-Test-Proxy"
$nic2_name = "NIC-VM-Test-Proxy"
$vm1_name = "VM-Test-Client"
$vm2_name = "VM-Test-Proxy"
$vm1_image = "Win2022Datacenter"
$vm2_image = "Ubuntu2204"
$vm_size = "Standard_B2ms"
$vm_authtype = "password"
$vm_adminname = "xxxxxxxxxxx"
#リソースグループの作成
az group create `
-l $location `
-g $rg_name
#仮想ネットワークの作成とクライアント用サブネットの追加
az network vnet create `
-n $vnet_name `
-g $rg_name `
-l $location `
--address-prefix $vnet_address `
--subnet-name $subnet1_name `
--subnet-prefix $subnet1_address
#web用サブネットの追加
az network vnet subnet create `
-g $rg_name `
--vnet-name $vnet_name `
-n $subnet2_name `
--address-prefixes $subnet2_address
#NSGの作成
az network nsg create `
-n $nsg1_name `
-g $rg_name
az network nsg create `
-n $nsg2_name `
-g $rg_name
#NSGのルール追加
az network nsg rule create `
-g $rg_name `
--nsg-name $nsg1_name `
-n $nsgrule1_name `
--source-address-prefixes $nsgrule_sourceip `
--destination-port-range $nsgrule1_port `
--priority $nsgrule1_priority
az network nsg rule create `
-g $rg_name `
--nsg-name $nsg2_name `
-n $nsgrule2_name `
--source-address-prefixes $nsgrule_sourceip `
--destination-port-range $nsgrule2_port `
--priority $nsgrule2_priority
#NSGをサブネットに適用
az network vnet subnet update `
-g $rg_name `
-n $subnet1_name `
--vnet-name $vnet_name `
--network-security-group $nsg1_name
az network vnet subnet update `
-g $rg_name `
-n $subnet2_name `
--vnet-name $vnet_name `
--network-security-group $nsg2_name
#パブリックIPの作成
az network public-ip create `
-n $pip1_name `
-g $rg_name
az network public-ip create `
-n $pip2_name `
-g $rg_name
#ネットワークインターフェースの作成
az network nic create `
-n $nic1_name `
-g $rg_name `
--vnet-name $vnet_name `
--subnet $subnet1_name `
--public-ip-address $pip1_name
az network nic create `
-n $nic2_name `
-g $rg_name `
--vnet-name $vnet_name `
--subnet $subnet2_name `
--public-ip-address $pip2_name
#仮想マシンの作成
az vm create `
-n $vm1_name `
-g $rg_name `
--image $vm1_image `
--size $vm_size `
--nics $nic1_name `
--authentication-type $vm_authtype `
--admin-username $vm_adminname
az vm create `
-n $vm2_name `
-g $rg_name `
--image $vm2_image `
--size $vm_size `
--nics $nic2_name `
--authentication-type $vm_authtype `
--admin-username $vm_adminname
上記作成後、クライアントVMとpacファイル配信用VMのグローバルIPを調べてみます。
PS C:\> $pip1_address = az network public-ip show -g $rg_name -n $pip1_name | ConvertFrom-Json
PS C:\> $pip1_address.ipAddress
74.176.50.81
PS C:\>
PS C:\> $pip2_address = az network public-ip show -g $rg_name -n $pip2_name | ConvertFrom-Json
PS C:\> $pip2_address.ipAddress
74.176.50.120
クライアントVM:74.176.50.81
pacファイル配信用VM:74.176.50.120
であることが分かりました。
1.プロキシVMの構成
以下の記事を参考にして構成します。
2.クライアントVMの構成
pacファイルを作成
以下のようにpacファイルを作成します。
function FindProxyForURL(url, host)
{
if(shExpMatch(host,"bonjiri-blog.com")
|| shExpMatch(host,"ipinfo.io")
)
{
return "PROXY 10.12.0.68:8080";
}
else
return "DIRECT";
}
IISをインストール
まずIISをインストールします。
Install-WindowsFeature -Name Web-Server -IncludeManagementTools
pacファイルを配置する
wwwrootフォルダ配下に上記で作成した proxy.pac を置きます。
MIME type(MIMEの種類)に.pacを追加
IISマネージャの設定でMIME typeに.pacを追加します。
デフォルト設定ではMIME typeに.pacの拡張子がないため、これを設定せずにproxy.pacにアクセスするとエラーとなります。
ネットワーク設定でpacファイルを指定
設定>ネットワークとインターネット>プロキシ からproxy.pacを指定します。
これでクライアントVM側の設定も完了です
3.アクセス確認
実際にpacファイルによって特定のURL通信がプロキシ経由になるかを確かめます。
bonjiri-blog.comへのアクセス
以下の記事で自分の送信元グローバルIPが分かるので、アクセスしてみます。
pacファイルに記載したURLなので、プロキシVMのグローバルIP(74.176.50.120)が表示されるはずです。
想定通り、プロキシVMのグローバルIP(74.176.50.120)が表示されました。
また、プロキシのログを確認してみても通信はプロキシを経由していることが分かります。
xxxxxxxx@VM-Test-Proxy:~$ sudo cat /var/log/squid/access.log | grep bonjiri | tail -n 10
2024/11/23 12:53:59 1732366439.041 188389 10.12.0.4 TCP_TUNNEL/200 1301732 CONNECT bonjiri-blog.com:443 - HIER_DIRECT/103.3.2.10 -
2024/11/23 12:54:34 1732366474.313 6346 10.12.0.4 TCP_TUNNEL/200 451395 CONNECT bonjiri-blog.com:443 - HIER_DIRECT/103.3.2.10 -
2024/11/23 12:54:34 1732366474.316 6311 10.12.0.4 TCP_TUNNEL/200 434 CONNECT bonjiri-blog.com:443 - HIER_DIRECT/103.3.2.10 -
2024/11/23 12:58:01 1732366681.386 23 10.12.0.4 TCP_TUNNEL/200 3199 CONNECT bonjiri-blog.com:443 - HIER_DIRECT/103.3.2.10 -
2024/11/23 12:59:04 1732366744.292 5990 10.12.0.4 TCP_TUNNEL/200 427375 CONNECT bonjiri-blog.com:443 - HIER_DIRECT/103.3.2.10 -
2024/11/23 13:01:29 1732366889.301 207950 10.12.0.4 TCP_TUNNEL/200 818263 CONNECT bonjiri-blog.com:443 - HIER_DIRECT/103.3.2.10 -
2024/11/23 13:05:03 1732367103.375 347100 10.12.0.4 TCP_TUNNEL/200 852762 CONNECT bonjiri-blog.com:443 - HIER_DIRECT/103.3.2.10 -
2024/11/23 13:07:17 1732367237.455 23119 10.12.0.4 TCP_TUNNEL/200 445132 CONNECT bonjiri-blog.com:443 - HIER_DIRECT/103.3.2.10 -
2024/11/23 13:08:55 1732367335.971 180031 10.12.0.4 TCP_TUNNEL/200 497 CONNECT bonjiri-blog.com:443 - HIER_DIRECT/103.3.2.10 -
2024/11/23 13:09:15 1732367355.006 30004 10.12.0.4 TCP_TUNNEL/200 423393 CONNECT bonjiri-blog.com:443 - HIER_DIRECT/103.3.2.10 -
xxxxxxxx@VM-Test-Proxy:~$
www.cman.jpへのアクセス
このサイトも送信元グローバルIPアドレスが分かるサイトです。
今回pacファイル内で定義していないため、クライアントVMのグローバルIP(74.176.50.81)が表示されるはずです。
想定通り、クライアントVMのグローバルIPが表示されました。