¿Cómo verificar que un servidor OpenVPN esté escuchando en un puerto remoto sin usar el cliente OpenVPN?


39

Necesito verificar que un servidor OpenVPN (UDP) esté activo y accesible en un host determinado: puerto.

Solo tengo una computadora simple con Windows XP sin un cliente OpenVPN (y sin posibilidad de instalarlo) y no se necesitan claves para conectarse al servidor, solo herramientas comunes de línea de comandos de WinXP, un navegador y PuTTY están a mi disposición.

Si estuviera probando algo como un servidor SMTP o POP3, usaría telnet y vería si responde, pero ¿cómo hacer esto con OpenVPN (UDP)?


si openvpn se ejecuta a través de tcp, también puede hacer telnet
rvs

OpenVPN se ejecuta a través de UDP
Ivan

2
¿Puede explicar por qué desearía resolver esto desde un sistema Windows obsoleto y no desde un sistema de monitoreo real?
Alex Holst

2
Si el servidor UDP openvpn usa la tls-authopción de configuración (recomendada) , entonces es IMPOSIBLE (¡si no tiene al menos la clave de envoltura externa)! Cualquier paquete con una firma HMAC incorrecta se descartará sin respuesta del servidor.
Alex Stragies

Respuestas:


51

Aquí hay un shell de una sola línea:

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

si hay un openvpn en el otro extremo, la salida será

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

de lo contrario, se silenciará y se agota el tiempo de espera después de 10 segundos o mostrará algo diferente.

NOTA: esto funciona solo si la tls-authopción de configuración no está activa; de lo contrario, el servidor rechaza los mensajes con HMAC incorrecto.


2
Tengo algo un poco diferente, pero consigo algo. Gracias.
artfulrobot

77
Solo para decir lo obvio, esto es para Linux / Unix, no para Windows. Y requiere netcat (no está instalado por defecto en algunas distribuciones). Además, si su distribución de Linux no tiene el comando "timeout", simplemente use el parámetro netcat "-w", como "nc -w 10 -u openvpnserver.com 1194".
MV.

1
Esto es increíble.
dmourati

2
Esto no funcionará en el escenario OP, si el servidor usa la tls-authopción de configuración para descartar paquetes con sig HMAC incorrecta.
Alex Stragies

2
Me parece tubería a od -x -N 14más que cat -ves mucho más útil porque se puede a) ver el contenido binario real en lugar de basura ASCII y b) al instante recibir el cada línea de salida como el servidor envía cada paquete apretón de manos y detenerlo de inmediato después de la primera. -N 14porque el paquete de protocolo de enlace tiene 14 bytes de longitud y solo se repite.
BaseZen

5

Lo siento si llego un poco tarde con mi respuesta;)
Envíe un paquete udp con el siguiente contenido:
$ 38 $ 01 $ 00 $ 00 $ 00 $ 00 $ 00 $ 00 $ 00
El servidor debe responder algo.
Puede falsificar paquetes de udp con python como este:

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()

1
como dice la respuesta de loic, esto no funciona tls-auth.
tedder42

1
Para Python 3, la línea 10 causará un problema. Reemplace "sock.send (senddata)" por "sock.send (senddata.encode ())" y funcionará.
NDB

2

Puede intentar ejecutar lo siguiente en la CLI

#netstat -ltnup

Esto debería enumerar todos los procesos que están escuchando en su servidor / sistema. Grep por el número de puerto que deseas

#netstat -ltnup | grep 1194

OP solo tiene herramientas de Windows XP.
user9517 es compatible con GoFundMonica el

1
@Iain: El OP tenía PuTTY, por lo que es posible que pueda ingresar SSH al servidor. En ese caso, este simple chequeo es un primer paso útil.
mivk

2

Para cualquiera que se encuentre con esto y esté tratando de monitorear un servidor que ha tls-authhabilitado, puede usar el script de Python aquí: https://github.com/liquidat/nagios-icinga-openvpn

La salida está formateada para su uso en Nagios o Icinga, pero puede ser ejecutada por cualquier persona, siempre que tenga python y el archivo de claves tls disponible.

Por ejemplo, si está usando SHA256su resumen, usaría algo como:

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

Nota: es posible que deba agregar --tls-auth-inversesegún el key-directionvalor del servidor .


0

Si puede obtener una pcap de interacción válida del cliente OpenVPN con el servidor OpenVPN, podría modelar el conjunto inicial de paquetes con algo como netcat, como lo sugiere TiZon.

Básicamente, desea un primer paquete válido suficiente para que el servidor responda con al menos un mensaje de error, por lo que no tiene que ser perfecto, solo lo suficientemente bueno.

Intenté ir a http://pcapr.net , pero no vi un ejemplo de OpenVPN allí. Quizás, si alguien más afirma que el servicio está activo, podría hacer que esa otra persona tome una parte de la transacción.


-5

si ha configurado openvpn en un tcp listen, entonces es tan simple como

telnet vpnserver 1194

suponiendo que 1194 es el puerto en el que lo está escuchando

esto debería darle una respuesta de algún tipo para mostrar que el servidor openvpn está escuchando


¿Estás 100% seguro? Cuando hago esto, aparece "No se pudo abrir la conexión con el host, en el puerto 1194: Error de conexión" después de esperar un poco. ¿No se supone que un cliente debe decir algo antes de que un servidor OpenVPN responda?
Ivan

66
Tenga en cuenta que, de manera predeterminada, OpenVPN es solo UDP y que telnet debe usar TCP.
Ivan
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.