É possível encaminhar solicitações ssh que chegam por uma determinada porta para outra máquina?

StackOverflow https://stackoverflow.com/questions/45230

  •  09-06-2019
  •  | 
  •  

Pergunta

Eu tenho uma pequena rede local.Apenas uma das máquinas está disponível para o mundo exterior (isto não é facilmente alterável).Eu gostaria de poder configurá-lo de forma que as solicitações ssh que não chegam na porta padrão sejam enviadas para outra máquina.Isso é possível?Se sim, como?

Ah, e todas essas máquinas estão executando Ubuntu ou OS X.

Foi útil?

Solução

Outra maneira seria usar o tunelamento ssh (que acontece no lado do cliente).

Você faria um comando ssh como este:

ssh -L 8022:myinsideserver:22 paul@myoutsideserver

Isso conecta você à máquina acessível externamente (myoutsideserver) e cria um túnel através dessa conexão ssh até a porta 22 (a porta ssh padrão) no servidor que só é acessível internamente.

Então você faria outro comando ssh como este (deixando o primeiro ainda conectado):

ssh -p 8022 paul@localhost

Essa conexão com a porta 8022 em seu host local será então encapsulada através da primeira conexão ssh que o levará ao myinsideserver.

Pode haver algo que você precise fazer em myoutsideserver para permitir o encaminhamento da porta ssh.Estou verificando isso agora.

Editar

Hmmm.A página de manual do ssh diz o seguinte:**Somente o superusuário pode encaminhar portas privilegiadas.**

Isso implica para mim que a primeira conexão ssh deve ser como root.Talvez alguém possa esclarecer isso.

Parece que os privilégios de superusuário não são necessários, desde que a porta encaminhada (neste caso, 8022) não é uma porta privilegiada (como 22).Obrigado pelo esclarecimento Mike Stone.

Outras dicas

(Neste exemplo, presumo que a porta 2222 irá para o seu host interno.$externalip e $internalip são os endereços IP ou nomes de host da máquina visível e interna, respectivamente.)

Você tem algumas opções, dependendo de quão permanente você deseja que o proxy seja:

  • Algum tipo de proxy TCP.No Linux, a ideia básica é que antes o pacote recebido é processado, você deseja mudar seu destino- ou sejapré-roteamento NAT de destino:

    iptables -t nat -A PREROUTING -p tcp -i eth0 -d $externalip --dport 2222 --sport 1024:65535 -j DNAT --to $internalip:22

  • Usando SSH para estabelecer encaminhamento de porta temporário.A partir daqui, você tem duas opções novamente:

    • Proxy transparente, onde o cliente pensa que seu host visível (na porta 2222) é apenas um servidor SSH normal e não percebe que está passando.Embora você perca algum controle refinado, você obtém conveniência (especialmente se quiser usar SSH para encaminhar VNC ou X11 até o host interno).

      • Da máquina interna: ssh -g -R 2222:localhost:22 $externalip
      • Então, do mundo exterior: ssh -p 2222 $externalip

      Observe que as máquinas “internas” e “externas” não precisam estar na mesma LAN.Você pode encaminhar para todo o mundo dessa maneira.

    • Forçando primeiro o login na máquina externa.Isso é verdadeiro "encaminhamento", não "proxy";mas a ideia básica é esta:Você força as pessoas a fazer login na máquina externa (assim você controla quem pode fazer login e quando, e obtém registros da atividade) e, a partir daí, elas podem usar SSH para dentro.Parece uma tarefa árdua, mas se você configure scripts de shell simples na máquina externa com os nomes de seus hosts internos, juntamente com pares de chaves SSH sem senha então é muito simples para o usuário fazer login.Então:

      • Na máquina externa você faz um script simples, /usr/local/bin/internalhost que simplesmente funciona ssh $internalip
      • Do mundo exterior, os usuários fazem: ssh $externalip internalhost e assim que fazem login na primeira máquina, são imediatamente encaminhados para a interna.

      Outra vantagem dessa abordagem é que as pessoas não terão problemas de gerenciamento de chaves, pois a execução de dois serviços SSH em um endereço IP deixará o cliente SSH irritado.

Para sua informação, se você deseja fazer SSH para um servidor e não quer se preocupar com chaves, faça isso

ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no

Eu tenho um alias no meu shell chamado "nossh", então posso simplesmente fazer nossh somehost e ignorará todos os erros principais.Apenas entenda que você está ignorando as informações de segurança ao fazer isso, portanto, há um risco teórico.

Muitas dessas informações vêm de uma palestra que dei no Barcamp Bangkok sobre truques sofisticados de SSH.Você pode ver meus slides, mas recomendo o versão de texto já que os slides do S5 têm alguns bugs.Confira a seção chamada "Encaminhar qualquer coisa:Encaminhamento de porta simples" para informações.Também há informações sobre como criar um proxy SOCKS5 com OpenSSH.Sim, você pode fazer isso.OpenSSH é incrível assim.

(Finalmente, se você estiver navegando muito na rede interna, considere configurar uma VPN.Parece assustador, mas o OpenVPN é bastante simples e funciona em todos os sistemas operacionais.Eu diria que é um exagero apenas para SSH;mas assim que você iniciar o encaminhamento de porta por meio de encaminhamento de porta para que VNC, HTTP ou outras coisas aconteçam;ou se você tiver muitos hosts internos com os quais se preocupar, pode ser mais simples e de fácil manutenção.)

@Mark Biek

Eu ia dizer isso, mas você chegou antes de mim!De qualquer forma, só queria acrescentar que também existe a opção -R:

ssh -R 8022:myinsideserver:22 paul@myoutsideserver

A diferença é a qual máquina você está se conectando.Meu chefe me mostrou esse truque há pouco tempo e é definitivamente muito bom saber...estávamos atrás de um firewall e precisávamos dar acesso externo a uma máquina...ele contornou isso por ssh -R para outra máquina que estava acessível ...então, as conexões para essa máquina foram encaminhadas para a máquina atrás do firewall, então você precisa usar -R ou -L com base em qual máquina você está e para qual você está fazendo ssh.

Além disso, tenho certeza de que você pode usar um usuário comum, desde que a porta que você está encaminhando (neste caso, a porta 8022) não esteja abaixo do intervalo restrito (que eu acho que é 1024, mas posso estar enganado) , porque essas são as portas "reservadas".Não importa que você esteja encaminhando para uma porta "restrita" porque essa porta não está sendo aberta (a máquina está apenas recebendo tráfego enviado para ela através do túnel, ela não tem conhecimento do túnel), a porta 8022 IS sendo aberto e, portanto, restrito como tal.

EDITAR:Apenas lembre-se, o túnel só estará aberto enquanto o ssh inicial permanecer aberto, portanto, se o tempo expirar ou você sair dele, o túnel será fechado.

Você pode usar o encaminhamento de porta para fazer isso.Dê uma olhada aqui:

http://portforward.com/help/portforwarding.htm

Há instruções sobre como configurar seu roteador para solicitação de encaminhamento de porta nesta página:

http://www.portforward.com/english/routers/port_forwarding/routerindex.htm

No Ubuntu, você pode instalar Firestarter e então use-o Serviço de encaminhamento recurso para encaminhar o tráfego SSH de uma porta não padrão em sua máquina com acesso externo à porta 22 na máquina dentro de sua rede.

No OS X você pode editar o /etc/nat/natd.plist arquivo para ativar o encaminhamento de porta.

Sem mexer nas regras de firewall, você pode configurar um arquivo ~/.ssh/config.

Suponha que 10.1.1.1 seja o sistema 'gateway' e 10.1.1.2 seja o sistema 'cliente'.

Host gateway
  Hostname 10.1.1.1 
  LocalForward 8022 10.1.1.2:22 

Host client
  Hostname localhost
  Port 8022

Você pode abrir uma conexão ssh com o 'gateway' via:

ssh gateway

Em outro terminal, abra uma conexão com o cliente.

ssh client
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top