Permitindo SSH em um servidor com um cliente OpenVPN ativo

15

Eu tenho um VPS executando o CentOS 7 ao qual me conecto com o SSH. Eu gostaria de executar um cliente OpenVPN no VPS para que o tráfego da Internet seja roteado através da VPN, mas ainda permita a conexão com o servidor via SSH. Quando inicio o OpenVPN, minha sessão SSH é desconectada e não consigo mais me conectar ao meu VPS. Como posso configurar o VPS para permitir que as conexões SSH (porta 22) de entrada sejam abertas no IP real do VPS (104.167.102.77), mas ainda roteie o tráfego de saída (como um navegador da Web no VPS) através da VPN?

O serviço OpenVPN que eu uso é PrivateInternetAccess, e um exemplo de arquivo config.ovpn é:

cliente
dev tun
proto udp
remote nl.privateinternetaccess.com 1194
resolver-repetir infinito
nobind
chave persistente
persist-tun
ca ca.crt
tls-client
servidor remote-cert-tls
auth-user-pass
comp-lzo
verbo 1
reneg-sec 0
crl-verifica crl.pem

Endereço IP do VPS:

1: lo: mtu 65536 qdisc noqueue state UNKNOWN
    link / loopback 00: 00: 00: 00: 00: 00 brd 00: 00: 00: 00: 00: 00
    host do escopo inet 127.0.0.1/8 lo
       valid_lft forever preferência_lft forever
    host do escopo inet6 :: 1/128
       valid_lft forever preferência_lft forever
2: ens33: mtu 1500 qdisc estado pfifo_fast UP qlen 1000
    link / éter 00: 50: 56: be: 16: f7 brd ff: ff: ff: ff: ff: ff
    inet 104.167.102.77/24 brd 104.167.102.255 escopo global ens33
       valid_lft forever preferência_lft forever
    inet6 fe80 :: 250: 56ff: febe: link do escopo 16f7 / 64
       valid_lft forever preferência_lft forever
4: tun0: mtu 1500 qdisc estado pfifo_fast DESCONHECIDO qlen 100
    link / nenhum
    escopo global in0 10.172.1.6 ponto 10.172.1.5/32
       valid_lft forever preferência_lft forever

Rota IP do VPS:

0.0.0.0/1 via 10.172.1.5 dev tun0
padrão via 104.167.102.1 dev ens33 proto estática métrica 1024
10.172.1.1 via 10.172.1.5 dev tun0
10.172.1.5 dev tun0 proto kernel scope link src 10.172.1.6
104.167.102.0/24 dev ens33 proto kernel scope link src 104.167.102.77
109.201.154.177 via 104.167.102.1 dev ens33
128.0.0.0/1 via 10.172.1.5 dev tun0
odie5533
fonte

Respostas:

15

Estou com um problema semelhante a esse e estou tentando a correção descrita nesta postagem do fórum .

A idéia é que, atualmente, quando você se conecta ao seu endereço IP público, os pacotes de retorno estão sendo roteados pela VPN. Você precisa forçar o roteamento desses pacotes pela sua interface pública.

Esperamos que estes comandos de rota façam o truque:

regra de ip adicionada a partir da tabela xxxx 128

rota ip adicione a tabela 128 ao aaaa / y dev ethX

rota ip adicionar tabela 128 padrão via zzzz

Onde xxxx é seu IP público, aaaa / y deve ser a sub-rede do seu endereço IP público, ethX deve ser sua interface Ethernet pública e zzzz deve ser o gateway padrão.

Note que isso não funcionou para mim (usando Debian e PrivateInternetAccess), mas pode ajudá-lo.

MrK
fonte
1
Em vez de apenas vincular a uma solução, indique ou pelo menos resuma a solução aqui. Dessa forma, sua postagem ainda poderá ser útil no futuro se a postagem à qual você vinculou desaparecer.
Andrew Schulman
Eu executei esses comandos sem sucesso ... Como listaria essa tabela (não consigo ver as novas regras adicionadas routeou ip route show) e a excluí?
Hussain Khalil
Perdi meu ssh no meu ip público quando levantei o openvpn no meu servidor doméstico. A execução do primeiro comando listado acima me permitiu obter acesso ssh de volta ao servidor quando não estiver na LAN local. Usando PIA + OpenVPN + ubuntu 16.04.
boredcoding
Ele realmente direciona apenas a porta SSH para o meu IP público? Você pode explicar mais sobre o que exatamente isso faz? Eu não vejo qualquer lugar que você definir uma porta específica ou protocolo
Freedo
Ele não é roteado com base nas portas (128 é o número da tabela, não uma porta). É basicamente dizer que, se os pacotes chegarem através do seu endereço IP público, a resposta deverá ser enviada na mesma interface (sem usar a VPN).
MRK
17

Pode ser um pouco tarde, mas ...

O problema é que o gateway padrão é alterado pelo OpenVPN e interrompe sua conexão SSH atual, a menos que você configure rotas apropriadas antes de iniciar o OpenVPN.

O que segue funciona para mim. Ele usa iptables e ip (iproute2). Abaixo, supõe-se que a interface de gateway padrão antes do OpenVPN ser iniciado seja "eth0". A idéia é garantir que quando uma conexão com eth0 for estabelecida, mesmo que eth0 não seja mais a interface de gateway padrão, os pacotes de resposta para a conexão retornem novamente a eth0.

Você pode usar o mesmo número para a marca de conexão, marca de firewall e tabela de roteamento. Usei números distintos para tornar as diferenças entre eles mais aparentes.

# set "connection" mark of connection from eth0 when first packet of connection arrives
sudo iptables -t mangle -A PREROUTING -i eth0 -m conntrack --ctstate NEW -j CONNMARK --set-mark 1234

# set "firewall" mark for response packets in connection with our connection mark
sudo iptables -t mangle -A OUTPUT -m connmark --mark 1234 -j MARK --set-mark 4321

# our routing table with eth0 as gateway interface
sudo ip route add default dev eth0 table 3412

# route packets with our firewall mark using our routing table
sudo ip rule add fwmark 4321 table 3412

===

ATUALIZAR:

O acima funciona bem para mim no Debian Jessie. Mas em um sistema Wheezy antigo, acabei de descobrir que preciso adicionar "via" à entrada da tabela de roteamento:

# our routing table with eth0 as gateway interface
sudo ip route add default dev eth0 via 12.345.67.89 table 3412

"12.345.67.89" deve ser o gateway não VPN original.

John Doe
fonte
1
OBRIGADO! Estou procurando uma solução para esse problema há dias, e sua resposta resolveu isso para mim. Essa deve ser a resposta aceita.
Mike Turley
Essa solução também funcionou para mim. Muito obrigado por compartilhar isso.
Alecov
Pode haver duas rotas na tabela de roteamento com o mesmo destino ( ip route add default)? Recebo "Respostas RTNETLINK: o arquivo existe". Estou executando o Ubuntu Xenial. "via" não ajuda. Eu apenas tentei no Arch Linux, primeiro ip route add defaultparece ter sucesso, mas a ip routesaída não muda. Qualquer execução subsequente resulta na mensagem "arquivo existe".
X-yuri
Entendo, a rota é adicionada à tabela de roteamento 3412. E para chegar a isso você tem que: ip route show table all | grep 3412. E sem "via" conexões não estabelecidas (se não me engano), pare para funcionar (Ubuntu Xenial). Pelo menos eu sou capaz de corrigir a tabela de roteamento. No entanto, não consigo acessar o servidor depois de executar openvpn.
X-yuri
Por algum motivo, não funcionou para mim, em oposição a isso , ou isso ou aquilo . Quais são basicamente os mesmos.
X-yuri
12

Com base na resposta do @MrK, escrevi aqui um código simples para agilizar o trabalho, para que você não precise verificar interfaces / IP:

ip rule add from $(ip route get 1 | grep -Po '(?<=src )(\S+)') table 128
ip route add table 128 to $(ip route get 1 | grep -Po '(?<=src )(\S+)')/32 dev $(ip -4 route ls | grep default | grep -Po '(?<=dev )(\S+)')
ip route add table 128 default via $(ip -4 route ls | grep default | grep -Po '(?<=via )(\S+)')

Eu tentei esse script em 4 dos meus VPS e está funcionando perfeitamente.

SandPox
fonte
Muito obrigado!
Jordi Goyanes
0

hmm soa como sobreposição de sub-rede ip .... sem saber mais sobre o seu esquema de ip, além do ip público da sua terminação vpn como nl.privateinternetaccess.com, não posso ter certeza.

por exemplo, se a sub-rede remota do outro lado de nl.privateinternetaccess.com for 10.32.43.0/24 e sua instância estiver em um aws vpc cuja sub-rede seja 10.32.44.0/24. mas seu cliente ssh de origem vive em 10.32.43.0/24 (seu lado do aws vpc), ele não funcionará, pois o tráfego ssh de retorno será enviado erroneamente sobre o vpn para os países baixos.

forneça informações completas sobre ip / sub-rede para obter mais ajuda com isso.

...

ok, então ... parece que sua rota padrão está no túnel, depois que você se conectar ao nl:

0.0.0.0/1 via 10.172.1.5 dev tun0

para que você possa mudar isso depois de se conectar. Muitas vezes, os servidores VPN oferecem rotas falsas. especialmente no corpo desleixado. nesse caso, eles estão enviando uma rota padrão para você, para que todo o tráfego da caixa vps vá para nl. altere a rota padrão para 104.167.102.x ou qualquer outro gateway de sub-rede no seu provedor de vps.

nandoP
fonte
Quais saídas de comandos seriam suficientes?
odie5533
1
saída de "ip addr" e "ip route" no ssh client, ssh server / vpn client e nl vpn server. verifique se o vpn está ativo ao obter a saída.
N
Quero que o tráfego, por padrão, passe pela VPN; no entanto, quero que o tráfego de entrada 104.167.102.77:22 seja permitido para que eu possa fazer o SSH no VPS.
odie5533
você verifica isso com tcpdump, mas parece que depois que você se conecta e a rota padrão se torna túnel, o novo tráfego ssh de entrada de outro local da Internet é permitido, mas não está retornando, pois a rota padrão envia resposta ssh através do túnel, em vez de voltar para você. você pode corrigir isso "ip route add [your-ip-addr] / 32 via [seu gateway vps]". para encontrar seu gateway vps, simplesmente desconecte-se do túnel e veja a rota padrão
nandoP
0

Quando você abre a VPN, seu gateway padrão é substituído. Isso significa que qualquer tráfego gerado ou roteado pela sua caixa será encaminhado para o gateway da VPN.

Uma solução simples é filtrar todo o tráfego que você não deseja rotear pela VPN e fazer outra coisa com ele. Uma possibilidade é pegar o tráfego gerado na sua caixa com o endereço de origem local e encaminhá-lo através do gateway local. Isso permite que serviços como SSH funcionem corretamente.

Nós vamos fazer isso aqui. Primeiro, crie uma nova tabela de roteamento e adicione uma rota padrão que roteie tudo pelo seu gateway local:

# <table> is any number between 2 and 252.
# Check /etc/iproute2/rt_tables for more info.
ip route add default via <gateway> table <table>
ip route add <lan-addr> dev <device> table <table>

Em seguida, crie uma nova regra de filtro de pacotes que marque todo o tráfego que sai da sua caixa de um determinado endereço de origem com algum identificador.

# <mark> is any number.
iptables -tmangle -AOUTPUT -s<local-addr> -jMARK --set-mark <mark>

Por fim, crie uma política de roteamento que escolha todo o tráfego marcado acima mencionado e o direcione usando a tabela gerada acima.

ip rule add fwmark <mark> table <table>

Mais uma vez, os valores <mark>e <table>são identificadores arbitrários de sua própria escolha.

alecov
fonte
0

Para mim, ao executar o servidor OpenVPN eu mesmo no pfSense, desmarquei a configuração "Forçar todo o tráfego IPv4 gerado pelo cliente através do túnel".

user3820047
fonte