Eu descobri uma maneira fácil de fazer isso. Quando meu script executa o comando netstat
no roteador para verificar se o túnel RDP está aberto, também posso enviar uma solicitação de conexão RDP pelo túnel usando netcat
!
Este é o comando que eu usei para enviar o pacote de requisição de conexão. Peguei o próprio pacote da sequência de conexão de exemplo na especificação RDP da Microsoft.
echo -ne '\x03\x00\x00\x2c\x27\xe0\x00\x00\x00\x00\x00'\
'Cookie: mstshash=eltons\r\n'\
'\x01\x00\x08\x00\x00\x00\x00\x00' |
nc -w 5 localhost 6000 |
xxd -p |
xargs -0 printf 'RDP response: %s\n'
O encapsulamento está na porta 6000. O comando netcat
tem -w 5
para que a conexão seja fechada se uma resposta não for recebida dentro de 5 segundos. xxd
converte para uma string hexadecimal simples e prefixo a saída de xxd
com RDP response:
para que meu script possa verificar facilmente essa linha na saída.
Se o servidor RDP estiver atendendo, receberei uma saída semelhante a esta.
RDP response: 030000130ed000001234000209080000000000
A única outra validação que faço é procurar o byte 02
no deslocamento 11 para verificar se é um pacote RDP que inclui uma estrutura TYPE_RDP_NEG_RSP
(resposta de negociação RDP).
Corrigir as falhas seria a solução óbvia, mas sofri o software de encapsulamento de vários modos diferentes e não estou fazendo nada incomum com isso. O software que estou usando é o BitVise SSH Client. Eu estou usando a versão mais recente e com alguns pesquisando eu não encontrei ninguém que tenha problemas semelhantes. Ele só falha uma vez a cada poucos dias ou semanas, mas é frustrante tentar RDP no meu computador para descobrir que ele não está aceitando conexões e não há nada que eu possa fazer sobre isso até chegar em casa.