web-dev-qa-db-fra.com

Vérifiez si le port est ouvert ou fermé sur un serveur Linux?

Comment puis-je vérifier si un port écoute sur un serveur Linux?

228
James Anderson

Vous pouvez vérifier si un processus écoute sur un TCP ou port UDP avec netstat -tuplen.

Pour vérifier si certains ports sont accessibles de l'extérieur (c'est probablement ce que vous voulez), vous pouvez utiliser un scanner de ports comme Nmap de un autre système. Exécuter Nmap sur le même hôte que vous souhaitez vérifier est tout à fait inutile pour votre objectif.

195
joschi

Le moyen le plus rapide de tester si un port TCP est ouvert (y compris tous les pare-feu matériels que vous pourriez avoir) est de taper à partir d'un ordinateur distant (par exemple, votre bureau):

telnet myserver.com 80

Qui tentera d'ouvrir une connexion au port 80 sur ce serveur. Si vous obtenez un temps mort ou refusez, le port n'est pas ouvert :)

108
Adrian Macneil

OK, en résumé, vous avez un serveur auquel vous pouvez vous connecter. Vous voulez voir si quelque chose écoute sur un port. En tant que root, exécutez:

netstat -nlp

cela affichera une liste des processus à l'écoute sur TCP et ports UDP. Vous pouvez le scanner (ou le grep) pour le processus qui vous intéresse et/ou les numéros de port que vous attendez de voir .

Si le processus que vous attendez n'est pas là, vous devez démarrer ce processus et vérifier à nouveau netstat. Si le processus est là, mais qu'il écoute sur une interface et un port auxquels vous ne vous attendiez pas, alors il y a un problème de configuration (par exemple, il pourrait être à l'écoute, mais uniquement sur l'interface de bouclage, vous verrez donc 127.0.0.1:3306 et pas d'autres lignes pour le port 3306, dans le cas de la configuration par défaut pour MySQL).

Si le processus est en cours et qu'il écoute sur le port que vous attendez, vous pouvez essayer d'exécuter un "telnet" sur ce port à partir de votre Macbook dans votre bureau/domicile, par exemple,

 telnet xxxxxxxxxxxx.co.uk 443

Cela testera si (en supposant des ports standard) qu'il y a un serveur Web configuré pour SSL. Notez que ce test utilisant telnet ne fonctionnera que si le processus écoute sur un port TCP. S'il s'agit d'un port UDP, vous pouvez aussi bien essayer avec le client que vous allez utiliser pour connectez-vous à lui (je vois que vous avez utilisé le port 224. C'est masqdialer, et je n'ai aucune idée de ce que c'est).

Si le service existe, mais que vous ne pouvez pas y accéder en externe, un pare-feu vous bloque. Dans ce cas, exécutez:

 iptables -L -n

Cela montrera toutes les règles de pare-feu telles que définies sur votre système. Vous pouvez poster cela, mais, généralement, si vous n'autorisez pas tout sur la chaîne INPUT, vous devrez probablement autoriser explicitement le trafic sur le port en question:

 iptables -I INPUT -p tcp --dport 224 -j ACCEPT

ou quelque chose de ce genre. N'exécutez pas vos commandes de pare-feu à l'aveugle sur la base de ce qu'un étranger vous a dit sur Internet. Considérez ce que vous faites.

Si votre pare-feu sur la boîte autorise le trafic que vous souhaitez, votre hébergeur peut exécuter un pare-feu (par exemple, il n'autorise que SSH (22/tcp), HTTP (80/tcp) et HTTPS (443/tcp) et refuser tout autre trafic entrant). Dans ce cas, vous devrez ouvrir un ticket d'assistance avec eux pour résoudre ce problème, bien que je suppose qu'il puisse y avoir quelque chose dans votre cPanel qui le permette.

32
cjc

J'utilise la combinaison de netstat et lsof:

netstat -an | grep <portnumber>
lsof -i:<portnumber>

Pour voir si le port est utilisé et ce qui l'utilise.

12
warren

Si vous êtes connecté au système et pouvez exécuter une commande en tant que root, vous pouvez vérifier la sortie d'iptables

iptables -L -vn

cela listera les règles de pare-feu et quels ports sont ouverts cible ACCEPT et tous les ports explicitement fermés cible REJECT.

8
user9517

lsof -i :ssh listera tous les processus avec le port ssh ouvert, les connexions d'écoute et actives.

6
pgs

Si vous avez besoin de scripter un tel test, la solution de Serhii Popov (voir le commentaire à la question) est probablement la meilleure car nc est capable de rechercher dans la pile TCP pour un open port au lieu de tenter une connexion réelle.

La forme la plus simple est:

nc -z <ip> <port>

La commande renvoie true si elle trouve le combo <ip>:<port> Spécifié comme étant ouvert (c'est-à-dire que l'un de vos services écoute).

Alors maintenant, vous pouvez écrire un script pour attendre que le port soit ouvert:

while ! nc -z <ip> <port>
do
    sleep 1
done

Remarque 1: J'ai essayé l'option de ligne de commande -w Et cela ne semble rien faire. Dans les deux cas, la commande revient immédiatement. Je pense que le -w N'est pas utile avec -z.

Remarque 2: pour faciliter le débogage, essayez avec l'option de ligne de commande -v.

0
Alexis Wilke