|
HackerHet is een wenselijke en veelbelovende carrière. Ik waardeer goede hackers en haat slechte hackers. De zogenaamde slechte hacker is het soort man dat iemand aan de andere kant laat overwerken. SYN Flood-aanvallen zijn typische denial-of-service-aanvallen. De zogenaamde denial of service-aanval is bedoeld om indirect het doel van de aanval te bereiken door ervoor te zorgen dat de slachtofferhost of het netwerk niet in staat is goede service te leveren. Hackers spelen dit graag om te laten zien dat ze op hun peil zijn, capabel en moedig door de andere partij overuren te laten werken, maar in werkelijkheid is het niets. 1: Wat is een SYN Flood-aanval? SYN Flood-aanvallen maken gebruik van het driewegshandshake-proces van het TCP-protocol in IPv4. Dit protocol bepaalt dat als het ene uiteinde een TCP-verbinding met het andere uiteinde wil initiëren, het eerst een TCP SYN (synchroniseren) pakket naar de andere partij moet sturen, waarna de andere partij na ontvangst een TCP SYN + ACK-pakket terugstuurt, waarna de initiator een TCP ACK (ACKnowledge Character) pakket terugstuurt, zodat de drie handshakes voorbij zijn. In het bovenstaande proces zijn er enkele belangrijke concepten: De wachtrij is niet verbonden: In het driewegshandshakeprotocol onderhoudt de server een niet-verbonden wachtrij die een invoer opent voor het SYN-pakket van elke client (syn=j) die aangeeft dat de server het SYN-pakket heeft ontvangen en geeft een bevestiging aan de klant, in afwachting van het bevestigingspakket van de klant. De verbinding die door deze entries wordt geïdentificeerd, bevindt zich in een Syn_RECV toestand op de server, en wanneer de server een bevestigingspakket van de klant ontvangt, wordt de entry verwijderd en gaat de server in de ESTABLISHED-toestand. Met andere woorden, wanneer de TCP-server het TCP SYN-verzoekpakket ontvangt, moet de TCP-server eerst een datagebied toewijzen voordat het TCP SYN+ACK-pakket teruggestuurd wordt naar de TCP-client. Over het algemeen staat de verbinding wanneer het SYN-pakket is ontvangen, maar het ACK-pakket nog niet is ontvangenHalfopen verbinding(Halfopen verbinding)。 Backlogparameter: Geeft het maximale aantal niet-verbonden wachtrijen aan. SYN-ACK aantal heruitzendingen: Nadat de server het SYN-ACK-pakket heeft verzonden, als het bevestigingspakket van de klant niet is ontvangen, voert de server de eerste hertransmissie uit, wacht een bepaalde tijd en ontvangt het klantbevestigingspakket niet, en voert de tweede hertransmissie uit; als het aantal hertransmissies het maximale aantal hertransmissies overschrijdt dat door het systeem is gespecificeerd, verwijdert het systeem de verbindingsinformatie uit de semi-verbinding wachtrij. Let op dat de wachttijd voor elke herhaling niet per se hetzelfde is. Semi-verbonden overlevingstijd: Verwijst naar de maximale tijd die een invoer in de semi-verbinding wachtrij overleeft, dat wil zeggen de maximale tijd vanaf het moment dat de dienst het SYN-pakket ontvangt tot het moment waarop het pakket ongeldig wordt bevestigd, en de tijdwaarde is de som van de maximale wachttijd voor alle hertransmissieverzoekpakketten. Soms noemen we ook semi-verbonden overlevingstijd, SYN_RECV overlevingstijd. Bij de meest voorkomende SYN-flood-aanval stuurt de aanvaller binnen korte tijd een groot aantal TCP SYN-pakketten naar het slachtoffer, waarna de aanvaller de TCP-client is en het slachtoffer de TCP-server. Volgens de bovenstaande beschrijving zou het slachtoffer een specifieke datazone toewijzen aan elk TCP SYN-pakket, zolang de SYN-pakketten verschillende bronadressen hadden (wat gemakkelijk zou zijn voor aanvallers om te vervalsen). Dit zal veel druk leggen op het TCP-serversysteem en uiteindelijk zorgen dat het systeem niet goed werkt. 2. Het principe van SYN-cookies Een van de manieren om SYN Flood-aanvallen effectief te voorkomen is SYN-cookies. SYN Cookie Reden D. Uitgevonden door J. Bernstain en Eric Schenk. SYN-cookies zijn een aanpassing van het TCP-serverzijde drieweg-handshakeprotocol om SYN Flood-aanvallen te voorkomen.Het principe is:Wanneer de TCP-server een TCP SYN-pakket ontvangt en een TCP SYN+ACK-pakket terugstuurt, wijst hij geen toegewijd datagebied toe, maar berekent hij een cookiewaarde op basis van dit SYN-pakket. Wanneer een TCP ACK-pakket wordt ontvangen, controleert de TCP-server de legitimiteit van het TCP ACK-pakket op basis van die cookiewaarde. Indien legaal, wordt er een toegewezen datagebied toegewezen om toekomstige TCP-verbindingen te verwerken. Laten we het hebben over hoe je kernelparameters configureert om SYN-cookies te implementeren in Linux en FreeBSD Drie: Linux-instellingen Als je serverconfiguratie niet goed is, bereikt het aantal TCP TIME_WAIT sockets 20.000 of 30.000, en kan de server gemakkelijk worden meegesleept. Door de parameters van de Linux-kernel aan te passen, kan het aantal TIME_WAIT sockets op de server worden verminderd. TIME_WAIT kan worden bekeken met het volgende commando: - 以下是代码片段:
- netstat -an | grep "TIME_WAIT" | wc -l
Code kopiërenOp Linux, zoals CentOS, kun je dit bereiken door het bestand /etc/sysctl.conf aan te passen. Voeg de volgende regels toe: - 以下是代码片段:
- net.ipv4.tcp_fin_timeout = 30
- net.ipv4.tcp_keepalive_time = 1200
- net.ipv4.tcp_syncookies = 1
- net.ipv4.tcp_tw_reuse = 1
- net.ipv4.tcp_tw_recycle = 1
- net.ipv4.ip_local_port_range = 1024 65000
- net.ipv4.tcp_max_syn_backlog = 8192
- net.ipv4.tcp_max_tw_buckets = 5000
- net.ipv4.tcp_synack_retries = 2
- net.ipv4.tcp_syn_retries = 2
Code kopiërenIllustreren: net.ipv4.tcp_syncookies = 1 betekent dat SYN-cookies zijn ingeschakeld, wat een BOOLEAN is. Wanneer SYN wacht tot de wachtrij overloopt, schakel cookies in om het aan te pakken, wat een klein aantal SYN-aanvallen kan voorkomen, en de standaard is 0, wat betekent dat het gesloten is. net.ipv4.tcp_tw_reuse = 1 betekent dat hergebruik is ingeschakeld, wat een BOOLEAN is. Staat hergebruik van TIME-WAIT-sockets toe voor nieuwe TCP-verbindingen, standaard op 0, wat op sluiting duidt; net.ipv4.tcp_tw_recycle = 1 betekent het snelle recycling van TIME-WAIT-sockets in TCP-verbindingen, wat een BOOLEAN is, en de standaard is 0, wat betekent dat het gesloten is. net.ipv4.tcp_fin_timeout = 30 betekent dat als de socket wordt gesloten door een lokaal verzoek, deze parameter bepaalt hoe lang hij in de FIN-WAIT-2 toestand blijft. De eenheid is seconden. net.ipv4.tcp_keepalive_time = 1200 geeft aan hoe vaak TCP keepalive-berichten verzendt wanneer keepalive wordt gebruikt. De standaard is 2 uur, veranderd naar 20 minuten. De eenheid is seconden. net.ipv4.ip_local_port_range = 1024 65000 geeft het bereik aan van poorten dat wordt gebruikt voor uitgaande verbindingen. De standaardcase is klein: 32768 naar 61000, veranderd naar 1024 naar 65000. net.ipv4.tcp_max_syn_backlog = 8192 geeft de lengte van de SYN-wachtrij aan, die standaard 1024 is, en de lengte van de verhoogde wachtrij is 8192 om meer netwerkverbindingen te kunnen accommoderen die op verbinding wachten. net.ipv4.tcp_max_tw_buckets = 5000 geeft het maximale aantal sockets aan dat het systeem op TIME_WAIT gelijktijdig onderhoudt, en als dit aantal wordt overschreden, worden TIME_WAIT sockets onmiddellijk verwijderd en wordt er een waarschuwingsbericht afgedrukt. De standaard is 180000, veranderd naar 5000. Voor servers zoals Apache en Nginx kunnen de parameters in de vorige lijnen het aantal sockets TIME_WAIT goed verminderen, maar voor Squid is het effect niet groot. Deze parameter regelt het maximale aantal TIME_WAIT sockets om te voorkomen dat de Squid-server wordt meegesleurd door een groot aantal TIME_WAIT sockets. net.ipv4.tcp_synack_retries en net.ipv4.tcp_syn_retries bepalen het aantal SYN-herhalingen. Voer het volgende commando uit om de configuratie in werking te stellen: Als je /etc/sysctl.conf niet wilt wijzigen, kun je ook het commando gebruiken: - 以下是代码片段:
- /sbin/sysctl -w key=value
Code kopiërenTen vierde, ingesteld onder FreeBSD yayu's persoonlijke leerperspectief: de verdediging tegen SYN in FreeBSD is mogelijk niet hetzelfde als in Linux, de geconfigureerde parameters zijn niet exact hetzelfde, en de relevante configuratie en het begrip zijn mogelijk niet correct :) Er is er één in de TCP-verbindingMSL (maximale segmentlevensduur)Het concept vanMaximale generatietijdDe MSL-waarde wordt in algemene implementaties 30 seconden genomen, en sommige implementaties duren 2 minuten. "Passieve afsluiting" in de TCP-toestandsmachine: Van CLOSE_WAIT tot LAST_ACK geldt als volgt: Wanneer TCP een actieve afsluiting uitvoert en de laatste ACK terugstuurt, moet de verbinding twee keer zo lang in de TIME_WAIT toestand blijven als de MSL. Dit stelt TCP in staat om de laatste ACK opnieuw te sturen als deze verloren gaat (het andere uiteinde loopt uit en stuurt de laatste FIN opnieuw uit). Het bestaan van deze regel heeft als gevolg dat de link (clientadres, poort en server-side adres, poort) op dat adres niet gebruikt kan worden tijdens deze 2*MSL-tijd. Als we bijvoorbeeld een link sluiten nadat we deze hebben gemaakt en vervolgens snel opnieuw starten, dan is de poort niet beschikbaar. TIME_WAIT tijd is 2*MSL. Je kunt TIME_WAIT tijd verlagen door net.inet.tcp.msl aan te passen. Voor de webserver kan deze waarde worden aangepast naar 7500 of 2000 (toegang tot een web, de pagina kan niet langer dan 4~15 seconden worden geflasht, je kunt overwegen om -_-" op te geven) Referentie voor parameterinstelling: - 以下是引用片段:
- net.inet.tcp.syncookies=1
- 防止DOS攻击
- net.inet.tcp.msl=7500
- 防止DOS攻击,默认为30000
- net.inet.tcp.blackhole=2
- 接收到一个已经关闭的端口发来的所有包,直接drop,如果设置为1则是只针对TCP包
- net.inet.udp.blackhole=1
- 接收到一个已经关闭的端口发来的所有UDP包直接drop
Code kopiërenOp FreeBSD zag yayu geen commando als "/sbin/sysctl -p" dat de inhoud van /etc/sysctl.conf effectief kon maken, dus gebruikte hij gewoon het commando: - 以下是代码片段:
- sysctl net.inet.tcp.syncookies=1 net.inet.tcp.msl=7500 net.inet.tcp.blackhole=2 net.inet.udp.blackhole=1
Code kopiëren
|