Fazendo uma porta reversa do SSH para a frente sem o GatewayPorts ativado

1

Eu tenho duas máquinas, m1 e m2, e a máquina m2 pode se conectar a m1 usando SSH. Há uma máquina m1bis que só pode se conectar a m1, e há uma máquina m2bis à qual apenas m2 pode se conectar. Eu gostaria de tornar possível para o m1bis alcançar a máquina m2bis em alguma porta q, conectando a alguma porta p da máquina m1. Digamos que p e q sejam portas desprivilegiadas, ou seja, sejam maiores que 1024. Em imagens:

+-------+   q   +----+   SSH   +----+   p   +-------+
| m1bis | ----> | m1 | <------ | m2 | ----> | m2bis |
+-------+       +----+         +----+       +-------+

Eu tenho acesso ao shell para m1 e m2. A maneira usual de fazer isso seria com uma porta reversa SSH, executando o seguinte em m2:

ssh -R *:q:m2bis:p m1

Isso faz com que o daemon do SSH em m1 ouça na porta q em todas as interfaces, e retransmite quaisquer conexões de entrada para a porta p da máquina m2bis. Dessa forma, quando o m1bis se conecta à porta q da máquina m1, a conexão é roteada pelo SSH de m1 para m2, e a conexão realmente acontece na porta p da máquina m2bis. Até agora tudo bem.

O problema é que isso requer que a configuração GatewayPorts=yes seja ativada na configuração do servidor SSH em m1. No entanto, ele não está ativado e eu não sou root em m1, então não posso ativá-lo.

No entanto, parece-me que não há nada realmente me impedindo de trabalhar em torno disso e fazer o meu encaminhamento de porta, no entanto: Eu tenho acesso shell para m1, eu posso ter uma conexão SSH entre m1 e m2, eu posso executar um processo em m1 que escuta na porta q em todas as interfaces (em vez de ter o daemon SSH fazendo a escuta) e que roteia a conexão através do SSH. Então, basicamente, eu tenho todas as permissões necessárias para construir minha própria porta.

Posso realmente fazer isso e há uma maneira fácil de fazer isso?

Requisitos adicionais:

  • Como não sou root no m1, prefiro uma solução sem dependências complicadas, idealmente algum script bash com utilitários comuns como netcat , socat , etc., ou algum programa C independente. / li>
  • Tenho raiz em m2, se ajudar (mas, em princípio, não acho que precise disso também).
  • Eu não confio na conexão entre m1 e m2, então o encaminhamento deve ser criptografado entre m1 e m2 (isto é, deve realmente passar por SSH).
por a3nm 26.08.2018 / 16:05

2 respostas

2

Um amigo sugeriu outra solução: se o comando socat estiver instalado em m1, você pode fazer a porta reversa do SSH para frente enquanto escuta no endereço de loopback, em alguma porta q2, ou seja, executando o seguinte em m2:

ssh -R q2:m2bis:p m1

E use socat on m1 da seguinte forma, o que redirecionará as conexões de entrada na porta q para o encaminhamento de porta que está escutando no endereço de loopback:

socat tcp-listen:q,reuseaddr,fork tcp:localhost:q2
    
por 26.08.2018 / 16:37
5

Uma solução que funciona bem é executar seu próprio daemon SSH em m1, o que é possível sem raiz. Veja como executar o daemon SSH sendo um usuário normal.

Primeiro, gere as chaves do host:

ssh-keygen -f test_host_rsa -N  '' -t rsa
ssh-keygen -f test_host_dsa -N  '' -t dsa
ssh-keygen -f test_host_ed25519 -N  '' -t ed25519

Em seguida, escreva um arquivo de configuração para o seu sshd, onde 2222 é uma porta sem privilégios que não é usada em m1 e à qual m2 pode se conectar, e onde você também precisa indicar o caminho absoluto para a pasta atual:

cat >sshd_config <<EOF
Port 2222
HostKey /folder/where/the/files/are/test_host_rsa
HostKey /folder/where/the/files/are/test_host_dsa
HostKey /folder/where/the/files/are/test_host_ed25519
GatewayPorts yes

Agora, execute seu daemon SSH:

/usr/sbin/sshd -f sshd_config

Agora, m2 pode conectar-se à porta 2222 de m1 e executar a porta reversa para frente porque o GatewayPorts está ativado em seu daemon SSH. Em outras palavras, em m2 você pode executar:

ssh -p 2222 -R *:q:m2bis:p m1
    
por 26.08.2018 / 16:33