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

16

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:] porta: host: hostport

...

Se o argumento da porta for `0 ', a porta de escuta será alocada dinamicamente no servidor e relatada ao cliente em tempo de execução.

página de manual do cliente openssh ssh

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

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

# netstat -ntlp

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

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

Mas nenhuma dessas opções é 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 forem criados.

Falta alguma coisa para obter efetivamente 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, estou tentando criar potencialmente muitos túneis reversos simultâneos para um host, retornando o túnel 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 eficaz de fazer isso.

estrutura codificada
fonte
Ao usar o "-R 0: xxxx: y" sintaxe, ssh vontade de saída "porto 49.488 alocado para remoto para a frente para xxxx: y em stderr.
BlakBat
Sim, a questão é como obter essa informação para o lado do servidor - onde seria muito mais útil ...
codedstructure

Respostas:

1

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

Lembre-se de que o uso de um LogLevel de DEBUG ou superior pode ser um risco de privacidade, uma vez que muito está 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ê segui-lo, poderá ver onde pode analisar as informações de conexão e, em seguida, a porta encaminhada (39813 neste caso)

Eu usei essa linha de comando entre duas de minhas máquinas, tenho o login da chave ssh configurado, portanto, nenhuma solicitação de senha ou atraso

-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 interrompe a alocação de um tty para esta conexão.

Outra maneira de disseminar as informações de conexão da porta seria analisá-las do lado do cliente e enviar um e-mail, tagarelar, mensagem de texto, sinais de fumaça ou pombo para transportar a porta # para quem precisar.

lornix
fonte
0

Você pode canalizar o stderr de sshum programa que abre uma conexão com um servidor na máquina de destino e relata o nome da máquina / endereço IP / número de série / o que for, juntamente 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
Russell Nelson
fonte