Le noyau Linux est conçu pour fonctionner sur une multitude de matériels et de cas d’usage, des postes de travail aux serveurs embarqués. Ses paramètres par défaut reflètent cet équilibre : prudents, génériques, mais souvent sous-optimaux pour un environnement de production. Heureusement, l’interface sysctl permet de modifier à chaud des centaines de paramètres du noyau sans redémarrage.
Sur un serveur de production hébergeant des applications web, des bases de données ou des microservices, quelques dizaines de paramètres bien choisis peuvent transformer radicalement les performances réseau, la gestion mémoire et le niveau de sécurité. Ce guide passe en revue les réglages sysctl essentiels, organisés par domaine, avec des valeurs testées et expliquées.
Avant toute modification en production, appliquez systématiquement la règle d’or : tester en pré-production, mesurer avant et après, et conserver un plan de retour arrière.
Comprendre sysctl : lecture, écriture et persistance
L’outil sysctl interagit directement avec le pseudo-système de fichiers /proc/sys/. Chaque fichier de cette arborescence correspond à un paramètre du noyau en cours d’exécution.
Lire et modifier un paramètre à chaud
# Lire la valeur actuelle d'un paramètre
sysctl vm.swappiness
# Modifier temporairement (perdu au redémarrage)
sysctl -w vm.swappiness=10
# Équivalent direct via /proc
echo 10 > /proc/sys/vm/swappiness
Rendre les modifications persistantes
La bonne pratique sur Debian et Ubuntu consiste à créer un fichier dédié dans /etc/sysctl.d/ plutôt que de modifier /etc/sysctl.conf, afin de faciliter la maintenance et les rollbacks.
# Créer un fichier de configuration dédié
sudo nano /etc/sysctl.d/99-production.conf
# Appliquer immédiatement sans redémarrer
sudo sysctl --system
# Vérifier qu'un paramètre est bien actif
sysctl net.core.somaxconn
Optimisation réseau : gérer des milliers de connexions simultanées
Le réseau est le premier goulot d’étranglement sur la majorité des serveurs de production. Les valeurs par défaut du noyau limitent le nombre de connexions simultanées, la taille des files d’attente et les tampons mémoire alloués aux sockets.
Files d’attente et connexions entrantes
# /etc/sysctl.d/99-production.conf
# Taille maximale de la file d'attente des connexions établies
net.core.somaxconn = 65535
# File d'attente des paquets entrants sur chaque interface réseau
net.core.netdev_max_backlog = 65535
# File d'attente des connexions SYN en attente (protection SYN flood)
net.ipv4.tcp_max_syn_backlog = 8192
# Protection active contre les SYN floods (cookies SYN)
net.ipv4.tcp_syncookies = 1
Tampons mémoire des sockets TCP
Les tampons de réception et d’émission déterminent le débit maximal atteignable sur une connexion. Les valeurs par défaut (environ 4 Mo) sont insuffisantes pour des liens haute vitesse ou des connexions longue distance.
# Tampon de réception : min / défaut / max (en octets)
net.ipv4.tcp_rmem = 4096 131072 16777216
# Tampon d'émission : min / défaut / max (en octets)
net.ipv4.tcp_wmem = 4096 87380 16777216
# Plafond système pour les sockets de réception
net.core.rmem_max = 16777216
# Plafond système pour les sockets d'émission
net.core.wmem_max = 16777216
# Auto-tuning des tampons (activer)
net.ipv4.tcp_moderate_rcvbuf = 1
Algorithme de contrôle de congestion BBR
BBR (Bottleneck Bandwidth and Round-trip time), développé par Google, surpasse l’algorithme CUBIC par défaut sur les liaisons WAN et les réseaux avec pertes de paquets. Il maintient un débit élevé tout en réduisant la latence.
# Vérifier les algorithmes disponibles
sysctl net.ipv4.tcp_available_congestion_control
# Activer BBR avec la discipline de file FQ
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
# Vérifier que BBR est actif
sysctl net.ipv4.tcp_congestion_control
Gestion des connexions et ports éphémères
# Plage de ports éphémères (par défaut 32768-60999)
net.ipv4.ip_local_port_range = 10000 65535
# Réutilisation des sockets TIME_WAIT pour de nouvelles connexions
net.ipv4.tcp_tw_reuse = 1
# Réduction du délai de fermeture TCP FIN (défaut : 60s)
net.ipv4.tcp_fin_timeout = 15
# Maintien des connexions persistantes (keepalive)
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_intvl = 60
net.ipv4.tcp_keepalive_probes = 9
Optimisation mémoire : swap, dirty pages et cache
La gestion mémoire du noyau impacte directement la latence des applications. Un serveur de base de données ou un cache Redis peut voir ses performances chuter de 50 % si le noyau décide d’activer massivement le swap au mauvais moment.
Contrôle du swap avec swappiness
# Réduire l'agressivité du swap (défaut : 60)
# 10 = conserver les données en RAM, swapper en dernier recours
# 1 = désactiver presque totalement le swap (bases de données)
vm.swappiness = 10
# Mémoire minimale libre à maintenir en permanence (en Ko)
vm.min_free_kbytes = 65536
Dirty pages et synchronisation disque
Les « dirty pages » sont des pages mémoire modifiées non encore écrites sur disque. Un ratio trop élevé entraîne des pics d’I/O lors des flush, dégradant les temps de réponse.
# Pourcentage de RAM contenant des dirty pages avant flush forcé (défaut : 20)
vm.dirty_ratio = 15
# Seuil de déclenchement du flush en arrière-plan (défaut : 10)
vm.dirty_background_ratio = 5
# Pression sur le cache VFS (dentry/inode) — 50 = équilibré
vm.vfs_cache_pressure = 50
# Délai entre deux passages du flush (en centièmes de secondes)
vm.dirty_expire_centisecs = 1500
vm.dirty_writeback_centisecs = 500
Limite de fichiers ouverts
# Nombre maximum de fichiers ouverts simultanément (C10k/C100k)
fs.file-max = 2097152
# Vérifier l'utilisation actuelle
cat /proc/sys/fs/file-nr
Durcissement sécurité : protections réseau et noyau
Les paramètres sysctl constituent une ligne de défense complémentaire au pare-feu. Ils neutralisent plusieurs vecteurs d’attaque réseau courants et renforcent l’isolation mémoire des processus.
Protections réseau
# Filtrage des paquets par chemin inverse (anti-spoofing IP)
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
# Rejeter le routage à la source (source routing)
net.ipv4.conf.all.accept_source_route = 0
net.ipv6.conf.all.accept_source_route = 0
# Ignorer les redirections ICMP (vecteur d'attaque MITM)
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
# Ignorer les broadcasts ICMP (amplification d'attaque)
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1
# Journaliser les paquets de sources martiens
net.ipv4.conf.all.log_martians = 1
Durcissement du noyau
# ASLR : randomisation de l'espace d'adressage (défaut souvent 0 ou 1)
kernel.randomize_va_space = 2
# Restreindre l'accès aux logs noyau (dmesg) aux administrateurs
kernel.dmesg_restrict = 1
# Masquer les pointeurs noyau dans /proc (prévention de fuites d'adresses)
kernel.kptr_restrict = 2
# Restreindre ptrace aux processus parents uniquement
kernel.yama.ptrace_scope = 1
# Désactiver les core dumps des processus setuid
fs.suid_dumpable = 0
# Protections des liens symboliques et physiques
fs.protected_symlinks = 1
fs.protected_hardlinks = 1
Configuration complète et application
Voici le fichier consolidé à déployer sur vos serveurs de production Debian/Ubuntu :
sudo tee /etc/sysctl.d/99-production.conf > /dev/null << 'EOF'
### Réseau — connexions et buffers
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 65535
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_rmem = 4096 131072 16777216
net.ipv4.tcp_wmem = 4096 87380 16777216
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_moderate_rcvbuf = 1
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
net.ipv4.ip_local_port_range = 10000 65535
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_intvl = 60
net.ipv4.tcp_keepalive_probes = 9
### Mémoire
vm.swappiness = 10
vm.min_free_kbytes = 65536
vm.dirty_ratio = 15
vm.dirty_background_ratio = 5
vm.vfs_cache_pressure = 50
vm.dirty_expire_centisecs = 1500
vm.dirty_writeback_centisecs = 500
fs.file-max = 2097152
### Sécurité réseau
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.accept_source_route = 0
net.ipv6.conf.all.accept_source_route = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1
net.ipv4.conf.all.log_martians = 1
### Durcissement noyau
kernel.randomize_va_space = 2
kernel.dmesg_restrict = 1
kernel.kptr_restrict = 2
kernel.yama.ptrace_scope = 1
fs.suid_dumpable = 0
fs.protected_symlinks = 1
fs.protected_hardlinks = 1
EOF
# Appliquer tous les paramètres
sudo sysctl --system
# Vérifier sans erreur
sysctl -p /etc/sysctl.d/99-production.conf
À lire également
- Mémoire Swap et paramétrage swappiness — comprendre et configurer la swappiness en profondeur
- Mémoire : Utilisation des Huge Pages et implémentation — réduire la pression TLB pour les workloads intensifs
- eBPF sur Linux : observabilité et traçage kernel avec bpftrace et BCC — surveiller l’impact réel de vos réglages noyau
- Analyse de la mémoire sur Linux — vmstat, free, smem — mesurer l’utilisation mémoire avant et après tuning