Les ports : l'adressage des applications
Une adresse IP identifie un hôte sur le réseau. Mais un hôte fait tourner des dizaines d'applications simultanément : un serveur web, un serveur SSH, une base de données, un agent de monitoring... Comment la couche réseau sait-elle vers quelle application livrer chaque paquet ?
La réponse : les ports. Un port est un entier sur 16 bits (0 à 65535) qui identifie une application ou un service spécifique sur un hôte. Combiné avec l'adresse IP et le protocole (TCP ou UDP), il permet d'adresser précisément un processus applicatif.
Analogie
Imaginez un immeuble de bureaux :
- L'adresse IP = l'adresse de l'immeuble (ex: 192.168.1.100)
- Le port = le numéro de bureau (ex: :80, :443, :22)
- Le socket = la ligne téléphonique directe du bureau
Vous envoyez votre courrier à "Immeuble 192.168.1.100, Bureau 443" → il arrive exactement au bon destinataire.
Les 3 catégories de ports
L'IANA (Internet Assigned Numbers Authority) divise les 65536 ports en trois catégories :
| Catégorie | Plage | Nom officiel | Usage |
|---|---|---|---|
| Ports bien connus | 0 – 1023 | Well-known ports | Services système standards (nécessitent root) |
| Ports enregistrés | 1024 – 49151 | Registered ports | Applications tierces enregistrées auprès de l'IANA |
| Ports éphémères | 49152 – 65535 | Dynamic/Private ports | Ports temporaires côté client |
Ports éphémères (ephemeral ports)
Quand votre navigateur ouvre une connexion vers google.com:443, votre OS lui attribue automatiquement un port source éphémère choisi aléatoirement dans la plage dynamique. Ce port identifie votre connexion particulière.
# Voir la plage de ports éphémères configurée sur Linux
cat /proc/sys/net/ipv4/ip_local_port_range
# → 32768 60999 (plage par défaut sur Linux)
# Modifier la plage (pour serveurs très chargés)
sudo sysctl -w net.ipv4.ip_local_port_range="1024 65535"
Tableau des ports importants
Ports systèmes essentiels (0-1023)
| Port | Protocole | Service | Description |
|---|---|---|---|
| 20 | TCP | FTP-DATA | Transfert de données FTP |
| 21 | TCP | FTP | Contrôle FTP |
| 22 | TCP | SSH | Shell sécurisé, SFTP, SCP |
| 23 | TCP | Telnet | Shell non chiffré (obsolète, à bannir) |
| 25 | TCP | SMTP | Envoi d'e-mails serveur à serveur |
| 53 | TCP/UDP | DNS | Résolution de noms |
| 67 | UDP | DHCP Server | Attribution d'adresses IP |
| 68 | UDP | DHCP Client | Client DHCP |
| 80 | TCP | HTTP | Web non chiffré |
| 110 | TCP | POP3 | Réception e-mails (obsolète) |
| 111 | TCP/UDP | RPC | Remote Procedure Call |
| 123 | UDP | NTP | Synchronisation horloge |
| 143 | TCP | IMAP | Réception e-mails |
| 161 | UDP | SNMP | Supervision réseau |
| 162 | UDP | SNMP Trap | Alertes SNMP |
| 389 | TCP/UDP | LDAP | Annuaire (Active Directory) |
| 443 | TCP | HTTPS | Web chiffré (TLS) |
| 465 | TCP | SMTPS | SMTP sur TLS |
| 514 | UDP | Syslog | Journalisation centralisée |
| 587 | TCP | SMTP/STARTTLS | Envoi e-mail avec STARTTLS |
| 636 | TCP | LDAPS | LDAP sur TLS |
| 853 | TCP/UDP | DNS-over-TLS | DNS chiffré (DoT) |
| 993 | TCP | IMAPS | IMAP sur TLS |
| 995 | TCP | POP3S | POP3 sur TLS |
Ports enregistrés courants (1024-49151)
| Port | Protocole | Service | Description |
|---|---|---|---|
| 1194 | UDP/TCP | OpenVPN | VPN open-source |
| 1433 | TCP | MSSQL | Microsoft SQL Server |
| 1521 | TCP | Oracle DB | Oracle Database |
| 2181 | TCP | ZooKeeper | Coordination distribuée |
| 2375 | TCP | Docker | API Docker non chiffrée |
| 2376 | TCP | Docker TLS | API Docker chiffrée |
| 3000 | TCP | Grafana/Node | Monitoring / apps Node.js |
| 3306 | TCP | MySQL/MariaDB | Base de données relationnelle |
| 5432 | TCP | PostgreSQL | Base de données relationnelle |
| 5601 | TCP | Kibana | Interface Elasticsearch |
| 6379 | TCP | Redis | Cache/broker in-memory |
| 7700 | TCP | Meilisearch | Moteur de recherche |
| 8080 | TCP | HTTP-alt | Alternative HTTP, proxies |
| 8443 | TCP | HTTPS-alt | Alternative HTTPS |
| 9092 | TCP | Kafka | Broker de messages |
| 9200 | TCP | Elasticsearch | Moteur de recherche |
| 27017 | TCP | MongoDB | Base de données NoSQL |
Définition d'un socket
Un socket est un point de communication identifié par un quintuplet unique :
Socket = (Protocole, IP_source, Port_source, IP_destination, Port_destination)
Exemple : votre connexion HTTPS à Google
Protocole : TCP
IP source : 192.168.1.100 (votre IP)
Port source : 54321 (port éphémère)
IP destination: 142.250.74.46 (IP Google)
Port dest : 443 (HTTPS)
→ Socket identifiant : TCP 192.168.1.100:54321 ↔ 142.250.74.46:443
Ce quintuplet est globalement unique : il n'existe qu'une seule connexion avec cette combinaison précise au monde à cet instant.
Types de sockets
| Type | Protocole | Usage |
|---|---|---|
| Stream socket | TCP | Connexion fiable, flux d'octets |
| Datagram socket | UDP | Datagrammes sans connexion |
| Raw socket | IP direct | Accès bas niveau (ping, nmap) |
| Unix Domain Socket | IPC local | Communication entre processus locaux |
Cycle de vie d'un socket
Côté serveur (TCP)
# Pseudo-code du cycle de vie serveur
socket() # Création du socket
bind() # Lier à l'adresse et au port (ex: 0.0.0.0:80)
listen() # Marquer comme passif, définir la file d'attente
accept() # Bloquer jusqu'à l'arrivée d'une connexion client
# → retourne un NOUVEAU socket pour cette connexion
read()/write() # Communication avec le client
close() # Fermer la connexion
Côté client (TCP)
# Pseudo-code du cycle de vie client
socket() # Création du socket
# Le kernel attribue automatiquement un port éphémère
connect() # Initie le three-way handshake
write()/read() # Envoi de la requête, lecture de la réponse
close() # Fermeture de la connexion
États LISTEN vs ESTABLISHED
# Voir les sockets en état LISTEN (serveur en attente)
ss -tlnp
# Exemple de sortie typique d'un serveur web :
# State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
# LISTEN 0 511 0.0.0.0:80 0.0.0.0:* nginx
# LISTEN 0 511 0.0.0.0:443 0.0.0.0:* nginx
# LISTEN 0 128 0.0.0.0:22 0.0.0.0:* sshd
# LISTEN 0 128 127.0.0.1:3306 0.0.0.0:* mysqld
# Voir les connexions ESTABLISHED
ss -tnp state established
# Exemple :
# ESTAB 0 0 192.168.1.100:22 192.168.1.200:54321 users:(("sshd"))
# ESTAB 0 0 192.168.1.100:443 203.0.113.5:48291 users:(("nginx"))
La commande ss — Socket Statistics
ss (socket statistics) est le remplaçant moderne de netstat. Plus rapide, plus précis, directement depuis le kernel.
Syntaxe et options principales
ss [options] [filtres]
Options :
-t TCP sockets
-u UDP sockets
-l Sockets en écoute (LISTEN)
-n Afficher numéros (pas résolution nom/service)
-p Afficher le processus propriétaire
-s Résumé statistique
-e Informations étendues
-i Informations TCP internes (cwnd, rtt, etc.)
-4 IPv4 uniquement
-6 IPv6 uniquement
Commandes ss les plus utiles
# Tous les ports en écoute (TCP + UDP)
ss -tulnp
# Sortie exemple :
# Netid State Local Address:Port Process
# udp UNCONN 0.0.0.0:68 dhclient
# udp UNCONN 0.0.0.0:123 ntpd
# tcp LISTEN 0.0.0.0:22 sshd
# tcp LISTEN 0.0.0.0:80 nginx
# tcp LISTEN 0.0.0.0:443 nginx
# tcp LISTEN 127.0.0.1:3306 mysqld
# Toutes les connexions TCP établies avec processus
ss -tnp state established
# Compter le nombre de connexions par état
ss -tn | awk 'NR>1 {print $1}' | sort | uniq -c | sort -rn
# Voir les connexions vers un port spécifique
ss -tnp dst :443
# Voir les connexions depuis une IP source
ss -tnp src 192.168.1.200
# Statistiques globales
ss -s
# Total: 856
# TCP: 43 (estab 31, closed 2, orphaned 0, timewait 2)
# UDP: 8
# Informations TCP avancées (RTT, cwnd, etc.)
ss -tip state established
# Filtres avancés
ss -tnp 'sport > 1024 and dport = 443'
ss -tnp 'dst 192.168.1.0/24'
Champ par champ : décoder la sortie de ss
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
State : LISTEN / ESTAB / TIME-WAIT / CLOSE-WAIT / etc.
Recv-Q : Octets reçus non encore lus par l'application
(en LISTEN : nombre de connexions en attente d'accept())
Send-Q : Octets envoyés mais non encore acquittés
(en LISTEN : backlog maximum configuré)
Local : IP:Port local
Peer : IP:Port distant (0.0.0.0:* si LISTEN)
Process : Processus propriétaire (nécessite root pour les autres processus)
La commande lsof — List Open Files
lsof (List Open Files) liste tous les fichiers ouverts par tous les processus — et sous Linux, les sockets réseau sont des fichiers.
# Voir tous les fichiers réseau ouverts
sudo lsof -i
# Voir les processus sur le port 80
sudo lsof -i :80
# Exemple de sortie :
# COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
# nginx 1234 root 6u IPv4 23456 0t0 TCP *:http (LISTEN)
# nginx 1235 www 6u IPv4 23456 0t0 TCP *:http (LISTEN)
# nginx 1235 www 8u IPv4 24567 0t0 TCP 192.168.1.100:80->203.0.113.5:48291 (ESTABLISHED)
# Voir les sockets d'un processus spécifique (par nom)
sudo lsof -i -p $(pgrep nginx)
# Voir les connexions TCP
sudo lsof -i TCP
# Voir les connexions UDP
sudo lsof -i UDP
# Voir les Unix Domain Sockets (communication locale)
sudo lsof -U
# Trouver quel processus utilise le port 3306
sudo lsof -i :3306
# ou
sudo ss -tnlp | grep :3306
Port Forwarding
Le port forwarding (redirection de port) permet de rediriger le trafic arrivant sur un port vers une autre adresse/port.
SSH Port Forwarding (tunneling)
# Local port forwarding :
# Redirige localhost:8080 → serveur_distant:80
ssh -L 8080:localhost:80 user@serveur-distant
# Accédez à http://localhost:8080 dans votre navigateur
# Remote port forwarding :
# Le serveur distant redirige son port 9090 → votre localhost:3000
ssh -R 9090:localhost:3000 user@serveur-distant
# Dynamic port forwarding (proxy SOCKS5) :
# Crée un proxy SOCKS5 sur localhost:1080
ssh -D 1080 user@serveur-distant
iptables Port Forwarding (DNAT)
# Rediriger le port 8080 local vers un autre serveur sur le port 80
sudo iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.50:80
# Rediriger le port 80 vers une application interne sur 8080
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
# Voir les règles NAT actives
sudo iptables -t nat -L -n -v
Sécurité et bonnes pratiques
Minimiser la surface d'attaque
# Principe de base : n'exposer que les ports nécessaires
# Lister tous les ports en écoute (audit)
ss -tulnp
# Vérifier les ports exposés depuis l'extérieur
nmap -sT localhost
sudo nmap -sU -sT 192.168.1.100
# Fermer un service inutile (exemple : telnet)
sudo systemctl stop telnet
sudo systemctl disable telnet
sudo systemctl mask telnet # empêche toute activation future
Bind sur localhost uniquement
# Mauvais : service exposé sur toutes les interfaces
mysqld --bind-address=0.0.0.0 # ← dangereux
# Bien : service uniquement sur localhost
mysqld --bind-address=127.0.0.1 # ← sécurisé
Vérifiez toujours dans /etc/mysql/mysql.conf.d/mysqld.cnf :
[mysqld]
bind-address = 127.0.0.1
Ports non-standard
Changer un service d'un port well-known (ex: SSH de 22 vers 2222) n'est pas une vraie sécurité (security by obscurity), mais peut réduire le bruit dans les logs provenant des scanners automatiques.
# Dans /etc/ssh/sshd_config
Port 2222
# Adapter le pare-feu
sudo ufw allow 2222/tcp
sudo ufw deny 22/tcp
Récapitulatif
| Concept | Détail |
|---|---|
| Port | 16 bits (0-65535), identifie un service |
| Well-known | 0-1023, services systèmes, nécessitent root |
| Registered | 1024-49151, applications enregistrées |
| Éphémères | 49152-65535 (Linux: 32768-60999), côté client |
| Socket | Quintuplet (proto, IP src, port src, IP dst, port dst) |
| LISTEN | Serveur attend des connexions |
| ESTABLISHED | Connexion active |
ss -tulnp |
Commande de référence pour auditer les ports |
lsof -i :PORT |
Trouver le processus sur un port |
Passez au chapitre suivant : ICMP et outils de diagnostic — les outils essentiels pour diagnostiquer les pannes réseau.