Como posso manter o acesso à LAN local enquanto conectado à Cisco VPN?
Ao conectar usando a Cisco VPN, o servidor deve instruir o cliente a impedir o acesso à LAN local.
Supondo que essa opção do lado do servidor não possa ser desativada, como permitir o acesso local à LAN enquanto estiver conectado a um cliente VPN da Cisco?
Eu costumava pensar que era apenas uma questão de adicionar rotas que capturassem o tráfego da LAN com uma métrica mais alta, por exemplo:
Network
Destination Netmask Gateway Interface Metric
10.0.0.0 255.255.0.0 10.0.0.3 10.0.0.3 20 <--Local LAN
10.0.0.0 255.255.0.0 192.168.199.1 192.168.199.12 1 <--VPN Link
E tentar excluir a 10.0.x.x -> 192.168.199.12
rota não tem efeito:
>route delete 10.0.0.0
>route delete 10.0.0.0 mask 255.255.0.0
>route delete 10.0.0.0 mask 255.255.0.0 192.168.199.1
>route delete 10.0.0.0 mask 255.255.0.0 192.168.199.1 if 192.168.199.12
>route delete 10.0.0.0 mask 255.255.0.0 192.168.199.1 if 0x3
E, embora ainda possa ser simplesmente um problema de roteamento, as tentativas de adicionar ou excluir rotas falham.
Em que nível o driver do cliente Cisco VPN está fazendo o que na pilha de rede que substitui a capacidade do administrador local de administrar sua máquina?
O cliente Cisco VPN não pode estar empregando mágica. Ainda é um software em execução no meu computador. Que mecanismo ele está usando para interferir na rede da minha máquina? O que acontece quando um pacote IP / ICMP chega na rede? Onde na pilha de rede o pacote está sendo consumido?
Veja também
- Sem conexão à Internet com Cisco VPN
- O Cisco VPN Client interrompe a conectividade com meu servidor LDAP
- Cisco VPN para a navegação no Windows 7
- Como posso proibir a criação de uma rota no Windows XP após a conexão com a Cisco VPN?
- Redirecionando o tráfego local da LAN e da Internet quando estiver na VPN
- Cliente VPN "Permitir acesso local à LAN"
- Permitir acesso local à LAN para clientes VPN no exemplo de configuração do VPN 3000 Concentrator
- Acesso à LAN desaparecido quando eu me conecto à VPN
- Documentação do Windows XP: Rota
Edit: Coisas que eu ainda não tentei:
>route delete 10.0.*
Atualização: Como a Cisco abandonou o cliente antigo, a favor do AnyConnect (VPN baseada em HTTP SSL), essa questão, sem solução, pode ser deixada como uma relíquia da história.
No futuro, podemos tentar resolver o mesmo problema com o novo cliente .
fonte
Respostas:
O problema com o Anyconnect é que ele primeiro modifica a tabela de roteamento, depois toma conta e a corrige, caso você a modifique manualmente. Encontrei uma solução alternativa para isso. Funciona com as versões 3.1.00495, 3.1.05152, 3.1.05170 e provavelmente qualquer outra coisa da família 3.1. Pode funcionar com outras versões, pelo menos uma idéia semelhante deve funcionar, assumindo que o código não seja reescrito. Felizmente para nós, a Cisco colocou a chamada de "babá acordada" em uma biblioteca compartilhada. Portanto, a ideia é impedir a ação do vpnagentd via LD_PRELOAD.
Primeiro, criamos um arquivo
hack.c
:Nota: Este código funciona apenas com Linux. Para aplicar esta solução a uma máquina macOS, consulte a versão adaptada do macOS .
Em seguida, compile-o assim:
Instale
libhack.so
no caminho da biblioteca da Cisco:Desative o agente:
Verifique se realmente está em baixo
Caso contrário,
kill -9
apenas para ter certeza.Em seguida, corrija o /etc/init.d/vpnagentd adicionando
LD_PRELOAD=/opt/cisco/anyconnect/lib/libhack.so
onde o vpnagentd está sendo chamado, para que fique assim:Agora inicie o agente:
Corrija o iptables, porque o AnyConnect mexe com eles:
Você pode querer fazer algo mais avançado aqui para permitir o acesso apenas a determinados hosts da LAN.
Agora corrija as rotas como desejar, por exemplo:
Verifique se eles estão realmente lá:
Uma versão anterior e mais simples desse truque dava uma função que apenas "retornava 0"; - o pôster observou que "O único efeito colateral que observei até agora é que o vpnagentd está usando 100% da CPU, conforme relatado pela parte superior, mas a CPU geral é apenas 3% de usuário e 20% do sistema, e o sistema é perfeitamente responsivo Eu tracei, parece estar fazendo duas seleções em um loop quando ocioso retornando dos dois rapidamente, mas nunca lê ou grava - suponho que a chamada que eu cortei com LD_PRELOAD deveria ler. até agora, mas é bom o suficiente para mim. Se alguém tiver uma solução melhor, compartilhe. "
O problema com o hackeamento trivial é que ele faz com que um único núcleo da CPU esteja 100% o tempo todo, reduzindo efetivamente a contagem de threads da CPU do hardware em um - independentemente de sua conexão VPN estar ativa ou não. Percebi que as seleções que o código estava fazendo estavam em um soquete de netlink, que envia dados vpnagentd quando a tabela de roteamento muda. O vpnagentd continua percebendo que há uma nova mensagem no soquete do netlink e chama o routeCallBackHandler para lidar com isso, mas como o hack trivial não limpa a nova mensagem, ele continua sendo chamado repetidamente. o novo código fornecido acima libera os dados do netlink para que o loop infinito que causou a CPU de 100% não aconteça.
Se algo não funcionar, faça
gdb -p $(pidof vpnagentd)
, uma vez anexado:e veja em qual chamada você está. Depois, adivinhe qual você deseja cortar, adicione-o ao hack.c e recompile.
fonte
_ZN27CInterfaceRouteMonitorLinux20routeCallbackHandlerEv
?nm /opt/cisco/anyconnect/lib/libvpnagentutilities.dylib | grep routeCallbackHandlerEv
e então você vai encontrar__ZN25CInterfaceRouteMonitorMac20routeCallbackHandlerEv
nm /opt/cisco/anyconnect/lib/libvpnagentutilities.so
retornanm: /opt/cisco/anyconnect/lib/libvpnagentutilities.so: no symbols
no meu AnyConnect no Ubuntu, por isso foi gerado sem as informações da tabela de símbolos. Como você conseguiu isso?Isso é MUITO complicado, mas se você criar uma VM mínima usando o VMWare Player ou similar e executar o cliente Cisco AnyConnect VPN nisso, poderá ser possível configurar o roteamento como desejar usando os adaptadores de rede virtual VMWare ou simplesmente usar o VM para acessar todos os recursos necessários via VPN Cisco SSL e arquivos "arrastar / soltar" de / para sua máquina atual.
fonte
O software Shrew Soft VPN também fez o truque para mim, como sugeriu Ian Boyd .
Pode importar perfis de clientes VPN da Cisco. Usei o Cisco VPN Client versão 5.0.05.0290 e, após instalar o Shrew VPN (versão 2.1.7) e importar o perfil da Cisco, consegui acessar a LAN local enquanto estava conectado à VPN corporativa sem nenhuma configuração adicional da conexão Shrew VPN (ou Programas).
fonte
Obrigado a Sasha Pachev pelo belo truque acima.
vpnagentd
também mexe com o resolvedor substituindo as alterações feitas em/etc/resolv.conf
. Eu o resolvi vencendo a corrida contra ele:Não se esqueça de
chattr -i /etc/resolv.conf
desconectar.Estou tentando resolvê-lo interceptando o retorno de chamada, como no método de rotas acima, mas ainda não consigo encontrar o retorno de chamada ou o método correspondente.
Atualização 1/2: A
strace
revelou quevpnagentd
está usando ainotify
API para monitorar as alterações no arquivo do resolvedor. A partir daí, foi ladeira abaixo. Aqui está o hack adicional:Isso é um pouco exagerado, pois desabilita a observação de todos os arquivos do agente. Mas parece funcionar bem.
O script de wrapper do cliente VPN abaixo integra toda a funcionalidade (atualizado para incluir esse hack adicional).
chattr
não é mais usado / necessário.Atualização 3: Corrigidas configurações de nome de usuário / senha no script. Agora ele usa um
vpn.conf
arquivo com o formato descrito abaixo (e permissões somente para raiz).fonte
Minha empresa ainda usa essa VPN. O cliente vpnc simplesmente altera as configurações do iptables dessa maneira:
Ele filtra tudo, exceto o tráfego VPN.
Simplesmente obtenha o filtro em um arquivo com iptables-save, adicione as linhas de acesso INPUT e OUTPOUT que atendam às suas necessidades e aplique novamente o arquivo com iptables-restore.
por exemplo, para acessar uma rede local em 192.168.0
fonte
Alguma novidade sobre isso?
Concordo plenamente e estava pensando sobre a mesma coisa.
Enfim, é um aplicativo que requer privilégios de administrador para instalar e, enquanto é executado, pode muito bem filtrar o que você faz ...
Minhas tentativas no Windows também falham:
Haha Nenhuma métrica abaixo de 20 aqui parece.
fonte
Não sei se entendi direito, mas primeiro esclareço meu entendimento:
Você possui uma LAN local (por exemplo, 10.0.0.0/16 e um Cisco VPN Server remoto (por exemplo, 64.0.0.0/16). Você deseja conectar-se ao servidor VPN por meio do cliente Cisco VPN e, no entanto, precisa para ter acesso à LAN. Nesse caso, você deseja separar o 10.0.xx / 16 inteiro da conexão VPN). A seguinte rota deve ser adicionada em um cliente Mac:
onde en1 é a interface através da qual você está conectado à sua LAN. Eu sei que você pode adicionar a mesma coisa no Windows e Linux também.
fonte
Como não consigo adicionar comentários, vou postar aqui. Estou executando no Windows.
A solução usando a Máquina Virtual e execute o AnyConnect dentro da VM e, em seguida, use a VM como mediadora entre o ambiente de trabalho e a rede da empresa não funcionará se o departamento de TI "amado" direcionar 0.0.0.0 por VPN e, portanto, até a sua rede local (incluindo esta entre o PC local e a VM) é roteado pela VPN (sic!).
Tentei aplicar a solução postada por @Sha Pachav, mas acabei corrigindo o patch .dll para que ele retornasse 0 no início da função. Eventualmente, depois de alguma briga com a biblioteca dinâmica, consegui modificar as tabelas de roteamento de acordo com minhas necessidades, mas aparentemente isso não é suficiente!
Mesmo que minhas regras pareçam corretas para obter o tunelamento dividido, ainda recebo falha geral. Você encontrou um problema semelhante ao que foi capaz de resolvê-lo?
É assim que minha tabela de roteamento se parece agora (após modificações manuais enquanto a VPN está ativada)
ainda o resultado do ping está seguindo
Apenas para referência, abaixo está a aparência da tabela de rotas quando a VPN é desconectada (inalterada)
e é assim que a tabela se parece quando a VPN está conectada (inalterada). Nesse caso, quando estou tentando
8.8.8.8
executar ping , simplesmente obtenho tempo limite (já que o firewall da empresa não permite que o tráfego saia da intranet)fonte
Para aqueles que procuram manter o controle de sua tabela de roteamento ao usar uma VPN Cisco AnyConnect SSL, confira o OpenConnect . Ambos suportam a VPN Cisco AnyConnect SSL e não tentam interromper ou "proteger" as entradas da tabela de roteamento. @Vadzim faz alusão a isso em um comentário acima .
Depois de tentar de tudo, menos o patch do AnyConnect Secure Mobility Client, consegui substituí-lo com sucesso no Windows pela OpenConnect GUI . Isso me permitiu manter a conectividade com os recursos locais (e atualizar a tabela de roteamento).
Uso o OpenConnect no Windows, mas ele também suporta Linux, BSD e macOS (entre outras plataformas) de acordo com a página do projeto .
fonte
Tente remover essas entradas com o gateway,
10.64.202.13
veja se o ping8.8.8.8
funciona, adicione-as novamente uma a uma e identifique qual delas está causando o problema.Como você corrigiu a DLL. Não consigo nem modificar a tabela de roteamento porque ela continua adicionando o
0.0.0.0
gateway VPN novamente.fonte