Une connexion réseau TCP/IP peut être soit bloquée, interrompue, ouverte ou filtrée. Ces actions sont généralement contrôlées par le pare-feu IPtables utilisé par le système et sont indépendantes de tout processus ou programme pouvant être à l'écoute sur un port réseau. Au-delà du pare-feu, un programme ou un processus (un serveur ou un démon) peut être à l'écoute sur un port ou ne pas l'écouter. Ceci peut être vérifié en utilisant les programmes netstat ou ss. Vérifier si un port est ouvert, bloqué, abandonné ou filtré au niveau du pare-feu n'est pas simple. Il existe deux manières de procéder :
- tester le port en externe
- répertorier la configuration du pare-feu et examiner le résultat
1. Utilisation de netstat pour voir les processus d'écoute
Pour voir si un programme ou un processus écoute sur un port, prêt à accepter un paquet, utilisez la commande netstat.
# netstat -tulnp
Les arguments de la commande netstat sont répertoriés ci-dessous :
l – Afficher TCP
u – Afficher UDP
l – Afficher uniquement les processus d'écoute (netstat peut afficher à la fois l'écoute et toutes les connexions établies, c'est-à-dire en tant que client également)
n – Ne résolvez pas les noms d'adresse IP ou les numéros de port du réseau
p – Afficher le nom du processus qui écoute sur le port
Par exemple :
# netstat -tulnp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1254/rpcbind tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1484/sshd tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 1355/cupsd tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1562/master tcp 0 0 0.0.0.0:44349 0.0.0.0:* LISTEN 1274/rpc.statd udp 0 0 0.0.0.0:111 0.0.0.0:* 1254/rpcbind udp 0 0 0.0.0.0:631 0.0.0.0:* 1355/cupsd udp 0 0 0.0.0.0:44165 0.0.0.0:* 1274/rpc.statd udp 0 0 0.0.0.0:602 0.0.0.0:* 1274/rpc.statd udp 0 0 0.0.0.0:1001 0.0.0.0:* 1254/rpcbind
2. Utiliser ss pour voir les processus d'écoute
Pour voir si un programme ou un processus écoute sur un port, prêt à accepter un paquet, utilisez le programme ss.
# ss -nutlp
Les arguments du programme ss sont listés ci-dessous :
l – Afficher les sockets TCP.u – Afficher les sockets UDP.
l – Afficher les prises d'écoute
n – Essayez maintenant de résoudre les noms
p - Afficher le processus à l'aide de socket
Par exemple :
# ss -nutlp Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port udp UNCONN 0 0 *:111 *:* users:(("rpcbind",1254,6)) udp UNCONN 0 0 *:631 *:* users:(("cupsd",1355,9)) udp UNCONN 0 0 *:44165 *:* users:(("rpc.statd",1274,8)) udp UNCONN 0 0 *:602 *:* users:(("rpc.statd",1274,5)) udp UNCONN 0 0 *:1001 *:* users:(("rpcbind",1254,7)) tcp LISTEN 0 128 *:111 *:* users:(("rpcbind",1254,8)) tcp LISTEN 0 128 *:22 *:* users:(("sshd",1484,3)) tcp LISTEN 0 128 127.0.0.1:631 *:* users:(("cupsd",1355,7)) tcp LISTEN 0 100 127.0.0.1:25 *:* users:(("master",1562,12)) tcp LISTEN 0 128 *:44349 *:* users:(("rpc.statd",1274,9))
3. utiliser lsof pour trouver les ports ouverts
Pour répertorier tous les ports ouverts sur un système, utilisez la commande suivante pour répertorier le nom et le numéro du processus qui a ouvert les ports.
# lsof -i
Voici un exemple de sortie :
# lsof -i COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME rpcbind 1254 rpc 6u IPv4 12592 0t0 UDP *:sunrpc rpcbind 1254 rpc 7u IPv4 12596 0t0 UDP *:1001 rpcbind 1254 rpc 8u IPv4 12597 0t0 TCP *:sunrpc (LISTEN) rpc.statd 1274 rpcuser 5r IPv4 12784 0t0 UDP *:xmlrpc-beep rpc.statd 1274 rpcuser 8u IPv4 12788 0t0 UDP *:44165 rpc.statd 1274 rpcuser 9u IPv4 12792 0t0 TCP *:44349 (LISTEN) cupsd 1355 root 7u IPv4 13147 0t0 TCP localhost:ipp (LISTEN) cupsd 1355 root 9u IPv4 13150 0t0 UDP *:ipp sshd 1484 root 3u IPv4 13707 0t0 TCP *:ssh (LISTEN) master 1562 root 12u IPv4 13923 0t0 TCP localhost:smtp (LISTEN) sshd 1657 root 3r IPv4 14745 0t0 TCP 192.168.1.50:ssh->192.168.1.101:49549 (ESTABLISHED)
Tester un port en externe
L'application telnet peut être utilisée pour tester la connectivité d'un socket réseau simple, mais uniquement pour les connexions TCP, pas UDP. Par exemple, si je souhaite voir si le port TCP 80 d'un système est prêt à accepter une connexion, je précise l'adresse IP et le port pour telnet :
# telnet 192.168.1.55 80 Trying 192.168.1.55... Connected to example.redhat.com (192.168.1.55). Escape character is '^]'.
Si le serveur n'écoute pas la réponse est différente :
# telnet 10.0.0.25 80 Trying 10.0.0.25... telnet: connect to address 10.0.0.25: Connection refused telnet: Unable to connect to remote host: Connection refused
- Cela indique que la connexion a été activement refusée. Le sous-système TCP a reçu le paquet, l'a examiné et a découvert qu'il s'agissait d'une demande d'ouverture d'un socket sur le port 80, a constaté qu'aucun processus n'était prêt à accepter la connexion et a répondu par un refus.
- Si le pare-feu était configuré pour bloquer ou filtrer la connexion, telnet afficherait quelque chose de très similaire à ce qui précède, même s'il y avait un processus prêt à accepter la connexion.
- Si le pare-feu était configuré pour supprimer les connexions, nous ne verrions aucune réponse et telnet expirerait à la place :
# telnet 10.0.0.25 80 Trying 10.0.0.25... telnet: connect to address 10.0.0.25: Connection timed out
Liste des règles de pare-feu
Dans Red Hat Enterprise Linux, les règles de pare-feu peuvent être répertoriées à l'aide de la commande de service :
# service iptables status
Ou en utilisant la commande iptables :
# iptables -xvn -L