Kees schreef op donderdag 24 december 2009 @ 17:00:
Mijn ervaring is dat een goed uitgevoerde SYN flood met random sources vrijwel altijd mijn servers plat kan leggen en ik heb nog niet een afdoende bescherming er tegen gevonden. En zo groot hoeft een DDoS niet te zijn, een goede SYN flood met ~150k pps doet zo'n 75 mbit aan verkeer, maar legt vrijwel elke site plat (en ook switches als je niet oppast). Ik ben er nu mee aan het testen, en het kan erg vervelend zijn, tot nu toe is het me niet gelukt om mijn eigen ddos af te slaan puur met iptables/syn_cookies waarbij de webserver ook nog bereikbaar blijft.
[...]
Het nadeel aan de ddos'ses die ik nu aan het testen ben is dat in bijna alle gevallen de packetloss oploopt tot 100% als ik mijn best doe. Zodra ik echter ga blocken en packets drop, kan ik zonder pingloss op een normale manier de lijn gebruiken.
Er zijn eigenlijk twee factoren die een DDoS (die niet je link volgooit) effectief maken:
- Puur het aantal packets per seconde en de daarbij behorende interrupts
- De mate van verwerking van elke packet afzonderlijk
Als je systeem per packet veel verwerking moet doen, komt het niet meer toe aan nuttige dingen als applicaties draaien (livelock genoemd). Hetzelfde zie je met routers die puur en alleen packets heen en weer sturen. Met behulp van interrupt moderation kun je het aantal interrupts per seconde beperken, zodat er nog wat tijd overblijft voor andere dingen. Linux zal dit ongetwijfeld standaard al doen, maar het is vast te tunen.
Verder moet je dus de verwerking per afzonderlijke packet zoveel mogelijk beperken. Als je op 150kpps aan SYNs loopt te SYN/ACK'en, gaat de SYN door de hele TCP/IP-stack heen en wordt er ook nog es een SYN/ACK gebouwd en helemaal door output-pad gestuurd. Als je er dan ook nog es een stateful filter voor hebt hangen, die voor elke SYN state aanmaakt, wordt het helemaal niet meer te harden. Hetzelfde geldt natuurlijk voor UDP, ICMP en anderssoortige TCP-packets. Bij stomme aanvallen waarbij men een mix van verkeer stuurt, ICMP pingfloods, TCP ACK floods, enz, kun je die packets gewoon stoppen. Bij SYN-floods is dat dus wat moeilijker..
Ratelimiting op inkomende SYN-pakketten kan er dan voor zorgen dat je systeem in ieder geval bereikbaar blijft zodat je verdere maatregelen kan treffen. Het snel classificeren en droppen van packets is DE manier om te voorkomen dat je systeem in livelock terecht komt. Helaas is dat classificeren met miljoenen source IP's lastiger, zoals je gezien hebt..
Overigens nog de opmerking dat stateful filtering en SYN-floods een slechte combo zijn. Statetables van die krengen zijn meestal veel te klein en bij genoeg random source IP's kunnen ze SYN-floods niet detecteren en moet er dus wel state bijgehouden worden.
Tja, dat is het grote probleem. De laatste DDoS'en die ik gezien heb hadden random source ip's. Waarbij het met gemak in de miljoenen verschillende ip's liep en er op een gegeven moment dik 150k verschillende SYN's per seconde binennkwamen. Gelukkig was het wel te blocken omdat het niet helemaal random was, maar tcpdumps e.d. (die ik uiteraard maakte) hadden eigenlijk geen nut vanwege de random source. Gelukkig zijn de DDoS'en met een beperkt aantal source ip's inderdaad wel zeer gemakkelijk te blocken.
De laatste keer dat ik DDoS-attacks kreeg deed men het nog met Stacheldraht. Dat tooltje spoofde OF het laatste octet van het IP, OF het gehele IP-adres. Als je daarvan een aanval binnen kreeg, zag je dus op zich wel miljoenen unieke IP-adressen, maar uiteindelijk bleek het meerendeel van de gespoofde packets alleen op laatste octet gespoofd te zijn. Jij hebt ongetwijfeld meer en grotere DDoS-attacks gezien, dus ik ben benieuwd naar wat voor analyses je zoal gedaan hebt op je tcpdumps. In mijn geval was het blocken op /24 erg efficient gezien het spoofgedrag van Stacheldraht. Bij analyse van tcpdumps moet je dan wel eerst ff sorteren op PPS per IP en netwerk natuurlijk..