Obtenga una lista de puertos abiertos en Linux

191

Necesito un comando de Linux para enumerar todos los puertos abiertos libres para usar en una aplicación

lsof -i TCP| fgrep LISTEN

No parece estar ayudando, ya que los puertos que enumera no son necesariamente gratuitos. ¿Cómo enumero los puertos abiertos libres que no están en uso?

ErrorNotFoundException
fuente

Respuestas:

258
netstat -lntu

como respondió @askmish le dará una lista de los servicios que se ejecutan en su sistema en los puertos tcp y udp donde

  • -l = solo servicios que escuchan en algún puerto
  • -n = muestra el número de puerto, no intentes resolver el nombre del servicio
  • -t = puertos tcp
  • -u = puertos udp
  • -p = nombre del programa

No necesita el parámetro 'p', ya que solo está interesado en obtener qué puertos están libres y no qué programa se ejecuta en él.

Sin embargo, esto solo muestra qué puertos de su sistema están agotados. Esto no le indica el estado de su red, por ejemplo, si está detrás de NAT y desea que algunos servicios sean accesibles desde el exterior. O si el firewall está bloqueando el puerto para visitantes externos. En ese caso, nmap viene al rescate. ADVERTENCIA: Use nmap solo en redes que están bajo su control. Además, hay reglas de firewall que pueden bloquear los pings de nmap, tendrás que jugar con las opciones para obtener resultados correctos.

mehulved
fuente
20
Tenga en cuenta que netstatestá en desuso en muchos sistemas y ssdebe usarse en su lugar.
Johu
1
pero si estás en busybox ssno está incluido
jcollum
90

Como net-toolsestá en desuso , puede usar el sscomando en lugar de netstatsi netstatno está presente en su máquina:

ss -lntu

debería funcionar de manera similar a

netstat -lntu

De acuerdo con la ayuda incorporada:

-n, --numeric       don't resolve service names
-l, --listening     display listening sockets
-t, --tcp           display only TCP sockets
-u, --udp           display only UDP sockets
Eric Finn
fuente
3
Otro indicador útil es -p, que muestra la identificación del proceso del socket.
Talespin_Kit
21

Este comando enumerará los puertos de red abiertos y los procesos que los poseen:

netstat -lnptu

luego puede filtrar los resultados a sus especificaciones exactas.

También puede usar nmappara obtener resultados más granulares sobre los puertos.

askmish
fuente
2
El indicador -p requiere privilegios de root para algunos procesos, por lo que seríasudo netstat -lnptu
klaus se
5

Todos los puertos abiertos, incluido el tráfico de respuesta:

netstat -tuwanp 2>/dev/null | awk '{print $4}' | sort | uniq -c | wc -l
diyism
fuente
3
Una lista de solo números de puerto exclusivos y sólo con IPv4:netstat -tuwanp4 | awk '{print $4}' | grep ':' | cut -d ":" -f 2 | sort | uniq
Aaron C. de Bruyn
+1 para mostrar cómo filtrar y extraer los números del resultado. Editado para eliminar la salida stderr de netstat (que agrega un encabezado al resultado en Ubuntu).
datashaman
Hmm, pensándolo bien. -1 por no responder la pregunta.
datashaman
1

Mi opinión sobre la pregunta original era que estaba preguntando sobre los puertos no utilizados, no sobre los puertos actualmente conectados a los servicios. Si este es el caso, no hay una forma específica de enumerarlos, aparte de enumerar los puertos utilizados y asumir que los demás no están en uso.

Un punto adicional a tener en cuenta: como usuario, no podrá abrir un puerto inferior a 1024 (necesitará permisos de root para eso).

joat
fuente
0

El siguiente comando funcionará en cualquier Unix que salga en el mismo formato que Ubuntu / Debian, donde la dirección local está en la columna 4 y la salida incluye un encabezado de 2 líneas en la parte superior. Si alguno de esos números es diferente, modifique el comando awk a continuación.

Si solo quiere IPv4:

netstat -lnt | awk 'NR>2{print $4}' | grep -E '0.0.0.0:' | sed 's/.*://' | sort -n | uniq

Si solo quiere IPv6:

netstat -lnt | awk 'NR>2{print $4}' | grep -E ':::' | sed 's/.*://' | sort -n | uniq

Si quieres los dos juntos:

netstat -lnt | awk 'NR>2{print $4}' | grep -E '(0.0.0.0:|:::)' | sed 's/.*://' | sort -n | uniq

El comando genera una lista de números de puerto que están escuchando en todas las interfaces. Si desea enumerar todos los puertos que están escuchando en la interfaz localhost, use algo como esto:

netstat -lnt | awk 'NR>2{print $4}' | grep -E '(127.0.0.1:|::1:)' | sed 's/.*://' | sort -n | uniq
datashaman
fuente
0

Tratar

sudo netstat -plnt | grep -E '(0.0.0.0:|:::|127.0.0.1:|::1:)' |  awk 'NR>2{print $7}' | sort -n  | uniq

y mira esto.

Robokishan
fuente