Linux (Ubuntu) Cliente OpenVPN - Não faça o encapsulamento do SSH

2

Eu gostaria de executar o OpenVPN no modo cliente na minha VM na nuvem (instância do EC2), para que o tráfego que sai da VM em geral passe pela VPN. Mas eu ainda gostaria que o endereço IP existente estivesse disponível para conexões SSH (para que ele não quebre a conexão SSH que estou atualmente conectada à máquina).

Aqui está o arquivo de configurações .ovpn atual que estou usando:

client
dev tun
proto udp
remote xxx.yyy.com 1198
resolv-retry infinite
nobind
persist-key
persist-tun
cipher aes-128-cbc
auth sha1
tls-client
remote-cert-tls server
auth-user-pass
comp-lzo
verb 1
reneg-sec 0
crl-verify crl.rsa.2048.pem
ca ca.rsa.2048.crt
disable-occ

Editar: essa pergunta pode ser uma duplicata de Evitar que a conexão SSH seja perdida após o login na VPN na máquina do servidor ... mas também não há resposta aceita.

    
por GavinR 11.08.2017 / 22:04

4 respostas

2

Você pode usar o roteamento avançado para rotear pacotes recebidos em sua interface principal através da mesma interface. Dessa forma, qualquer tráfego originado do servidor será roteado por VPN, mas a interface principal do seu servidor permanecerá disponível para conexões. A idéia aqui é que, se um pacote vier pela interface principal, ele usará uma tabela de roteamento diferente chamada "vpn", para que ele não seja afetado pelas configurações de roteamento do cliente VPN.

Para conseguir isso, faça o seguinte:

Edite o arquivo /etc/iproute2/rt_tables . Deve conter algo assim:

#
# reserved values
#
255     local
254     main
253     default
0       unspec
#
# local 
#

Adicione esta linha ao final do arquivo:

1        vpn

Para o arquivo /etc/network/interfaces , sob as configurações da sua interface principal (ou para o arquivo apropriado em /etc/network/interfaces.d/ ), adicione as seguintes linhas:

up ip route add 0.0.0.0/0 via def.ault.gw table vpn
up ip rule add from the.primary.ip.addr table vpn
down ip route del 0.0.0.0/0 table vpn
down ip rule del from the.primary.ip.addr

Substitua the.primary.ip.addr pelo endereço IP da sua interface principal (ou seja, o IP pelo qual você deseja que seu servidor fique disponível) e def.ault.gw com o endereço do gateway padrão.

    
por 15.08.2017 / 11:32
1

Eu sugeriria usar as opções '--up' e '--down' para executar scripts de shell que manipulam o firewall e a tabela de roteamento em sua VM conforme necessário. Isso permitiria que você encapsulasse o tráfego através de sua VPN (se o openvpn já não estivesse fazendo isso) e fizesse uma exceção para o tráfego ssh. Lembre-se de que as regras do iptables são aplicadas de maneira descendente, portanto, certifique-se de que sua regra de exceção seja aplicada antes da regra de encapsulamento. Há outras perguntas que você pode usar como exemplos sobre como gerenciar as tabelas de roteamento e as regras de firewall.

iptables - Alvo para rotear pacotes para uma interface específica?

    
por 14.08.2017 / 23:31
1

Eu acho que o problema que você está enfrentando é que a rota padrão está na VPN e há algumas rotas que estão filtrando pacotes que estão vindo de uma interface onde não há rota para a origem. Isso é chamado de filtro RP .

Você tem 2 soluções para ter uma rota padrão diferente para o sshd do que o restante dos processos. Você pode usar namespaces de rede ou pode usar cgroups. Eu não sei muito sobre isso, mas você pode ler mais nas respostas para: link

    
por 15.08.2017 / 04:31
1

Você pode fazer isso por roteamento avançado, como sugerido, mas não é tão simples assim.

A solução mais simples para atingir seu objetivo é rotear pacotes endereçando seu endereço IP (home) de maneira diferente. É sempre boa ideia restringir o acesso ssh a vários endereços IP seguros. Por exemplo, você pode fazer:

ip route add 1.1.1.1 via 9.9.9.9

Aqui 1.1.1.1 é o seu endereço IP, e 9.9.9.9 é algum gateway padrão já acessível na tabela de roteamento. Agora todos os pacotes da sua máquina para o IP externo retornarão da mesma maneira. Você pode rotear todo o resto da VPN como normal. Você pode até adicionar esta rota no arquivo de configuração openvpn. Tudo é super.

No entanto, não é tão bom se seu IP residencial está mudando (também conhecido como endereço dinâmico) ou você precisa acessar sua máquina a partir de endereços aleatórios (vários usuários, viajando). Nesse caso, você deve seguir o caminho difícil.

Por favor note que se você não fizer nada, os pacotes ssh chegarão na sua interface externa (e ip), mas eles não poderão encontrar o caminho de volta se você os rotear através da VPN (na verdade eles poderiam dependendo das configurações de VPN, mas o IP de origem será diferente e o pacote será descartado). Seu objetivo é redirecionar alguns pacotes de saída para a interface externa e alguns para a VPN. Este é o problema.

Crie uma tabela de roteamento alternativa:

echo "100 secure" >> /etc/iproute2/rt_tables

Preencha e controle o roteamento:

# route ssh over external iface eth0 to router 9.9.9.9 
ip route add default via 9.9.9.9 dev eth0 table secure

# send all packages with fwmark 1 to the secondary routing table
ip rule add fwmark 0x1 table secure

# Mark outgoing ssh packages with the mark 1
iptables -t mangle -A OUTPUT -p tcp --sport 22 -j MARK --set-mark 1

Aqui, marcaremos todos os pacotes ssh de saída e, em seguida, redirecionaremos todos os pacotes marcados pelo roteiro alternativo. Claro, agora você não vai poder fazer o ssh em sua vpn porque todas as respostas seriam redirecionadas para uma outra interface. O ponto é, você pode criar regras iptables arbitrariamente complexas e rotea-las diferentemente usando set-mark.

Felizmente, temos uma coisa chamada CONNMARK que (utilizando o recurso de rastreamento de conexão do kernel) pode marcar conexões inteiras para frente e para trás (você precisará do módulo xt_connmark).

# mark incoming ssh *connection* with 1. Here eth0 is your external interface
iptables -A INPUT -m state --state NEW -i eth0 -p tcp --dport 22 -t mangle -j CONNMARK --set-mark 1

# restore connection mark (e.g. mark the packages) 
iptables -A OUTPUT -t mangle -j CONNMARK --restore-mark 

# send all packages with fwmark 1 to the secondary routing table as before..
ip rule add fwmark 0x1 table secure

Por favor, use o acima de acordo com sua configuração atual depois de entender os conceitos e não apenas copiar e colar.

Editar: da perspectiva do cliente

Se você estiver usando sua VPN da mesma máquina onde é feita a conexão ssh, um problema adicional surge.

Por padrão, o par de VPN é o gateway padrão. Ele pode facilmente quebrar sua conexão existente, já que seus pacotes ssh serão roteados pelo canal VPN (o servidor os obterá da interface tun ou tap e não da interface eth física). A solução fácil não inclui a opção de gateway padrão na configuração do lado cliente (ou não a envia). Pressione apenas a rota das sub-redes preferidas. Aviso: se você fez a VPN para ocultar seu endereço público (em casa), isso pode não ser o que você quer!

    
por 16.08.2017 / 13:37