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

2

Acho que o que estou tentando fazer é chamado de 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 através da 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 principal.

Eu também quero apenas 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.

    
por MasterGberry 05.06.2014 / 09:28

2 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, ie se e somente o servidor B for não atrás de um firewall e 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 é acessado diretamente 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 a /etc/rc.local

    su -c /home/your_name/bin/auto your_name
    
  2. Crie um arquivo executável chamado auto em /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 reinicia automaticamente o túnel ssh a cada o tempo cai (queda de energia, reinicializações, o que for); 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 . Este exige privilégios sudo.

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

    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.

    
por 05.06.2014 / 16:14
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 ouvindo 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 o link 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 seja o Servidor A.

    
por 05.06.2014 / 13:58