Como encaminhar uma porta para outra conexão de servidor via SSH

2

Eu acho que o que estou tentando fazer é chamado SSH Tunneling. Estou um pouco confuso se isso é realmente o que eu quero fazer.

Eu quero configurar um túnel na porta 1234 no servidor a . O servidor A encaminha todas as conexões pela porta 1234 para o servidor B na porta 5678 . Isso é possível com o SSH?

Basicamente eu quero acessar um servidor secundário em uma rede local através do servidor primário que está em uma rede pública do meu computador local sem ter que fazer o login no servidor primário.

Eu também só quero que o túnel permita que um usuário não-root se conecte ao servidor privado. Ele deve ser autenticado normalmente ao efetuar login no SSH. Precisa ter certeza de que isso funciona para o WinSCP também, para que o cliente possa acessar sua conta na caixa privada através do endereço IP público corretamente.

MasterGberry
fonte

Respostas:

4

O que o @RolandW sugere está correto e funcionará se e somente se o servidor B na rede privada estiver diretamente acessível do servidor A, ou seja , se e somente o servidor B não estiver atrás de um firewall e de um roteador NAT.

Se qualquer uma dessas duas suposições for falsa, você terá que usar uma solução diferente. Nesse caso, como B não é diretamente acessível de A, você terá que estabelecer um túnel reverso de B para A e, em seguida, poderá acessar B de sua casa.

No servidor B,

  1. Adicione esta linha para /etc/rc.local

    su -c /home/your_name/bin/auto your_name
    
  2. Crie um arquivo executável chamado auto in /home/your_name/bin, chamado auto, com este conteúdo:

    #!/bin/sh
    /usr/lib/autossh/autossh -M 6321 -f -p 22 -2 -N -D  -R 8100:localhost:22 your_name_o_server_A@IP_address_of_server_A -i /path/to/cryptokey/of_server_A
    

    O comando autossh é um utilitário muito conveniente que automaticamente reinicia o túnel ssh toda vez que ele desce (falta de energia, reinicializações, qualquer coisa); Para fazer isso, ele usa uma porta (no meu caso, 6321) para verificar o status da conexão. Você pode muito bem usar uma porta TCP diferente de 6321 (mas maior que 1024!), Apenas certifique-se de que ela esteja aberta no servidor A.

    O comando acima assume que você ativou a autenticação por meio de chaves criptográficas, o que definitivamente deve ser feito.

  3. No servidor A, você terá que introduzir a seguinte linha

    GatewayPorts yes
    

    no arquivo /etc/ssh/sshd_config. Isso exige privilégios de sudo.

  4. Por fim, você pode se conectar em casa da seguinte maneira:

    ssh -YC -t -t -p 22 -i /path/to/cryptkey/of_server_A \
      your_name_o_server_A@IP_address_of_server_A        \
      "ssh -Y your_name_on_server_B@localhost -p 8100 -i /path/to/cryptkey/of-server_B" 
    

Claro que será conveniente estabelecer aliases para tornar a chamada acima mais rápida.

MariusMatutiae
fonte
2

Estou assumindo que você deseja obter acesso SSH ao Servidor B, que está em uma rede privada conectada ao Servidor (público) A. O Servidor B executa um daemon ssh na porta 5678.

Para fazer isso, você pode criar um encaminhamento de porta no servidor público que encaminha pacotes TCP que chegam na porta 1234 para o servidor-b: 5678. De acordo com https://serverfault.com/questions/140622/how-can-i-port-forward-with-iptables isso pode ser feito em uma caixa Linux executando o iptables (netfilter) usando os seguintes comandos

iptables -t nat -A PREROUTING -p tcp -i <WAN interface> --dport 1234 -j DNAT --to-destination <server-b-IP>:5678
iptables -A FORWARD -p tcp -d <server-b-IP> --dport 5678 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

A primeira regra reescreve o endereço de destino, o segundo permite que o pacote modificado seja entregue ao seu destino. Isso pressupõe que o gateway padrão do servidor B é o servidor A.

Roland W
fonte