LoginSignup
3

Windows: 特定のIPアドレスやドメインだけVPN経由にするスクリプト

Posted at

ビデオ通話しながら検証したりペア作業をすることはよくありますが、サーバや開発環境につ繋ぐためVPN接続する必要があり、ビデオ通話はVPN使わない通信でサーバなどはVPN経由と分けたいです。

そこでこちらの記事を参考にして、ルーティングを指定しています。

ルーティングではドメインを指定できないためURLのような条件ではDNSからIPアドレスを引いてきています。
ドメインのIPアドレスが固定ならいいのですがIPアドレスが変わるものがあるため、たびたびルーティングの再設定を強いられることがあります。
手で更新していましたが、対象のドメインが複数あり手間なのでスクリプトで自動化しました。

手順

事前準備

  1. VPN設定
    上でリンクを貼っている記事などを参考に、VPN接続設定をし、すべての宛先でVPNを使わないようにします。

  2. VPN接続時のダイアログ非表示設定
    コマンドで操作したいので接続ダイアログを表示しないようにします。

以下のファイルを開き、該当のVPN接続でPreviewUserPwを1から0に変更します。
C:\Users\{ユーザー名}\AppData\Roaming\Microsoft\Network\Connections\Pbk\rasphone.pbk

rasphone.pbk
[VPN接続名]
Encoding=1
PBVersion=6
Type=2
...
- PreviewUserPw=1
+ PreviewUserPw=0
...

接続スクリプトファイル

PowerShellでスクリプトを書き、batファイルでクリック起動できるようにしました。

connect-vpn.ps1
$VpnName = "XXXXXX"     # TODO: VPN接続名

###############################
# 登録済みIPアドレスをリセット
###############################
$DestinationList = (Get-VpnConnection $VpnName).Routes | Select DestinationPrefix
foreach ($Destination in $DestinationList){
     Remove-VpnConnectionRoute $VpnName -DestinationPrefix  $Destination.DestinationPrefix
}

###############################
# VPN経由にするIPアドレスを設定
###############################
$StaticIpList = @(
	"999.999.999.999/32"	# TODO: 任意のIPアドレス
	"999.999.999.0/24"
)
foreach ($StaticIp in $StaticIpList){
     Add-VpnConnectionRoute $VpnName -DestinationPrefix  $StaticIp
}

###############################
# VPN経由にするドメインを設定
###############################
$DomainList = @(
    "qiita.com"    # TODO: 任意のドメイン
    "google.com"
)
# ドメインのIPアドレスを特定して、VPNに登録する
foreach ($Domain in $DomainList){
    $DnsList = Resolve-DnsName -Name $Domain -Server 1.1.1.1 -Type A

    foreach ($Dns in $DnsList){
        $DnsIP = $Dns | Select IPAddress
        if([string]::IsNullOrEmpty($DnsIP.IPAddress)) { continue }
        Add-VpnConnectionRoute $VpnName -DestinationPrefix "$($DnsIP.IPAddress)/32"
    }
}

###############################
# VPN再接続
###############################
# VPN切断
rasphone -h $VpnName

# VPN接続
rasphone -d $VpnName

ps1ファイルはクリック起動できないので、batファイルから呼び出す形にします。

connect-vpn.bat
@echo off
powershell -NoProfile -ExecutionPolicy Unrestricted .\connect-vpn.ps1
exit

ドメインのIPアドレスが変わる頻度が高い場合は定期的に更新するような処理にした方がいいかもしれません。
再接続せずにルーティングを反映する方法が分からないので、今のところは必要な時にこのbatを叩いています。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
3