Windows VPNルート選択トラフィック(宛先ネットワークごと)を作成するにはどうすればよいですか?


139

Windows VPNを使用したいのですが、ネットワーク接続全体を引き継がないように、特定のネットワークのみに使用します。

たとえば、VPNがデフォルトルートになる代わりに、192.168.123.0 / 24のルートのみにします

この質問にはUbuntu向けの解決策があることがわかりますが、Windowsでもこれを行う必要がある場合があります)

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


VPNを介して多数のサイトをフィルタリングするための関連する質問はありますか?ここでの回答は、VPNの背後に単一のサイトがある場合にのみ機能するようです。私は中国にいて、使用したいサイトの約半分がブロックされているため、VPNを通過する必要がありますが、VPNを使用しない他のサイトはより高速でスムーズです。
ヒッピートレイル

先に進み、新しい質問をしました:superuser.com/questions/925947
hippietrail

回答:


139

VPNのプロパティ、Networkingタブ、Internet Protocol (TCP/IP)プロパティAdvanced、、チェックを外すことで、接続全体の引き継ぎをオフにできますUse default gateway on remote network。これは192.168.123.0/24、VPNサーバーのセットアップに応じて、ルートを残す場合とできない場合があります。そうでない場合は、毎回手動でルートを追加する必要がありますが、それをバッチファイルに入れることもできます。

ルートを手動で追加するには、次を実行します(管理者として):

route -p add 192.168.0.12 mask 255.255.255.255 10.100.100.254

この例では192.168.0.12、VPNゲートウェイを介したIPへの永続的な(再起動後にコマンドを実行する必要はありません)ルートを作成します10.100.100.254

詳細については、http://technet.microsoft.com/en-us/library/bb878117.aspxをご覧ください。


1
「ルートを手動で追加する必要があります」...方法は?誰かが「192.168.10.123」をvpnに強制的に通過させますが、それ以外のことは何ですか?
ティモシーコウリ

16
個人的には、チェックボックスをオフにするだけで十分であることがわかりました。ルートを追加する必要はありませんでした。多数のトレーサーを使用して、期待通りにすべてが進んでいることを確認しました。
-eidylon

1
同じように、必要なのはこのチェックボックスだけでした。
ルク

1
どうか明らかにしてください。どのトラフィックがVPN経由でルーティングされますか?VPNサーバーのIPをターゲットとするトラフィックですか?たとえば、VPN接続が「my.domain.com」に行く場合、「my.domain.com」へのクライアント上のすべてのトラフィックはVPNを経由し、他のすべてはデフォルトゲートウェイに行きますか。
トリインコ

1
「ルート印刷」コマンドを使用して、Windows 7が生成したルートが完全に間違っていることを確認しました。VPNのIP宛てのトラフィックをVPNに送信していませんでした...代わりに、ローカルゲートウェイに送信していました。表にはいくつかの循環エントリもありました。Windowsが作成したルートを削除し、VPNサーバーのIPアドレスエントリがインターフェイスのクライアントのVPNゲートウェイとローカルIPを使用するように、正しいルートを手動で追加しました。その後、VPNサーバーへのトラフィックはVPNトンネルを経由して正常にルーティングされ、他のすべてのトラフィックは予想どおり影響を受けませんでした。うまくいく。
トリインコ

20

私は正常に使用TRS-80 @これを達成するための技術。

私は自宅で仕事をしており、電子メールのために企業ネットワークにVPN接続する必要があります(Webメールが嫌いです!!)。

同時に、私は情報のために絶えずサーフィンする必要があり、バックグラウンドミュージックにもYouTubeが必要です。今では、YouTubeをVPNからストリーミングすることは絶対に望まないでしょう。:)

私がしたことは、@ TRS-80をフォローすることだけでした。

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

そして、自分でやった:

[DNS]タブで、[この接続アドレスをDNSに登録する]にチェックマークを付けます

すべてがシームレスに機能します!


9

この答えはあなたのリクエストを反映していませんが、私はこの目的のためにVMを使用しています。これにより、VM内のネットワークのみがルートによって制限されます。

他の人がより良い答えを見つけるかもしれませんが、少なくともこれは、VMが作成された後の簡単な解決策として考慮すべきことを与えるかもしれません。


これは、ハードウェアが適切に処理できる場合に適したソリューションです。
エニグマ

このスレッドが見つかるまで、このソリューションを何年も使用していました。:)
ov

7

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」に注意してください。


これも私にとってはうまくいきました。必要なインターフェイスを見つけるには、「route print」コマンドを実行し、使用可能なインターフェイスのリストを表示する最初の行を確認します(VPNを見つけて、IFを確認します-最初の列にあります)。
-Funbit

これに関するすばらしい記事があります:link。デフォルトゲートウェイIPとして0.0.0.0を使用することもうまくいくようで、変更時に調整する必要はありません。この答えに組み込むのは素晴らしいことです。なぜなら、それは一番上のものよりもはるかに便利だからです。
lpd


4

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


3

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

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


2

ソリューションをミックスに追加したい。Windows 7以降のCygwinを搭載したUNIXシェルで実行されますが、ビルド14986後のMSYS2、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アダプターの[ …プロパティ ]メニュー項目を開くアダプター設定→ [ ネットワーク ]タブ→[ インターネットプロトコルバージョン4(TCP / IP)]プロパティ→[ 詳細] →でチェックを外します。もちろん、デフォルトゲートウェイを使用するに加えて「自動メトリック」チェックボックスをオンにし、「インターフェースメトリック:」フィールドの値をデフォルトルートよりも低い値に設定します(ROUTE.EXE -4 print出力を参照)。


1

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

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


1

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


2
これがあなたが書いたものである場合、anseko.com / about.htmlでよくある質問を参照する必要があることを開示する必要があります
ジェフアトウッド

1

ロシアのフォーラムから: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

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

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

それも非常に人気があります。同じテーマで何十ものスレッドに出くわしました。だから、誰かがこれのばかげたことに気づいて、それについて何かをすることを願っています。(Windows 8で!)

このソリューションは、属性のないバッチファイルからのものです。それは少し適応されています。

Windows 7の手順

このスクリプトは、再起動するまで、あなたのVPN経由のトラフィックにとルート接続する-あなたは置き換えることができるroute addroute -p addの変化が持続するために、しかし、あなたはあなたのVPNとの永続的なIPを持っていない場合は、それが最終的にするとき、あなたのVPNのIPの変更作業を停止します。

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

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

  • <VPN> 作成したVPN接続の名前
  • <USER> VPNユーザー名で
  • <PASS> VPNパスワード付き
  • <TARGET> VPN経由でルーティングするIPアドレスを使用します(さらに多くのアドレスをルーティングする場合は、ターゲットが使用されている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

0

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

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

!これらのルールがどこでどのように構成されているかは正確にはわかりませんが、そのようなシナリオは存在します。おそらく、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です。VPN接続名をw.x.y.z実行ipconfigして検索することで見つけることができます。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コマンドレットがないため、これらのルールを管理するのが難しい場合があります。

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.