GNU/Linux >> Tutoriels Linux >  >> Linux

paramètre sysctl pour une charge élevée et empêcher les attaques DDoS

Présentation

Il existe de nombreux exemples différents de configurations de noyau Linux sur Internet pour prendre en charge un grand nombre de connexions, des projets Web fortement chargés et contrer les attaques DDoS. Voici un autre exemple que j'ai déjà pu essayer en pratique. Je dirai tout de suite - cela m'a plus que aidé. Essayez-le et vous.

options/etc/sysctl.conf

Il existe une liste d'options nécessaires à ajouter à /etc/sysctl.conf :

net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.tcp_max_orphans = 65536
net.ipv4.tcp_fin_timeout = 10
net.ipv4.tcp_keepalive_time = 1800
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.tcp_keepalive_probes = 5
net.ipv4.tcp_max_syn_backlog = 4096
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_mem = 50576   64768   98152
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.tcp_orphan_retries = 0
net.ipv4.tcp_syncookies = 0
net.ipv4.netfilter.ip_conntrack_max = 16777216
net.netfilter.nf_conntrack_max = 16777216
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_sack = 1
net.ipv4.tcp_congestion_control = htcp
net.ipv4.tcp_no_metrics_save = 1
net.ipv4.route.flush = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.lo.rp_filter = 1
net.ipv4.conf.eth0.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.lo.accept_source_route = 0
net.ipv4.conf.eth0.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_rfc1337 = 1
net.ipv4.ip_forward = 0
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_echo_ignore_all = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 1000
net.core.rmem_default = 65536
net.core.wmem_default = 65536
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
fs.inotify.max_user_watches = 16777216

Et maintenant sur chaque option plus en détail.

net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.all.send_redirects = 0

N'acceptez pas et n'envoyez pas de paquets de redirection ICMP. Les redirections ICMP peuvent être utilisées par un attaquant pour modifier les tables de routage. Il est conseillé de le mettre à « 0 ». L'unité n'a de sens que pour les hôtes utilisés comme routeurs.

net.ipv4.tcp_max_orphans = 65536

La valeur entière du paramètre tcp_max_orphans détermine le nombre maximum de sockets TCP valides dans le système qui ne sont connectés par aucun filehandle utilisateur. Lorsque la valeur seuil est atteinte, les composés orphelins sont immédiatement réinitialisés avec un avertissement. Ce seuil aide à prévenir uniquement les attaques DoS simples. Vous ne devez pas réduire la valeur de seuil (plutôt l'augmenter en fonction des exigences du système, par exemple, après avoir ajouté de la mémoire. Chaque connexion orpheline absorbe environ 64 Ko de mémoire non échangeable).

net.ipv4.tcp_fin_timeout

net.ipv4.tcp_fin_timeout = 10

Le paramètre tcp_fin_timeout détermine le temps pendant lequel le socket reste dans l'état FIN-WAIT-2 après sa fermeture par le côté local. Le partenaire ne peut jamais fermer cette connexion, vous devez donc la fermer de votre propre initiative après un délai d'attente. Par défaut, le délai d'attente est de 60 secondes. Dans les cœurs de la série 2.2, une valeur de 180 secondes était généralement utilisée et vous pouvez enregistrer cette valeur, mais vous ne devez pas oublier que sur des serveurs WEB chargés, vous courez le risque de consommer beaucoup de mémoire pour enregistrer des connexions mortes à moitié interrompues. Les sockets dans l'état FIN-WAIT-2 sont moins dangereux que FIN-WAIT-1 car ils n'absorbent pas plus de 1,5 Ko de mémoire, mais ils peuvent durer plus longtemps.

tcp keepalive time

net.ipv4.tcp_keepalive_time = 1800
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.tcp_keepalive_probes = 5

tcp_keepalive_time La variable détermine la fréquence à laquelle la connexion doit être vérifiée si elle n'a pas été utilisée pendant une longue période. La valeur de la variable n'a de sens que pour les sockets qui ont été créés avec l'indicateur SO_KEEPALIVE. La variable entière tcp_keepalive_intvl définit l'intervalle d'échantillonnage. Le produit tcp_keepalive_probes * tcp_keepalive_intvl détermine le temps après lequel la connexion sera déconnectée s'il n'y a pas de réponse. Par défaut, l'intervalle est de 75 secondes, c'est-à-dire que le temps de déconnexion en l'absence de réponse sera d'environ 11 minutes.

net.ipv4.tcp_max_syn_backlog = 4096

La valeur entière dans le fichier tcp_max_syn_backlog définit le nombre maximal de demandes de connexion mémorisées pour lesquelles aucune confirmation n'a été reçue du client qui se connecte. En cas de surcharge sur le serveur, vous pouvez essayer d'augmenter cette valeur.

net.ipv4.tcp_synack_retries = 1

La valeur entière (1 octet) tcp_synack_retries détermine le nombre de nouvelles tentatives de transmission des paquets SYNACK pour les connexions TCP passives. Le nombre de tentatives ne doit pas dépasser 255. Une valeur de 5 correspond à environ 180 secondes pour tenter d'établir une connexion.

net.ipv4.tcp_mem

net.ipv4.tcp_mem = 50576   64768   98152

La variable vectorielle (minimum, mode de chargement, maximum) du fichier tcp_mem contient les paramètres généraux de consommation de mémoire pour le protocole TCP. Cette variable est mesurée en pages (généralement 4 ko), et non en octets.

Minimum  :tant que la taille totale de la mémoire pour les structures du protocole TCP est inférieure à ce nombre de pages, le système d'exploitation ne fait rien.

Mode de chargement :dès que le nombre de pages mémoire allouées pour le protocole TCP atteint cette valeur, le mode de chargement est activé, dans lequel le système d'exploitation tente de limiter l'allocation de mémoire. Ce mode est maintenu jusqu'à ce que la consommation de mémoire atteigne à nouveau le niveau minimum.

Maximum :Le nombre maximum de pages mémoire autorisées pour tous les sockets TCP.

net.ipv4.tcp_rmem

net.ipv4.tcp_rmem = 4096 87380 16777216

La variable vectorielle (minimum, défaut, maximum) du fichier tcp_rmem contient 3 entiers qui déterminent la taille du tampon de réception du socket TCP.

Minimum :chaque socket TCP a le droit d'utiliser cette mémoire lors de sa création. La possibilité d'utiliser un tel tampon est garantie même lorsque le seuil de la limite (pression mémoire modérée) est atteint. La taille de mémoire tampon minimale par défaut est de 8 Ko (8192).

Valeur par défaut :quantité de mémoire autorisée pour le tampon de transfert de socket TCP par défaut. Cette valeur est utilisée à la place du paramètre /proc/sys/net/core/rmem_default utilisé par d'autres protocoles. La valeur de tampon par défaut (généralement) est de 87830 octets. Cela détermine la taille de la fenêtre de 65535 avec la valeur par défaut de tcp_adv_win_scale et tcp_app_win =0, légèrement inférieure à la valeur par défaut de tcp_app_win.

Maximum :La taille maximum du buffer peut être allouée automatiquement pour recevoir un socket TCP. Cette valeur n'annule pas le maximum spécifié dans le fichier /proc/sys/net/core/rmem_max. Avec une allocation de mémoire "statique" utilisant SO_RCVBUF, ce paramètre n'a pas d'importance.

net.ipv4.tcp_wmem

net.ipv4.tcp_wmem = 4096 65536 16777216

La variable vectorielle dans le fichier tcp_wmem contient 3 valeurs entières qui définissent la quantité minimale, par défaut et maximale de mémoire réservée aux tampons de transfert de socket TCP.

Minimum :chaque socket TCP a le droit d'utiliser cette mémoire lors de sa création. La taille de tampon minimale par défaut est de 4 Ko (4096)

Valeur par défaut :quantité de mémoire autorisée pour le tampon de transfert de socket TCP par défaut. Cette valeur est utilisée à la place du paramètre /proc/sys/net/core/wmem_default utilisé par d'autres protocoles et est généralement inférieure à /proc/sys/net/core/wmem_default. La taille du tampon par défaut est généralement (par défaut) 16 Ko (16384).

Maximum :quantité maximale de mémoire pouvant être automatiquement allouée au tampon de transmission du socket TCP. Cette valeur ne remplace pas le maximum spécifié dans le fichier /proc/sys/net/core/wmem_max. Avec une allocation de mémoire "statique" utilisant SO_SNDBUF, ce paramètre n'a pas d'importance.

net.ipv4.tcp_orphan_retries =0

La valeur entière tcp_orphan_retries détermine le nombre de tentatives infructueuses, après quoi la connexion TCP qui est fermée du côté local est détruite. La valeur par défaut est 7, ce qui correspond approximativement à une durée de 50 secondes à 16 minutes, selon le RTO. Sur les serveurs WEB fortement chargés, il est logique de réduire la valeur de ce paramètre car les connexions fermées peuvent consommer beaucoup de ressources.

net.ipv4.tcp_syncookies =0

En lien avec la recommandation des développeurs du noyau, il est préférable de désactiver cette option.

net.ipv4.netfilter.ip_conntrack_max =16777216

Le nombre maximal de connexions pour que le mécanisme de suivi des connexions fonctionne (utilisé, par exemple, iptables). Si les valeurs sont trop petites, le noyau commence à rejeter les connexions entrantes avec l'entrée correspondante dans le journal système.

net.ipv4.tcp_timestamps =1

Autorise les horodatages TCP. Leur présence permet de contrôler le fonctionnement du protocole sous fortes charges (voir tcp_congestion_control).

net.ipv4.tcp_sack = 1

Autoriser l'accusé de réception sélectif de la prise en charge de TCPIP. Cette option est nécessaire pour une utilisation efficace de toute la bande passante disponible de certains réseaux.

net.ipv4.tcp_congestion_control = htcp

Protocole, utilisé pour le contrôle de charge dans les réseaux TCP. Les implémentations bic et cubiques par défaut contiennent des bogues dans la plupart des versions du noyau RedHat et de ses clones. L'utilisation de htcp est recommandée.

net.ipv4.tcp_no_metrics_save = 1

N'enregistrez pas les mesures de connexion TCP dans le cache lorsqu'il est fermé. Dans certains cas, cela aide à augmenter la productivité.

Défense contre l'usurpation d'adresse IP

net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.lo.rp_filter = 1
net.ipv4.conf.eth0.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1

Désactiver le routage source

net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.lo.accept_source_route = 0
net.ipv4.conf.eth0.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0

net.ipv4.ip_local_port_range

net.ipv4.ip_local_port_range = 1024 65535

Augmentez la gamme de ports locaux disponibles pour les connexions sortantes.

net.ipv4.tcp_tw_reuse = 1

Nous autorisons la réutilisation des sockets TIME-WAIT dans les cas où le protocole considère que cela est sûr.

net.ipv4.tcp_window_scaling = 1

Autoriser le redimensionnement dynamique de la fenêtre de la pile TCP.

net.ipv4.tcp_rfc1337 = 1

Défense contre l'attaque TIME_WAIT.

net.ipv4.ip_forward = 0

Nous interdisons le transfert de paquets, car nous ne sommes pas un routeur.

net.ipv4.icmp_echo_ignore_broadcasts = 1

Nous ne répondons pas aux requêtes ICMP ECHO transmises par paquets de diffusion.

net.ipv4.icmp_echo_ignore_all = 1

Vous ne pouvez pas du tout répondre aux requêtes ICMP ECHO (le serveur ne pingera pas).

net.ipv4.icmp_ignore_bogus_error_responses = 1

Nous ne répondons pas aux messages mal formés.

net.core.somaxconn = 65535

Le nombre maximum de sockets ouverts en attente d'une connexion. Il est logique d'augmenter la valeur par défaut.

net.core.netdev_max_backlog = 1000

Le paramètre détermine le nombre maximum de paquets dans la file d'attente de traitement si l'interface reçoit les paquets plus rapidement que le noyau ne peut les traiter.

Mémoire maximale par défaut

net.core.rmem_default = 65536

La taille par défaut du tampon de réception des données pour toutes les connexions.

net.core.wmem_default = 65536

La taille par défaut du tampon de transfert de données pour toutes les connexions.

net.core.rmem_max = 16777216

La taille maximale du tampon de réception de données pour toutes les connexions.

net.core.wmem_max = 16777216

Taille maximale du tampon de données pour toutes les connexions.


Linux
  1. Analyser les cas pour et contre la configuration de l'espace d'échange sur les instances cloud

  2. Installation et configuration de Grafana sous Linux

  3. Écrire pour Atlantic.Net FAQ

  4. Installez les services de licence sur les serveurs cloud pour Windows 2008 et Windows 2008 R2 pour éviter une erreur de licence

  5. Configurer SFTP et empêcher SSH sur Ubuntu 20.04

Configuration de l'environnement et des outils de développement .NET sur Fedora 35

Keepalive et haute disponibilité :rubriques avancées

Qu'est-ce qu'un DDoS et comment empêcher que notre entreprise soit attaquée ?

Interface ruban pour GTK et Qt

Couleur différente pour la commande et la sortie

Jusqu'où la charge du système peut-elle aller ?