¿Cómo cerrar puertos en Linux?


38

Tengo alguna pregunta al cerrar el puerto, creo que tengo algunas cosas extrañas.

Cuando uso ejecutar

nmap --top-ports 10 192.168.1.1

muestra que el puerto 23 / TCP está abierto.

Pero cuando ejecuto

nmap --top-ports 10 localhost

muestra que el puerto 23 / tcp está cerrado.

¿Cuál de ellos es cierto? Quiero cerrar este puerto en todo mi sistema, ¿cómo puedo hacerlo?


10
Ambos son verdad. Los puertos TCP no están asociados con los hosts. están asociados con las interfaces de red. La diferencia es sutil pero importante. Las interfaces son a menudo las mismas que los hosts, pero no siempre. en este caso (como se indica en las respuestas) localhostestá accediendo a la lointerfaz (loopback). La dirección IP es accesando su verdadera interfaz, probablemente, eth0o wlan0, o algo por el estilo.
strugee

3
La aparente ingenuidad de esta pregunta condujo a algunas respuestas fabulosas. ¡Gracias por la pregunta!
dotancohen

Respuestas:


47

Nmap es un excelente escáner de puertos, pero a veces quieres algo más autorizado. Puede preguntarle al núcleo qué procesos tienen qué puertos se abren utilizando la netstatutilidad:

yo @ myhost: ~ $ sudo netstat -tlnp
Conexiones activas a Internet (solo servidores)
Proto Recv-Q Send-Q Dirección local Dirección extranjera Estado PID / Nombre del programa
tcp 0 0 127.0.0.1:53 0.0.0.0:* ESCUCHE 1004 / dnsmasq    
tcp 0 0 0.0.0.0:22 0.0.0.0:* ESCUCHE 380 / sshd        
tcp 0 0 127.0.0.1:631 0.0.0.0:* ESCUCHE 822 / cupsd       
tcp6 0 0 ::: 22 ::: * ESCUCHE 380 / sshd        
tcp6 0 0 :: 1: 631 ::: * ESCUCHE 822 / cupsd       

Las opciones que he dado son:

  • -t Solo TCP
  • -l Solo puertos de escucha
  • -n No busques nombres de servicio y host, solo muestra números
  • -p Mostrar información del proceso (requiere privilegio de root)

En este caso, podemos ver que sshdestá escuchando en cualquier 0.0.0.0puerto 22 de interfaz ( ) y cupsdestá escuchando en el 127.0.0.1puerto 631 de loopback ( ). Su salida puede mostrar que telnetdtiene una dirección local de 192.168.1.1:23, lo que significa que no responderá a las conexiones en el adaptador de loopback (por ejemplo, no puedes telnet 127.0.0.1).

Existen otras herramientas que mostrarán información similar (por ejemplo, lsofo /proc), pero netstat es la más disponible. Incluso funciona en Windows ( netstat -anb). BSD netstat es un poco diferente: tendrá que usar sockstat (1) para obtener la información del proceso.

Una vez que tenga la ID del proceso y el nombre del programa, puede buscar el proceso y eliminarlo si desea cerrar el puerto. Para un control más detallado, puede usar un firewall (iptables en Linux) para limitar el acceso a solo ciertas direcciones. Es posible que deba deshabilitar el inicio de un servicio. Si el PID es "-" en Linux, es probable que sea un proceso de kernel (esto es común con NFS, por ejemplo), así que buena suerte para descubrir qué es.

Nota: Dije "autorizado" porque las condiciones de la red y los cortafuegos no te obstaculizan. Si confías en tu computadora, eso es genial. Sin embargo, si sospecha que ha sido pirateado, es posible que no pueda confiar en las herramientas de su computadora. Reemplazar las utilidades estándar (y a veces incluso las llamadas al sistema) por otras que ocultan ciertos procesos o puertos (también conocidos como rootkits) es una práctica estándar entre los atacantes. Su mejor apuesta en este momento es hacer una copia forense de su disco y restaurar desde la copia de seguridad; luego use la copia para determinar la forma en que entraron y ciérrela.


14

Un sistema Linux tiene una interfaz llamada loopback, que es para comunicación interna. Su nombre de host es localhosty su dirección IP es 127.0.0.1.

Cuando se ejecuta nmapen localhost, en realidad se ejecuta el escaneo de puertos en el Virtual interfaz de bucle invertido. 192.168.1.1es la dirección IP de su interfaz física (lo más probable eth0).

Entonces, se ha ejecutado nmapen dos interfaces de red diferentes, por eso hay una diferencia en los puertos abiertos. Ambos son verdad.

Si tiene abierto el puerto TCP 23, es probable que tenga un telnetservidor en funcionamiento (lo que no es bueno debido a su falta de cifrado) o que tenga algún tipo de caballo de Troya en su máquina.


1
Entonces, ¿cómo puedo cerrarlo?
user74080

44
@ user74080 Puede agregar una iptablesregla como sugiere una respuesta cercana, pero mantendrá el servicio sin usar, lo que consume recursos. Entonces, si tienes telnetdcorriendo, simplemente apágalo.
psimon

12

Para "cerrar" el puerto puede usar iptables

sudo iptables -A INPUT -p tcp --dport 23 -m state --state NEW,ESTABLISHED -j DROP

1
En esta respuesta, "cerrar el puerto" significa "ignorar el tráfico". El puerto aún está abierto, pero ya no se puede llegar. También tenga en cuenta que DROPhace lo que dice, ve el paquete y luego lo ignora. Normalmente (sin iptables habilitado), el núcleo enviaría un paquete ICMP inalcanzable (que puede simularse con el REJECTdestino en lugar de DROP).
Lekensteyn 01 de

3
El puerto de @Lekensteyn ICMP inalcanzable es para UDP. El paquete apropiado para responder es un paquete TCP RST, que también puede generarse usando el REJECTobjetivo escribiendo -j REJECT --reject-with tcp-reset.
kasperd 01 de

A pesar de su puntaje más bajo, esta es la primera respuesta que realmente responde la pregunta. Quien pueda agregar más puntajes aquí, por favor hágalo.
EnzoR

2

Si lo hace nmap localhost, le informa sobre una situación diferente: algunos programas en Linux funcionan como servidor, aunque solo se usan localmente. Esto se debe a que otros programas los usan como un servidor al que se conectan. Entonces ambas respuestas son verdaderas, ya que preguntas algo diferente.

El puerto 23 se usa para telnet. Normalmente ya no se usa. Intente hacer nmap -sV 192.168.1.1para averiguar qué programa abre el puerto.

(192 ... es una IP de red local, por lo que el resultado nmap <your outside world IP>también dará un resultado diferente, debido a la posible configuración del firewall, etc.)


1

Si tiene un servicio ejecutándose y escuchando en el puerto 23, podría decirse que es más limpio detener el proceso que escucha el puerto 23 (probablemente telnet) que mantenerlo ejecutándose y cerrar o bloquear el puerto 23 usando iptables.

Cuando no hay un proceso escuchando en un puerto, incluso en ausencia de un bloqueo de firewall, cualquier intento de conectarse a él debería resultar en una "conexión rechazada" inmediata ( ECONNREFUSEDa connect(2))

Una forma de encontrar el proceso (y su pid) que escucha en el puerto 23, si existe dicho proceso, es:

sudo lsof -i -P | grep ':23 '

En las -ilistas anteriores , abra los puertos de Internet (tanto UDP como TCP), y -P inhibe la traducción de los puertos a los nombres de servicio (a través de /etc/services)

Después de encontrar el proceso en ejecución escuchando en el puerto 23, puede averiguar cómo comenzó mirando el árbol de procesos (con say, pstree). Si su padre es init(muy probable), puede buscar recursivamente el nombre del proceso en /etc. p.ej:

sudo grep -r telnet /etc

Esto debería llevarlo a la mejor manera de deshabilitar su ejecución en primer lugar.


No hay necesidad de usar grep (y si lo hubiera, no hay necesidad de comillas). Puedes usar sudo lsof -Pi :23.
Théophile

Las citas están ahí por una buena razón. Para asegurarse de que solo el puerto telnet ( 23) coincida. Si no incluye un espacio después :23, coincidirá :234, :2345etc.
arielf

Ah, ya veo. Eso tiene sentido para grep. Por cierto, parece que el comando sin grep ( lsof -Pi :23) busca una coincidencia exacta.
Théophile
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.