
Einen VPS unter DDoS online halten
Drei recht unterschiedliche Angriffe teilen sich den Namen DDoS, und fast jeder Ratschlag, den Sie dazu lesen werden, scheitert, weil er sie als eine einzige Sache behandelt: Er beantwortet eine gesättigte Uplink-Leitung mit einer nginx-Direktive oder einen raffinierten Layer-7-Flood mit einem größeren Server. Die nützliche Frage lautet nie „wie blockiere ich das“, sondern „auf welcher Schicht ist das physisch überhaupt stoppbar, und wem gehört diese Schicht“. Diese Seite beantwortet das für eine gemietete Linux-Maschine – was das Netzwerk oberhalb von Ihnen abfängt, bevor Sie es je zu Gesicht bekommen, was innerhalb der Maschine tatsächlich hilft, und warum der mit Abstand wirksamste Schritt meist darin besteht, gar nicht erst adressierbar zu sein.
Volumetrische Abwehr ist in diesem Netzwerk permanent aktiv, und es gibt nichts, was Sie dafür einschalten müssten: Floods unter 10 Gbps werden lautlos absorbiert, 10–100 Gbps werden beim Transit-Provider gescrubbt, und alles darüber wird auf einen dedizierten Scrubbing-Pfad umgeleitet – die Schwellenwerte stehen in der Dokumentation, statt als Marketing-Adjektiv im Raum zu stehen. Das ist die ehrliche Grenze dessen, was ein Hoster Ihnen abnehmen kann. Für den Traffic, der kleine Server tatsächlich in die Knie zwingt, ist es zugleich die uninteressantere Hälfte des Problems.
Denn die Angriffe, die einen Fünf-Dollar-VPS zuverlässig umbringen, sind nicht die 340-Gbps-Monster, die es in die Nachrichten schaffen. Es sind 40.000 kleine SYN-Pakete pro Sekunde, die eine Zustandstabelle füllen, in die Sie noch nie hineingeschaut haben, oder 300 Anfragen pro Sekunde auf die eine URL Ihrer Seite, die eine Datenbankabfrage auslöst – Traffic, der an einem völlig gesunden Interface ankommt, über eine Leitung, die bei Weitem nicht ausgelastet ist, und den kein vorgelagerter Scrubber von Ihren echten Nutzern unterscheiden kann. Die müssen Sie selbst in den Griff bekommen, und das gelingt mit etwa zwanzig Zeilen Konfiguration – vorausgesetzt, Sie klären zuerst, mit welchem der drei Fälle Sie es gerade zu tun haben.
Das Folgende setzt Debian 13 oder Ubuntu 24.04, nftables und nginx voraus, und setzt voraus, dass Sie bereits die Härtung der ersten Stunde erledigt haben – ein Server, der noch auf Ports antwortet, die er gar nicht bedient, ist nicht bereit, verteidigt zu werden.
Drei Angriffe, ein Name
„DDoS“ beschreibt eine Absicht, keinen Mechanismus, und die Mechanismen haben fast nichts gemeinsam. Sie sauber zu sortieren ist keine Pedanterie: Es ist die eigentliche Arbeit, denn jeder ist auf genau einer Schicht stoppbar und auf den anderen unsichtbar.
Volumetrische Floods zielen auf Ihre Bandbreite. UDP-Amplification – DNS, NTP, memcached und neuerdings alles, was eine kleine Frage mit einer großen Antwort beantwortet – lässt einen Angreifer aus 1 Gbps eigener Kapazität 50 Gbps machen, die auf Sie gerichtet werden. Das Ziel ist die Leitung, nicht der Server. Ihre CPU langweilt sich währenddessen.
Protokoll- und Zustandsangriffe zielen auf eine endliche Tabelle in Ihrem Kernel. Ein SYN-Flood versucht, die Accept-Queue zu erschöpfen; ein generischer Small-Packet-Flood versucht, die Connection-Tracking-Tabelle zu erschöpfen. Beide werden in Paketen pro Sekunde gemessen, nicht in Bit pro Sekunde, und beide können eine Maschine auf einer Leitung töten, die zu 97 % im Leerlauf ist. Das ist die Klasse, die kleine Server umbringt, und die Klasse, die die meisten Anleitungen auslassen.
Angriffe auf der Anwendungsschicht zielen auf Ihre CPU oder Ihre Datenbank, mit Anfragen, die von echten nicht zu unterscheiden sind, weil sie echt sind. Hundert Anfragen pro Sekunde an einen Such-Endpunkt sind für ein Netzwerk nichts und für eine PHP-Anwendung tödlich. Kein vorgelagerter Scrubber kann das für Sie herausfiltern: Von außen sieht es exakt wie Erfolg aus.
Es gibt noch ein Viertes, das verkleidet als alle drei ankommt und überhaupt kein Angriff ist: ein Link, der irgendwo gut ankam, ein eigener Client, der sich schlecht benimmt, oder ein Crawler ohne Manieren. Das zuerst auszuschließen kostet nichts, und es ist peinlich, wie oft genau das die Antwort ist.
Der Teil, den Sie von innerhalb der Maschine nicht reparieren können
Wenn 60 Gbps auf Ihre Adresse gerichtet werden und Ihr Port ein 1-Gbps-Port ist, fällt die Entscheidung über diese Pakete in einem Router oberhalb von Ihnen, mehrere Hops bevor irgendetwas beginnt, das Sie selbst verwalten. Ihre Firewall bekommt sie nie zu Gesicht. Sie kann gar nicht: Sie wurden verworfen, um eine Leitung zu schützen, die Ihnen nicht gehört. Das ist die mit Abstand wichtigste strukturelle Tatsache über volumetrische Angriffe, und der Grund, warum „härten Sie Ihre Firewall gegen DDoS“ größtenteils Unsinn ist.
Die einzig sinnvollen Fragen sind also, was Ihr Anbieter automatisch tut und wo seine Schwellenwerte liegen. Unsere sind veröffentlicht statt bloß versprochen: Unter 10 Gbps wird ohne sichtbaren Effekt absorbiert, 10–100 Gbps werden beim Transit-Provider gescrubbt und Sie bemerken womöglich einen kurzen Latenzanstieg, und oberhalb von 100 Gbps wird das Präfix auf einen dedizierten Scrubbing-Pfad umgeleitet – die Latenz steigt spürbarer, aber der Dienst bleibt erreichbar. Das Null-Routing einer Adresse steht nur bei anhaltenden Angriffen zur Debatte, die den gesamten PoP bedrohen, und wir informieren Sie innerhalb von Minuten, falls es passiert. Es gibt nichts zu kaufen und nichts einzuschalten.
Zwei Dinge über Scrubbing lohnen sich zu wissen, die Anbieter selten von sich aus erwähnen. Das Erste: Sie werden von der Nachbarschaft geschützt, nicht nur von Ihren eigenen Verteidigungsmaßnahmen – ein Angriff auf einen Kunden, der sich Ihr vorgelagertes /20 teilt, wird absorbiert, bevor er irgendjemandes Präfix erreicht. Ein ~340-Gbps-Flood, der auf einen benachbarten Bereich in Paris zielte, ging bei uns ohne messbare Auswirkung durch – genau das Ergebnis, das niemand bemerkt. Das Zweite: Scrubber arbeiten mit Heuristiken, und Heuristiken liegen manchmal falsch – im selben Netzwerk hat ein Scrubber einmal neun Minuten lang TCP-Resets gegen legitime Verbindungen verschickt, während er einen Angriff auf einen Nachbarn herausfilterte. Beide Vorfälle stehen im öffentlichen Incident-Log. Wenn Ihre Sitzungen während des Angriffs von jemand anderem auf eine Art sterben, die wie ein aktiver Reset statt wie ein Timeout aussieht, ist das ein echter Fehlerfall, und es lohnt sich, ihn zu melden, statt eine Stunde lang lokal zu debuggen.
Neunzig Sekunden Messung, bevor Sie irgendetwas ändern
Jede falsche DDoS-Reaktion beginnt mit einer Änderung, die vorgenommen wurde, bevor irgendjemand wusste, was eigentlich passiert. Holen Sie sich zuerst vier Zahlen. Sie passen auf einen Bildschirm, und sie benennen die Schicht für Sie.
# 1. bits vs packets — which axis is saturated?
sar -n DEV 1 5 # or: ifstat -i eth0 1
# 2. socket states — SYN-RECV piling up means a SYN flood
ss -s
ss -tan state syn-recv | wc -l
# 3. kernel drop counters (these are the ones that matter)
nstat -az | grep -E 'ListenDrops|ListenOverflows|SyncookiesSent|TCPReqQFullDrop'
dmesg -T | tail -20 # look for: nf_conntrack: table full, dropping packet
# 4. connection tracking headroom
cat /proc/sys/net/netfilter/nf_conntrack_count
cat /proc/sys/net/netfilter/nf_conntrack_maxLesen Sie sie zusammen. Viele Bits pro Sekunde, wenige Pakete pro Sekunde, niedrige CPU-Last ist ein volumetrischer Angriff, und Ihr Job ist es, das zu bestätigen und aufzuhören zu tippen. Viele Pakete pro Sekunde, wenige Bits pro Sekunde – viele winzige Pakete – ist ein Zustandsangriff; schauen Sie sofort auf SyncookiesSent und den conntrack-Zähler. Mäßiger Traffic auf beiden Achsen bei ausgereizter CPU ist Layer 7, und die Antwort liegt in Ihrem Webserver und Ihrer Datenbank, nicht in Ihrer Firewall.
Eine kontraintuitive Lesart lohnt sich zu verinnerlichen: Während eines echten volumetrischen Floods kann Ihr Interface fast ruhig aussehen. Sie sehen die Überlebenden – das, was durch eine bereits volle Leitung noch passt, oder das, was der vorgelagerte Scrubber durchgelassen hat. Ein Interface, das 900 Mbps auf einem 1-Gbps-Port zeigt, während Nutzer totale Unerreichbarkeit melden, ist kein Beweis gegen einen Angriff. Es ist die Form, die einer annimmt.
Prüfen Sie dann, ob der Traffic nicht einfach echt ist. tail -f Ihr Access-Log für zehn Sekunden lang: Ein einzelner Pfad, wiederholt von Tausenden verschiedenen Adressen ohne Referrer, ist ein Angriff; eine Streuung normaler Pfade von normalen Browsern ist ein Publikum, und es zu drosseln erledigt die Arbeit des Angreifers für ihn.
Die Angriffsfläche verkleinern – vor dem Angriff, nicht währenddessen
Jeder offene Port ist eine Warteschlange, die ein Angreifer füllen kann, und jedes Paket, das sich Ihr Gastsystem ansehen muss, kostet Sie CPU und einen conntrack-Eintrag, selbst wenn Sie es verwerfen. Das billigste Paket ist das, welches Ihre Maschine nie erreicht – und genau deshalb ist Filtern oberhalb des Gastsystems mehr wert als Filtern darin.
Es gibt hier zwei Schichten, und sie sind nicht dasselbe. Der Edge-Filter ist optional, wird pro Server konfiguriert, ist zustandsbehaftet und arbeitet mit Default-Deny, und er läuft auf dem Hypervisor – Traffic, den Sie dort ablehnen, erreicht Ihre virtuelle NIC überhaupt nie, kostet Sie also weder CPU noch Speicher noch einen Zustandseintrag. Die Gast-Firewall – Ihr nftables-Regelwerk – gehört vollständig Ihnen, und wir fassen sie nie an. Das Muster, das den Kontakt mit einem Angriff übersteht, besteht darin, die grobe, stabile Layer-4-Wahrheit am Edge auszudrücken („diese Maschine bedient 80, 443 und SSH von diesen Adressen, und sonst existiert nichts“) und das Gast-Regelwerk für die feingranulare Arbeit aufzuheben, die sich mit Ihrer Anwendung ändert. Beides ist in der Firewall-Dokumentation beschrieben.
Verengen Sie dann, was übrig bleibt. SSH, beschränkt auf die Adressen, von denen aus Sie tatsächlich administrieren, ist hier keine nette Härtungsgeste – es entfernt eine ganze Klasse von Connection-Exhaustion-Angriffen von Ihrer Maschine. Eine Datenbank, gebunden an 127.0.0.1 oder eine WireGuard-Adresse, lässt sich vom Internet aus überhaupt nicht fluten. Und wenn Sie eine rein interne Steuerungsebene bedienen, stellen Sie sie hinter ein WireGuard-Interface, statt einen öffentlichen Port mit einem Passwort davor zu betreiben.
SYN-Floods und die Accept-Queue
Ein SYN-Flood nutzt den Handshake aus: Der Angreifer schickt einen Strom von Verbindungsanfragen und schließt sie nie ab, und jede belegt einen Platz in der SYN-Queue des Kernels, bis sie in ein Timeout läuft. Ist die Queue voll, werden legitime Handshakes verworfen – Ihr Dienst läuft, lauscht, und ist unerreichbar.
Linux hat dafür seit den Neunzigern eine saubere Antwort, und sie ist standardmäßig aktiv. SYN-Cookies lassen den Kernel komplett darauf verzichten, Speicher für halboffene Verbindungen zu reservieren: Er kodiert den Verbindungszustand in die Sequenznummer, die er zurückschickt, und rekonstruiert ihn, falls der Client den Handshake abschließt. Bestätigen Sie das, statt es anzunehmen, und geben Sie den Queues genug Spielraum, um einen Burst durchzustehen:
# /etc/sysctl.d/99-flood.conf
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 8192
net.core.somaxconn = 8192
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_abort_on_overflow = 0
sysctl --systemtcp_synack_retries = 2 ist wichtiger, als es aussieht: Der Standardwert fünf bedeutet, dass ein gefälschter Handshake den Kernel etwa drei Minuten lang beschäftigt, und zwei senkt das auf ungefähr sieben Sekunden. somaxconn zu erhöhen ist nur die halbe Arbeit – die Queue-Tiefe ist das Minimum aus diesem Wert und dem, was die Anwendung angefordert hat, sodass nginx listen 443 ssl backlog=8192; und einen Reload braucht, bevor die Kernel-Einstellung überhaupt etwas bedeutet. Das ist der klassische Fall eines sysctl-Werts, der angewendet aussieht und nichts bewirkt.
Wenn Sie den Flood stoppen wollen, bevor er die Anwendung überhaupt erreicht, kann nftables Handshakes stellvertretend für den Kernel abschließen und nur Verbindungen durchreichen, die sich als echt erweisen:
table inet filter {
chain input {
type filter hook input priority filter; policy drop;
ct state established,related accept
iif lo accept
tcp dport { 80, 443 } ct state new synproxy mss 1460 wscale 7 timestamp sack-perm
tcp dport { 80, 443 } accept
ip protocol icmp icmp type echo-request limit rate 5/second accept
}
}Testen Sie synproxy auf einer Maschine, die Sie notfalls noch per Konsole erreichen, bevor Sie sich darauf verlassen; falsch konfiguriert ist es eine hervorragende Methode, sich selbst aus dem eigenen Server auszusperren. Für die meisten reicht der sysctl-Block von oben, und die ehrliche Rangfolge lautet: zuerst Syncookies, dann Backlog, synproxy nur, wenn Sie gemessen haben, dass die ersten beiden nicht ausreichten.
Die Tabelle, die niemand ansieht, bis sie voll ist
Das hier ist es, was auch erfahrene Leute erwischt. Eine zustandsbehaftete Firewall muss sich jeden Flow merken, den sie gesehen hat, und dieses Gedächtnis ist nf_conntrack, eine Hash-Tabelle mit fester, beim Booten festgelegter Größe. Ist sie voll, verwirft der Kernel neue Verbindungen – alle, Angreifer wie Kunden gleichermaßen – und schreibt eine einzige Zeile nach dmesg, die niemand beobachtet:
nf_conntrack: table full, dropping packetDer Grund, warum das so wirksam ist, ist reine Arithmetik. Eine Standardtabelle auf einem kleinen VPS fasst irgendwo im niedrigen Zehntausenderbereich an Einträgen, und jedes Paket von einer neuen Quelladresse erzeugt einen – einschließlich UDP-Pakete, einschließlich Pakete, die Sie verwerfen, einschließlich des Floods selbst. Zwanzigtausend Pakete pro Sekunde aus gefälschten Quellen füllen sie in weniger als zwei Sekunden, auf einer Leitung, die dabei nur ein paar Megabit trägt. Ihr Bandbreiten-Graph wird rein gar nichts zeigen.
# /etc/sysctl.d/99-conntrack.conf
net.netfilter.nf_conntrack_max = 262144
net.netfilter.nf_conntrack_buckets = 65536
net.netfilter.nf_conntrack_tcp_timeout_established = 3600
net.netfilter.nf_conntrack_tcp_timeout_syn_recv = 20
net.netfilter.nf_conntrack_udp_timeout = 20Die Timeouts bringen mehr als die Größe. Die Standard-Lebensdauer für einen etablierten TCP-Flow beträgt fünf Tage, was bedeutet, dass ein Server, der seit einer Woche läuft, noch Zustand für Verbindungen vorhält, die am Dienstag endeten; eine Stunde reicht für alles, was keine untätige SSH-Sitzung ist, und net.ipv4.tcp_keepalive_time = 600 hält solche Sitzungen absichtlich am Leben statt zufällig. Kalkulieren Sie beim Dimensionieren mit etwa 300 Byte Kernel-Speicher pro Eintrag: 262.144 Einträge sind rund 80 MB, was auf einer 4-GB-Maschine völlig in Ordnung ist – und nicht in Ordnung, wenn Sie zehn Millionen einstellen, weil das irgendwo in einem Forum stand.
Wenn Sie etwas wirklich Zustandsloses mit hohem Volumen betreiben – einen autoritativen DNS-Server, einen öffentlichen Gameserver, ein Tor-Relay –, ist die bessere Antwort, das Tracking dafür ganz abzuschalten. Connection-Tracking für einen Dienst ohne sinnvolle Verbindungen ist reine Kosten:
table ip raw {
chain prerouting {
type filter hook prerouting priority raw; policy accept;
udp dport 51820 notrack
tcp dport 9001 notrack
}
}Denken Sie daran, dass solcher Traffic dann Ihre ct state established-Regeln umgeht und deshalb explizite Accept-Regeln in der Filter-Chain braucht. Das ist der Tausch: Sie geben für diesen Port die Zustandsbehaftung auf und bekommen dafür eine Tabelle, die sich nicht mehr füllen lässt.
Layer 7: der Flood, der exakt wie Ihre Kunden aussieht
Der effizienteste Angriff auf einen kleinen Server ist überhaupt kein Flood. Es sind ein paar hundert sorgfältig gewählte HTTP-Anfragen pro Sekunde, jede für sich völlig valide, jede gezielt auf den einen Endpunkt, der eine nicht indizierte Abfrage ausführt oder eine ungecachte Seite rendert. Die Ökonomie dahinter ist brutal: Die Anfrage kostet den Angreifer ein paar hundert Byte und kostet Sie 200 Millisekunden CPU-Zeit und eine Datenbankverbindung. Dieses Rennen verlieren Sie bei jedem Volumen, das Sie sich leisten können zu bedienen.
Der Instinkt ist, den Angreifer zu blockieren. Gegen ein Botnetz, verteilt über Tausende Privatadressen, von denen jede zwei Anfragen pro Sekunde schickt, ist Blockieren nach IP reines Theater – kein Rate-Limit pro Adresse, das Ihre echten Nutzer noch durchlässt, wird je auslösen, und Sie verbringen den Ausfall damit, Regeln hinzuzufügen, während die Seite unten bleibt. Der Zug, der gewinnt, ist es, die Kosten zu ändern, nicht die Anzahl.
Zuerst cachen – und auch den Miss cachen. Ein Full-Page-Cache macht aus einer teuren Anfrage einen Speicherzugriff, und die Direktive, die während eines Angriffs am meisten zählt, ist die, die verhindert, dass tausend gleichzeitige Cache-Misses zu tausend gleichzeitigen Datenbankabfragen werden:
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=app:64m max_size=2g inactive=60m;
server {
location / {
proxy_cache app;
proxy_cache_valid 200 301 302 10m;
proxy_cache_lock on; # one origin request per key, not a thousand
proxy_cache_lock_timeout 5s;
proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
proxy_cache_background_update on; # serve stale, refresh behind it
add_header X-Cache $upstream_cache_status always;
proxy_pass http://127.0.0.1:8080;
}
}proxy_cache_lock und use_stale sind die beiden Zeilen, die entscheiden, ob eine Traffic-Spitze überlebbar ist. Ohne sie wird in dem Moment, in dem ein heißer Key abläuft, jede noch offene Anfrage zu einer Origin-Anfrage – die Stampede, die aus einem beherrschbaren Angriff einen Ausfall macht. Mit ihnen bedient Ihr Backend eine Anfrage pro Key und Intervall, und alle anderen bekommen eine leicht veraltete Seite, was in jeder Situation der richtige Tausch ist, in der die Alternative gar keine Seite ist.
Drosseln Sie dann gezielt die teuren Pfade, großzügig bemessen und so, dass es sichtbar fehlschlägt:
limit_req_zone $binary_remote_addr zone=general:16m rate=20r/s;
limit_req_zone $binary_remote_addr zone=costly:16m rate=2r/s;
limit_conn_zone $binary_remote_addr zone=conn:16m;
limit_req_status 429;
limit_conn_status 429;
server {
limit_req zone=general burst=40 nodelay;
limit_conn conn 24;
location /search { limit_req zone=costly burst=5 nodelay; proxy_pass http://127.0.0.1:8080; }
location /login { limit_req zone=costly burst=3 nodelay; proxy_pass http://127.0.0.1:8080; }
}burst ohne nodelay stellt überschüssige Anfragen in eine Warteschlange, statt sie abzulehnen, was unter einem Angriff bedeutet, dass nginx höflich Tausende Verbindungen für Sie offenhält – Sie haben einen Request-Flood in einen Connection-Flood verwandelt. Verwenden Sie nodelay, liefern Sie sofort 429 zurück, und überlassen Sie den Rest dem Client. Und denken Sie hinter jedem Proxy daran, dass $binary_remote_addr die Adresse des Proxys ist, sofern Sie set_real_ip_from und real_ip_header nicht korrekt konfiguriert haben; ein Rate-Limit, das auf die Adresse Ihres eigenen Frontends schlüsselt, sperrt beim ersten Auslösen sämtliche Nutzer auf einen Schlag aus.
Angriffe im Slowloris-Stil – viele Verbindungen, jede tröpfelt eine Anfrage byteweise – bringen nginx' Event-Modell kaum in Bedrängnis, aber die Timeouts lohnt es sich trotzdem zu straffen: client_header_timeout 8s; client_body_timeout 8s; send_timeout 10s; reset_timedout_connection on;. Zusammen mit limit_conn ist das die gesamte Verteidigung.
Warum fail2ban kein DDoS-Werkzeug ist
fail2ban ist wirklich nützlich, zielt aber auf ein anderes Problem. Es liest Logdateien, entscheidet nach N Fehlschlägen in M Minuten, und fügt eine Firewall-Regel ein. Jeder einzelne Teil davon hat die falsche Form für einen Flood.
Es ist zu langsam: Ein Burst, der vierzig Sekunden dauert, ist vorbei, bevor sich das Ban-Fenster schließt. Es liest Logs, sodass der Angriff Sie bereits den vollen Preis jeder Anfrage gekostet hat – das Parsen passiert erst nach dem Schaden. Es bannt einzelne Adressen, sodass es gegen zehntausend Quellen entweder gar nichts tut oder zehntausend lineare Regeln einfügt, an welchem Punkt die Firewall selbst zum Flaschenhals wird und Sie den Angriff stellvertretend für den Angreifer zu Ende gebracht haben. Und es hängt von Ihren Logs ab, sodass ein Flood, der groß genug ist, um eine Platte mit Log-Zeilen zu füllen, den Server über einen Pfad lahmlegen kann, an den Sie nie gedacht haben.
Wenn Sie dynamisches Blockieren wollen, tun Sie es in der Datenebene, wo das Lookup ein Hash ist und das Verfallen automatisch passiert. Ein dynamisches nftables-Set ist O(1), unabhängig von der Größe, und vergisst von selbst:
table inet filter {
set flooders {
type ipv4_addr
flags dynamic, timeout
timeout 10m
size 65535
}
chain input {
type filter hook input priority filter; policy drop;
ct state established,related accept
iif lo accept
ip saddr @flooders drop
tcp dport { 80, 443 } ct state new add @flooders { ip saddr limit rate over 50/second burst 100 packets } drop
tcp dport { 80, 443 } accept
}
}Lesen Sie die Regel genau, denn die Verneinung bringt Leute durcheinander: Die Adresse wird nur dann zum Set hinzugefügt und verworfen, wenn die Rate über dem Limit liegt. Heben Sie sich fail2ban für das auf, worin es gut ist – langsames Erraten von Zugangsdaten gegen SSH und Anwendungs-Logins, wo ein Bann im menschlichen Zeitmaßstab auf eine bestimmte Adresse genau richtig ist.
Werden Sie nicht zur Waffe: die Amplification, die Sie hosten
Jeder große volumetrische Angriff wird von Servern angetrieben, deren Betreiber nicht wussten, dass sie mitmachen. Der Mechanismus ist ein UDP-Dienst, der eine kleine gefälschte Anfrage mit einer großen Antwort beantwortet: Ein offener DNS-Resolver liefert das 50-Fache dessen zurück, wonach gefragt wurde, falsch konfiguriertes NTP und memcached sind noch schlimmer, und jedes Protokoll, das antwortet, bevor es prüfen kann, wer da fragt, ist ein Kandidat.
Die Konsequenzen treffen Sie, bevor sie das Opfer treffen. Ihr Uplink füllt sich mit Ihren eigenen ausgehenden Antworten, Ihr Anbieter sieht anhaltenden missbräuchlichen Traffic, der Ihren Port verlässt, und die Transit-Anbieter, die ihn empfangen, beginnen, die Bereiche, aus denen er kommt, per Null-Routing zu sperren – weshalb die Acceptable-Use-Policy bei Angriffsursprung und Amplification eine harte Grenze zieht, während sie im Grunde alles andere erlaubt. Ein unwissentlicher Reflektor zu sein, ist der schnellste Weg, eine Adresse zu verlieren, die mit dem, was Sie eigentlich betreiben wollten, nichts zu tun hat.
# bind a recursive resolver to localhost, never 0.0.0.0
# unbound: interface: 127.0.0.1 + access-control: 0.0.0.0/0 refuse
# what is actually listening on a public address?
ss -ulpn
ss -tlpn
# from another machine, confirm you do not answer strangers
dig @your.server.ip example.com +short # must time out
ntpq -c rv your.server.ip # must failWenn Sie absichtlich einen öffentlichen UDP-Dienst betreiben – einen Gameserver, einen autoritativen Nameserver, einen WireGuard-Endpunkt –, gilt dieselbe Regel wie überall sonst: Drosseln Sie die Antwort, niemals die Anfrage. Sowohl bind als auch knot implementieren Response Rate Limiting; nutzen Sie es, denn es ist der Unterschied zwischen dem Bedienen Ihrer Nutzer und dem Ausliefern des Angriffs eines anderen.
Die wirksamste Verteidigung ist, nicht auffindbar zu sein
Alles bisher Genannte ist Schadensbegrenzung für einen Angriff, der Ihre Adresse bereits gefunden hat. Es lohnt sich, das zu tun, aber es ist die zweitbeste Lösung. Ein Origin, den niemand benennen kann, ist auf Layer 3 oder 4 überhaupt nicht angreifbar, und die Adresse, die den Traffic bedient, von der Adresse zu trennen, die die Welt kennt, ist der Hebel mit der größten Wirkung auf dieser Seite.
Origin-Adressen sickern fast nie durch raffinierte Angriffe durch. Sie sickern durch Geschichte und durch Nachlässigkeit, auf einer kurzen und gut bekannten Liste. Alte DNS-Einträge sind der übliche Übeltäter: Passive-DNS-Archive erinnern sich für immer an den A-Eintrag, den Sie hatten, bevor Sie ein Frontend davorgesetzt haben. Certificate-Transparency-Logs sind öffentlich und dauerhaft, sodass ein Zertifikat, das für einen Hostnamen ausgestellt wurde, der direkt auf den Origin zeigte, ein signierter, zeitgestempelter Nachweis dafür ist, wo Sie früher gewohnt haben. Ausgehende E-Mail stempelt die Adresse des sendenden Servers in die Header jeder Nachricht. Und der leise Fall: Ihr Webserver, der auf seiner nackten IP antwortet, wodurch jeder, der den Adressraum nach dem HTML Ihrer Seite durchsucht, Sie an einem Nachmittag über den Inhalt findet.
Der letzte Fall ist eine Zwei-Zeilen-Lösung, und fast niemand setzt sie um. Sorgen Sie dafür, dass der Default-Server alles ablehnt, was nicht mit einem Hostnamen ankam, den Sie bedienen:
server {
listen 80 default_server;
listen 443 ssl default_server;
ssl_reject_handshake on; # nginx 1.19.4+: no certificate, no fingerprint
return 444; # close without a response
}Wählen Sie dann ein Frontend. Ein kommerzielles CDN ist die naheliegende Antwort und kommt mit realen Kosten, die hier zählen: Sie holen sich ein Unternehmen ins Boot, das Ihr TLS terminiert, Ihren Klartext sieht, Ihren Origin kennt und in einer Jurisdiktion, die Sie sich nicht ausgesucht haben, mit einer gerichtlichen Anordnung belangt werden kann – was einen guten Teil dessen zunichtemacht, wozu der Server überhaupt in Krypto ohne Namensangabe bezahlt wurde. Wenn Sie es trotzdem tun, seien Sie sich bewusst, dass der Origin niemals öffentlich gewesen sein darf und dass die ganze Konstruktion in dem Moment scheitert, in dem jemand einen alten Eintrag findet.
Die Alternative, die die Eigenschaft erhält, für die Sie bezahlt haben, ist, Ihr eigenes Frontend zu sein. Eine Fünf-Dollar-Instanz in einer zweiten Region, auf der nginx als Reverse-Proxy läuft, wobei der Edge-Filter des Origins nur Traffic von genau dieser einen Adresse akzeptiert und sonst nichts, gibt Ihnen eine Wegwerf-Adresse, die Sie in fünf Minuten umnummerieren können, und eine Steuerungsebene, die nur Ihnen antwortet. Es ist dieselbe Architektur, minus den Dritten. Und wo das Publikum es nutzen kann, entfernt ein Tor-Onion-Dienst die IP vollständig aus der Gleichung – es gibt keine Adresse zu fluten, auch wenn Onion-Dienste an ihren Introduction Points eine eigene Angriffsfläche haben, weshalb modernes Tor genau dafür eine Proof-of-Work-Verteidigung mitbringt.
Länder und ASNs blockieren – und die Form des Traffics
Früher oder später schlägt jemand vor, ein ganzes Land zu blockieren. Das ist grobschlächtig, gelegentlich richtig, und meistens eine Methode, sich beschäftigt zu fühlen.
Es ist vertretbar, wenn Ihr Dienst ein wirklich begrenztes Publikum hat – ein regionaler Gameserver, ein internes Tool, ein Control Panel – und Sie bereit sind, die Falsch-Positiven zu verantworten, darunter Ihre eigenen Nutzer auf Reisen und jeder, der seltsam geroutet wird. Gegen ein modernes Botnetz, das über Privatanschlüsse in jedem Land verteilt ist, Ihr eigenes eingeschlossen, ist es nahezu nutzlos, und für alles Öffentliche ist es aktiv schädlich: Sie verlieren stillschweigend echte Menschen und bekommen nie zu sehen, wer gegangen ist.
Blockieren nach ASN ist präziser. Angriffs-Traffic, der von einer Handvoll Hosting-Anbietern ausgeht – billige VPS-Bereiche, stundenweise gemietet – lässt sich per Präfix verwerfen, mit weit weniger Kollateralschaden als ein Länderblock, weil gewöhnliche Nutzer nicht aus einem Rechenzentrum heraus browsen. Rechenzentrums-Bereiche sind praktischerweise auch dort, wo Scraping und Credential-Stuffing herkommen.
Die dauerhafte Version dieser Idee ist aber überhaupt keine Geografie: Es ist das Filtern nach der Form des Traffics statt nach seiner Herkunft. Ein Angriff teilt üblicherweise etwas Strukturelles – denselben User-Agent, denselben fehlenden Header, dieselbe URL mit demselben Query-Parameter, denselben TLS-Fingerabdruck, ein vollständiges Fehlen der zweiten Anfrage, die ein echter Browser immer stellt. Finden Sie die gemeinsame Eigenschaft, und Sie schreiben eine Regel, die nichts kostet und es übersteht, wenn der Angreifer die Adressen wechselt – was er schneller tun wird, als Sie sie auflisten können.
# in an attack: what do these requests have in common?
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -20 # addresses
awk -F'"' '{print $6}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -20 # user agents
awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -20 # pathsWenn ein einziger User-Agent für 90 % der Anfragen verantwortlich ist, sind Sie neunzig Sekunden von einer Lösung entfernt. Wenn die zwanzig größten Adressen jeweils 2 % des Traffics ausmachen, hören Sie auf, nach Adressen zu suchen – das ist ein verteilter Angriff, und die Antwort heißt Caching und Rate-Limits.
Wenn die Adresse verbrannt ist
Manchmal ist der Angriff gezielt, anhaltend und richtet sich gegen Sie persönlich statt gegen eine zufällige Adresse, und die richtige Reaktion ist, aufzuhören, die Adresse zu verteidigen, und sie aufzugeben. Das ist keine Niederlage; für einen kleinen Dienst ist es oft das günstigste denkbare Ergebnis, und schmerzhaft ist es nur, wenn Sie es nicht geprobt haben.
Was das schnell macht, wird im Voraus entschieden. Halten Sie DNS-TTLs standardmäßig bei 300 Sekunden – die Kosten sind vernachlässigbar, und der Nutzen ist, dass Sie in fünf Minuten umziehen können statt in einem Tag. Halten Sie Ihr Deployment reproduzierbar, denn ein Server, den Sie neu aufbauen können, ist ein Server, den Sie verlegen können; wenn Neuaufbau bedeutet, sich zu erinnern, was Sie im März gemacht haben, haben Sie keinen Plan, sondern eine Geisel. Halten Sie ein wiederherstellbares Backup in einer anderen Region vor, und wissen Sie aus einer echten Übung heraus, wie lange eine Wiederherstellung dauert.
Der eigentliche Umzug ist dann kurz: In einer anderen Region deployen, wiederherstellen, auf der neuen Adresse per Hostname-Override verifizieren, bevor Sie DNS anfassen, den Eintrag umstellen, und den alten Server lange genug weiterlaufen lassen, damit die letzten Resolver nachziehen. Der Migrations-Guide behandelt die Reihenfolge im Detail, und es ist dieselbe Abfolge, ob Sie wegen der Performance umziehen oder weil jemand wütend ist.
Das Abrechnungsmodell macht die Generalprobe im Grunde kostenlos: Gebühren werden tagesgenau gegen Ihr Guthaben abgerechnet, sodass eine zweite Maschine, die Sie innerhalb eines Nachmittags deployen, testen und wieder zerstören, ein paar Cent kostet – kein Vertrag, keine Karte, keine Kündigung nötig. Es gibt keinen Grund, warum Ihre erste Umnummerierung ausgerechnet während eines Angriffs stattfinden sollte.
Was Ihnen das alles nicht bringt
Zwei ehrliche Schlussbemerkungen, denn der Rest dieser Seite ist konstruktionsbedingt optimistisch.
Die erste ist, dass kein Hoster alles absorbiert, und jeder Anbieter, der das Gegenteil behauptet, verkauft Ihnen etwas. Kapazität ist endlich, Scrubbing-Kapazität ist noch endlicher, und ab einer gewissen Größenordnung ist es für ein Netzwerk, das Tausende Kunden schützt, die ökonomisch rationale Handlung, irgendwann eine einzelne Adresse nicht mehr anzukündigen. Wir behandeln das als letztes Mittel gegen anhaltende Angriffe, die den gesamten PoP bedrohen, und wir sagen es Ihnen, statt Sie es selbst debuggen zu lassen – aber ein Versprechen, dass das nie passieren kann, wäre eine Lüge, und Sie sollten jedem Hoster misstrauen, der eines gibt.
Die zweite ist, dass Vergeltung nicht zur Auswahl steht. Booter- und Stresser-Dienste sind Angriffe zum Mieten, verkleidet als Testwerkzeuge, sie sind in den meisten relevanten Jurisdiktionen illegal, sie werden intensiv überwacht, und sie führen hier unter einer Policy, die so ziemlich alles andere erlaubt, zur Kündigung Ihres Servers. Die Asymmetrie, die DDoS für einen Angreifer attraktiv macht, macht es für einen Verteidiger wertlos: Sie können niemanden zurück-fluten, der nichts zu verlieren hat. Absorbieren, cachen, umziehen, und es langweilig werden lassen – was es, für jeden, der für den Traffic bezahlt, den er verschickt, irgendwann tatsächlich wird.
- Die Schicht in neunzig Sekunden benennen
Bevor Sie irgendetwas konfigurieren, holen Sie sich die zwei Achsen und die zwei Zähler. Bits hoch und Pakete niedrig ist volumetrisch; Pakete hoch und Bits niedrig ist ein Zustandsangriff; beide mäßig bei ausgereizter CPU ist Layer 7.
sar -n DEV 1 5 # bits/s and packets/s per interface ss -s # socket summary; watch synrecv nstat -az | grep -E 'ListenDrops|ListenOverflows|SyncookiesSent' cat /proc/sys/net/netfilter/nf_conntrack_count dmesg -T | grep -i conntrack | tailSchließen Sie dann Erfolg und Selbstschädigung aus: Überfliegen Sie das Access-Log für zehn Sekunden. Wenn die Pfade aussehen wie eine genutzte Website, haben Sie ein Publikum oder einen Bug, keinen Angreifer.
- Floods für den Kernel billig abfangen
Zwei Dateien, ein Reload. Das ist auf jedem Allzweck-Server unbedenklich und beseitigt die zwei häufigsten Arten, wie eine kleine Maschine in die Knie geht.
cat > /etc/sysctl.d/99-flood.conf <<'EOF' net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_max_syn_backlog = 8192 net.core.somaxconn = 8192 net.ipv4.tcp_synack_retries = 2 net.ipv4.tcp_keepalive_time = 600 net.netfilter.nf_conntrack_max = 262144 net.netfilter.nf_conntrack_buckets = 65536 net.netfilter.nf_conntrack_tcp_timeout_established = 3600 net.netfilter.nf_conntrack_tcp_timeout_syn_recv = 20 EOF sysctl --system sysctl net.ipv4.tcp_syncookies net.netfilter.nf_conntrack_max # verify, do not assumeBringen Sie dann die Anwendung auf denselben Stand: nginx braucht
listen 443 ssl backlog=8192;, sonst wird die Kernel-Queue, die Sie gerade vergrößert haben, durch die kleinere Zahl gedeckelt, die der Prozess angefordert hat. - Alles schließen, was Sie nicht bedienen – oberhalb des Gastsystems
Zählen Sie auf, was tatsächlich lauscht, entscheiden Sie, was auf eine öffentliche Adresse gehört, und schieben Sie die groben Regeln hoch zum Edge-Filter des Hypervisors, sodass der Traffic Ihre virtuelle NIC nie erreicht.
ss -tlpn; ss -ulpn # every public listener, with the process that owns itSetzen Sie unter Server → Netzwerk → Firewall den Edge-Filter auf Default-Deny und erlauben Sie nur die Ports, die Sie bedienen, mit SSH beschränkt auf die Adressen, von denen aus Sie administrieren. Behalten Sie das Gast-Regelwerk in
nftablesals zweite Schicht – Gürtel und Hosenträger, kein Entweder-oder – und binden Sie Datenbanken und Admin-Oberflächen an127.0.0.1oder eine WireGuard-Adresse, statt einen öffentlichen Port zu firewallen. - Einen Cache vor den teuren Pfad setzen
Das ist die Änderung mit dem größten Wert für alles, was Seiten rendert. Fügen Sie
proxy_cachemitproxy_cache_lock onundproxy_cache_use_stalehinzu, sodass tausend gleichzeitige Cache-Misses zu einer einzigen Origin-Anfrage werden und alle anderen eine leicht veraltete Seite bekommen.nginx -t && systemctl reload nginx curl -sI https://example.com/ | grep -i x-cache # MISS, then HITVerifizieren Sie die Hitrate, bevor Sie ihr glauben. Ein Cache, der wegen eines
Set-Cookiebei jeder Antwort nie trifft, ist die häufigste Scheinsicherheit in dieser ganzen Übung – prüfen Sie zweimal mitcurl -sIund lesen SieX-Cache. - Die Pfade drosseln, die Sie etwas kosten – nicht den Besucher
Wenden Sie ein großzügiges globales Limit an und ein enges für die Endpunkte, die eine Datenbank anfassen. Immer
nodelay, immer mit einem Statuscode, nie eine stille Warteschlange.limit_req_zone $binary_remote_addr zone=general:16m rate=20r/s; limit_req_zone $binary_remote_addr zone=costly:16m rate=2r/s; limit_req_status 429;Sitzt nginx hinter einem Proxy, konfigurieren Sie zuerst
set_real_ip_fromundreal_ip_header. Ein Limit, das auf die Adresse Ihres Frontends schlüsselt, drosselt keinen Angreifer – es drosselt beim ersten Auslösen alle gleichzeitig. - Die Origin-Adresse aus der öffentlichen Sicht nehmen
Machen Sie die nackte IP nutzlos, und entscheiden Sie dann, was davor steht. Die Ablehnung sind zwei Zeilen und schließt den Pfad „das Internet nach Ihrem HTML durchsuchen“ endgültig.
server { listen 80 default_server; listen 443 ssl default_server; ssl_reject_handshake on; return 444; }Prüfen Sie dann die Lecks in der Reihenfolge, in der sie üblicherweise passieren: historische A-Einträge in Passive-DNS-Archiven, Hostnamen in Certificate-Transparency-Logs, die einst auf den Origin auflösten, und Header ausgehender E-Mails. Wenn auch nur einer davon die Adresse noch nennt, rettet Sie kein Frontend – erst umnummerieren, dann davorsetzen.
- Den Netzwerkbetreiber informieren – mit Zahlen
Volumetrische Abwehr ist automatisch und braucht kein Ticket, aber ein Bericht mit Belegen lässt einen Menschen bestätigen, was die Automatisierung getan hat, und Fehlerfälle erkennen, die sie selbst nicht sieht – etwa einen Scrubber, der legitime Sitzungen zurücksetzt.
Schicken Sie die Zieladresse, die Startzeit in UTC, Protokoll und Ziel-Ports, die gemessene Rate auf beiden Achsen, und ob Ihre eigenen Zähler Pakete ankommen oder vorgelagert verschwinden sehen. Fünfzig Zeilen
tcpdump -ni eth0 -c 200sind mehr wert als ein Absatz Beschreibung. „Die Seite ist langsam“ ist nicht umsetzbar; „185.x.x.x, 14:02 UTC, UDP auf 443, ~1,2 Mpps, Interface zeigt 40 Kpps ankommend“ ist es. - Die Umnummerierung proben, solange nichts kaputt ist
Stellen Sie DNS-TTLs noch heute auf 300 Sekunden und lassen Sie sie dort. Führen Sie die Übung dann einmal komplett von Anfang bis Ende durch, auf einer Maschine, die Sie eine Stunde später wieder zerstören.
# deploy a second instance in another region, restore, verify by hostname override curl --resolve example.com:443:<new-ip> https://example.com/ -sINotieren Sie sich, was es Sie an Minuten gekostet hat. Diese Zahl ist Ihr echter DDoS-Plan – mehr als jede Regel in dieser Anleitung –, denn sie ist es, die sagt, wie lange ein gezielter Angriff Sie offline halten kann. Gebühren werden tagesgenau gegen Ihr Guthaben abgerechnet, die ganze Generalprobe kostet also ein paar Cent.
Wo sich jeder Angriff tatsächlich stoppen lässt
| Schicht | Stoppt | Stoppt nicht | Was es Sie kostet | Wer es kontrolliert |
|---|---|---|---|---|
| Upstream-Scrubbing | Volumetrische Floods – absorbiert bis 10 Gbps, gescrubbt bis 100, darüber per BGP umgeleitet | Alles, was innerhalb normaler Traffic-Volumen bleibt: Zustandsangriffe, Layer 7 | Nichts. Immer aktiv, kein Ticket, gelegentliche Latenz während einer Umleitung | Wir, automatisch |
| Hypervisor-Edge-Filter | Alles auf einen geschlossenen Port, bevor es Ihre virtuelle NIC erreicht – keine CPU, kein Zustandseintrag | Angriffe auf Ports, die offen bleiben müssen | Nichts außer den Regeln, die Sie schreiben; zustandsbehaftet, Default-Deny | Sie, pro Server |
| Gast-Firewall (nftables) | SYN-Floods mit synproxy, Paketraten pro Quelle, unerwünschte Protokolle | Traffic, der die Leitung oberhalb von Ihnen bereits gefüllt hat – er kommt nie an | CPU und ein conntrack-Eintrag für jedes Paket, auch für die verworfenen | Sie, vollständig |
| Kernel-Tuning (sysctl) | Erschöpfung von Accept-Queue und conntrack – der klassische Killer kleiner Server | Alles, was eine gültige, abgeschlossene Verbindung ist | Etwa 80 MB RAM bei einer vernünftigen conntrack-Größe. Zwei Dateien | Sie, vollständig |
| Anwendung (Cache + Rate-Limit) | Layer-7-Floods, Request-Stampedes, teure Endpunkte | Angriffe auf Paketebene – sie erreichen den Webserver nie | Leicht veraltete Seiten, und 429er für die Nutzer, die Sie falsch eingeschätzt haben | Sie, vollständig |
| Reverse-Proxy-Frontend | Direkte Angriffe auf den Origin – es gibt keine öffentliche Adresse zum Zielen | Angriffe auf das Frontend selbst, und alles, nachdem Ihre Origin-IP durchgesickert ist | 5 $/Monat und eine weitere Maschine, die gepatcht werden muss | Sie, wenn Sie es selbst betreiben |
| Kommerzielles CDN | Große Layer-3/4- und Layer-7-Angriffe, in großem Maßstab, mit einer Support-Warteschlange | Einen Origin, der jemals öffentlich war, oder der auf seiner nackten IP antwortet | TLS-Terminierung durch einen Dritten, der weiß, wer Sie sind, und dem eine Klage zugestellt werden kann | Der Anbieter |
| Tor-Onion-Dienst | Jeden IP-basierten Angriff – es gibt keine Adresse im Protokoll | Fluten der Introduction Points, weshalb modernes Tor eine Proof-of-Work-Verteidigung mitbringt | Latenz, und ein Publikum, das bereit ist, Tor zu nutzen | Sie und das Netzwerk |
Fragen, die eine Antwort verdienen
Muss ich DDoS-Schutz auf meinem Server aktivieren?
Nein. Volumetrische Abwehr sitzt vorgelagert zu den PoPs und ist permanent aktiv – es gibt kein Produkt zu kaufen und keinen Schalter umzulegen. Unter 10 Gbps wird ohne sichtbaren Effekt absorbiert; 10–100 Gbps werden beim Transit-Provider gescrubbt, wo Sie eventuell einen kurzen Latenzanstieg bemerken; oberhalb von 100 Gbps wird das Präfix auf einen dedizierten Scrubbing-Pfad umgeleitet, die Latenz steigt spürbarer, und der Dienst bleibt erreichbar. Die Schwellenwerte sind in der Dokumentation veröffentlicht. Nicht automatisch ist alles oberhalb von Layer 4: Erschöpfung der Zustandstabelle und Angriffe auf der Anwendungsschicht sehen von vorgelagert aus wie gewöhnlicher Traffic und müssen auf Ihrer Maschine behandelt werden.
Setzen Sie meine IP auf Null-Routing, wenn ich angegriffen werde?
Nur als letztes Mittel, und nur bei anhaltenden Angriffen, die den gesamten PoP bedrohen und nicht nur Ihren Server – und wir informieren Sie innerhalb von Minuten, falls es passiert, statt Sie es selbst entdecken zu lassen. Jeder Hoster, der verspricht, dass das nie vorkommen kann, beschreibt Marketing statt eines Netzwerks: Ab einer gewissen Größenordnung bedeutet der Schutz Tausender Kunden irgendwann, eine einzelne Adresse zurückzuziehen. Der realistische Schutz besteht darin, sich selbst zu einem unattraktiven Ziel zu machen – die Origin-Adresse unveröffentlicht halten, einen geprobten Umnummerierungsplan bereithalten, und Ihre Restore-Zeit kennen.
Meine Seite ist down, aber der Bandbreiten-Graph sieht normal aus. Was ist da los?
Fast sicher eine Zustandserschöpfung – der klassische Fall ist eine volle nf_conntrack-Tabelle. Zwanzigtausend kleine Pakete pro Sekunde aus gefälschten Quellen füllen eine Standardtabelle in Sekunden, während sie nur ein paar Megabit verbrauchen, sodass der Graph nichts zeigt und jede neue Verbindung verworfen wird. Prüfen Sie dmesg -T | grep conntrack auf „table full, dropping packet“ und vergleichen Sie nf_conntrack_count mit nf_conntrack_max. Die andere Möglichkeit ist die gegenteilige Lesart: Die Leitung oberhalb von Ihnen ist bereits voll, sodass Ihr Interface Ihnen die Überlebenden zeigt statt des Angriffs.
Übersteht ein größerer Tarif einen Angriff, den ein kleiner nicht übersteht?
Manchmal, und nicht aus dem Grund, den man erwarten würde. Mehr vCPU und RAM helfen tatsächlich gegen Layer-7-Floods und Zustandserschöpfung, weil diese Angriffe CPU, Speicher und Tabellenplatz aufbrauchen. Gegen einen volumetrischen Flood ist der Tarif fast irrelevant – die Pakete werden vorgelagert zu Ihrem Port verworfen, egal was dahinterhängt, und ein 2,5-Gbps-Port rettet Sie nicht vor 40 Gbps. Beheben Sie Caching und conntrack-Dimensionierung, bevor Sie upgraden; das ist billiger, und meistens stellt sich heraus, dass es das eigentliche Problem war.
Kann ich Cloudflare oder ein anderes CDN vor einen No-KYC-VPS setzen?
Technisch ja, und es funktioniert gut. Verstehen Sie den Tausch, bevor Sie ihn eingehen: Das CDN terminiert Ihr TLS und sieht Ihren Klartext, kennt Ihre Origin-Adresse, führt ein Konto, das Sie per E-Mail und oft per Zahlungsmethode identifiziert, und kann in einer Jurisdiktion, die Sie sich nicht ausgesucht haben, mit einer gerichtlichen Anordnung belangt werden. Für einen Server, der ohne Namensangabe gekauft wurde, holt das genau die Partei zurück ins Spiel, die die ganze Konstruktion eigentlich vermeiden sollte. Wenn Ihr Bedrohungsmodell Ausfallzeit ist und nicht Enttarnung, ist es eine vernünftige Wahl – aber der Origin darf niemals öffentlich gewesen sein, sonst macht ein alter DNS-Eintrag die ganze Sache zunichte. Wenn Ihr Bedrohungsmodell einschließt, wer weiß, wo Sie sind, betreiben Sie stattdessen Ihren eigenen Reverse-Proxy auf einer zweiten Instanz, und lassen Sie den Origin Traffic nur von dort akzeptieren.
Reicht fail2ban aus, um einen DDoS zu stoppen?
Nein, und es ist das falsche Werkzeug, nicht bloß ein schwaches. Es reagiert im menschlichen Zeitmaßstab, nachdem es Logs geparst hat, sodass die Anfragen Sie bereits alles gekostet haben, was sie kosten sollten; es bannt jeweils eine Adresse, was gegen zehntausend Quellen nichts bewirkt und Ihre Firewall zu einem linearen Scan macht, wenn Sie es lassen; und es hängt von Logs ab, die ein Angreifer fluten kann. Nutzen Sie es für das, worin es exzellent ist – langsames Erraten von Zugangsdaten gegen SSH und Login-Formulare – und nutzen Sie ein dynamisches nftables-Set mit Timeout für alles, was in Flood-Geschwindigkeit passiert.
Sollte ich ganze Länder oder ASNs blockieren?
Länderblöcke sind nur vertretbar, wenn Ihr Publikum wirklich begrenzt ist und Sie in Kauf nehmen, reisende Nutzer und seltsam geroutete zu verlieren. Gegen ein modernes Botnetz, das überall über Privatanschlüsse verteilt ist, Ihr eigenes Land eingeschlossen, ist es nahezu nutzlos. Rechenzentrums-ASNs zu blockieren ist präziser – gewöhnliche Leute browsen nicht aus einem Hosting-Bereich heraus – und fängt nebenbei Scraping und Credential-Stuffing ab. Der bessere Instinkt ist, nach der Form des Traffics zu filtern: ein gemeinsamer User-Agent, ein fehlender Header, ein wiederholter Pfad. Diese Regel funktioniert weiter, nachdem der Angreifer die Adressen gewechselt hat – was er innerhalb von Minuten tun wird.
Macht mich der Betrieb eines Tor-Onion-Dienstes immun?
Immun gegen IP-basierte Angriffe, ja – es gibt keine Adresse im Protokoll, auf die ein Flood zielen könnte, was eine wirklich andere Sicherheitslage ist und keine bloß graduelle Verbesserung. Immun im Allgemeinen ist er nicht: Onion-Dienste lassen sich an ihren Introduction Points angreifen, weshalb modernes Tor eine Proof-of-Work-Verteidigung mitbringt, die Fluten für den Client teuer macht. Es kostet außerdem Latenz und beschränkt Sie auf ein Publikum, das bereit ist, Tor zu nutzen. Viele betreiben beides – ein Clearnet-Frontend für Reichweite, eine Onion-Adresse, die weiterläuft, wenn das Clearnet-Frontend unter Angriff steht.
Keep exploring
Einen neuen VPS in der ersten Stunde härten
Die Voraussetzung für diese Seite: Ports zu schließen, die Sie nicht bedienen, entfernt eine ganze Angriffsklasse, bevor Sie irgendetwas tunen.
Einen VPS ohne Ausfallzeit migrieren
Die vollständige Umnummerierungs-Übung, mit der DNS-Reihenfolge, die entscheidet, wie lange eine verbrannte Adresse Sie offline hält.
VPS für Gameserver
Die Workload, die das am meisten anzieht, und das UDP-spezifische Tuning, das zu einem öffentlichen Game-Port dazugehört.
Deploy your offshore server.
Wählen Sie eine Region. Wählen Sie einen Plan. Fügen Sie einen Schlüssel ein. Zahlen Sie. Die nächsten 47 Sekunden gehen auf uns.