web-development-kb-pt.site

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

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

Considere a seguinte configuração:

Meu laptop está conectado na rede doméstica. Ele não pode acessar 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.

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

14
Ruben Vermeersch

Você pode especificar a interface através da qual rotear o tráfego na tabela de roteamento:

Sudo route add <Host.com> -interface <ppp0>

Onde Host.com é o nome do host ou ip que você deseja acessar através da interface e ppp0 é o identificador de link para o seu vpn mostrado com o comando ifconfig.

6
Sam Coles

Versões recentes do OpenSSH suportam dispositivos de rede tun/tap para suporte verdadeiro à VPN. Veja https://help.ubuntu.com/community/SSH_VPN para obter alguma documentação básica (obviamente destinada ao Ubuntu, mas o princípio básico se aplica a outros lugares).

3
durin42

Isenção de responsabilidade: Na verdade, não testei o que vou descrever e, de fato, pode estar completamente errado, mas sua pergunta é tão intrigante que não resisto à tentação de redigir uma resposta. :-) Além disso, a configuração aqui depende de algumas funcionalidades iptables que podem existir apenas no Linux.

Supondo que você deseja se conectar do seu laptop a uma porta P1 específica no servidor X1, à porta P2 no servidor X2, etc. - Vou descrever como rotear TCP tráfego para esses pares 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 no host do gateway (aquele no qual você SSH).

  1. Selecione algumas portas locais não utilizadas 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 servidores distintos (Xn, Pn) pares de portas.

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

    iptables -t nat -A SAÍDA -p tcp -d X1 --dados P1 -j DNAT --para o localhost de destino: L1 localhost de destino: L2

  3. Agora SSH para o gateway, usando o -L opção para encapsular o tráfego do host local: 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

Ressalvas:

  • só funciona para TCP, se é que funciona ...

  • se você deseja acessar mais de um servidor, provavelmente é menos trabalhoso configurar uma VPN

  • ainda pode ser mais fácil usar o SSH -D opção para simular um proxy SOCKS e encapsular todo o seu tráfego por meio disso.

1
Riccardo Murri

sub-redes de X e Y para passar por esse túnel, sem ter que executar toda a solução VPN que enviaria todo o meu tráfego pelo servidor?

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

Uma VPN não deve

enviar todo o [seu] tráfego através do servidor?

Se for, não está configurado corretamente.

Supõe-se que qualquer máquina que você está tentando acessar por meio de um túnel ou VPN, por definição, não seja acessível pela Internet. Portanto, apenas o endereço roteável necessário, que não seja da Internet, 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 colocá-los em uma sub-rede para você. Em seguida, no computador cliente, apenas roteie essa sub-rede pela VPN.

1
Stephen Jazdzewski

De alguma forma, posso encapsular automaticamente todo o tráfego nas sub-redes de X e Y para passar por esse túnel, sem ter que executar toda a solução VPN que enviaria todo o meu tráfego pelo servidor?

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

Em outras palavras: todo o tráfego que chega a qualquer outra sub-rede ainda deve ir diretamente do laptop, sem passar pelo servidor (usando o túnel).

Novamente, 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 se intrometer com isso porque seria muito complicado), você deve realmente olhar para OpenVPN , o que ajudará exatamente o que você está descrevendo. Ele não apenas encapsularia todo o tráfego, mas também poderia ser feito de maneira que apenas o tráfego destinado a essas sub-redes fizesse a viagem pelo canal da VPN. Avisarei que você ainda precisará editar um arquivo de texto nas máquinas local e remota, mas é bastante fácil continuar executando.

Para seus propósitos, como você não deseja que a parte no meio (um servidor) veja seu tráfego, configure a VPN para conectar-se diretamente de sua máquina à máquina remota. Todos os pacotes roteados seriam criptografados antes de sair do laptop, para que você tivesse 100% de cobertura de ponta a ponta.

0
Avery Payne

Como já foi dito, se você deve "encapsular todo o tráfego nas sub-redes", provavelmente deseja usar a VPN.

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

ssh -N -L 3333:localhost:2222 jump_box

depois conectando 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 conectar-se a serviços em outros hosts se o ssd_config em jump_box permite.

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

0
Jeff