Comment puis-je vérifier quels ports sont occupés et quels ports sont libres sur ma machine Linux?

30

Existe-t-il une commande en ligne de commande ou tout autre moyen pour rechercher et répertorier les numéros de port occupés et libres sur ma machine Linux?

Jeegar Patel
la source

Réponses:

41

La commande

netstat -antu

affichera tous les ports tcp et udp utilisés. La sortie ressemblera à ceci:

Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 0.0.0.0:59753           0.0.0.0:*               LISTEN

Le nombre après les deux-points dans le champ Adresse locale indique le port utilisé. Si l'état est "ECOUTER", cela signifie un port qui utilise pour les connexions entrantes. Si l'adresse IP dans le Local Addresschamp est, 0.0.0.0cela signifie que les connexions entrantes seront acceptées sur toute adresse IP affectée à une interface - cela signifie donc à partir de connexions provenant de l'extérieur de votre machine.

Si cela disait localhostou 127.0.0.1ce serait seulement accepter les connexions de votre machine.

De plus, si vous ajoutez le -pparamètre et l'exécutez en tant que root, il affichera le processus qui a ouvert le port:

$ sudo netstat -antup
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:59753           0.0.0.0:*               LISTEN      860/rpc.statd

Tout ce qui n'est pas indiqué comme étant en cours d'utilisation est gratuit, mais les utilisateurs (comptes non privilégiés) ne peuvent ouvrir que des ports supérieurs à 1023.

Paul
la source
cela signifie que les connexions entrantes seront acceptées sur n'importe quelle adresse IP attribuée à une interface - cela signifie donc que depuis les connexions provenant de l'extérieur de votre machine, n'avez-vous pas fait d'erreur ici? Vous vouliez probablement dire que les connexions seront acceptées si elles proviennent d'une adresse affectée à une interface donnée, quelle que soit leur origine. L'origine des connexions entrantes est probablement spécifiée dans la colonne suivante Adresse étrangère. Donc, c'est là, si l'on a 0.0.0.0 comme valeur, cela signifie que les connexions seront acceptées de n'importe où, y compris à l'extérieur de la machine
user907860
1
@ user907860 Ce n'est peut-être pas clair, mais la distinction que je fais est entre 0.0.0.0 vs 127.0.0.1 - ce dernier n'acceptera que les connexions de votre machine, car il écoute sur une adresse IP non routée. Alors que 0.0.0.0 signifie n'importe quelle adresse sur votre machine, et si elles sont routées, des connexions peuvent être établies à partir d'autres machines.
Paul
Juste FYI, -antupeut être écrit comme -tuna🐟
Abdennour TOUMI
13

J'ai compilé une petite liste moi-même.

Certains de mes favoris sont:

netstat -tulpn
lsof -i -n -P
Robin
la source
7

Un moyen bon et fiable de vérifier les ports ouverts est d'utiliser ss(remplacement des ports obsolètes netstat ), il est utilisable dans un script sans nécessiter de privilèges élevés (c. sudo-à-d.).

Utilisation: option -lpour écouter les ports, option -npour contourner la résolution DNS et le filtre sur le port source NN: src :NN(remplacer NNpar le port que vous souhaitez surveiller). Pour plus d'options, voirman ss

ss -ln src :NN

Exemples:

[user@server ~]# ss -ln src :80
State       Recv-Q Send-Q       Local Address:Port   Peer Address:Port
LISTEN      0      128                      *:80                *:*
[user@server ~]# ss -ln src :81
State       Recv-Q Send-Q       Local Address:Port   Peer Address:Port

Et dans un script, en utilisant grep, nous pouvons tester si la sortie contient le port que nous avons demandé. Exemple avec le port 80 utilisé (voir ci-dessus):

myport=80
# count the number of occurrences of port $myport in output: 1= in use; 0 = not in use
result=$(ss -ln src :$myport | grep -Ec -e "\<$myport\>")
if [ "$result" -eq 1 ]; then
  echo "Port $myport is in use (result == $result) "
else
  echo "Port $myport is NOT in use (result == $result) "
fi

# output:
Port 80 is in use (result == 1)

Exemple avec le port 81 non utilisé (voir ci-dessus)

myport=81
result=$(ss -ln src :$myport | grep -Ec -e "\<$myport\>")
if [ "$result" -eq 1 ]; then
  echo "Port $myport is in use (result == $result) "
else
  echo "Port $myport is NOT in use (result == $result) "
fi

# output:
Port 81 is NOT in use (result == 0)
Thomas
la source