Bagaimana saya bisa membuat lalu lintas selektif rute Windows VPN (berdasarkan jaringan tujuan)?

139

Saya ingin menggunakan VPN Windows tetapi hanya untuk jaringan tertentu, sehingga tidak mengambil alih seluruh koneksi jaringan saya.

misalnya, Alih-alih VPN menjadi rute default, jadikan hanya rute untuk 192.168.123.0/24

(Saya dapat melihat bahwa ada solusi untuk ini untuk Ubuntu dalam pertanyaan ini , tetapi kadang-kadang saya harus melakukan ini pada Windows juga)

Bisakah ini diotomatiskan sehingga setiap kali saya terhubung ke VPN ia melakukan ini?

Legooolas
sumber
Apakah ada pertanyaan terkait untuk memfilter banyak situs melalui VPN? Sepertinya jawaban di sini hanya akan berfungsi untuk kasus di mana ada satu situs di belakang VPN. Saya di China dan sekitar setengah situs yang ingin saya gunakan diblokir sehingga harus melalui VPN tetapi situs lain lebih cepat / lebih lancar tanpa VPN.
hippietrail
Saya melanjutkan dan mengajukan pertanyaan baru: superuser.com/questions/925947
hippietrail

Jawaban:

139

Anda dapat mematikan pengambilan alih seluruh koneksi Anda dengan membuka properti VPN, Networkingtab, Internet Protocol (TCP/IP)properties Advanced,, untick Use default gateway on remote network. Ini mungkin atau mungkin tidak meninggalkan rute 192.168.123.0/24tergantung pada pengaturan server VPN. Jika tidak, Anda harus menambahkan rute secara manual setiap kali, meskipun Anda bisa memasukkannya ke dalam file batch.

Untuk menambahkan rute secara manual, jalankan (sebagai administrator):

route -p add 192.168.0.12 mask 255.255.255.255 10.100.100.254

Contoh ini akan membuat rute yang persisten (tidak perlu menjalankan perintah setelah reboot) ke IP 192.168.0.12melalui gateway VPN 10.100.100.254.

Lebih lanjut tentang ini di http://technet.microsoft.com/en-us/library/bb878117.aspx

TRS-80
sumber
1
"Anda harus secara manual menambahkan rute" ... bagaimana? Bagaimana seseorang memaksa, katakanlah, "192.168.10.123" untuk melalui vpn, tetapi tidak ada yang lain?
Timothy Khouri
16
Secara pribadi, saya menemukan hanya mematikan kotak centang sudah cukup. Saya tidak perlu menambahkan rute apa pun. Saya memverifikasi semuanya berjalan di mana saya harapkan melalui banyak tracerts.
eidylon
1
Sama, kotak centang ini adalah semua yang diperlukan.
Luk
1
Mohon klarifikasi. Lalu lintas mana yang diarahkan melalui VPN? Apakah hanya lalu lintas yang ditargetkan ke IP server VPN? Misalnya, jika koneksi VPN menuju ke "my.domain.com", lalu apakah itu berarti semua lalu lintas pada klien untuk "my.domain.com" melewati VPN, dan yang lainnya pergi ke gateway default?
Triynko
1
Saya menggunakan perintah "route print", dan memverifikasi bahwa rute yang dihasilkan Windows 7 salah. Itu tidak mengirim lalu lintas yang ditujukan ke IP VPN saya ke VPN ... melainkan mengirimnya ke gateway lokal saya. Ada juga beberapa entri melingkar di tabel. Saya menghapus rute yang dibuat Windows, lalu secara manual menambahkan rute yang benar sehingga entri alamat IP server VPN saya akan menggunakan gateway VPN dan IP lokal klien untuk antarmuka. Lalu lintas ke server VPN saya kemudian berhasil dialihkan melalui terowongan VPN, dan semua lalu lintas lainnya tidak terpengaruh seperti yang diharapkan. Bekerja dengan baik.
Triynko
20

Saya berhasil menggunakan teknik @ TRS-80 untuk mencapai ini.

Saya bekerja dari rumah dan harus VPN ke jaringan perusahaan untuk email saya (saya benci webmail !!).

Pada saat yang sama, saya harus terus berselancar untuk mendapatkan info dan juga membutuhkan youtube untuk musik latar belakang saya ... Sekarang Anda pasti tidak ingin melakukan streaming youtube dari VPN karena itu membuatnya seperti Robot Singing !!! :)

Yang saya lakukan adalah mengikuti @ TRS-80:

properti dari VPN, tab Networking, "Internet Protocol (TCP / IP)" properti, Advanced, hapus centang "Gunakan gateway default pada jaringan jarak jauh"

dan kemudian lakukan sendiri:

di bawah tab DNS, centang "daftarkan alamat koneksi ini dalam DNS"

Semua bekerja dengan mulus!

bPratik
sumber
9

Mengabulkan jawaban ini tidak mencerminkan permintaan Anda, tetapi saya menggunakan VM khusus untuk tujuan ini. Dengan begitu hanya jaringan di dalam VM yang dibatasi oleh rute.

Anda mungkin menemukan beberapa jawaban yang lebih baik oleh orang lain tetapi setidaknya ini dapat memberi Anda sesuatu untuk dipertimbangkan karena ini merupakan solusi yang mudah setelah VM dibuat.

Wayne
sumber
Ini adalah solusi yang baik asalkan perangkat keras Anda dapat menanganinya dengan baik.
Enigma
Menggunakan solusi ini selama bertahun-tahun, hingga menemukan utas ini. :)
ov
7

Saya menemukan bahwa itu perlu langsung menunjuk antarmuka dalam perintah rute. Tanpa itu, Windows akan menggunakan antarmuka kartu jaringan utama, bukan VPN. Dalam kasus saya, sepertinya

route -p add 192.168.10.187 mask 255.255.255.255 0.0.0.0 IF 26
::           ^destination        ^mask           ^gateway   ^interface

catat 'IF 26'.

Dmitry Petrov
sumber
Ini juga bekerja untuk saya. Untuk mengetahui antarmuka mana yang Anda perlukan, cukup jalankan perintah "cetak rute" dan periksa baris pertama yang menampilkan daftar antarmuka yang tersedia (temukan VPN Anda di sana dan periksa IF-nya - itu akan berada di kolom pertama).
Funbit
Ada artikel yang brilian tentang ini: tautan . Menggunakan 0.0.0.0 sebagai IP gateway default tampaknya berfungsi dengan baik juga, jadi tidak perlu disesuaikan saat perubahan. Akan sangat bagus untuk dimasukkan dalam jawaban ini, karena imo itu jauh lebih berguna daripada yang teratas.
lpd
5

Gunakan cmdlet Add-VpnConnectionRoute di Windows 8+.

Add-VpnConnectionRoute -ConnectionName 'My VPN Connection' -DestinationPrefix 192.168.123.0/24
Der_Meister
sumber
Ini bekerja dengan baik untuk saya di Windows 10.
x-ray
4

jika Anda memiliki IPV4 dan IPV6, Anda harus menghapus centang "Gunakan gateway default pada jaringan jarak jauh" di kedua tempat, bahkan jika Anda hanya menggunakan IPV4

Dave
sumber
2

Saya ingin menambahkan solusi saya ke dalam campuran. Ini berjalan pada shell UNIX Cygwin-powered pada Windows 7 atau lebih baru tetapi juga harus bekerja dengan MSYS2, Bash-on-Windows [WSL] setelah membangun 14986, atau Busybox untuk Windows). Perlu dijalankan dengan hak istimewa admin.

Ini memiliki beberapa pengaturan dan mencoba untuk mendeteksi beberapa hal yang tidak Anda atur secara eksplisit. Itu juga menetapkan nomor antarmuka (IF) secara eksplisit untuk melawan beberapa masalah yang dimiliki beberapa pengguna (seperti saya) dengan solusi lain di sini.

#!/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

Perlu juga dicatat bahwa mungkin perlu secara manual menetapkan metrik rendah atau jika tidak, rute default akan cocok sebelum lalu lintas diperuntukkan untuk VPN. Anda melakukan ini dengan masuk ke pengaturan adaptor tempat Anda membuka item menu "... Properties" untuk adaptor VPN → "Networking" → → "Internet Protocol Version 4 (TCP / IP)" Properties → "Advanced" → dan Anda tidak hapus centang di sana yang "Automatic metrik" kotak centang (di samping "Menggunakan default gateway ..." tentu saja) dan menetapkan nilai dalam "interface metrik:" lapangan untuk nilai yang lebih rendah daripada rute default (lihat ROUTE.EXE -4 printoutput).

phk
sumber
1

Agak lama tapi saya menemukan cara untuk melakukan ini menggunakan komputer lain. Saya punya laptop tempat saya mengatur koneksi VPN dan di sana saya punya FreeProxy diatur dengan Socks5 ..

Kemudian saya mengatur firefox pada mesin klien saya untuk menggunakan server proxy laptop .. hasilnya adalah jika saya menggunakan FireFox atau apa pun yang diatur untuk menggunakan proxy Socks5 itu, ia akan menggunakan VPN, jika tidak menggunakan perutean standar ..

Lonnie
sumber
1

Anda dapat menggunakan sesuatu seperti netcatcher - cukup tambahkan semua rute yang Anda butuhkan satu kali dan lupakan saja. Ini akan secara otomatis menambah dan menghapus rute ketika Anda menghubungkan atau memutuskan sesi VPN Anda. Jika alamat IP VPN Anda diperoleh secara dinamis (DHCP), netcatcher akan menangkapnya dan memperbarui rute dengan cara yang benar.

Andy
sumber
2
jika ini adalah sesuatu yang Anda tulis, Anda perlu mengungkapkan bahwa anseko.com/about.html lihat faq
Jeff Atwood
1

dari forum rusia: http://forum.ixbt.com/topic.cgi?id=14:43549

simpan sebagai file (mis: vpn_route.vbs) dan setelah vpn terhubung jalankan perintah

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
shibormot
sumber
1

Ini tidak dapat dilakukan di Windows tanpa menggunakan program tambahan, file batch, atau baris perintah. Alternatifnya adalah dengan mendapatkan mesin virtual (atau fisik) yang dapat Anda gunakan untuk menjalankan VPN.

Tampaknya aneh bahwa sesuatu yang mudah dijelaskan seperti ini sangat sulit dicapai. Seberapa sulitkah untuk hanya mengarahkan lalu lintas dari satu program ke antarmuka VPN dan semua program lainnya ke antarmuka NIC default? Mengapa kita perlu mengatur seluruh mesin virtual untuk itu? Dan dengan Linux itu mungkin tetapi solusinya juga tidak terlalu elegan.

Ini sangat banyak dicari juga: Saya menemukan puluhan utas tentang topik yang sama. Jadi saya hanya berharap seseorang menyadari kegilaan ini dan melakukan sesuatu untuk itu. (Di Windows 8!)

Solusi ini berasal dari file batch yang tidak disalurkan . Itu telah sedikit diadaptasi.

Petunjuk untuk Windows 7

Skrip akan terhubung ke dan merutekan lalu lintas melalui VPN Anda sampai reboot - Anda dapat mengganti route adddengan route -p addagar perubahan tetap ada, tetapi jika Anda tidak memiliki IP persisten dengan VPN Anda, ia pada akhirnya akan berhenti berfungsi ketika IP VPN Anda berubah.

  1. Buka Pusat Jaringan dan Berbagi
  2. Buka properti untuk koneksi VPN Anda
  3. Klik Networkingtab
  4. Untuk IPv4 dan 6:
    1. Klik Properties
    2. Klik Advanced
    3. Hapus centang Use default gateway[...]
  5. Tutup semua yang dibuka dari langkah sebelumnya
  6. Edit dan simpan skrip kumpulan yang ditemukan di bawah ini
  7. Jalankan sebagai administrator

Anda harus mengganti yang berikut dalam skrip:

  • <VPN> dengan Nama koneksi VPN yang Anda buat
  • <USER> dengan nama pengguna VPN
  • <PASS> dengan kata sandi VPN
  • <TARGET> dengan alamat IP yang Anda inginkan dialihkan melalui VPN (jika Anda ingin merutekan lebih banyak alamat, cukup duplikat tiga baris tempat target digunakan)

Catatan: Jika Anda tidak ingin menyimpan sandi pada file tersebut, ganti <PASS>dengan %password%dan menambahkan berikut setelah baris pertama dari script: set password= Input password:.

Naskah

@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
Xantippe
sumber
0

Panduan 'singkat' untuk pemula seperti saya, yang tidak tahu banyak tentang jaringan. Tidak banyak yang baru di sini, tetapi ringkasan dari semua opsi bagus yang dijelaskan dalam jawaban sebelumnya dan di utas terkait lainnya. Seluruh prosedur terdiri dari 3 langkah dasar:

1) Jadikan semua lalu lintas TIDAK melalui VPN. Untuk ini, Anda harus menghapus Use default gateway on remote networkcentang pada pengaturan VPN. Pastikan untuk menghapus centang pada kotak centang ini untuk IPv4 dan IPv6. Biasanya saya cukup menonaktifkan protokol IPv6 sepenuhnya untuk koneksi VPN.

(!) Mungkin (kadang-kadang) tidak mencentang bahwa kotak centang akan cukup untuk pekerjaan normal - dalam pengalaman saya, rute yang diperlukan (yang akan mengarahkan lalu lintas yang diperlukan melalui VPN) dapat ditambahkan secara otomatis setelah koneksi VPN dibuat. Saya tidak tahu persis di mana dan bagaimana aturan-aturan ini dikonfigurasi, tetapi skenario seperti itu ada - mungkin itu adalah sihir yang dilakukan oleh administrator jaringan VPN.

2) Buat hanya lalu lintas yang diperlukan melalui VPN. Untuk ini, Anda perlu menentukan rute. Di sini Anda memiliki 3 opsi:

2.1) Tambahkan rute permanen melalui gateway VPN:

route -p add a.b.c.d/<CIDR> w.x.y.z atau route -p add a.b.c.d mask e.f.g.h w.x.y.z

di mana 'VPN gateway' = 'IP Anda di jaringan VPN' = w.x.y.zdan alamat target / jaringan = a.b.c.d. Anda dapat menemukan w.x.y.zdengan mengeksekusi ipconfigdan mencari nama koneksi VPN Anda atau, jika Anda menggunakan PowerShell, Anda bisa mendapatkan output yang kompak dengan mengeksekusi ipconfig | grep -A5 PPP(yang akan menghasilkan 5 baris setelah menemukan setiap koneksi PPP).

Cons: Anda harus membuat kembali rute jika IP VPN Anda akan berubah.

2.2) Tambahkan rute permanen melalui antarmuka jaringan VPN:

route -p add a.b.c.d/<CIDR> 0.0.0.0 IF <interface number>

di mana a.b.c.dalamat target / jaringan dan interface numberpengidentifikasi koneksi VPN Anda. ID ini dapat ditemukan dengan mengeksekusi netstat -rn, atau, untuk output yang lebih kompak netstat -rn | grep -A10 'Interface List',.

Pro: tidak perlu mengubah apa pun jika alamat VPN Anda ( w.x.y.z) akan berubah.

Cons: perlu membuat kembali rute dengan ID baru jika Anda menghapus koneksi VPN Anda.

2.3) Gunakan cmdlet PowerShell:

Add-VpnConnectionRoute -ConnectionName '<VPN connection name>' -DestinationPrefix a.b.c.d/<CIDR>

Kelebihan: rute yang diperlukan ditambahkan setiap kali koneksi VPN dibuat dan dihapus setiap kali terputus.

Cons: tidak ada Get-VpnConnectionRoutescmdlet sehingga sulit untuk mengelola aturan ini.

3) Periksa dan pastikan rute berfungsi seperti yang diharapkan!

Jika Anda menambahkan rute persisten, Anda dapat memeriksanya dengan mengeksekusi netstat -rn | grep -A10 'Persistent Routes'.

Dan, akhirnya, jalankan beberapa tracertperintah terhadap kedua alamat IP yang seharusnya diakses melalui VPN dan terhadap mereka yang seharusnya bekerja tanpa VPN.

Ov
sumber