web-dev-qa-db-ja.com

Windows VPNに選択的なトラフィックを(宛先ネットワークごとに)ルーティングさせるにはどうすればよいですか。

Windows VPNを使用したいのですが、特定のネットワーク専用にして、ネットワーク接続全体を占有しないようにします。

たとえば、VPNがデフォルトルートになるのではなく、192.168.123.0/24のルートのみにする

(この質問にはUbuntu に対する解決策があることがわかります が、Windowsでもこれを実行する必要があります)。

これを自動化して、VPNに接続するたびにこれが行われるようにすることはできますか?

136
Legooolas

あなたは、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ゲートウェイ192.168.0.12を介してIP 10.100.100.254への永続的な(再起動後にコマンドを実行する必要はありません)ルートを作成します。

これについての詳細は http://technet.Microsoft.com/ja-jp/library/bb878117.aspx

136
TRS-80

これを実現するために、@ TRS-80の手法を使用しました。

私は自宅で仕事をしていて、私のEメールのために企業ネットワークにVPN接続しなければなりません(私はWebメールが嫌いです!!)。

同時に、私は絶えず情報のためにサーフィンをしていて、また私のバックグラウンドミュージックのためにyoutubeを必要としています。 :)

私がしたのは@ TRS-80に従っただけです。

vPNのプロパティ、[ネットワーク]タブ、[インターネットプロトコル(TCP/IP)]のプロパティ、[詳細]の順にクリックし、[リモートネットワークでデフォルトゲートウェイを使用する]のチェックを外します。

それから私自身のことをしました:

[DNS]タブで、[この接続アドレスをDNSに登録する]をクリックします。

すべてがシームレスに動作します。

19
bPratik

確かにこの答えはあなたの要求を反映していませんが、私は特にこの目的のためにVMを使用しています。そのようにしてVMの中のネットワークだけが経路によって制限されます。

他の人からより良い答えが見つかるかもしれませんが、VMが作成された後は、少なくともこれが簡単な解決策になるので検討すべき点がいくつかあります。

8
Wayne

私はそれがrouteコマンドで直接インタフェースを指す必要があることがわかりました。それがなければ、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

iPV4とIPV6の両方を使用している場合は、IPV4のみを使用している場合でも、両方の場所で[リモートネットワークでデフォルトゲートウェイを使用する]をオフにする必要があります。

4
Dave

CMAKを使用してクライアントがダウンロードできるルーティングファイルを設定すると、...ウィンドウがルーティングファイルをダウンロードし、必要に応じてルートを調整します。デフォルトルートを削除したり、さまざまなスタティックルートなどを追加するオプションがあります。これはスプリットトンネルbtwとして知られています。

ここで良い使い方があります: http://blogs.technet.com/b/rrasblog/archive/2007/06/11/split-tunnelling-using-cmak.aspx

3
TheCompWiz

私は自分のソリューションをミックスに追加したいのです。 Windows 7以降のCygwin搭載のUNIXシェルで動作しますが、ビルド14986以降のMSYS2、Bash-on-Windows [WSL]、またはWindows用のBusyboxでも動作します。管理者権限で実行する必要があります。

いくつかの設定があり、あなたが明示的に設定しなかったことのいくつかを検出しようとします。また、インターフェイス番号(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" タブ→「インターネットプロトコルバージョン4(TCP/IP)」プロパティ→「詳細設定」→そこからのチェックを外します。 ] [自動メトリック] チェックボックス( "デフォルトゲートウェイの使用…" に加えて)を追加し、 "インターフェイスに値を設定します。 metric: "フィールドをデフォルトルートよりも低い値にする(ROUTE.EXE -4 printの出力を参照).

2
phk

Windows 8以降では Add-VpnConnectionRoute コマンドレットを使用します。

Add-VpnConnectionRoute -ConnectionName 'My VPN Connection' -DestinationPrefix 192.168.123.0/24
2
Der_Meister

あなたは netcatcher のようなものを使うことができます - ちょうどあなたが一度必要とするすべてのルートを加えて、それを忘れてください。 VPNセッションを接続または切断すると、自動的に経路が追加および削除されます。あなたのVPN IPアドレスが動的に取得されている場合(DHCP)、netcatcherはそれをキャッチして正しい方法でルートを更新します。

1
Andy

ロシアのフォーラムから: http://forum.ixbt.com/topic.cgi?id=14:43549

ファイルとして保存し(例: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

少し古いですが、私は別のマシンを使ってこれを行う方法を見つけました。私はVPN接続を設定したラップトップを持っていて、そこでFreeProxyをSocks5で設定しています。

その後、ラップトップのプロキシサーバーを使用するようにクライアントマシンにFirefoxを設定します。その結果、FireFoxまたはそのSocks 5プロキシを使用するように設定されたものを使用するとVPNが使用されます。

1
Lonnie

追加のプログラム、バッチファイル、またはコマンドラインを使用せずにWindowsでこれを行うことはできません。別の方法としては、VPNを実行できる仮想(または物理)マシンを入手することです。

これと同じくらい簡単に説明できるものが達成するのがとても難しいのは不思議に思えます。あるプログラムからのトラフィックをVPNインタフェースにルーティングし、他のすべてのプログラムからデフォルトのNICインタフェースにトラフィックをルーティングするだけでは、どれほど難しいのでしょうか。そのために仮想マシン全体を設定する必要があるのはなぜでしょうか。そしてLinuxではそれは可能ですが、その解決策はあまり洗練されていません。

それは非常に大いに求められていました:私は同じ主題に関して何十ものスレッドに出くわしました。だから私は誰かがこれのばかげたことを理解してそれについて何かをすることを願っています。 (Windows 8の場合)

この解決策は、 未割り当てバッチファイル からのものです。それは少し適応されています。

Windows 7用のインストラクション

スクリプトは再起動するまでVPNに接続してトラフィックをルーティングします - 変更を持続させるためにroute addroute -p addに置き換えることができます。変更します。

  1. ネットワークと共有センターを開く
  2. VPN接続のプロパティを開く
  3. Networkingタブをクリック
  4. IPv4と6の両方:
    1. Propertiesをクリック
    2. Advancedをクリック
    3. Use default gateway[...]のチェックを外します
  5. 前の手順で開いたものをすべて閉じる
  6. 下記のバッチスクリプトを編集して保存します。
  7. 管理者として実行してください

スクリプト内で次のものを置き換える必要があります。

  • 作成したVPN接続の名前を含む<VPN>
  • VPNユーザー名を持つ<USER>
  • VPNパスワードを含む<PASS>
  • VPN経由でルーティングしたいIPアドレスを含む<TARGET>(もっと多くのアドレスをルーティングしたい場合は、ターゲットが使用されている3行を複製するだけです)

注:パスワードをファイルに保存したくない場合は、<PASS>%password%に置き換えて、スクリプトの最初の行の後に次を追加してください:set password= Input password:

スクリプト

@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

ネットワークのことをあまり知らない私のような初心者向けの「短い」ガイド。ここではそれほど新しいものではありませんが、以前の回答や他の関連するスレッドで説明されているすべての優れたオプションの概要です。全体の手順は、3つの基本的な手順で構成されています。

1)VPN経由ではないallトラフィックを作成します。このため、VPN設定のUse default gateway on remote networkチェックボックスをオフにする必要があります。 IPv4とIPv6の両方について、このチェックボックスをオフにしてください。通常、VPN接続のIPv6プロトコルを完全に無効にします。

(!)そのチェックボックスのチェックを外すと通常の作業に十分である可能性があります-私の経験では、VPN接続が確立された後、必要なルート(VPNを介して必要なトラフィックを誘導します)を自動的に追加できます。これらのルールがどこでどのように構成されているかは正確にはわかりませんが、そのようなシナリオは存在します。おそらく、VPNネットワーク管理者が行った魔法のようです。

2)のみnecessaryトラフィックを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.dw.x.y.zを見つけるには、ipconfigを実行してVPN接続名を探します。または、PowerShellを使用している場合、ipconfig | grep -A5 PPPを実行してコンパクトな出力を取得できます。 PPP接続)。

短所: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コマンドレットがないため、これらのルールを管理するのが難しい場合があります。

)ルーティングが期待どおりに機能することを確認してください!

永続的なルートを追加した場合は、netstat -rn | grep -A10 'Persistent Routes'を実行して確認できます。

そして、最後に、VPN経由でアクセスされるはずのIPアドレスと、VPNなしで動作するはずのIPアドレスの両方に対して、いくつかのtracertコマンドを実行します。

0
o.v