Reconocimiento: La utilidad descrita en este artículo es original de Scott Klement y fue publicada en System iNetwork Programming Tips Newsletter [1] [2].
El mandato PING es una herramienta de diagnóstico utilizada en redes IP que comprueba el estado de la comunicación entre dos equipos. PING opera en la capa de red de la pila TCP/IP, un nivel muy bajo donde no se emplean protocolos de transporte (TCP o UDP) ni de aplicación (HTTP, FTP, TELNET, etc). A pesar de ser una herramienta eficaz en la verificación de redes, no es útil si lo que se pretende es comprobar si una determinada aplicación o servicio TCP/IP está activo en un equipo.
Por ejemplo, necesitamos saber si el servidor FTP se está ejecutando en una máquina determinada. Una respuesta positiva de un PING sólo indicaría que la dirección IP consultada está activa, pero no implica necesariamente que el servidor FTP lo esté. Una respuesta negativa tampoco indica que la máquina sea inalcanzable, ya que es posible configurarla para que no responda a las peticiones del PING. Dicho de otro modo, PING no detecta si una determinada aplicación TCP se está ejecutando, sólo averigua si una dirección IP responde. Entonces, ¿cómo se puede comprobar si el servidor FTP (o cualquier otro) se está ejecutando?
El protocolo TCP proporciona un mecanismo para distinguir distintas aplicaciones dentro de una misma máquina a través del concepto de puerto. Cada aplicación escucha uno o más de estos puertos y responde a las peticiones recibidas a través de ellos. Existen algunos estándares que asignan un número de puerto a los servicios más conocidos:
Puerto |
Sevidor, servicio o aplicación |
21 |
File Transfer Protocol (FTP) |
22 |
Secure Shell (SSH), incluido SFTP |
23 |
Telnet y TN5250 (sin SSL) |
25 |
Correo electrónico (SMTP) |
80 |
HTTP (sin SSL) |
89 |
A menudo utilizado por Zend's PHP Server |
110 |
POP3 |
143 |
IMAP |
389 |
LDAP o IBM i Directory Server (*DIRSRV) |
443 |
HTTP sobre SSL/TLS |
446 |
DRDA |
447 |
DDM |
448 |
DDM sobre SSL |
512 |
RExec (RUNRMTCMD sobre TCP/IP) |
515 |
Line Printer Daemon (LPD) también conocido por Colas de salida remotas sobre TCP/IP |
990 |
FTP sobre SSL/TLS en modo *IMPLICIT |
992 |
Telnet sobre SSL/TLS |
2001 |
IBM HTTP Administration |
2010 |
IBM HTTP Administration sobre SSL/TLS |
9100 |
HP JetDirect/PJL Printing (utilizado en CRTDEVPRT *LAN) |
El mandato Comprobar servidor TCP (CHKTCPSVR)
El mandato CL Comprobar servidor TCP (CHKTCPSVR) es una utilidad sencilla que averigua si existe una aplicación (o servicio) escuchando un determinado puerto TCP. Su pantalla de solicitud es la siguiente:
Dispone de tres parámetros:
- Nombre del sistema principal (HOST)
-
Es el nombre o dirección IP del sistema donde debería estar ejecutándose el servidor que se quiere comprobar. Puede ser la máquina local o una remota.
- Número del puerto (PORT)
-
Es el número de puerto TCP que utiliza el servidor consultado para atender las peticiones.
- Tiempo de espera (TIMEOUT)
-
Es el tiempo en segundos que se espera para tener una respuesta. Superado este plazo se cancelará la operación.
CHKTCPSVR primero intenta establecer una conexión TCP a través de la red con el equipo y en el puerto especificado. Si durante el tiempo indicado no se recibe una respuesta se emite el mensaje de escape TCP860F con una descripción del problema. Puede ocurrir porque no se reciba una respuesta del sistema remoto o porque no haya una aplicación ejecutándose en ese puerto. Otros errores generarán mensages CPF* o CPE*. Si no se produce una excepción significa que se ha recibido una respuesta y hay un servidor escuchando el puerto.
¡Cuidado! este mandato NO AVERIGUA qué servidor TCP está detrás del puerto consultado, sólo determina si una aplicación está escuchando ese puerto. Por lo tanto, el responsable de asegurarse de que detrás de un puerto esté el servidor esperado es de quién realiza la consulta.
Cómo se utiliza
Por ejemplo, el siguiente mandato se puede utilizar para comprobar si el servidor SSH se está ejecutando en el equipo local:
CHKTCPSVR HOST('localhost') PORT(22) TIMEOUT(5)
Del mismo modo, para validar el servidor HTTP sólo hay que cambiar el número de puerto:
CHKTCPSVR HOST('localhost') PORT(80) TIMEOUT(5)
Si el servidor HTTP se encuentra en un equipo remoto sólo hay que cambiar el nombre de la máquina:
CHKTCPSVR HOST('www.google.com') PORT(80) TIMEOUT(30)
Esta técnica funciona muy bien para comprobar si las impresoras de red están en línea:
CHKTCPSVR HOST('PRT24') PORT(9100) TIMEOUT(30)
Este tipo de comprobaciones pueden incluirse en un programa CL que se ejecute a intervalos regulares para que avise cuando algo vaya mal:
PGM
BUCLE:
CHKTCPSVR HOST( 'mi.smtp.server.es' ) PORT( 25 ) TIMEOUT( 10 )
MONMSG MSGID(CPE0000 CPF0000 TCP0000) EXEC(DO)
SNDMSG MSG( 'El servicor de correo ha caído!' ) +
TOUSR(*SYSOPR)
ENDDO
DLYJOB DLY(300) /* CADA CINCO MINUTOS */
GOTO BUCLE
ENDPGM
Código fuente
Esta utilidad puede descargarse desde la sección de archivos.
Referencias