私はWindows VPNを使用したいのですが、特定のネットワークだけに使用して、ネットワーク接続全体を引き継がないようにしたいのです
例:VPNをデフォルトルートにする代わりに、192.168.123.0/24のルートのみにする
(Ubuntuの場合はこの質問に解決策があることがわかりますが、Windowsでも時々これをやらなければならないことがあります)
これは、VPNに接続するたびにこれを行うように自動化することができますか?
159 Legooolas 2009-07-24
VPN のプロパティ, Networking
タブ, Internet Protocol (TCP/IP)
プロパティ, Advanced
, Use default gateway on remote network
のチェックを外すことで、接続全体の引き継ぎをオフにすることができます。これにより、VPN サーバーの設定によっては 192.168.123.0/24
へのルートが残る場合と残らない場合があります。残っていない場合は、毎回手動でルートを追加する必要がありますが、バッチファイルに追加することもできます
手動でルートを追加するには、(管理者として)実行します
route -p add 192.168.0.12 mask 255.255.255.255 10.100.100.254
この例では、VPNゲートウェイ10.100.100.254
を経由してIP192.168.0.12
へのルートを永続化します(再起動後にコマンドを実行する必要はありません)
http://technet.microsoft.com/en-us/library/bb878117.aspxでの詳細はこちら
153 TRS-80 2009-07-24
私は@TRS-80さんのテクニックを駆使して、これを成功させました
私は在宅で仕事をしていて、メールのために企業ネットワークにVPNをかけなければなりません(ウェブメールは大嫌いです!)
同時に、私は常に情報のためにサーフィンする必要があり、また、私のBGMのためにyoutubeを必要としています…今、あなたは間違いなくそれが歌っているロボットのように聞こえるようになりますので、VPNからyoutubeをストリーミングしたいとは思いません!:)
私は@TRS-80をフォローしただけです
VPNのプロパティ、ネットワーキングタブ、”インターネットプロトコル(TCP/IP) “プロパティ、詳細設定、”リモートネットワークでデフォルトのゲートウェイを使用する “のチェックを外します
と言って、自分でやってみました
DNSタブで「この接続アドレスをDNSに登録する」にチェックを入れます
すべてがシームレスに動作します
21 bPratik 2011-02-28
Windows 8+でAdd-VpnConnectionRoutecmdletを使用します
Add-VpnConnectionRoute -ConnectionName 'My VPN Connection' -DestinationPrefix 192.168.123.0/24
17 Der_Meister 2018-01-26
この答えはあなたの要求を反映したものではありませんが、私はこの目的のために特別にVMを使用しています。この方法では、VM内のネットワークだけがルートによって制限されます
他の人のより良い答えが見つかるかもしれませんが、少なくともこれはVMが作成された後の簡単な解決策として考慮すべきことを与えてくれるかもしれません
10 Wayne 2009-07-24
私はそれがルートコマンドで直接インターフェイスを指定する必要があることを発見しました。これがないと、WindowsはVPNではなく、メインのネットワークカードのインターフェースを使うことになります。私の場合は以下のようになります
route -p add 192.168.10.187 mask 255.255.255.255 0.0.0.0 IF 26
:: ^destination ^mask ^gateway ^interface
‘if 26’に注意してください
7 Dmitry Petrov 2013-09-25
ネットワークについてあまり知らない私のような初心者のための「短い」ガイド。ここではあまり新しいことはありませんが、以前の回答や他の関連するスレッドで説明されているすべての良いオプションの要約です。全体の手順は3つの基本的な手順で構成されています
1) すべてのトラフィックをVPNを経由しないようにします。そのためには、VPN設定のUse default gateway on remote network
チェックボックスのチェックを外す必要があります。IPv4とIPv6の両方でこのチェックボックスのチェックを外すことを確認してください。通常は、VPN接続のためにIPv6プロトコルを完全に無効にするだけです
私の経験では、VPN接続が確立された後に必要なルート(VPN経由で必要なトラフィックを誘導するルート)が自動的に追加されることがあります。このようなルールがどこでどのように設定されているのか正確にはわかりませんが、このようなシナリオは存在します – おそらく、VPN ネットワーク管理者が行う何らかの魔法のようなものでしょう
2) 必要なトラフィックだけをVPN経由にする。そのためには、ルートを定義する必要があります。ここでは3つのオプションがあります
2.1) VPNゲートウェイを経由した恒久的なルートを追加します
route -p add a.b.c.d/<CIDR> w.x.y.z
またはroute -p add a.b.c.d mask e.f.g.h w.x.y.z
の場合
ここで、’VPNゲートウェイ’ = ‘VPNネットワーク上のあなたのIP’ = w.x.y.z
とターゲットアドレス/ネットワーク = a.b.c.d
となります。w.x.y.z
は ipconfig
を実行して VPN 接続名を探すか、PowerShell を使っている場合は ipconfig | grep -A5 PPP
を実行することでコンパクトな出力を得ることができます (これは PPP 接続を見つけた後に 5 行出力されます)
短所:VPNのIPが変更された場合、ルートを再作成する必要があります
2.2) VPNネットワークインタフェースを介して恒久的なルートを追加します
route -p add a.b.c.d/<CIDR> 0.0.0.0 IF <interface number>
ここで、a.b.c.d
はターゲットアドレス/ネットワーク、interface number
はVPN接続の識別子です。この ID は netstat -rn
を実行するか、よりコンパクトな出力のために netstat -rn | grep -A10 'Interface List'
を実行することで見つけることができます
長所:VPNアドレス(w.x.y.z
)が変われば何も変える必要がない
欠点:VPN接続を削除した場合、新しいIDでルートを再作成する必要がある
2.3) PowerShellのコマンドレットを使う
Add-VpnConnectionRoute -ConnectionName '<VPN connection name>' -DestinationPrefix a.b.c.d/<CIDR>
長所:VPN接続が確立されるたびに必要なルートを追加し、切断されるたびに削除する
短所: Get-VpnConnectionRoutes
のcmdletがないので、これらのルールを管理するのが大変かもしれません
3) ルーティングが期待通りに動作するかどうかを確認してください!
永続的なルートを追加した場合は、netstat -rn | grep -A10 'Persistent Routes'
を実行することで確認できます
そして最後に、VPN経由でアクセスされることになっているIPアドレスと、VPNなしで動作するはずのIPアドレスの両方に対して、いくつかのtracert
コマンドを実行します
7 o.v 2019-08-07
IPV4 と IPV6 の両方を使用している場合は、IPV4 のみを使用している場合でも、両方の場所で「リモートネットワークでデフォルトゲートウェイを使用する」のチェックを外す必要があります
4 Dave 2011-07-29
CMAKを使用して、クライアントがダウンロードできるルーティングファイルを設定すると…windowsはルーティングファイルをダウンロードして、適切なルートを調整します。デフォルトのルートを削除したり、静的なルートを追加したりするオプションがあります。これはスプリットトンネルとして知られている
ここに良いハウツーがあります。http://blogs.technet.com/b/rrasblog/archive/2007/06/11/split-tunnelling-using-cmak.aspx
3 TheCompWiz 2011-03-28
私のソリューションを追加したいと思います。これは Windows 7 またはそれ以降の Cygwin を搭載した UNIX シェル上で動作しますが、MSYS2、ビルド 14986 以降の Bash-on-Windows [WSL]、または Busybox for Windows でも動作するはずです)。管理者権限で実行する必要があります
これはいくつかの設定を持っていて、明示的に設定していないもののいくつかを検出しようとします。また、インターフェイス番号 (IF) を明示的に設定して、(私のような) 何人かのユーザがここにある他の解決策を使っていた問題に対抗しています
#!/bin/sh
# these three settings are required
adapter_name='VPN Connection'
username=
password=
# This setting here might be important because it's about the target network
# and in some cases it can't be properly determined automatically so this might
# be then worth setting.
# Format is in CIDR notation with the network address and a forward slash and
# the amount of network bits
target_network=192.168.0.0/24
# the IP you will get on the target network, also the VPN gateway on your
# local machine, you normally don't need to set this as the script tries to
# detect it
ip=
# optional setting for metric which normally shouldn't be necessary,
# except in te very rare cases where it should be set to a value lower than all
# other routes that might match the target network
metric=
# experimental setting to delete routes to the target network prior and after
# should normally not be needed unless this script fails and you get error
# messages like 'The route addition failed: The object already exists.'
route_cleanup=F
prog_name=${0##*/}
msg() {
printf '%s: %s\n' "$prog_name" "$*"
}
die() {
msg "$*" >&2
exit 1
}
[ "$adapter_name" ] || die "Adapter name not set!"
[ "$username" ] || die "Username not set!"
[ "$password" ] || die "Password not set!"
if [ "$(uname -o)" != 'MS/Windows' ]; then
id -G | grep -qE '\<0|544\>' || die 'Not running with admin rights.'
fi
msg "Disconnecting any existing connection that might exist."
rasdial.exe "$adapter_name" /d
msg "Connecting"
rasdial.exe "$adapter_name" "$username" "$password"
if [ ! "$ip" ]; then
msg "Getting IP address on target network."
ip=$(netsh.exe interface ip show config name="$adapter_name" |
grep -a 'IP Address' | awk -F'[: ]+' '{print $4}')
[ "$ip" ] || die 'Could not get IP! Exiting.'
msg "Detected IP address as '$ip'."
fi
if [ ! "$target_network" ]; then
msg "Getting target network."
target_network=$(netsh.exe interface ip show config name="$adapter_name" |
grep -a 'Subnet Prefix' | awk -F'[: ]+' '{print $4}')
[ "$target_network" ] || die 'Could not get target network! Exiting.'
msg "Detected target network as '$target_network'."
fi
msg "Getting VPN interface number."
if=$(ROUTE.EXE print -4 | grep -a "$adapter_name" |
awk -F. '{gsub(" ", "");print $1}')
[ "$if" ] || die 'Could not get interface number! Exiting.'
msg "Detected VPN interface number as '$if'."
if [ "$route_cleanup" = T ]; then
msg "Deleting any potentially already existing routes for the target network."
ROUTE.EXE delete "$target_network"
fi
msg "Adding route for target network."
if [ "$metric" ]; then
ROUTE.EXE add "$target_network" "$ip" IF "$if" Metric "$metric"
else
ROUTE.EXE add "$target_network" "$ip" IF "$if"
fi
msg "VPN should be up now."
msg "Press enter to make it stop."
read -r _
if [ "$route_cleanup" = T ]; then
msg "Deleting route."
ROUTE.EXE delete "$target_network"
fi
msg "Disconnecting."
rasdial.exe "$adapter_name" /d
# msg "Press enter to exit."
# read -r _
exit 0
また、手動でメトリックを低く設定する必要があるかもしれませんし、そうしないと VPN 向けのトラフィックよりも先にデフォルトのルートが一致してしまうことにも注意が必要です。これを行うには、アダプタの設定で VPN アダプタの “… Properties” メニュー項目を開きます → “Networking” タブ → “Internet Protocol Version 4 (TCP/IP)” プロパティ → “Advanced” → そこで “Automatic metric” チェックボックスのチェックを外し (もちろん “Use default gateway ….” に加えて)、”Interface metric:” フィールドの値をデフォルトルートよりも低い値に設定します (ROUTE.EXE -4 print
の出力を参照)
2 phk 2015-10-26
少し古いですが、別のマシンを使った方法を見つけました。私はラップトップでVPN接続を設定し、その上でFreeProxyをSocks5で設定しています
その結果、FireFox や Socks5 のプロキシを使うように設定されたものを使うと、VPN を使うようになり、それ以外の場合は標準的なルーティングを使うようになりました
1 Lonnie 2010-04-20
netcatcherのようなものを使うことができます。VPNセッションを接続したり切断したりすると、自動的にルートを追加したり削除したりします。VPNのIPアドレスが動的に取得されている場合(DHCP)、netcatcherはそれをキャッチし、正しい方法でルートを更新します
1 Andy 2011-08-30
ロシアのフォーラムから。http://forum.ixbt.com/topic.cgi?id=14:43549
ファイル(ex: vpn_route.vbs)として保存し、VPN接続後にコマンドを実行します
cscript vpn_route.vbs
vpn_route.vbs:
strComputer = "."
strMACAddress = "MAC of VPN interface here (example 00:45:55:00:00:00)"
strTarget = "route target here (example 192.168.123.0)"
strMask = "mask here (example 255.255.255.0)"
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery _
("Select * From Win32_NetworkAdapterConfiguration Where MACAddress = '" & strMACAddress & "'")
For Each objItem in colItems
strIP = objItem.IPAddress(0)
Next
Set objShell = CreateObject("WScript.Shell")
objShell.Run "route add " & strTarget & " mask " & strMask & " " & strIP
1 shibormot 2013-02-18
これは、追加のプログラムやバッチファイル、コマンドラインを使用しない限り、Windowsでは実行できません。別の方法としては、VPN を実行できる仮想マシン (または物理マシン) を入手することができます
これほど簡単に説明できることが、実現するのが難しいというのは奇妙なことのように思えます。あるプログラムからのトラフィックを VPN インターフェイスにルーティングし、他のすべてのプログラムをデフォルトの NIC インターフェイスにルーティングするだけで、どれだけ難しいことができるでしょうか?そのために仮想マシン全体をセットアップする必要があるのでしょうか?そして、Linuxではそれが可能ですが、その解決策もあまりエレガントではありません
それも非常に求められています。私は同じテーマのスレッドに何十も出くわしました。だから、誰かがこの馬鹿げたことに気付いて何かしてくれることを願うばかりです。(Windows 8で!)
このソリューションは、帰属しないバッチファイルからのものです。それはわずかに適応されています
Windows 7の説明書
スクリプトは再起動するまで、VPN に接続してトラフィックをルートします – route add
を route -p add
に置き換えることで変更を持続させることができますが、VPN で持続的な IP を持っていない場合は、VPN の IP が変更されると、最終的に動作しなくなります
- ネットワークと共有センターを開きます
- VPN接続のプロパティを開きます
Networking
タブをクリックします- IPv4 と 6 の両方の場合:
- Click
Properties
- Click
Advanced
Use default gateway[...]
のチェックを外す
- Click
- 前の手順で開いたものをすべて閉じます
- 以下のバッチスクリプトを編集して保存します
- 管理者として実行してください
スクリプトの中で以下のように置き換える必要があります
<VPN>
に作成したVPN接続の名前を入れてください<USER>
をVPNユーザー名で指定します<PASS>
をVPNパスワードで<TARGET>
にVPNを経由してルーティングしたいIPアドレスを指定します(より多くのアドレスをルーティングしたい場合は、ターゲットが使用される3行を重複して指定するだけです)
注意: パスワードをファイルに保存したくない場合は、<PASS>
を%password%
に置き換え、スクリプトの1行目の後に次のように追加してください。set password= Input password:
Script
@echo off
@echo make sure to be disconnected!
rasdial <VPN> /d
@echo start to connect to vpn
rasdial <VPN> <USER> <PASS>
netsh interface ip show config name="<VPN>" | findstr "IP" > ip.dat
set /p ip= < ip.dat
del ip.dat
set ip=%ip:~-12%
@echo VPN IP is %ip%
set target=<TARGET>
@echo Add route for %target%
route add %target% mask 255.255.255.255 %ip%
timeout /T 3 > nul
1 Xantippe 2010-10-11