Una conexión de red TCP/IP puede estar bloqueada, interrumpida, abierta o filtrada. Estas acciones generalmente están controladas por el firewall de IPtables que usa el sistema y es independiente de cualquier proceso o programa que pueda estar escuchando en un puerto de red. Más allá del firewall, un programa o proceso (un servidor o demonio) puede estar escuchando en un puerto o no escuchar. Esto se puede comprobar utilizando los programas netstat o ss. Verificar si un puerto está abierto, bloqueado, descartado o filtrado en el firewall no es simple. Hay dos formas de hacer esto:
- probar el puerto externamente
- enumere la configuración del cortafuegos y examine el resultado
1. Usando netstat para ver los procesos de escucha
Para ver si un programa o proceso está escuchando en un puerto, listo para aceptar un paquete, use el comando netstat.
# netstat -tulnp
Los argumentos del comando netstat se enumeran a continuación:
t – Mostrar TCP
u – Mostrar UDP
l – Mostrar solo los procesos de escucha (netstat puede mostrar tanto la escucha como todas las conexiones establecidas, es decir, también como cliente)
n – No resuelva nombres de direcciones IP de red o números de puerto
p – Mostrar el nombre del proceso que está escuchando en el puerto
Por ejemplo:
# netstat -tulnp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1254/rpcbind tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1484/sshd tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 1355/cupsd tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1562/master tcp 0 0 0.0.0.0:44349 0.0.0.0:* LISTEN 1274/rpc.statd udp 0 0 0.0.0.0:111 0.0.0.0:* 1254/rpcbind udp 0 0 0.0.0.0:631 0.0.0.0:* 1355/cupsd udp 0 0 0.0.0.0:44165 0.0.0.0:* 1274/rpc.statd udp 0 0 0.0.0.0:602 0.0.0.0:* 1274/rpc.statd udp 0 0 0.0.0.0:1001 0.0.0.0:* 1254/rpcbind
2. Usando ss para ver los procesos de escucha
Para ver si un programa o proceso está escuchando en un puerto, listo para aceptar un paquete, use el programa ss.
# ss -nutlp
Los argumentos del programa ss se enumeran a continuación:
t – Mostrar sockets TCP.u – Mostrar sockets UDP.
l – Mostrar tomas de escucha
n – Intente ahora resolver los nombres
p – Mostrar proceso usando socket
Por ejemplo:
# ss -nutlp Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port udp UNCONN 0 0 *:111 *:* users:(("rpcbind",1254,6)) udp UNCONN 0 0 *:631 *:* users:(("cupsd",1355,9)) udp UNCONN 0 0 *:44165 *:* users:(("rpc.statd",1274,8)) udp UNCONN 0 0 *:602 *:* users:(("rpc.statd",1274,5)) udp UNCONN 0 0 *:1001 *:* users:(("rpcbind",1254,7)) tcp LISTEN 0 128 *:111 *:* users:(("rpcbind",1254,8)) tcp LISTEN 0 128 *:22 *:* users:(("sshd",1484,3)) tcp LISTEN 0 128 127.0.0.1:631 *:* users:(("cupsd",1355,7)) tcp LISTEN 0 100 127.0.0.1:25 *:* users:(("master",1562,12)) tcp LISTEN 0 128 *:44349 *:* users:(("rpc.statd",1274,9))
3. usando lsof para encontrar puertos abiertos
Para listar todos los puertos abiertos en un sistema, use el siguiente comando para listar el nombre y el número del proceso que ha abierto los puertos.
# lsof -i
Aquí hay una salida de ejemplo:
# lsof -i COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME rpcbind 1254 rpc 6u IPv4 12592 0t0 UDP *:sunrpc rpcbind 1254 rpc 7u IPv4 12596 0t0 UDP *:1001 rpcbind 1254 rpc 8u IPv4 12597 0t0 TCP *:sunrpc (LISTEN) rpc.statd 1274 rpcuser 5r IPv4 12784 0t0 UDP *:xmlrpc-beep rpc.statd 1274 rpcuser 8u IPv4 12788 0t0 UDP *:44165 rpc.statd 1274 rpcuser 9u IPv4 12792 0t0 TCP *:44349 (LISTEN) cupsd 1355 root 7u IPv4 13147 0t0 TCP localhost:ipp (LISTEN) cupsd 1355 root 9u IPv4 13150 0t0 UDP *:ipp sshd 1484 root 3u IPv4 13707 0t0 TCP *:ssh (LISTEN) master 1562 root 12u IPv4 13923 0t0 TCP localhost:smtp (LISTEN) sshd 1657 root 3r IPv4 14745 0t0 TCP 192.168.1.50:ssh->192.168.1.101:49549 (ESTABLISHED)
Probar un puerto externamente
La aplicación telnet se puede utilizar para probar la conectividad de socket de red simple, pero solo para conexiones TCP, no UDP. Por ejemplo, si deseo ver si el puerto TCP 80 en un sistema está listo para aceptar una conexión, especifico la dirección IP y el puerto para telnet:
# telnet 192.168.1.55 80 Trying 192.168.1.55... Connected to example.redhat.com (192.168.1.55). Escape character is '^]'.
Si el servidor no está escuchando, la respuesta es diferente:
# telnet 10.0.0.25 80 Trying 10.0.0.25... telnet: connect to address 10.0.0.25: Connection refused telnet: Unable to connect to remote host: Connection refused
- Esto indica que la conexión fue rechazada activamente. El subsistema TCP recibió el paquete, lo examinó y descubrió que era una solicitud para abrir un socket en el puerto 80, vio que no había ningún proceso listo para aceptar la conexión y respondió con una negativa.
- Si el cortafuegos se configuró para bloquear o filtrar la conexión, telnet mostraría algo muy similar a lo anterior, incluso si hubiera un proceso listo para aceptar la conexión.
- Si el cortafuegos se configuró para desconectar las conexiones, no veríamos ninguna respuesta y, en su lugar, telnet expiraría:
# telnet 10.0.0.25 80 Trying 10.0.0.25... telnet: connect to address 10.0.0.25: Connection timed out
Enumeración de las reglas del cortafuegos
En Red Hat Enterprise Linux, las reglas de firewall se pueden enumerar mediante el comando de servicio:
# service iptables status
O usando el comando iptables:
# iptables -xvn -L