Como determinar a porta alocada no servidor para um túnel reverso do openssh ligado dinamicamente?

15

Ao criar túneis reversos em versões recentes do OpenSSH, uma porta remota de 0 pode ser fornecida para ligar qualquer porta disponível:

-R [bind_address:]port:host:hostport

...

If the port argument is '0', the listen port will be dynamically allocated on the server and reported to the client at run time.

openssh ssh client manpage

Minha pergunta é como eu posso (de uma maneira automatizada) determinar essa alocação de porta no servidor. Parece um pouco inútil que seja reportado ao host que está executando o cliente ssh - mas não ao destino, que desejará fazer conexões com essa porta para acessar os serviços no cliente.

Duas opções semelhantes em que consigo pensar estão em execução

# netstat -ntlp

no servidor e procure por portas suspeitas ligadas a 127.0.0.1 por sshd ou olhando para a saída de

# lsof -p $PPID | grep TCP | grep LISTEN

Mas nenhum deles é agradável do ponto de vista da automação e não há como vincular as portas dinâmicas à porta de serviço de origem se mais de um desses túneis for criado.

Existe algo que estou perdendo para efetivamente obter uma lista de túneis ativos (números de porta local e remota) no lado do servidor sshd, como um equivalente à variável de ambiente SSH_CONNECTION, mas para túneis ativos?

Para algum contexto, eu estou tentando criar potencialmente muitos túneis reversos simultâneos para um host, tunelando de volta para o mesmo número de porta em muitos hosts diferentes. Ter a pilha TCP gerenciando automaticamente o pool de portas parece ser a maneira mais eficiente de fazer isso.

    
por codedstructure 29.06.2011 / 22:51

2 respostas

1

Se você definir o 'LogLevel' no arquivo de configuração sshd_config como DEBUG1 (ou qualquer nível de DEBUG), então o sshd registrará os números de porta em /var/log/auth.log.

Lembre-se de que usar um LogLevel de DEBUG ou superior pode ser um risco de privacidade, já que muito é registrado.

(de /var/log/auth.log, removeu algumas linhas para mostrar informações relevantes)

Jun 24 06:18:24 radon sshd[9334]: Connection from 192.168.13.10 port 39193
Jun 24 06:18:24 radon sshd[9334]: Accepted publickey for lornix from 192.168.13.10 port 39193 ssh2
Jun 24 06:18:24 radon sshd[9334]: pam_unix(sshd:session): session opened for user lornix by (uid=0)
Jun 24 06:18:24 radon sshd[9334]: User child is on pid 9339
Jun 24 06:18:24 radon sshd[9339]: debug1: Local forwarding listening on 0.0.0.0 port 0.
Jun 24 06:18:24 radon sshd[9339]: debug1: Allocated listen port 39813
Jun 24 06:18:24 radon sshd[9339]: debug1: channel 0: new [port listener]
Jun 24 06:18:24 radon sshd[9339]: debug1: Local forwarding listening on :: port 39813.
Jun 24 06:18:24 radon sshd[9339]: debug1: channel 1: new [port listener]
Jun 24 06:18:27 radon sshd[9339]: Received disconnect from 192.168.13.10: 11: disconnected by user

Se você seguir, você pode ver onde você poderia analisar as informações de conexão e, em seguida, a porta encaminhada (39813 neste caso)

Eu usei esta linha de comando entre duas das minhas máquinas, eu tenho o login ssh-key configurado, então nenhuma senha solicita ou atrasa

-xenon- lornix:~> ssh -R "*:0:radon:22" -N -T radon
Allocated port 39813 for remote forward to radon:22

-N especifica que nenhum comando é dado e -T para a alocação de um tty para esta conexão.

Outra forma de disseminar as informações de conexão da porta seria analisá-lo do lado do cliente e enviar um e-mail, um jabber, uma mensagem de texto, sinais de fumaça ou pombo para transportar o número da porta para quem precisar.

    
por 24.06.2012 / 13:33
0

Você pode canalizar o stderr de ssh em um programa que abre uma conexão com um servidor na máquina de destino e relata seu nome de máquina / endereço IP / número de série / o que quer que esteja junto com o número da porta. Mais ou menos assim:

% ssh -R "*:0:radon:22" -N -T radon 2>&1 | sed "s/^/'uname -n' /" | netcat radon 3743
    
por 09.04.2013 / 20:16