Obtenir une liste des ports ouverts sous Linux

191

J'ai besoin d'une commande Linux pour répertorier tous les ports ouverts disponibles à utiliser dans une application.

lsof -i TCP| fgrep LISTEN

Ne semble pas aider car les ports qu’il énumère ne sont pas nécessairement gratuits. Comment puis-je lister les ports ouverts libres non utilisés?

ErrorNotFoundException
la source

Réponses:

258
netstat -lntu

comme réponse par @askmish vous donnera la liste des services en cours d'exécution sur votre système sur les ports TCP et UDP où

  • -l = uniquement les services qui écoutent sur un port
  • -n = affiche le numéro de port, n'essayez pas de résoudre le nom du service
  • -t = ports TCP
  • -u = ports UDP
  • -p = nom du programme

Vous n'avez pas besoin du paramètre 'p', vous voulez uniquement savoir quels ports sont libres et non quel programme est exécuté.

Cela montre seulement quels ports de votre système sont utilisés. Cela ne vous indique pas l'état de votre réseau, par exemple si vous êtes derrière un NAT et que vous souhaitez que certains services soient accessibles de l'extérieur. Ou si le pare-feu bloque le port pour les visiteurs extérieurs. Dans ce cas, nmap vient à la rescousse. AVERTISSEMENT: utilisez nmap uniquement sur les réseaux sous votre contrôle. De plus, il existe des règles de pare-feu qui peuvent bloquer les pings nmap.

mehulved
la source
20
Notez que cette netstatméthode est obsolète sur de nombreux systèmes et ssdevrait être utilisée à la place.
Johu
1
mais si vous êtes sur busybox ssn'est pas inclus
jcollum
90

Puisque net-toolsobsolète , vous pouvez utiliser la sscommande à la place de netstatsi netstatn'est pas présent sur votre machine:

ss -lntu

devrait fonctionner de la même manière que

netstat -lntu

selon l'aide intégrée:

-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
la source
3
Un autre indicateur utile est -p, qui indique l'ID de processus du socket.
Talespin_Kit
21

Cette commande listera les ports réseau ouverts et les processus qui les possèdent:

netstat -lnptu

vous pouvez ensuite filtrer les résultats selon vos spécifications exactes.

Vous pouvez également utiliser nmappour obtenir des résultats plus détaillés sur les ports.

demander
la source
2
L'option -p requiert des privilèges root pour certains processus, donc ce seraitsudo netstat -lnptu
klaus se
5

Tous les ports ouverts, y compris le trafic de réponse:

netstat -tuwanp 2>/dev/null | awk '{print $4}' | sort | uniq -c | wc -l
diyisme
la source
3
Liste uniquement des numéros de port et des adresses IPv4:netstat -tuwanp4 | awk '{print $4}' | grep ':' | cut -d ":" -f 2 | sort | uniq
Aaron C. de Bruyn
+1 pour montrer comment filtrer et extraire les nombres du résultat. Edité pour supprimer la sortie stderr de netstat (ce qui ajoute un en-tête au résultat dans Ubuntu).
datashaman
Hmm, à bien réfléchir. -1 pour ne pas répondre à la question.
datashaman
1

Ma réponse à la question initiale était qu'il posait une question sur les ports inutilisés, pas sur les ports actuellement connectés aux services. Si tel est le cas, il n'existe aucun moyen spécifique de les répertorier, à part de répertorier les ports utilisés et de supposer que les autres sont inutilisés.

Un point supplémentaire à garder à l'esprit: en tant qu'utilisateur, vous ne pourrez pas ouvrir un port inférieur à 1024 (vous aurez besoin d'autorisations root pour cela).

Joat
la source
0

La commande suivante fonctionnera sur tous les Unix produisant dans le même format que Ubuntu / Debian - où l’adresse locale est dans la colonne 4 et où la sortie comprend un en-tête de 2 lignes en haut. Si l'un de ces nombres est différent, modifiez la commande awk ci-dessous.

Si vous voulez uniquement IPv4:

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

Si vous voulez uniquement IPv6:

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

Si vous voulez les deux ensemble:

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

La commande génère une liste de numéros de port qui écoutent sur toutes les interfaces. Si vous voulez lister tous les ports en écoute sur l'interface localhost, utilisez quelque chose comme ça:

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

Essayer

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

et regarde ça.

Robokishan
la source