Evitar a conexão SSH perdida após o login na VPN na máquina do servidor


14

Encontrei um problema que não consigo resolver. Quando estou conectado a um VPS sobre SSH e tento estabelecer uma conexão VPN nesse VPS, a conexão SSH entre o VPS e minha máquina é perdida. Suponho que é porque o roteamento foi alterado pelas configurações da VPN. Como evitar isso?


Que tal se conectar ao SSH após o estabelecimento do VP? : p Você está certo que isso é causado porque a VPN substitui os caminhos de roteamento. O que você pode fazer é manter seus caminhos originais intocados e apenas adicionar o caminho VPN extra (a menos que você queira usar seu VPS como proxy. Essa é outra história). Qual cliente você usa?
Nikolaidis Fotis

O que você quer dizer com "tentar estabelecer uma conexão VPN nesse VPS"? Você está se conectando da sua máquina a um servidor Openvpn no VPS? Seu VPS está se conectando a um servidor Openvpn em execução em um terceiro host? Neste último caso, essa conexão VPN está atrasando algumas rotas? Além disso, confirme não há traduções NAT para chegar ao seu VPS (o endereço IP configurado em sua interface é a mesma que você está especificando na conexão SSH?
Damiano Verzulli

@NikolaidisFotis Não consigo conectar porque a VPN está em execução. Eu uso o cliente openvpn. Há uma --route-noexecopção para ignorar rotas empurrados pelo servidor, mas, como você mencionou, isso não ajuda quando eu quiser usar VPN como procurador ...
mic22

@DamianoVerzulli a segunda opção, sim rotas são empurrados (mas eu acho que tem que ser feito desde que eu preciso que VPN para agir como proxy para encobre endereço IP original da máquina), e não há nenhuma NAT
mic22

Respostas:


6

Você precisa adicionar a route-nopullopção (e remover, redirect-gatewayse existir) ao arquivo de configuração do seu cliente OpenVPN no seu VPS.

Dessa forma, a conexão com um servidor VPN não modifica nenhuma rota no seu VPS; portanto, você poderá definir as que precisa.


Ei, obrigado por este conselho, mas agora não consigo acessar a Internet através do tun0. Suponho que estou perdendo um gateway. Alguma idéia de como adicionar um gateway para tun0? Parte relevante do ifconfig:inet addr:10.56.10.6 P-t-P:10.56.10.5 Mask:255.255.255.255
Housemd 05/05

Você precisa adicionar manualmente uma rota para o servidor VPN si através do seu padrão ISP gateway, em seguida, adicione o gateway padrão via 10.56.10.5 para todos os outros tráfegos
Anubioz

Desculpa, o que? Eu não tenho ideia do que você acabou de dizer. Você poderia dar um exemplo ?
Housemd 5/05

Deixe-me esclarecer: não quero que a rota padrão seja via tun0, mas preciso de tun0 para ter acesso à Internet.
Housemd 5/05

@Housemd hm você precisa ter acesso à Internet através do tun0 você mesmo ou precisa de clientes conectados via tun0 de outros lugares para ter acesso à internet?
Anubioz 5/05

4

Vamos considerar o seguinte cenário:

  1. seu VPS possui uma única interface Ethernet, configurada com o endereço IP 4.3.2.1/24;
  2. seu VPS pode acessar a Internet através de um gateway padrão 4.3.2.254
  3. seu VPS ainda não ativou nenhuma conexão OpenVPN; portanto, não interface tun ativa

Nesse cenário, em sua máquina (suponha que sua máquina seja 9.8.7.6/24 com def-gw 9.8.7.254), você pode estabelecer com êxito uma conexão SSH para 4.3.2.1. Portanto, os dois hosts 4.3.2.1 e 9.8.7.6 podem alcançar um ao outro com êxito.

Agora, com uma conexão SSH estabelecida, vamos supor:

  1. você inicia uma conexão OpenVPN a partir do seu VPS 4.3.2.1;
  2. como tal, uma nova interface tun0 será dinamicamente configurada (suponha que seja atribuído um IP 10.10.10.2, com um PTP 10.10.10.1).

Nesta fase:

  • Se nenhuma rota for enviada do servidor OpenVPN remoto para o seu VPS local, nada mudará no prazo de roteamento, e sua conexão SSH sobreviverá sem problemas. Nesse caso, o único tráfego que atravessa a VPN é o direcionado ao servidor OpenVPN remoto (10.10.10.1);

  • Se o servidor OpenVPN remoto atrasar alguma rota e, especialmente, se o gateway padrão do VPS for substituído pelo 10.10.10.1 (ponto de extremidade OpenVPN remoto), ENTÃO você está tendo problemas. Nesse caso, você está encapsulando TODO o tráfego IP de saída (com exceção do próprio OpenVPN) na VPN.

Nesse segundo caso (substituindo def-gw logo após o estabelecimento da conexão VPN), sua conexão SSH anterior "travará", devido ao roteamento assimétrico:

  • O tráfego da sua máquina (9.8.7.6) para o VPS (4.3.2.1) fluirá através do caminho anterior, nunca alterado;
  • Tráfego do VPS (4.3.2.1) para sua máquina (9.8.7.6):
    • sem a VPN (portanto, inicialmente) foi roteada através do gateway 4.3.2.254;
    • após o estabelecimento do link VPN, com a substituição def-gw relacionada, ser roteado através da VPN (10.10.10.1).

Em outras palavras: assim que o link VPN for estabelecido, sua rota de retorno do VPS para sua máquina mudará e ... isso não é uma coisa boa (vários dispositivos de rede, ao longo do caminho de retorno, podem reconhecer tais assimetrias caminho e simplesmente solte pacotes).

Além disso, são grandes as chances de seu servidor OpenVPN remoto estar atuando como uma caixa NAT: todo o tráfego proveniente da VPN será NATted com o endereço IP público do servidor OpenVPN remoto. Se isso for verdade, as coisas não serão mais ... "não boas", mas definitivamente "ruins", quanto à sua conexão SSH: o tráfego de retorno, além de voltar por uma rota diferente, está voltando à sua máquina com um IP de origem diferente (o da interface pública do servidor VPN).

Como resolver este problema?

Muito facilmente, de fato.

Simplesmente instruindo o servidor VPS a não rotear o tráfego para sua máquina ao longo da VPN, mas, em vez disso, contando com a rota anterior . Deve ser tão fácil quanto adicionar antes de iniciar o OpenVPN:

     route add -host 9.8.7.6 gw 4.3.2.254

Onde:

  • 9.8.7.6 é o endereço IP público da sua máquina
  • 4.3.2.254 é o gateway padrão original do seu VPS.

PS: ao fornecer uma pergunta muito mais detalhada, você teria uma resposta muito mais rápida :-)


Obrigado pela sua resposta @DamianoVerzulli! O gateway padrão não é especificado. route addcomando com tais retornos 0.0.0.0 gwSIOCADDRT: Invalid argument
mic22

Isso é o que eu recebo logo após Ligações OpenVPN[server] Peer Connection Initiated with [AF_INET]64.251.27.139:443; TUN/TAP device tun0 opened; do_ifconfig, tt->ipv6=0, tt->did_ifconfig_ipv6_setup=0; /sbin/ip link set dev tun0 up mtu 1500; /sbin/ip addr add dev tun0 10.200.1.251/22 broadcast 10.200.3.255; ERROR: Linux route add command failed: external program exited with error status: 2
mic22

@ mic22: Gostaria de saber como o def-gw do seu VPS pode não ser especificado, pois nesse caso esse VPS não pode alcançar nada fora da sub-rede local (e isso significa que a sua máquina - capaz de se conectar via SSH-- e o servidor OpenVpn - poder estabelecer VPN - deve ser "local" e, como tal, bastante inútil!). BTW: quando você estiver conectado via SSH você pode facilmente obter def-gw com um "netstat -rn" (linha começando com 0.0.0.0, segunda coluna)
Damiano Verzulli

netstat -rnresultar 0.0.0.0 0.0.0.0 0.0.0.0 U 0 0 0 venet0da VPS que estou usando é uma opção básica OVH com o Ubuntu 14.04 Server no conselho
mic22

ifconfige netstat -rnsaída: goo.gl/TEZ61q
mic22

0

Isso pode ajudar:

coloque TCPKeepAlive=yesno seu/etc/ssh/sshd_config

A partir de

man sshd_config | less +/'^ *TCPKeepAlive'

TCPKeepAlive

Especifica se o sistema deve enviar mensagens de manutenção de atividade do TCP para o outro lado. Se forem enviados, a morte da conexão ou falha de uma das máquinas será notada corretamente. No entanto, isso significa que as conexões morrerão se a rota for interrompida temporariamente e algumas pessoas acham isso irritante. Por outro lado, se as keepalives TCP não forem enviadas, as sessões poderão travar indefinidamente no servidor, deixando usuários `` fantasmas '' e consumindo recursos do servidor.

O padrão é yes'' (to send TCP keepalive messages), and the server will notice if the network goes down or the client host crashes. This avoids infinitely hanging sessions. To disable TCP keepalive messages, the value should be set tonão ''.


I'v já teve TCPKeepAliveset opção de yesmodo que não é uma solução adequada
mic22

0

Eu tive esse problema e tentei todas as soluções recomendadas e, mesmo assim, meu problema não foi resolvido!

Depois de muitas tentativas de soluções, usei o screencomando (meu cliente VPN é cisco-any-connect).

$ screen -R VPN
$ openconnect -b "your server"

Depois de fornecer sua credencial, pressione ctrl + a + d imediatamente e retorne à sua sessão.


0

Pessoalmente, prefiro que todas as conexões com o SSH sejam roteadas através da VPN. No caso de uma conexão ssh ativa antes de a VPN ser estabelecida, ela deve se reconectar devido à alteração da rota.

Eu recomendo usar autossh Sob a configuração do seu cliente ssh basta adicionar.ssh/config

Host *
   ServerAliveInterval 300
   ServerAliveCountMax 2
   BatchMode yes
  • BatchMode significa reconexão automática
  • ServerAlive significa Manter Vivo

-1

Depois de conectar a VPN, o ssh é desconectado porque, o tráfego ssh do servidor passa pelo servidor VPN. Portanto, para evitar isso, execute o seguinte comando antes de conectar a VPN.

rota add -host sua-máquina-pública-ip gw Servidor-gatway-ip dev eth0

your-machine-public-ip: IP da sua máquina de onde você está executando o SSH. Server-gatway-ip: IP do Gatway / roteador desse servidor

O comando acima redirecionará o tráfego através do gateway fornecido, não através do servidor VPN.


Isso é confuso, e o idioma parece ter o contrário. Você não gostaria de adicionar uma rota com o endereço IP do destino SSH e o gateway padrão da estação de trabalho local?
Rmalayter
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.