martes, abril 25, 2017

Comprobando la conectividad entre máquinas para evitar problema de firewall

En ocasiones necesitamos comprobar a un nivel muy elemental que cierto puerto o servicio está disponible entre máquinas. Puede ser que falle el servicio, el firewall de la máquina, el firewall de tu infraestuctura si dependes de un tercero...

Lo más habitual es que para comprobar que cierto servicio está disponible desde tu red uses un nmap que suele dar el resultado que necesitas.

$ nmap -p 80 xxx.xxx.xxx

Starting Nmap 7.01 ( https://nmap.org ) at 2017-04-25 14:38 CEST
Nmap scan report for xxx.xxx.xxx (yyy.yyy.yyy.yyy)
Host is up (0.0078s latency).
PORT   STATE SERVICE
80/tcp open  http

Nmap done: 1 IP address (1 host up) scanned in 0.15 seconds

En muchas ocasiones intento hacer también un telnet directo al puerto en cuestión para ver si además del puerto el servicio está disponible

$ telnet yyy.yyy.yyy.yyy 53
Trying yyy.yyy.yyy.yyy...
Connected to yyy.yyy.yyy.yyy.
Escape character is '^]'.

Pero te puede pasar, como ha sido mi último caso, que las reglas de firewall te traicionen y aunque aparentemente el puerto esté abierto, las respuestas no puedan volver. En mi caso era un servidor de DNSmasq que funciona sobre paquetes UDP. En local funcionaba correctamente, en la red de servidores funcionaba correctamente, pero no conseguía responder desde la red desarrollo. Todos los puertos parecían correctamente abiertos y como se ve en ejemplo anterior el telnet respondía ¿Qué estaba pasando?

Pues pasaba que el firewall no permitía que los paquetes UDP (protocolo usado por el DNS) volvieran a la red de desarrollo. ¿cómo pude darme cuenta? Con el comando netcat, una especie de navaja suiza de la conectividad TCP/IP aún más "básica" que telnet.

Puedes probarla con cualquier servidor web:

$ netcat www.google.com 80
GET /

...y el servidor de google te responderá.

Pero la clave es que la puedes usar en tus dos máquinas para crear una comunicación cliente/servidor sencilla con el protocolo que quieras para que ambas máquinas "dialoguen" en un formato de texto plano. Como hacer un chat a nivel muy muy básico.

Probando que dos máquinas se pueden comunicar a través del puerto 890 por TCP:

En  la máquina servidor pongo a escuchar el netcat:

# netcat  -l -p 890

En la máquina cliente conecto al puerto correspondiente del servidor

$ netcat yyy.yyy.yyy.yyy 890

En ambos casos el cursor se queda esperando la siguiente instrucción. Si escribo "hola" en el cliente y la comunicación puede fluir, la palabra aparecerá en el servidor. Si escribo algo en el servidor pasará lo mismo en el cliente.

Con este comando comprobé que ambas máquinas se podían comunicar correctamente a través del protocolo TCP pero cuando lo intenté con el protocolo UDP...

# netcat  -u -l -p 890

$ netcat -u yyy.yyy.yyy.yyy 890

... vi que los mensajes sí que llegaban desde el cliente al servidor pero no los del servidor al cliente. Así pues contacte con el administrador de redes de mi infraestructura para que verificara. Efectivamente, el tráfico UDP de retorno estaba filtrado. Una vez resuelto el "dialogo" UDP funcionaba correctamente y el servicio de DNS también.






No hay comentarios:

Publicar un comentario