SSH tunelamento com múltiplos encaminhamentos dinâmicos de portas

7

Estou tentando monitorar várias JVMs em execução em servidores diferentes por meio de um túnel ssh.

Graças a um dos gurus do UNIX aqui, eu consegui fazer isso funcionar por um único servidor:

  1. Executar jstatd no servidor de destino
  2. Configure o Visual VM para usar 9696 como sua porta proxy de meias.
  3. No meu PC local, execute:

    ssh -L 2222:server1:22 bastion-host
    
  4. No meu PC local, execute:

    ssh -o port=2222 -D 9696 -L 1099:localhost:1099 localhost
    

Isso faz o truque. Agora, quando tento fazer um túnel para um segundo servidor, tento:

  1. No meu PC local, execute:

    ssh -L 3333:server2:22 bastion-host
    
  2. No meu PC local, execute:

    ssh -o port=3333 -D 9696 -L 2099:localhost:1099 localhost
    

No entanto, o último passo reclama com:

bind: Address already in use
channel_setup_fwd_listener: cannot listen to port: 9696

Alguém já conseguiu fazer algo semelhante?

Atualização:

A razão pela qual isso é tão complexo é que o jstatd é um aplicativo do servidor RMI:

link

Assim como nos aplicativos RMI, eles se registram com um novo registro. Usar o rmi através de um firewall requer que eu use o SOCKS conforme descrito aqui:

link

Infelizmente, o visualvm só me permite definir a porta do proxy SOCKS uma vez, e a opção -D não me permite encaminhar a mesma porta local para ambos os servidores ...

    
por toolkit 23.08.2011 / 12:44

3 respostas

5

Estou certo em pensar que você tem o seu computador (computador A), e dizer dois servidores (A e B) que você não pode se conectar diretamente em uma determinada porta e assim quer tunelá-los através do SSH?

Nesse caso, você cria dois túneis de sua máquina (um para cada servidor de destino) em portas locais diferentes usando -L não -D e, em sua ferramenta de monitoramento, conecta-se à sua máquina local (sem configurações de proxy) como se foi o servidor remoto que você deseja verificar.

ssh -L 9000:localhost:<local port jstatd listens on> user@server1
ssh -L 9001:localhost:<local port jstatd listens on> user@server2

Em seguida, usando o seu monitor local, você se conecta ao localhost: 9000 e localhost: 9001 e esses túneis conectam você ao seu destino jstatd.

Se houver um servidor intermediário, um túnel de dois lances,

ssh -L 9000:server1:<local port jstatd listens on> user@bastion-host
ssh -L 9001:server2:<local port jstatd listens on> user@bastion-host

Hmm, se o bastião-host puder falar com todas as JVM's, então

ssh -D 9000 user@bastion-host

É o suficiente para criar um proxy de meias que você pode usar na porta 9000.

    
por 23.08.2011 / 20:06
3

Na página de manual do ssh:

 -D [bind_address:]port
         Specifies a local “dynamic” application-level port forwarding.
         This works by allocating a socket to listen to port on the local
         side, optionally bound to the specified bind_address.  Whenever a
         connection is made to this port, the connection is forwarded over
         the secure channel, and the application protocol is then used to
         determine where to connect to from the remote machine.  Currently
         the SOCKS4 and SOCKS5 protocols are supported, and ssh will act
         as a SOCKS server.  Only root can forward privileged ports.
         Dynamic port forwardings can also be specified in the configura‐
         tion file.

Você está especificando a mesma porta local para encaminhar de duas vezes; Experimente -D 9697 na sua segunda configuração.

    
por 23.08.2011 / 13:00
1

O último passo diz o suficiente: Ele não pode começar a escutar na porta 9696. Isso porque se é o seu segundo túnel você deve usar outra porta enquanto o 9696 está lidando com o primeiro.

    
por 19.01.2016 / 07:44