GNU/Linux >> LINUX-Kenntnisse >  >> Linux

sysctl-Einstellung für hohe Last und verhindert DDoS

Einführung

Im Internet gibt es eine ganze Reihe verschiedener Beispiele für Linux-Kernel-Konfigurationen, um eine große Anzahl von Verbindungen, stark ausgelastete Webprojekte zu unterstützen und DDoS-Angriffen entgegenzuwirken. Hier ist ein weiteres Beispiel, das ich bereits in der Praxis ausprobieren konnte. Ich sage gleich – es hat mir mehr als geholfen. Probieren Sie es aus und Sie.

/etc/sysctl.conf-Optionen

Es gibt eine Liste von Optionen, die zur /etc/sysctl.conf hinzugefügt werden müssen :

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

Und nun zu jeder Option im Detail.

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

Akzeptieren oder senden Sie keine ICMP-Umleitungspakete. ICMP-Umleitungen können von einem Angreifer verwendet werden, um Routing-Tabellen zu ändern. Es ist ratsam, ihn auf „0“ einzustellen. Die Einheit ist nur für Hosts sinnvoll, die als Router verwendet werden.

net.ipv4.tcp_max_orphans = 65536

Der ganzzahlige Wert des Parameters tcp_max_orphans bestimmt die maximale Anzahl gültiger TCP-Sockets im System, die von keinem Benutzerdateihandle verbunden sind. Bei Erreichen des Schwellenwerts werden verwaiste Verbindungen sofort mit einer Warnung zurückgesetzt. Dieser Schwellenwert hilft, nur einfache DoS-Angriffe zu verhindern. Sie sollten den Schwellenwert nicht verringern (sondern entsprechend den Anforderungen des Systems erhöhen, z. B. nach dem Hinzufügen von Speicher. Jede verwaiste Verbindung verbraucht etwa 64 KByte nicht auslagerbaren Speicher).

net.ipv4.tcp_fin_timeout

net.ipv4.tcp_fin_timeout = 10

Der Parameter tcp_fin_timeout bestimmt die Zeit, in der der Socket im Zustand FIN-WAIT-2 verbleibt, nachdem er von der lokalen Seite geschlossen wurde. Der Partner darf diese Verbindung nie schließen, daher sollten Sie diese nach einem Timeout von sich aus schließen. Standardmäßig beträgt das Timeout 60 Sekunden. In den Cores der 2.2-Serie wurde normalerweise ein Wert von 180 Sekunden verwendet, und Sie können diesen Wert speichern, aber Sie sollten nicht vergessen, dass Sie auf geladenen WEB-Servern Gefahr laufen, viel Speicher zu verbrauchen, um halb unterbrochene tote Verbindungen zu speichern. Sockets im FIN-WAIT-2-Zustand sind weniger gefährlich als FIN-WAIT-1, da sie nicht mehr als 1,5 KByte Speicher beanspruchen, aber länger dauern können.

TCP-Keepalive-Zeit

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

tcp_keepalive_time Die Variable legt fest, wie oft die Verbindung überprüft werden soll, wenn sie längere Zeit nicht benutzt wurde. Der Wert der Variablen ist nur für die Sockets sinnvoll, die mit dem SO_KEEPALIVE-Flag erstellt wurden. Die Integer-Variable tcp_keepalive_intvl definiert das Abtastintervall. Das Produkt tcp_keepalive_probes * tcp_keepalive_intvl bestimmt die Zeit, nach der die Verbindung getrennt wird, wenn keine Antworten kommen. Standardmäßig beträgt das Intervall 75 Sekunden, d. h. die Zeit der Trennung ohne Antworten beträgt etwa 11 Minuten.

net.ipv4.tcp_max_syn_backlog = 4096

Der ganzzahlige Wert in der Datei tcp_max_syn_backlog definiert die maximale Anzahl von gemerkten Verbindungsanfragen, für die keine Bestätigung vom verbindenden Client empfangen wurde. Wenn der Server überlastet ist, können Sie versuchen, diesen Wert zu erhöhen.

net.ipv4.tcp_synack_retries = 1

Der ganzzahlige Wert (1 Byte) tcp_synack_retries bestimmt die Anzahl der Wiederholungsversuche zur Übertragung von SYNACK-Paketen für passive TCP-Verbindungen. Die Anzahl der Versuche sollte 255 nicht überschreiten. Ein Wert von 5 entspricht ca. 180 Sekunden für den Verbindungsaufbauversuch.

net.ipv4.tcp_mem

net.ipv4.tcp_mem = 50576   64768   98152

Die Vektorvariable (Minimum, Lademodus, Maximum) in der Datei tcp_mem enthält allgemeine Speicherverbrauchseinstellungen für das TCP-Protokoll. Diese Variable wird in Seiten (normalerweise 4 KB) gemessen, nicht in Bytes.

Minimum :Während die Gesamtspeichergröße für TCP-Protokollstrukturen kleiner als diese Anzahl von Seiten ist, unternimmt das Betriebssystem nichts.

Lademodus :Sobald die Anzahl der für das TCP-Protokoll zugewiesenen Speicherseiten diesen Wert erreicht, wird der Lademodus aktiviert, in dem das Betriebssystem versucht, die Speicherzuweisung zu begrenzen. Dieser Modus wird beibehalten, bis der Speicherverbrauch wieder das Mindestniveau erreicht.

Maximal :Die maximal zulässige Anzahl von Speicherseiten für alle TCP-Sockets.

net.ipv4.tcp_rmem

net.ipv4.tcp_rmem = 4096 87380 16777216

Die Vektorvariable (Minimum, Standard, Maximum) in der Datei tcp_rmem enthält 3 Ganzzahlen, die die Größe des TCP-Socket-Empfangspuffers bestimmen.

Minimum :Jeder TCP-Socket hat das Recht, diesen Speicher bei seiner Erstellung zu verwenden. Die Nutzbarkeit eines solchen Puffers ist auch bei Erreichen der Schwelle des Limits (mäßiger Speicherdruck) gewährleistet. Die standardmäßige minimale Puffergröße beträgt 8 KB (8192).

Standardwert :Die für den standardmäßigen TCP-Socket-Übertragungspuffer zulässige Speichermenge. Dieser Wert wird anstelle des Parameters /proc/sys/net/core/rmem_default verwendet, der von anderen Protokollen verwendet wird. Der Standardpufferwert (normalerweise) beträgt 87830 Bytes. Dies bestimmt die Fenstergröße von 65535 mit dem Standardwert von tcp_adv_win_scale und tcp_app_win =0, etwas kleiner als der Standardwert von tcp_app_win.

Maximal :Die maximale Puffergröße kann automatisch zugewiesen werden, um einen TCP-Socket zu empfangen. Dieser Wert hebt das in der Datei /proc/sys/net/core/rmem_max angegebene Maximum nicht auf. Bei „statischer“ Speicherallokation mittels SO_RCVBUF spielt dieser Parameter keine Rolle.

net.ipv4.tcp_wmem

net.ipv4.tcp_wmem = 4096 65536 16777216

Die Vektorvariable in der Datei tcp_wmem enthält 3 ganzzahlige Werte, die die minimale, standardmäßige und maximale Speichermenge definieren, die für TCP-Socket-Übertragungspuffer reserviert ist.

Minimum :Jeder TCP-Socket hat das Recht, diesen Speicher bei seiner Erstellung zu verwenden. Die standardmäßige minimale Puffergröße beträgt 4 KB (4096)

Standardwert :Die für den standardmäßigen TCP-Socket-Übertragungspuffer zulässige Speichermenge. Dieser Wert wird anstelle des Parameters /proc/sys/net/core/wmem_default verwendet, der von anderen Protokollen verwendet wird, und ist normalerweise kleiner als /proc/sys/net/core/wmem_default. Die Größe des Standardpuffers beträgt normalerweise (Standard) 16 KByte (16384).

Maximal :Die maximale Speichermenge, die dem TCP-Socket-Übertragungspuffer automatisch zugewiesen werden kann. Dieser Wert überschreibt nicht das in der Datei /proc/sys/net/core/wmem_max angegebene Maximum. Bei „statischer“ Speicherallokation mittels SO_SNDBUF spielt dieser Parameter keine Rolle.

net.ipv4.tcp_orphan_retries =0

Der ganzzahlige Wert tcp_orphan_retries bestimmt die Anzahl der Fehlversuche, nach denen die lokal geschlossene TCP-Verbindung zerstört wird. Der Standardwert ist 7, was je nach RTO ungefähr einem Zeitraum von 50 Sekunden bis 16 Minuten entspricht. Auf stark ausgelasteten WEB-Servern ist es sinnvoll, den Wert dieses Parameters zu reduzieren, da geschlossene Verbindungen viele Ressourcen verbrauchen können.

net.ipv4.tcp_syncookies =0

Im Zusammenhang mit der Empfehlung von Kernel-Entwicklern ist es besser, diese Option zu deaktivieren.

net.ipv4.netfilter.ip_conntrack_max =16777216

Die maximale Anzahl von Verbindungen, damit der Verbindungsverfolgungsmechanismus funktioniert (verwendet zum Beispiel iptables). Bei zu kleinen Werten beginnt der Kernel eingehende Verbindungen mit entsprechendem Eintrag im Systemlog abzulehnen.

net.ipv4.tcp_timestamps =1

Ermöglicht TCP-Zeitstempel. Ihr Vorhandensein ermöglicht es Ihnen, den Betrieb des Protokolls unter starker Belastung zu kontrollieren (siehe tcp_congestion_control).

net.ipv4.tcp_sack = 1

Selektive Bestätigung der TCPIP-Unterstützung zulassen. Diese Option ist für die effiziente Nutzung der gesamten verfügbaren Bandbreite einiger Netzwerke erforderlich.

net.ipv4.tcp_congestion_control = htcp

Protokoll, das zur Laststeuerung in TCP-Netzwerken verwendet wird. Die standardmäßigen bic- und cubic-Implementierungen enthalten Fehler in den meisten Versionen des RedHat-Kernels und seiner Klone. Die Verwendung von htcp wird empfohlen.

net.ipv4.tcp_no_metrics_save = 1

Speichern Sie keine TCP-Verbindungsmessungen im Cache, wenn dieser geschlossen ist. In einigen Fällen hilft es, die Produktivität zu steigern.

Schutz vor IP-Spoofing

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

Quellrouting deaktivieren

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

Erhöhen Sie den Bereich der für ausgehende Verbindungen verfügbaren lokalen Ports.

net.ipv4.tcp_tw_reuse = 1

Wir erlauben die Wiederverwendung von TIME-WAIT-Sockets in Fällen, in denen das Protokoll dies als sicher erachtet.

net.ipv4.tcp_window_scaling = 1

Dynamische Größenänderung des TCP-Stack-Fensters zulassen.

net.ipv4.tcp_rfc1337 = 1

Verteidigung vor TIME_WAIT-Angriff.

net.ipv4.ip_forward = 0

Wir verbieten die Paketweiterleitung, da wir kein Router sind.

net.ipv4.icmp_echo_ignore_broadcasts = 1

Wir antworten nicht auf ICMP-ECHO-Anfragen, die durch Broadcast-Pakete übertragen werden.

net.ipv4.icmp_echo_ignore_all = 1

Sie können überhaupt nicht auf ICMP-ECHO-Anfragen antworten (der Server pingt nicht).

net.ipv4.icmp_ignore_bogus_error_responses = 1

Wir reagieren nicht auf falsch formulierte Nachrichten.

net.core.somaxconn = 65535

Die maximale Anzahl offener Sockets, die auf eine Verbindung warten. Es ist sinnvoll, den Standardwert zu erhöhen.

net.core.netdev_max_backlog = 1000

Der Parameter bestimmt die maximale Anzahl von Paketen in der Verarbeitungswarteschlange, wenn die Schnittstelle Pakete schneller empfängt, als der Kernel sie verarbeiten kann.

Speicher max. Standard

net.core.rmem_default = 65536

Die Standardgröße des Datenempfangspuffers für alle Verbindungen.

net.core.wmem_default = 65536

Die Standardgröße des Datenübertragungspuffers für alle Verbindungen.

net.core.rmem_max = 16777216

Die maximale Größe des Datenempfangspuffers für alle Verbindungen.

net.core.wmem_max = 16777216

Maximale Datenpuffergröße für alle Verbindungen.


Linux
  1. Analysieren von Argumenten für und gegen das Festlegen von Auslagerungsspeicher auf Cloud-Instanzen

  2. Richtlinien für Anwendungs- und Belastungstests

  3. Richten Sie SFTP ein und verhindern Sie SSH unter Ubuntu 20.04

  4. Beispiele für Bash-For- und While-Schleifen

  5. So laden Sie das SELinux-Modul für Oracleasm

Einrichten der .NET-Entwicklungsumgebung und -Tools auf Fedora 35

Keepalived und Hochverfügbarkeit:Themen für Fortgeschrittene

Schreiben Sie für Atlantic.Net FAQ

Was ist ein DDoS und wie verhindern wir, dass unser Unternehmen angegriffen wird?

Ribbon-Schnittstelle für GTK und Qt

Wie hoch darf die Systemlast gehen?