2009-07-24 09:33:51 +0000 2009-07-24 09:33:51 +0000
143
143

Como posso tornar o tráfego selectivo da rota VPN Windows (por rede de destino)?

Quero utilizar uma VPN Windows mas apenas para uma determinada rede, de modo a que esta não me assuma toda a ligação à rede.

por exemplo, Em vez da VPN se tornar a rota padrão, faça-o apenas para 192.168.123.0/24

(vejo que existe uma solução para isto para o Ubuntu nesta pergunta , mas por vezes também tenho de o fazer no Windows)

Isto pode ser automatizado para que sempre que me ligar à VPN o faça?

Respostas (13)

143
143
143
2009-07-24 11:11:52 +0000

Pode desligar toda a sua ligação indo às propriedades da VPN, Networking tab, Internet Protocol (TCP/IP) properties, Advanced, untick Use default gateway on remote network. Isto pode ou não deixar uma rota para 192.168.123.0/24, dependendo da configuração do servidor VPN. Se não o fizer, terá de adicionar manualmente a rota de cada vez, embora possa colocá-la num ficheiro batch.

Para adicionar manualmente a rota, corra (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 correr o comando após um reinício) para o IP 192.168.0.12 através da gateway VPN 10.100.100.254.

Mais sobre isto em http://technet.microsoft.com/en-us/library/bb878117.aspx

20
20
20
2011-02-28 16:05:03 +0000

Usei com sucesso a técnica @TRS-80 para o conseguir.

Trabalho a partir de casa e tenho de VPN para a rede corporativa para o meu e-mail (detesto webmail!!).

Ao mesmo tempo, preciso de estar constantemente a navegar para obter informações e também preciso de youtube para a minha música de fundo… Agora definitivamente não queres transmitir o youtube através de uma VPN já que isso faz com que pareça um Robot Singing!!!

propriedades da VPN, separador Networking, propriedades “Internet Protocol (TCP/IP)”, Advanced, desmarque “Use default gateway on remote network”

e depois faça o meu próprio:

no separador DNS, assinale “register this connections addresses in DNS”

Tudo funciona sem problemas!

9
9
9
2009-07-24 10:09:15 +0000

Esta resposta não reflecte o seu pedido, mas utilizo um VM especificamente para este fim. Assim, apenas a rede dentro do VM é restringida pelas rotas.

Pode encontrar algumas respostas melhores por outras pessoas mas pelo menos isto pode dar-lhe algo a considerar, pois é uma solução fácil depois do VM ter sido criado.

7
7
7
2013-09-25 05:41:53 +0000

Descobri que precisava de apontar directamente a interface no comando da rota. Sem ele, o Windows vai utilizar a interface da placa de rede principal, em vez da VPN. No meu caso, parece que os

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

têm em conta o ‘IF 26’.

6
6
6
2018-01-26 07:11:32 +0000

Utilize Add-VpnConnectionRoute cmdlet no Windows 8+.

Add-VpnConnectionRoute -ConnectionName 'My VPN Connection' -DestinationPrefix 192.168.123.0/24
4
4
4
2011-07-29 09:03:55 +0000

se tiver IPV4 e IPV6 tem de desmarcar o “Use default gateway on remote network” em ambos os locais, mesmo que só utilize IPV4

3
3
3
2011-03-28 18:32:39 +0000

Se utilizar o CMAK e configurar um ficheiro de encaminhamento que o cliente pode descarregar… as janelas irão descarregar o ficheiro de encaminhamento e ajustar as rotas conforme apropriado. Existem opções para remover a rota padrão… e adicionar várias rotas estáticas & tais. Isto é conhecido como btw.

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

2
2
2
2015-10-26 15:29:33 +0000

Quero acrescentar a minha solução a esta mistura. Ela roda em uma shell UNIX com a tecnologia Cygwin no Windows 7 ou mais recente, mas também deve funcionar com MSYS2, Bash-on-Windows [WSL] após a compilação do 14986, ou Busybox para Windows). Precisa de ser executado com privilégios de administrador.

Tem algumas configurações e tenta detectar algumas das coisas que não definiu explicitamente. Também define o número de interface (IF) explicitamente para contrariar alguns problemas que alguns utilizadores (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 de notar que pode ser necessário definir manualmente uma métrica baixa ou então a rota padrão irá coincidir antes do tráfego destinado para a VPN. Isto é feito indo à configuração do adaptador onde se abre a opção “… Propriedades” item de menu para o adaptador VPN → “Networking” separador → “Internet Protocol Version 4 (TCP/IP)” Propriedades → “Advanced” → e aí desmarque a caixa de verificação “Automatic metric” (para além da opção “Use default gateway …” claro) e defina o valor no campo “Interface metric:” para um valor inferior ao da rota padrão (ver saída ROUTE.EXE -4 print).

1
1
1
2010-04-20 19:46:26 +0000

Um pouco velho, mas encontrei uma maneira de o fazer utilizando outra máquina. Tenho um portátil onde configuro a ligação VPN e aí tenho FreeProxy configurado com Socks5…

Depois configuro o Firefox na máquina do meu cliente para usar o servidor proxy do portátil… o resultado é que se eu usar o FireFox ou qualquer coisa configurada para usar esse proxy Socks5, ele irá usar a VPN, caso contrário usa o encaminhamento padrão…

1
1
1
2011-08-30 09:23:19 +0000

Você pode usar algo como netcatcher - basta adicionar todas as rotas que você precisa uma vez e esquecer. Irá automaticamente adicionar e apagar rotas quando ligar ou desligar a sua sessão VPN. Se o seu endereço IP VPN for obtido dinamicamente (DHCP) o netcatcher irá capturá-lo e actualizar as rotas da forma correcta.

1
1
1
2013-02-18 16:37:51 +0000

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

guardar como ficheiro (ex: vpn_route.vbs) e depois de vpn conectado executar 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
1
1
2019-08-07 13:42:20 +0000

Um guia “curto” para noobs como eu, que não sabem muito sobre redes. Não é muito novo aqui, mas um resumo de todas as boas opções descritas em respostas anteriores e em outros tópicos relacionados. O procedimento completo consiste em 3 passos básicos:

1) Faça todo o tráfego NÃO passar via VPN. Para isso deve desmarcar Use default gateway on remote network nas definições VPN. Certifique-se de que desmarca esta caixa de verificação tanto para IPv4 como para IPv6. Normalmente simplesmente desabilito completamente o protocolo IPv6 para a ligação VPN.

(!) É (por vezes) possível que desmarcar esta caixa de verificação seja suficiente para o trabalho normal - segundo a minha experiência, as rotas necessárias (que irão direccionar o tráfego necessário via VPN) podem ser adicionadas automaticamente após o estabelecimento da ligação VPN. Não sei exactamente onde e como estas regras são configuradas, mas tal cenário existe - provavelmente é alguma magia feita pelos administradores de rede VPN.

2) Faça apenas necessary traffic going via VPN. Para isso, é necessário definir rotas. Aqui tem 3 opções:

2.1) Adicionar rota permanente via gateway VPN:

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

onde ‘gateway VPN’ = ‘o seu IP na rede VPN’ = w.x.y.z e endereço/rede de destino = a.b.c.d. Pode encontrar w.x.y.z executando ipconfig e procurando o nome da sua ligação VPN ou, se utilizar o PowerShell, pode obter uma saída compacta executando ipconfig | grep -A5 PPP (que irá emitir 5 linhas após encontrar cada ligação PPP).

Cons: terá de recriar rotas se o seu IP VPN for alterado.

2.2) Adicionar rota permanente via interface de rede VPN:

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

onde a.b.c.d é o endereço/rede de destino e interface number é o identificador da sua ligação VPN. Esta identificação pode ser encontrada executando netstat -rn, ou, para uma saída mais compacta, netstat -rn | grep -A10 'Interface List'.

Pros: não é necessário alterar nada se o seu endereço VPN (w.x.y.z) for alterado.

Cons: necessidade de recriar rotas com nova identificação se eliminar a sua ligação VPN.

  1. 3) Utilize PowerShell cmdlet:

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

Pros: as rotas necessárias são adicionadas cada vez que a ligação VPN é estabelecida e apagadas cada vez que é desligada.

Cons: não há Get-VpnConnectionRoutes cmdlet, pelo que pode ser difícil gerir estas regras.

3) Verifique e assegure-se de que o encaminhamento funciona como esperado!

Se adicionou rotas persistentes, pode verificá-las executando netstat -rn | grep -A10 'Persistent Routes'.

E, finalmente, execute alguns comandos tracert contra ambos os endereços IP que devem ser acedidos via VPN e contra os que devem funcionar sem VPN.

1
1
1
2010-10-11 21:31:43 +0000

Isto não pode ser feito no Windows sem a utilização de programas adicionais, ficheiros batch, ou a linha de comando. Uma alternativa é obter uma máquina virtual (ou física) na qual se possa correr a VPN.

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

Também é muito procurada: Encontrei dezenas de linhas sobre o mesmo assunto. Por isso só espero que alguém se aperceba do ridículo disto e faça alguma coisa a esse respeito. (No Windows 8!)

Esta solução é de um ficheiro unattributed batch file . Foi ligeiramente adaptada.

Instruções para Windows 7

O script ligar-se-á e encaminhará o tráfego através da sua VPN até um reinício - pode substituir route add por route -p add para que a alteração persista, mas se não tiver um IP persistente com a sua VPN, acabará por deixar de funcionar quando o seu IP VPN mudar.

  1. Abra a Rede e o Centro de Partilha
  2. Abra as propriedades da sua ligação VPN
  3. Clique no separador Networking
  4. Tanto para IPv4 como para 6:
  5. Clique no separador Properties
  6. Clique no separador Advanced
  7. Desmarque Use default gateway[...]
  8. Feche tudo o que foi aberto desde os passos anteriores
  9. Edite e guarde o script de lote encontrado abaixo do
  10. Execute-o como administrador

Tem de substituir o seguinte no script:

  • <VPN> com o Nome da ligação VPN que criou
  • <USER> com o nome de utilizador VPN
  • <PASS> com a palavra-passe VPN
  • <TARGET> com o endereço IP que pretende encaminhar através da VPN (se pretende encaminhar mais endereços, basta duplicar as três linhas onde o alvo é utilizado)

_Note: _ Se não quiser guardar a password no ficheiro, 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