Como rotear endereços específicos através de um túnel?

13

Existem determinados sites / serviços que só posso acessar na sub-rede em que o meu servidor está localizado (pense no cenário típico da intranet). Existe uma maneira de rotear o tráfego de forma transparente para esses endereços através de um túnel SSH?

Considere a seguinte configuração:

Meu laptop está conectado à rede doméstica. Não pode acessar os serviços nos ips X e Y diretamente. Eu tenho um túnel SSH para um servidor que está em uma sub-rede que pode realmente acessar esses serviços.

Posso, de alguma forma, encapsular automaticamente todo o tráfego para as sub-redes de X e Y para passar por este túnel, sem ter que executar toda a solução de VPN que enviaria todo o meu tráfego através do servidor? Em outras palavras: todo o tráfego que vai para qualquer outra sub-rede ainda deve ir diretamente do laptop, sem passar pelo servidor (usando o túnel).

    
por Ruben Vermeersch 11.08.2010 / 23:06

6 respostas

6

Você pode especificar a interface pela qual encaminhar o tráfego na tabela de roteamento:

sudo route add <host.com> -interface <ppp0>

Onde host.com é o nome de host ou ip que você deseja acessar através da interface, e ppp0 é o identificador de link para sua VPN mostrado com o comando ifconfig .

    
por 12.08.2010 / 01:25
3

As versões recentes do OpenSSH suportam dispositivos de rede tun / tap para um verdadeiro suporte VPN. Veja link para alguma documentação básica (obviamente destinada ao Ubuntu, mas o princípio básico se aplica em outros lugares.)

    
por 12.08.2010 / 02:42
1

Disclaimer: Eu não testei realmente o que vou descrever, e na verdade, pode ser completamente errado, mas sua pergunta é tão intrigante que não posso resistir à tentação de redigir uma resposta. :-) Também o a configuração aqui depende de alguma funcionalidade iptables que possa existir somente no Linux.

Supondo que você deseja se conectar do seu laptop a uma porta específica P1 servidor X1, para a porta P2 no servidor X2, etc. - vou descrever como para rotear o tráfego TCP para esses pares específicos de servidor + porta através de um Túnel SSH. Nota: os endereços IP X1, X2, etc são os endereços IP do servidor como visto a partir do host do gateway (o que você SSH em).

  1. Selecione algumas portas locais não usadas L1 (por exemplo, 10000), L2 (por exemplo, 10001), etc. As portas L1, L2, ..., devem ser todas distintas e seu número deve ser igual ao número de distintas ( Xn, Pn) pares server + port.

  2. Use iptables para redirecionar pacotes direcionados para Xn: Pn para localhost: Ln

    iptables -t nat -A OUTPUT -p tcp -d X1 --dporta P1 -j DNAT --a localhost de destino: L1 iptables -t nat -A OUTPUT -p tcp -d X2 --dportar P2 -j DNAT - para localhost de destino: L2

  3. Agora, o SSH para o gateway, usando a opção -L para encapsular o tráfego de localhost: Ln para (Xn, Pn):

    ssh gateway.server -L localhost: L1: X1: P1 -L localhost: L2: X2: P2 ...

Exemplo:

# access webserver.intranet (port 80) through localhost:10080
iptables -t nat -A OUTPUT -p tcp -d webserver.intranet --dport 80 -j DNAT --to-destination localhost:10080
ssh gateway.server -L locahost:10080:webserver.intranet:80

Advertências:

  • ele só funciona para o TCP, se funcionar ...

  • se você quiser acessar mais de um servidor, provavelmente é menos trabalho para configurar uma VPN

  • ainda pode ser mais fácil usar a opção SSH -D para simular um SOCKS Proxy e túnel todo o seu tráfego através disso.

por 12.08.2010 / 00:13
1

subnets of X and Y to go through this tunnel, without having to run the entire VPN solution that would send all my traffic through the server?

O que você quer é a definição de uma VPN.

Uma VPN não deve

send all [your] traffic through the server?

Se for, não está configurado corretamente.

Supõe-se que qualquer máquina que você esteja tentando acessar através de um Túnel ou VPN, por definição, não seja acessível pela Internet. Portanto, somente o endereço não roteado pela Internet necessário deve ser roteado pela VPN.

Se você tiver uma situação mais complicada, como apenas a máquina X e Y e nada mais. Sua equipe de TI pode colocar aqueles em uma sub-rede para você. Em seguida, no seu computador cliente, apenas direcione essa sub-rede pela VPN.

    
por 12.08.2010 / 00:31
0

Can I somehow automatically encapsulate all the traffic to the subnets of X and Y to go through this tunnel, without having to run the entire VPN solution that would send all my traffic through the server?

Isso é um pouco estranho à primeira vista, porque é isso que uma VPN fará por você. O SSH tende a ser um assunto ponto-a-ponto, a idéia é que você conecte uma porta em sua máquina local à porta de uma máquina remota em outro lugar; realmente não foi projetado para o tipo de tráfego que você imagina.

In other words: all traffic that goes to any other subnet should still go directly from the laptop, without passing through the server (using the tunnel).

Mais uma vez, uma VPN cuidaria disso.

Se você está preocupado com uma solução "pesada" para obter tráfego VPN seguro (ou seja, você não quer brincar com ele porque seria muito complicado), você deve realmente olhar para OpenVPN , que fará exatamente o que você está descrevendo. Não só ele encapsularia todo o tráfego, mas também pode ser feito de forma que apenas o tráfego destinado a essas sub-redes faça a viagem pelo canal da VPN. Vou avisá-lo que você ainda precisará editar um arquivo de texto na (s) máquina (s) local (is) e remota (s), mas é bastante fácil de executar.

Para seus objetivos, como você não deseja que a parte intermediária (um servidor) veja seu tráfego, configure a VPN para se conectar diretamente de sua máquina à máquina remota. Qualquer pacote roteado será criptografado antes de sair do seu laptop, assim você terá 100% de cobertura end-to-end.

    
por 12.08.2010 / 02:53
0

Como outros já disseram, se você precisar "encapsular todo o tráfego para as sub-redes", provavelmente desejará usar a VPN.

No entanto, para acessar apenas alguns serviços, talvez você queira usar o recurso de encaminhamento de porta local do SSH, que é realmente simples. Por exemplo, se você digitar (do seu laptop):

ssh -N -L 3333:localhost:2222 jump_box

em seguida, conectar-se a localhost:2222 será como conectar-se a localhost:2222 de jump_box . Você pode usar várias opções -L de uma só vez e pode se conectar a serviços em outros hosts se o ssd_config on jump_box permitir.

Você pode usar autossh com systemd ou algo parecido para manter os túneis em funcionamento.

    
por 25.08.2016 / 01:04