Como posso fazer com que a VPN do Windows direcione o tráfego seletivo (por rede de destino)?

139

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

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

(Percebo que há uma solução para isso no Ubuntu nesta questão , mas às vezes também preciso fazer isso no Windows)

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

Legooolas
fonte
Existe uma pergunta relacionada à filtragem de vários sites através da VPN? Parece que as respostas aqui funcionarão apenas para o caso em que haja um único site atrás da VPN. Estou na China e cerca de metade dos sites que gostaria de usar estão bloqueados, portanto, eles devem passar pela VPN, mas outros sites são mais rápidos / suaves sem a VPN.
hippietrail
Fui em frente e pediu uma nova pergunta: superuser.com/questions/925947
hippietrail

Respostas:

139

Você pode desativar o controle de toda a conexão, acessando as propriedades da VPN, Networkingguia, Internet Protocol (TCP/IP)propriedades Advancede desmarcar Use default gateway on remote network. Isso pode ou não deixar uma rota 192.168.123.0/24dependendo da configuração do servidor VPN. Caso contrário, você precisará adicionar manualmente a rota a cada vez, embora possa colocá-la em um arquivo em lotes.

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.12através do gateway VPN 10.100.100.254.

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

TRS-80
fonte
1
"Você precisará adicionar manualmente a rota" ... como? Como alguém força, digamos, "192.168.10.123" a passar pela vpn, mas nada mais?
Timothy Khouri
16
Pessoalmente, descobri que basta desligar a caixa de seleção. Não precisei adicionar nenhuma rota. Eu verifiquei que tudo está indo para onde eu esperaria através de vários rastreadores.
eidylon
1
Mesmo, essa caixa de seleção era tudo o que era necessário.
Luk
1
Por favor, esclareça. Qual tráfego é roteado pela VPN? É apenas tráfego direcionado para o IP do servidor VPN? Por exemplo, se a conexão VPN for para "meu.domínio.com", isso significa que todo o tráfego do cliente para "meu.domínio.com" passa pela VPN e todo o resto vai para o gateway padrão?
Triynko 25/09/12
1
Usei o comando "route print" e verifiquei que as rotas geradas pelo Windows 7 estavam totalmente erradas. Não estava enviando tráfego endereçado ao IP da minha VPN para a VPN ... em vez disso, estava enviando para o meu gateway local. Havia também algumas entradas circulares na tabela. Excluí a rota criada pelo Windows e adicionei manualmente a rota correta para que a entrada do endereço IP do meu servidor VPN usasse o gateway da VPN e o IP local do cliente para a interface. O tráfego para o meu servidor VPN foi roteado com êxito pelo túnel da VPN e todo o outro tráfego não foi afetado conforme o esperado. Funciona bem.
Triynko 25/09/12
20

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

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

Ao mesmo tempo, eu preciso estar constantemente navegando para obter informações e também preciso do youtube para a minha música de fundo ... Agora você definitivamente não deseja transmitir o youtube a partir de uma VPN, pois isso soa como um Robot Singing !!! :)

Tudo o que fiz foi seguir o @ TRS-80:

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

e depois fiz o meu:

na guia DNS, marque "registrar esses endereços de conexão no DNS"

Tudo funciona perfeitamente!

bPratik
fonte
9

A resposta concedida não reflete sua solicitação, mas eu uso uma VM especificamente para esse fim. Dessa forma, apenas a rede dentro da VM é restringida pelas rotas.

Você pode encontrar respostas melhores de outras pessoas, mas pelo menos isso pode lhe dar algo a considerar, pois é uma solução fácil após a criação da VM.

Wayne
fonte
Esta é uma boa solução, desde que o seu hardware possa lidar bem com isso.
Enigma
Usou esta solução por anos, até encontrar este segmento. :)
ov
7

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

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'.

Dmitry Petrov
fonte
Isso funcionou para mim também. Para descobrir qual interface você precisa apenas executar o comando "route print" e verificar as primeiras linhas que exibem a lista de interfaces disponíveis (encontre sua VPN lá e verifique seu FI - ela estará na primeira coluna).
Funbit
Há um artigo brilhante sobre isso: link . O uso de 0.0.0.0 como o IP do gateway padrão também parece funcionar bem, portanto, ele não precisa ser ajustado após a alteração. Seria ótimo incorporar essa resposta, já que na imo é muito mais útil que a primeira.
Lpd
5

Use o cmdlet Add-VpnConnectionRoute no Windows 8 ou superior.

Add-VpnConnectionRoute -ConnectionName 'My VPN Connection' -DestinationPrefix 192.168.123.0/24
Der_Meister
fonte
Isso funcionou perfeitamente para mim no Windows 10.
raio-x
4

se você possui IPV4 e IPV6, desmarque a opção "Usar gateway padrão na rede remota" nos dois locais, mesmo se você usar apenas IPV4

Dave
fonte
3

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 btw de túnel dividido.

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

TheCompWiz
fonte
2

Quero adicionar minha solução à mistura. É executado em um shell UNIX desenvolvido pela Cygwin no Windows 7 ou mais recente, mas também deve funcionar com o MSYS2, o Bash-on-Windows [WSL] após a compilação 14986 ou o Busybox for 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 explicitamente o número da interface (IF) para combater 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 a rota padrão corresponderá antes do tráfego destinado à VPN. Você faz isso acessando a configuração do adaptador, onde abre o item de menu "… Propriedades" do adaptador VPN → guia "Rede""Internet Protocol Version 4 (TCP / IP)" Propriedades → "Avançado" → e desmarca a caixa de seleção "Métrica automática" (além de "Usar gateway padrão ...", é claro) e defina o valor no campo "Métrica da interface:" para um valor menor que a rota padrão (consulte a ROUTE.EXE -4 printsaída).

phk
fonte
1

Um pouco velho, mas 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 ..

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

Lonnie
fonte
1

Você pode usar algo como o netcatcher - basta adicionar todas as rotas necessárias uma vez e esquecê-las. 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 o capturará e atualizará as rotas da maneira correta.

Andy
fonte
2
se isso é algo que você escreveu, você deve divulgar que anseko.com/about.html veja o FAQ
Jeff Atwood
1

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

salve como arquivo (por exemplo: vpn_route.vbs) e depois do comando de conexão conectado 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
shibormot
fonte
1

Isso não pode ser feito no Windows sem o uso de 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 quanto 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 de todos os outros programas para a interface NIC padrão? Por que precisamos configurar uma máquina virtual inteira para isso? E com o Linux é possível, mas sua solução também não é muito elegante.

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

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

Instruções para o Windows 7

O script irá conectar e rotear o tráfego através de sua VPN até que um reboot - você pode substituir route addcom route -p addpara a mudança de persistir, mas se você não tem um IP persistente com a sua VPN, ele acabará por deixar de funcionar quando as alterações IP VPN.

  1. Abra o Centro de Rede e Compartilhamento
  2. Abra as propriedades para sua conexão VPN
  3. Clique na Networkingguia
  4. Para IPv4 e 6:
    1. Clique Properties
    2. Clique Advanced
    3. Desmarque Use default gateway[...]
  5. Feche tudo aberto das 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 pela VPN (se desejar rotear mais endereços, basta duplicar as três linhas em que o destino é usado)

Nota: Se você não quiser salvar a senha no arquivo, substitua <PASS>com %password%e adicione a seguinte após a primeira linha do script: set password= Input password:.

Roteiro

@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
fonte
0

Um guia 'curto' para noobs como eu, que não sabem muito sobre redes. Não há muita novidade aqui, mas um resumo de todas as boas opções descritas nas respostas anteriores e em outros tópicos relacionados. Todo o procedimento consiste em 3 etapas básicas:

1) Faça todo o tráfego NÃO passar por VPN. Para isso, desmarque a Use default gateway on remote networkcaixa de seleção nas configurações da VPN. Desmarque esta caixa de seleção para IPv4 e IPv6. Normalmente, desabilito completamente o protocolo IPv6 para a conexão VPN.

(!) É (às vezes) possível que desmarcar essa caixa de seleção seja suficiente para o trabalho normal - na minha experiência, as rotas necessárias (que direcionarão o tráfego necessário via VPN) podem ser adicionadas automaticamente após o estabelecimento da conexão VPN. Não sei exatamente onde e como essas regras estão configuradas, mas esse cenário existe - provavelmente é uma mágica feita pelos administradores de rede VPN.

2) Faça apenas o tráfego necessário via VPN. Para isso, você precisa definir rotas. Aqui você 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' = 'seu IP na rede VPN' = w.x.y.ze endereço / rede de destino = a.b.c.d. Você pode encontrar w.x.y.zexecutando ipconfige procurando o nome da sua conexão VPN ou, se você usa o PowerShell, pode obter uma saída compacta executando ipconfig | grep -A5 PPP(que produzirá 5 linhas depois de encontrar cada conexão PPP).

Contras: você terá que recriar rotas se o seu IP da VPN mudar.

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 conexão VPN. Esse ID pode ser encontrado executando netstat -rn, ou, para uma saída mais compacta netstat -rn | grep -A10 'Interface List',.

Prós: não é necessário alterar nada se o seu endereço VPN ( w.x.y.z) mudar.

Contras: é necessário recriar rotas com o novo ID se você excluir sua conexão VPN.

2.3) Use o cmdlet do PowerShell:

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

Prós: as rotas necessárias são adicionadas sempre que a conexão VPN é estabelecida e excluída toda vez que é desconectada.

Contras: não há Get-VpnConnectionRoutescmdlet; portanto, pode ser difícil gerenciar essas regras.

3) Verifique e verifique se o roteamento funciona conforme o esperado!

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

E, finalmente, execute alguns tracertcomandos nos dois endereços IP que devem ser acessados ​​via VPN e naqueles que devem funcionar sem a VPN.

ov
fonte