Como alguém encaminha uma conexão TCP (especificamente cliente-servidor MyQSL) através de um túnel SSH de múltiplos saltos?

2

Eu quero abrir uma conexão com um banco de dados MySQL remoto. Esse banco de dados está em uma sub-rede privada em uma rede diferente, portanto não posso abrir diretamente uma conexão com ele. O acesso SSH remoto também é completamente desativado no servidor MySQL.

Meu processo atual é este:

Eu abro um túnel SSH através de um servidor publicamente disponível, HOST_1. A partir desse túnel, eu abro uma conexão SSH para um servidor (HOST_2) que está na mesma sub-rede que o servidor MySQL (MYSQL_HOST). Usando a sessão SSH que eu abri naquele ponto (no HOST_2), eu uso o cliente MySQL para abrir uma conexão com o MYSQL_HOST.

Aqui está um diagrama grosseiro do que é feito atualmente:

Oqueeuquero,éusaroclienteMySQLdomeucomputadorlocalparaconectar-mea127.0.0.1:3306eteraconexãotodaencapsuladadeHOST_1aHOST_2edepoisaMYSQL_HOST,comoseeuestivessetendooservidorMySQLrodandode127.0.0.1emprimeirolugar.

Maisumavez,nãoconsigoabrirumtúnelSSHnoMYSQL_HOSTapartirdoHOST_2,porissonãohánenhumtúnelapartirdaí.EuprecisodescobrircomoencaminharaconexãodoclienteMySQLatravésdotúnelSSHparaHOST_2e,emseguida,terHOST_2encaminharaconexãodoclienteMySQLparaMYSQL_HOST.

Euacheiquepoderiausarredirouncparaconseguirisso.Nãotenhocertezadecomo,noentanto.

Háalgumasperguntasqueli,masnãoentendotudoosuficienteparareunirasinformaçõesparaobterarespostaqueestouprocurando:

  1. Um túnel SSH por meio de vários saltos
  2. Tráfego UDP através do túnel SSH
  3. link

Eu sei que há informações nesta página novamente, o que me ajudaria, mas eu não sei como usá-las: link

Obrigado!

    
por Nathan Lutterman 17.08.2018 / 00:21

2 respostas

1

Esta resposta assume que o sshd está configurado para permitir o encaminhamento de porta em HOST_1 e HOST_2.

Você já encontrou a maior parte do que precisa (a segunda opção da resposta de Mika Fischer em seu primeiro link).

Tunnel from localhost to host1 and from host1 to host2:

ssh -L 9999:localhost:9999 host1 ssh -L 9999:localhost:1234 -N host2 This will open a tunnel from localhost to host1 and another tunnel from host1 to host2. However the port 9999 to host2:1234 can be used by anyone on host1. This may or may not be a problem.

A idéia é agrupar o encaminhamento de porta (ou seja, você está encaminhando uma porta local para uma porta remota que, em seguida, encaminhará para uma porta ainda mais remota).

Para o seu exemplo, o comando seria

ssh -tt -L 3306:localhost:XXXX [user@]HOST_1 ssh -L XXXX:MYSQL_HOST:3306 [user@]HOST_2 em que XXXX é qualquer porta acima de 1024 que ainda não esteja em uso (use o mesmo número para substituir as duas instâncias)

Uma vez executado, você será perguntado pela senha duas vezes (uma vez para HOST_1 e uma vez para HOST_2), a menos que você esteja usando chaves SSH para login sem senha. O túnel funcionará enquanto você permanecer conectado ao HOST_2 via HOST_1.

Aqui está o detalhamento:

ssh é o cliente ssh local que você está executando

-tt força a alocação de pseudo-tty (consulte O pseudo-terminal não será alocado porque o stdin não é um terminal para explicar por que isso pode ser necessário)

-L 3306:localhost:XXXX [user@]HOST_1 está dizendo ao seu cliente ssh local para encaminhar 3306 em seu sistema local para a porta XXXX em "localhost" no outro lado da conexão SSH. Você só precisa especificar user@ se o usuário em seu computador local for diferente do usuário ao qual você está se conectando no HOST_1. Mais genericamente, você poderia especificar uma porta local diferente de 3306, mas você apontaria seu cliente mysql para 127.0.0.1:[ sua porta escolhida].

ssh (o segundo) Como você deve saber, o ssh tem a opção de executar um único comando em vez de lançar um shell. Você usará isso para executar outra sessão SSH no HOST_1, que criará o próximo link na cadeia de encaminhamento de porta.

-L XXXX:MYSQL_HOST:3306 [user@]HOST_2 Como essa sessão ssh está sendo executada no HOST_1, ela está encaminhando XXXX no lado local (HOST_1) (que está sendo encaminhado para o 3306 no cliente) para a porta 3306 no MYSQL_HOST no lado remoto (HOST_2). Você só precisa especificar user@ se o usuário no HOST_1 for diferente do usuário ao qual você está se conectando no HOST_2.

Se forem necessários saltos adicionais, adicione instâncias de ssh -L XXXX:localhost:XXXX hostX para cada salto no meio, contanto que XXXX seja uma porta disponível em todos os servidores no caminho.

    
por 17.08.2018 / 21:53
1

Como você está intermediando a conexão SSH com o HOST_2 por meio do HOST_1, é possível fazer isso com apenas uma única -L port forward:

ssh -A -o 'ProxyCommand = ssh -q usuário @ HOST_1 nc% h% p' usuário @ HOST_2 -L 3306: MYSQL_HOST: 3306

Isso essencialmente faz o que você está fazendo agora: abre uma conexão ssh para HOST_2 por meio de uma conexão ssh para HOST_1 e, em seguida, encaminha conexões de 3306 no host local para MYSQL_HOST: 3306. Note que MYSQL_HOST verá a conexão vindo do HOST_2, já que é onde ele sai do túnel e volta para uma conexão TCP normal.

BTW, se você tiver o OpenSSH 7.3 ou posterior no computador local e no HOST_1, será possível simplificar o proxy do SSH usando nova opção -J (ou ProxyJump diretiva em seu arquivo de configuração ssh) :

ssh -A -J usuário @ HOST_1 usuário @ HOST_2 -L 3306: MYSQL_HOST: 3306

Isso também torna mais fácil passar por vários proxies SSH:

ssh -A -J usuário @ HOST_1, usuário @ HOST_3, usuário @ HOST_3 usuário @ HOST_4 -L 3306: MYSQL_HOST: 3306

    
por 21.08.2018 / 04:36