Como verificar se um servidor OpenVPN está escutando em uma porta remota sem usar o cliente OpenVPN?

39

Preciso verificar se um servidor OpenVPN (UDP) está ativo e acessível em um determinado host: port.

Eu só tenho um computador Windows XP simples, sem cliente OpenVPN (e sem chance de instalá-lo) e sem chaves necessárias para conectar-se ao servidor - apenas ferramentas comuns de linha de comando do WinXP, um navegador e PuTTY estão à minha disposição.

Se eu estivesse testando algo como um servidor SMTP ou POP3, usaria o telnet e veria se ele responde, mas como fazer isso com o OpenVPN (UDP)?

Ivan
fonte
Se openvpn está sendo executado através de TCP, você pode telnet bem
RVS
OpenVPN está sendo executado através de UDP
Ivan
2
Você pode explicar por que você gostaria de resolver isso de um sistema Windows obsoleto e não de um sistema de monitoramento real?
Alex Holst
2
Se o servidor UDP openvpn usar a tls-authopção de configuração (recomendada) , será IMPOSSÍVEL (se você não tiver pelo menos a chave do wrapper externo)! Qualquer pacote com assinatura HMAC incorreta será descartado sem resposta do servidor.
Alex Stragies

Respostas:

51

Aqui está uma linha de shell:

echo -e "\x38\x01\x00\x00\x00\x00\x00\x00\x00" | 
   timeout 10 nc -u openvpnserver.com 1194 | cat -v

se houver um openvpn na outra extremidade, a saída será

@$M-^HM--LdM-t|M-^X^@^@^@^@^@@$M-^HM--LdM-t|M-^X^@^@^@^@^@@$M-^HM--LdM-t|M-^X...

caso contrário, será desativado e atingido o tempo limite após 10 segundos ou exibirá algo diferente.

NOTA: isso funciona apenas se a tls-authopção de configuração não estiver ativa; caso contrário, o servidor rejeitará mensagens com HMAC incorreto.

Loic Dachary
fonte
2
Tenho algo um pouco diferente, mas recebo algo. Obrigado.
Artfulrobot
7
Só para dizer o óbvio, isso é para Linux / Unix, não para Windows. E requer netcat (não instalado por padrão em algumas distros). Além disso, se a sua distribuição Linux não tiver o comando "timeout", use o parâmetro netcat "-w", como "nc -w 10 -u openvpnserver.com 1194".
MV.
11
Isso é incrível.
dmourati
2
Isso não funcionará no cenário OP, se o servidor usar a tls-authopção de configuração para descartar pacotes com sig HMAC incorretos.
Alex Stragies
2
Acho tubulação a od -x -N 14mais do que cat -vé muito mais útil porque você pode a) ver o conteúdo binário real em vez de lixo ASCII e b) instantaneamente receber a cada linha de saída como o servidor envia cada pacote de aperto de mão e pará-lo imediatamente após a primeira. -N 14porque o pacote de handshake tem 14 bytes e apenas se repete.
BaseZen
5

Desculpe se estou um pouco atrasado com a minha resposta;)
Envie um pacote udp com o seguinte conteúdo:
$ 38 $ 01 $ 00 $ 00 $ 00 $ 00 $ 00 $ 00 $ 00 $ 00
O servidor deve responder alguma coisa.
Você pode forjar pacotes udp com python assim:

import socket
senddata= "\x38\x01\x00\x00\x00\x00\x00\x00\x00"

def checkserver(ip,port):
   print('Checking %s:%s' %(ip,port)) 
   sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
   sock.settimeout(5) # in seconds
   sock.connect((ip, port))
   print("Sending request...")
   sock.send(senddata)
   try:
      dta=sock.recv(100)
      print("Server reply: %s" %(dta))
   except:
      print("Server not responding")
   sock.close()
   print("###########################################################")

def main():
   checkserver("addr.of.server1",1194)
   checkserver("addr.of.server2",1195)

if __name__ == "__main__":
   main()
tagarela
fonte
11
como a resposta do loic diz, isso não funciona tls-auth.
Tdder42
11
Para Python 3, a linha 10 causará um problema. Substitua "sock.send (senddata)" por "sock.send (senddata.encode ())" e ele funcionará.
NDB
2

Você pode tentar executar o seguinte na CLI

#netstat -ltnup

Isso deve listar todos os processos que estão escutando no seu servidor / sistema. Grep para o número da porta que você deseja

#netstat -ltnup | grep 1194
Mister IT Guru
fonte
O OP possui apenas ferramentas do Windows XP.
user9517 suporta GoFundMonica
11
@ Iain: O OP tinha o PuTTY, portanto pode ser capaz de fazer o SSH no servidor. Nesse caso, essa verificação muito simples é um primeiro passo útil.
mivk 21/02
2

Para qualquer pessoa que esteja tentando rastrear um servidor que esteja tls-authhabilitado, use o script python aqui: https://github.com/liquidat/nagios-icinga-openvpn

A saída é formatada para uso em Nagios ou Icinga, mas pode ser executada por qualquer coisa / qualquer pessoa, desde que você tenha python e o arquivo de chave tls disponível.

Por exemplo, se você estiver usando SHA256como resumo, use algo como:

python check-openvpn.py -p 1194 --tls-auth ta.key --digest SHA256 vpn-server.example.com

Nota: pode ser necessário adicionar, --tls-auth-inversedependendo do key-directionvalor do servidor .

sereno
fonte
0

Se você pode obter um pcap da interação válida do cliente OpenVPN com o servidor OpenVPN, pode modelar o conjunto inicial de pacotes com algo como netcat, conforme sugerido pelo TiZon.

Basicamente, você quer um primeiro pacote válido suficiente para fazer o servidor responder com pelo menos uma mensagem de erro, para que ele não precise ser perfeito, apenas bom o suficiente.

Tentei acessar http://pcapr.net , mas não vi um exemplo do OpenVPN lá. Talvez, se outra pessoa estiver reivindicando o serviço, você poderá fazer com que a outra pessoa faça uma captura da transação.

pcapademic
fonte
-5

Se você configurou o openvpn em um tcp listen, é tão simples quanto

telnet vpnserver 1194

assumindo que 1194 é a porta em que você está ouvindo

isso deve fornecer uma resposta de algum tipo para mostrar que o servidor openvpn está escutando

anthonysomerset
fonte
Você tem 100% de certeza? Quando faço isso, recebo "Não foi possível abrir a conexão com o host, na porta 1194: falha na conexão" depois de alguma espera. Um cliente não deve dizer algo primeiro, antes que um servidor OpenVPN responda?
22411 Ivan
6
Observe que, por padrão, o OpenVPN é apenas UDP e o telnet deve usar o TCP.
22411 Ivan