|
HackerDet er en ønskværdig og lovende karriere. Jeg sætter pris på gode hackere og hader dårlige hackere. Den såkaldte dårlige hacker er den slags fyr, der får nogen på den anden side til at arbejde overtid. SYN Flood-angreb er et typisk denial of service-angreb. Det såkaldte denial of service-angreb har til formål indirekte at opnå formålet med angrebet ved at gøre offerets vært eller netværk ude af stand til at levere god service. Hackere kan godt lide at spille dette for at vise, at de er stabile, dygtige og modige ved at få den anden part til at arbejde overtid, men i virkeligheden er det ingenting. 1: Hvad er et SYN Flood-angreb? SYN Flood-angreb udnytter den trevejs håndtryksproces i TCP-protokollen i IPv4. Denne protokol foreskriver, at hvis den ene ende ønsker at initiere en TCP-forbindelse til den anden ende, skal den først sende en TCP SYN (synkronisere) pakke til den anden part, og den anden part sender en TCP SYN + ACK-pakke tilbage efter modtagelsen, hvorefter initiativtageren sender en TCP ACK (ACKnowledge Character) pakke tilbage, så de tre håndtryk er overstået. I ovenstående proces er der nogle vigtige begreber: Køen er ikke forbundet: I trevejs håndtryksprotokollen opretholder serveren en uforbundet kø, der åbner en post for hver klients SYN-pakke (syn=j), som angiver, at serveren har modtaget SYN-pakken, og udsender en bekræftelse til kunden, mens kunden afventer bekræftelsespakken. Forbindelsen, der identificeres af disse poster, er i en Syn_RECV tilstand på serveren, og når serveren modtager en bekræftelsespakke fra kunden, slettes posten, og serveren går ind i ETABLERET tilstand. Med andre ord, når TCP-serveren modtager TCP SYN-anmodningspakken, skal TCP-serveren først allokere et dataområde til at betjene TCP-forbindelsen, som denne hånd danner, før TCP SYN+ACK-pakken sendes tilbage til TCP-klienten. Generelt er forbindelsen til tilstand, når SYN-pakken modtages, men ACK-pakken endnu ikke er modtagetHalvåben forbindelse(Halvåben forbindelse)。 Backlog-parameter: Angiver det maksimale antal uforbundne køer. SYN-ACK antal genudsendelser: Efter at serveren har sendt SYN-ACK-pakken, hvis kundebekræftelsespakken ikke modtages, udfører serveren den første genudsendelse, venter en periode og modtager ikke kundens bekræftelsespakke, og udfører den anden genudsendelse; hvis antallet af genudsendelser overstiger det maksimale antal genudsendelser, som systemet har angivet, sletter systemet forbindelsesinformationen fra semi-forbindelseskøen. Bemærk, at ventetiden for hver genbevisning ikke nødvendigvis er den samme. Semi-forbundet overlevelsestid: Henviser til den maksimale tid, hvor en post i semi-forbindelseskøen overlever, altså den maksimale tid fra det tidspunkt, hvor tjenesten modtager SYN-pakken, til det tidspunkt, hvor pakken bekræftes at være ugyldig, og tidsværdien er summen af den maksimale ventetid for alle genudsendelsesanmodningspakker. Nogle gange kalder vi også semi-forbundet overlevelsestid SYN_RECV overlevelsestid. I det mest almindelige SYN-floodangreb sender angriberen et stort antal TCP SYN-pakker til offeret på kort tid, hvor angriberen er TCP-klienten og offeret er TCP-serveren. Ifølge beskrivelsen ovenfor ville offeret tildele en specifik datazone til hver TCP SYN-pakke, så længe SYN-pakkerne havde forskellige kildeadresser (hvilket ville være let for angribere at forfalske). Dette vil lægge meget pres på TCP-serversystemet og til sidst få systemet til ikke at fungere korrekt. 2. Princippet om SYN-cookies En af måderne effektivt at forhindre SYN Flood-angreb på er SYN-cookies. SYN Cookie Grund D. Opfundet af J. Bernstain og Eric Schenk. SYN-cookies er en modifikation af TCP's serverside trevejs håndtryksprotokol for at forhindre SYN Flood-angreb.Dets princip er:Når TCP-serveren modtager en TCP SYN-pakke og returnerer en TCP SYN+ACK-pakke, allokerer den ikke et dedikeret dataområde, men beregner en cookie-værdi baseret på denne SYN-pakke. Når en TCP ACK-pakke modtages, kontrollerer TCP-serveren legitimiteten af TCP ACK-pakken baseret på denne cookie-værdi. Hvis det er lovligt, er der afsat et dedikeret dataområde til at håndtere fremtidige TCP-forbindelser. Lad os tale om, hvordan man konfigurerer kerneparametre til at implementere SYN-cookies i Linux og FreeBSD Tre: Linux-indstillinger Hvis din serverkonfiguration ikke er god, når antallet af TCP TIME_WAIT sockets op på 20.000 eller 30.000, og serveren kan nemt blive trukket ihjel. Ved at ændre Linux-kernens parametre kan antallet af TIME_WAIT sockets på serveren reduceres. TIME_WAIT kan ses med følgende kommando: - 以下是代码片段:
- netstat -an | grep "TIME_WAIT" | wc -l
Kopier kodePå Linux, såsom CentOS, kan du opnå dette ved at ændre filen /etc/sysctl.conf. Tilføj følgende linjer: - 以下是代码片段:
- 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
Kopier kodeIllustrere: net.ipv4.tcp_syncookies = 1 betyder, at SYN-cookies er aktiveret, hvilket er en BOOLEAN. Når SYN venter på, at køen bliver overfyldt, skal cookies aktiveres til at håndtere den, hvilket kan forhindre et lille antal SYN-angreb, og standarden er 0, hvilket betyder, at den er lukket. net.ipv4.tcp_tw_reuse = 1 betyder, at genbrug er aktiveret, hvilket er en BOOLEAN. Tillader genbrug af TIME-WAIT-sockets til nye TCP-forbindelser, som standard er 0, hvilket indikerer lukning; net.ipv4.tcp_tw_recycle = 1 betyder at muliggøre hurtig genbrug af TIME-WAIT-sockets i TCP-forbindelser, hvilket er en BOOLEAN, og standarden er 0, hvilket betyder, at den er lukket. net.ipv4.tcp_fin_timeout = 30 betyder, at hvis soklen lukkes af en lokal forespørgsel, bestemmer denne parameter, hvor længe den forbliver i FIN-WAIT-2-tilstanden. Enheden er sekunder. net.ipv4.tcp_keepalive_time = 1200 angiver, hvor ofte TCP sender keepalive-beskeder, når keepalive bruges. Standarden er 2 timer, ændret til 20 minutter. Enheden er sekunder. net.ipv4.ip_local_port_range = 1024 65000 angiver rækkevidden af porte, der bruges til udgående forbindelser. Standardtilfældet er lille: 32768 til 61000, ændret til 1024 til 65000. net.ipv4.tcp_max_syn_backlog = 8192 angiver længden af SYN-køen, som som standard er 1024, og længden af den øgede kø er 8192 for at rumme flere netværksforbindelser, der venter på forbindelse. net.ipv4.tcp_max_tw_buckets = 5000 angiver det maksimale antal sokler, som systemet opretholder TIME_WAIT samme tid, og hvis dette antal overskrides, vil TIME_WAIT sokler straks blive ryddet, og en advarselsmeddelelse vil blive trykt. Standarden er 180000, ændret til 5000. For servere som Apache og Nginx kan parametrene i de tidligere linjer reducere antallet af sockets TIME_WAIT godt, men for Squid er effekten ikke særlig god. Denne parameter styrer det maksimale antal TIME_WAIT sokler for at forhindre, at Squid-serveren bliver trukket ud af et stort antal TIME_WAIT sokler. net.ipv4.tcp_synack_retries og net.ipv4.tcp_syn_retries definerer antallet af SYN-gentagelser. Kør følgende kommando for at få konfigurationen til at træde i kraft: Hvis du ikke vil ændre /etc/sysctl.conf, kan du også bruge kommandoen til det: - 以下是代码片段:
- /sbin/sysctl -w key=value
Kopier kodeFor det fjerde, opsat under FreeBSD yayus personlige læringssynspunkt: forsvaret mod SYN i FreeBSD er måske ikke det samme som i Linux, de konfigurerede parametre er ikke helt de samme, og den relevante konfiguration og forståelse er måske ikke korrekt :) Der er en i TCP-linketMSL (maks segmentlevetid)BegrebetMaksimal generationstidMSL-værdien tages i 30 sekunder i generelle implementeringer, og nogle implementeringer tager 2 minutter. "Passiv nedlukning" i TCP-tilstandsmaskinen: Fra CLOSE_WAIT til LAST_ACK findes der en regel som følger: Når TCP udfører en aktiv nedlukning og sender den sidste ACK tilbage, skal forbindelsen forblive i TIME_WAIT-tilstanden dobbelt så længe som MSL. Dette gør det muligt for TCP at sende den sidste ACK igen, hvis den går tabt (den anden ende går ud og sender den sidste FIN igen). Eksistensen af denne regel har den konsekvens, at forbindelsen (klientadresse, port og serverside-adresse, port) på den adresse ikke kan bruges i denne 2*MSL-tid. For eksempel, hvis vi lukker et link efter oprettelsen og derefter hurtigt genstarter linket, vil porten være utilgængelig. TIME_WAIT tid er 2*MSL. Så du kan reducere TIME_WAIT tid ved at justere net.inet.tcp.msl. For webserveren kan denne værdi justeres til 7500 eller 2000 (adgang til en web, siden kan ikke flashes i mere end 4~15 sekunder, du kan overveje at opgive -_-) Parameter indstillingsreference: - 以下是引用片段:
- 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
Kopier kodePå FreeBSD så yayu ikke en kommando som "/sbin/sysctl -p", der kunne gøre indholdet af /etc/sysctl.conf effektivt, så han brugte bare kommandoen: - 以下是代码片段:
- sysctl net.inet.tcp.syncookies=1 net.inet.tcp.msl=7500 net.inet.tcp.blackhole=2 net.inet.udp.blackhole=1
Kopier kode
|