it-swarm.dev

Como posso fazer o tráfego seletivo de rota de VPN do Windows (por rede de destino)?

Eu quero usar uma VPN do Windows, mas apenas para uma rede específica, para que ela não ocupe toda a minha conexão de rede.

por exemplo, em vez de a VPN se tornar a rota padrão, torne-a somente a rota para 192.168.123.0/24

(Eu posso ver que há uma solução para isso para o Ubuntu nesta questão , mas às vezes eu tenho que fazer isso no Windows também)

Isso pode ser automatizado para que, sempre que eu me conectar à VPN, ele faça isso?

136
Legooolas

Você pode desativar o controle de toda a sua conexão acessando as propriedades da VPN, a guia Networking, Internet Protocol (TCP/IP) properties, Advanced, desmarque Use default gateway on remote network. Isso pode ou não deixar uma rota para 192.168.123.0/24 dependendo da configuração do servidor VPN. Se isso não acontecer, você precisará adicionar manualmente a rota a cada vez, embora possa colocá-la em um arquivo de lote.

Para adicionar manualmente a rota, execute (como administrador):

route -p add 192.168.0.12 mask 255.255.255.255 10.100.100.254

Este exemplo fará uma rota persistente (não é necessário executar o comando após uma reinicialização) para o IP 192.168.0.12 através do gateway da VPN 10.100.100.254.

Mais sobre isso em http://technet.Microsoft.com/en-us/library/bb878117.aspx

136
TRS-80

Eu usei com sucesso @ TRS-8 's técnica para conseguir isso.

Eu trabalho em casa e tenho que VPN na rede corporativa para o meu e-mail (eu odeio webmail !!).

Ao mesmo tempo, eu preciso estar constantemente surfando para informações e também preciso do youtube para minha música de fundo ... Agora você definitivamente não quer transmitir o youtube de uma VPN desde que isso faz parecer um Robot Singing !!! :)

Tudo que fiz foi seguir @ TRS-80:

propriedades da VPN, guia Rede, propriedades "Protocolo Internet (TCP/IP)", Avançado, desmarque "Usar gateway padrão na rede remota"

e depois fiz o meu próprio:

na guia DNS, marque "registrar os endereços das conexões no DNS"

Tudo funciona perfeitamente!

19
bPratik

Concedido esta resposta não reflete sua solicitação, mas eu uso um VM especificamente para esse fim. Dessa forma, apenas a rede dentro de VM é restrita pelas rotas.

Você pode encontrar algumas respostas melhores de outras pessoas, mas pelo menos isso pode lhe dar algo a considerar como uma solução fácil depois que o VM foi criado.

8
Wayne

Eu achei que precisava apontar diretamente a interface no comando route. Sem isso, o Windows vai usar a interface da placa de rede principal, em vez de VPN. No meu caso, parece

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

observe o 'IF 26'.

7
Dmitry Petrov

se você tiver o IPV4 e IPV6, você tem que desmarcar o "Usar gateway padrão na rede remota" em ambos os lugares, mesmo se você usar apenas IPV4

4
Dave

Se você usar o CMAK e configurar um arquivo de roteamento que o cliente possa baixar ... o Windows fará o download do arquivo de roteamento e ajustará as rotas conforme apropriado. Existem opções para remover a rota padrão ... e adicionar várias rotas estáticas e tal. Isso é conhecido como um túnel dividido.

Há um bom tutorial aqui: http://blogs.technet.com/b/rrasblog/archive/2007/06/11/split-tunnelling-using-cmak.aspx

3
TheCompWiz

Eu quero adicionar minha solução ao mix. Ele é executado em um shell UNIX baseado em Cygwin no Windows 7 ou mais recente, mas também deve funcionar com MSYS2, Bash-on-Windows [WSL] após a compilação 14986 ou Busybox para Windows). Precisa ser executado com privilégios de administrador.

Ele possui algumas configurações e tenta detectar algumas das coisas que você não definiu explicitamente. Ele também define o número da interface (IF) explicitamente para conter alguns problemas que alguns usuários (como eu) tiveram com as outras soluções aqui.

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

Também é importante notar que pode ser necessário definir manualmente uma métrica baixa ou, caso contrário, a rota padrão corresponderá antes do tráfego destinado à VPN. Você faz isso indo para a configuração do adaptador onde você abre o item de menu "… Properties" para o adaptador VPN → "Networking" tab → "Protocolo de Internet" Versão 4 (TCP/IP) " Propriedades → " Avançado " → e aí você desmarca a caixa " Métrica automática " (além do "Use default gateway ..." claro) e ajuste o valor no campo "Interface métrica:" para um valor menor que a rota padrão (veja saída ROUTE.EXE -4 print).

2
phk

Use Add-VpnConnectionRoute cmdlet no Windows 8+.

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

Você pode usar algo como netcatcher - basta adicionar todas as rotas que você precisa uma vez e esquecê-lo. Ele adicionará e excluirá rotas automaticamente quando você conectar ou desconectar sua sessão VPN. Se o seu endereço IP da VPN for obtido dinamicamente (DHCP), o netcatcher irá detectá-lo e atualizar as rotas corretamente.

1
Andy

do fórum russo: http://forum.ixbt.com/topic.cgi?id=14:43549

salvar como arquivo (ex: vpn_route.vbs) e depois vpn conectado execute comando

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

Um pouco velho, mas eu encontrei uma maneira de fazer isso usando outra máquina. Eu tenho um laptop onde eu configuro a conexão VPN e lá eu tenho o FreeProxy configurado com o Socks5.

Então eu configurei o firefox na minha máquina cliente para usar o servidor proxy do laptop. O resultado é que se eu usar o FireFox ou qualquer coisa que esteja configurada para usar o proxy Socks5, ele usará a VPN, caso contrário ele usa roteamento padrão.

1
Lonnie

Isso não pode ser feito no Windows sem usar programas adicionais, arquivos em lotes ou a linha de comando. Uma alternativa é obter uma máquina virtual (ou física) na qual você possa executar a VPN.

Parece estranho que algo tão facilmente explicável como isso seja tão difícil de alcançar. Quão difícil poderia ser apenas rotear o tráfego de um programa para a interface VPN e todos os outros programas para a interface padrão NIC? Por que precisaríamos configurar uma máquina virtual inteira para isso? E com o Linux é possível, mas sua solução também não é muito elegante.

É muito procurado também: me deparei com dezenas de tópicos sobre o mesmo assunto. Então eu só espero que alguém perceba o absurdo disso e faça algo sobre isso. (No Windows 8!)

Esta solução é de um arquivo em lote não atribuído . Foi ligeiramente adaptado.

Instruções para o Windows 7

O script se conectará e roteará o tráfego através de sua VPN até a reinicialização - você poderá substituir route add por route -p add para que a alteração persista, mas se você não tiver um IP persistente com sua VPN, ela eventualmente parará de funcionar quando seu IP de VPN alterar.

  1. Abra o Centro de Rede e Compartilhamento
  2. Abra as propriedades da sua conexão VPN
  3. Clique na guia Networking
  4. Para IPv4 e 6:
    1. Clique em Properties
    2. Clique em Advanced
    3. Desmarque Use default gateway[...]
  5. Feche tudo que abriu nas etapas anteriores
  6. Edite e salve o script em lote encontrado abaixo
  7. Execute-o como administrador

Você precisa substituir o seguinte no script:

  • <VPN> com o nome da conexão VPN que você criou
  • <USER> com o nome de usuário da VPN
  • <PASS> com a senha da VPN
  • <TARGET> com o endereço IP que você deseja rotear através da VPN (se você quiser rotear mais endereços, simplesmente duplique as três linhas onde o alvo é usado)

Nota: Se você não quiser salvar a senha no arquivo, substitua <PASS> por %password% e adicione o seguinte após a primeira linha do script: 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