¿Verifica si el puerto está abierto o cerrado en un servidor Linux?

209

¿Cómo puedo verificar si un puerto está escuchando en un servidor Linux?

James Anderson
fuente
2
No está muy claro lo que estás preguntando. ¿Qué quieres decir con "abierto"? ¿Quiere decir que algún servidor está escuchando en ese puerto? ¿O quiere decir que está permitido por el firewall del sistema? ¿O que?
David Schwartz
Creo que un puerto está siendo bloqueado en mi servidor y quiero desbloquearlo / abrirlo nuevamente.
James Anderson el
14
netstat -an | grep PORTNUMBER | grep -i listenSi la salida está vacía, el puerto no está en uso.
Automatix

Respuestas:

187

Puede verificar si un proceso escucha en un puerto TCP o UDP con netstat -tuplen.

Para verificar si algunos puertos son accesibles desde el exterior (esto es probablemente lo que desea), puede usar un escáner de puertos como Nmap de otro sistema. Ejecutar Nmap en el mismo host que desea verificar es bastante inútil para su propósito.

joschi
fuente
54
GNU netstat conoce los parámetros -t, -u, -p, -l, -e, y -n. Gracias al analizador de opciones se puede expresar como -tuplen. linux.die.net/man/8/netstat
joschi
3
Además, el telnetcomando generalmente solo admite TCP, por lo que no tiene suerte si el servicio que desea verificar se ejecuta en otro protocolo.
joschi
1
Sí, estaba usando Windows, de ahí la confusión.
Dexter
2
nc es (mejor) alternativa a telnet. También es compatible con UDP.
Tsvetomir Dimitrov
1
Utilizarlo con sudo: sudo netstat -tuplen. Esto le proporcionará procesos propiedad no solo de usted, sino también de otros, e imprimirá detalles adicionales (como PID / Nombre del programa) si aún no se muestran como usuarios no root.
John Red
102

La forma más rápida de probar si un puerto TCP está abierto (incluidos los firewall de hardware que pueda tener) es escribir desde una computadora remota (por ejemplo, su escritorio):

telnet myserver.com 80

Que intentará abrir una conexión al puerto 80 en ese servidor. Si tiene un tiempo de espera o lo niega, el puerto no está abierto :)

Adrian Macneil
fuente
1
dice que no reconoce "telnet" como un comando ...
James Anderson
66
"yum install telnet" para instalar el paquete del cliente telnet.
cjc
8
Escrito arriba:if you get a time out or deny, the port is not open
Industrial
2
¿Qué pasa si no tienes permisos para instalar telnet? ¿Hay otra herramienta estándar?
KC Baltz
3
Intenté "telnet myhost 22" y obtuve un tiempo de espera. Pero puedo meterme en esa máquina. ?!
Torsten Bronger
30

OK, en resumen, tiene un servidor en el que puede iniciar sesión. Desea ver si algo está escuchando en algún puerto. Como root, ejecuta:

netstat -nlp

esto mostrará una lista de procesos que escuchan en los puertos TCP y UDP. Puede escanear (o grep) para el proceso que le interesa y / o los números de puerto que espera ver.

Si el proceso que espera no está allí, debe iniciar ese proceso y verificar netstat nuevamente. Si el proceso está allí, pero está escuchando en una interfaz y puerto que no esperaba, entonces hay un problema de configuración (por ejemplo, podría estar escuchando, pero solo en la interfaz de bucle invertido, por lo que vería 127.0.0.1:3306 y no hay otras líneas para el puerto 3306, en el caso de la configuración predeterminada para MySQL).

Si el proceso está activo y está escuchando en el puerto que espera, puede intentar ejecutar un "telnet" a ese puerto desde su Macbook en su oficina / hogar, por ejemplo,

 telnet xxxxxxxxxxxx.co.uk 443

Eso probará si (suponiendo puertos estándar) que hay un servidor web configurado para SSL. Tenga en cuenta que esta prueba con telnet solo funcionará si el proceso está escuchando en un puerto TCP. Si se trata de un puerto UDP, también puede intentar con cualquier cliente que vaya a utilizar para conectarse a él. (Veo que usó el puerto 224. Esto es masqdialer, y no tengo idea de qué es eso).

Si el servicio está allí, pero no puede acceder a él externamente, entonces hay un firewall que lo bloquea. En ese caso, ejecute:

 iptables -L -n

Esto mostrará todas las reglas de firewall tal como están definidas en su sistema. Puede publicar eso, pero, en general, si no está permitiendo todo en la cadena INPUT, probablemente tendrá que permitir explícitamente el tráfico en el puerto en cuestión:

 iptables -I INPUT -p tcp --dport 224 -j ACCEPT

O algo por el estilo. No ejecute los comandos de su firewall a ciegas según lo que un extraño le haya dicho en Internet. Considera lo que estás haciendo.

Si su firewall en la caja permite el tráfico que desea, entonces su compañía de hosting puede estar ejecutando un firewall (por ejemplo, solo permiten SSH (22 / tcp), HTTP (80 / tcp) y HTTPS (443 / tcp) y negando todo otro tráfico entrante). En este caso, deberá abrir un ticket del servicio de asistencia con ellos para resolver este problema, aunque supongo que puede haber algo en su cPanel que lo permita.

cjc
fuente
¿Podría agregar cómo deshacer el comando iptables -I? ¡¡Gracias!!
Evgeny
1
"iptables -D" seguido de cualquier otra cosa que tuviera después de "-I" en el comando original. Básicamente, busque la documentación.
cjc
11

Yo uso el combo de netstaty lsof:

netstat -an | grep <portnumber>
lsof -i:<portnumber>

Para ver si se está utilizando el puerto y qué lo está utilizando.

madriguera
fuente
nada incita con o sin sudo
Dheeraj Thedijje
1
@DheerajThedijje - entonces ese puerto no está abierto
warren
Sí, no lo fue, lo tengo.
Dheeraj Thedijje
7

Si está conectado al sistema y puede ejecutar un comando como root, puede verificar la salida de iptables

iptables -L -vn

esto enumerará las reglas del firewall y qué puertos son objetivo abierto ACCEPTy cualquier objetivo de puerto cerrado explícitamente REJECT.

usuario619714
fuente
Y si tienes Firewalld, es más simple firewall-cmd --query-port=port/protocol, por ejemplo firewall-cmd --query-port=80/tcp.
Agostino
6

lsof -i :ssh enumerará todos los procesos con el puerto ssh abierto, tanto las conexiones activas como las de escucha.

pgs
fuente
Prefijo sudosi no devuelve ningún resultado.
Elijah Lynn