|
Când am ajuns la companie în această dimineață, m-am simțit destul de încet când m-am conectat pe site-ul oficial al companiei, m-am conectat la server pentru a verifica statusul accesului pe site-ul oficial: [root@web ~]# netstat -anp |awk '{print $6}'|sort|uniq -c |sort -rn 172 ÎNFIINȚAT 59 CONECTAT 589 SYN_RECV 15 PÂRÂU SYN este de fapt atât de ridicat, continuați să urmăriți SYN-ul trimis de acele IP-uri: [root@tweb ~]# netstat -an | grep SYN | awk '{print $5}' | awk -F: '{print $1}' | sortează | uniq -c | sortează -nr | mai mult 570 x.x.x.x (IP-ul nu este scris, este un IP al Shandong Zaozhuang Unicom), dar acest IP a trimis atât de multe conexiuni de cerere SYN, iar concurența serverului nostru web nu este foarte mare, astfel încât cererile normale ale utilizatorilor nu pot fi corespunse, iar pagina nu poate fi deschisă. Pentru că firewall-ul hardware este gestionat de departamentul IT al grupului, nu am autoritate, așa că pot lua doar câteva măsuri pe serverul local pentru a reduce parțial atacul SYN. În primul rând, să vorbim despre principiul de atac al SYN: În protocolul TCP/IP, protocolul TCP oferă servicii de conexiune fiabile folosind o strângere de mână în trei căi pentru a stabili o conexiune. Prima strângere de mână: La stabilirea unei conexiuni, clientul trimite un pachet syn (syn=j) către server și intră în starea SYN_SEND, așteptând confirmarea serverului. A doua strângere de mână: Când serverul primește pachetul SYN, trebuie să confirme SYN-ul clientului (ack=j+1) și să trimită și un pachet SYN (syn=k), adică pachetul SYN+ACK, moment în care serverul intră în starea SYN_RECV. A treia strângere de mână: Clientul primește pachetul SYN+ACK de la server și trimite pachetul de confirmare ACK (ack=k+1) către server. După trei strângeri de mână, clientul și serverul încep să transmită date.
Dacă utilizatorul inițiază o cerere de conexiune cu serverul doar pentru a doua oară și nu răspunde serverului, serverul va continua să aștepte confirmarea utilizatorului. Așadar, facem următoarele modificări direct de la conexiunea SYN: Verifică configurația implicită a SYN în Linux: [root@web ~]# sysctl -a | grep _syn net.ipv4.tcp_max_syn_backlog = 1024 net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_synack_retries = 5 net.ipv4.tcp_syn_retries = 5 tcp_max_syn_backlog este lungimea cozii SYN, iar mărirea lungimii cozii SYN poate acomoda mai multe conexiuni de rețea care așteaptă să fie conectate. tcp_syncookies este un comutator care activează funcția de cookie-uri SYN, care poate preveni atacurile parțiale SYN. tcp_synack_retries și tcp_syn_retries definesc numărul de conexiuni de reîncercare pentru SYN și reduc parametrii impliciti pentru a controla cât mai mult numărul de conexiuni SYN. Următorii sunt parametrii pe care i-am modificat, care pot fi modificați în funcție de situația reală a serverului meu: [root@web ~]# mai mult /etc/rc.d/rc.local #!/bin/sh # Acest scrip{filter}t va fi executat *după* toate celelalte scrip{filter}ts init. # Poți să-ți pui propriile lucruri de inițializare aici dacă nu o faci # vreau să fac totul în stilul Sys V Init. touch /var/lock/subsys/local ulimit -HSn 65535 /usr/local/apache2/bin/apachectl start ##### sysctl -w net.ipv4.tcp_max_syn_backlog=2048 sysctl -w net.ipv4.tcp_syncookies=1 sysctl -w net.ipv4.tcp_synack_retries=3 sysctl -w net.ipv4.tcp_syn_retries=3 Pentru ca configurația să intre în vigoare imediat fără a reporni serverul, aceasta poate fi efectuată #sysctl -w net.ipv4.tcp_max_syn_backlog=2048 #sysctl -w net.ipv4.tcp_syncookies=1 #sysctl -w net.ipv4.tcp_synack_retries=3 #sysctl -w net.ipv4.tcp_syn_retries=3 Unii oameni preferă să folosească liste de control de acces pentru a preveni atacurile SYN, ceea ce încetinește într-o anumită măsură atacurile SYN: Atac de inundație syn #iptables -A INPUT -p tcp --syn -m limită --limită 1/s -j ACCEPT --limită 1/s limitează numărul de concurențe syn la 1 dată pe secundă Scanare anti-port # iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -limit --limit 1/s -j ACCEPT Semnalul morții # iptables -A ÎNAINTE -p icmp --cerere de tip ecou -m limită --limită 1/s -j ACCEPT #>iptables-save >/etc/sysconfig/iptables Pentru a vedea, #iptables -L ACCEPT tcp -- oriunde, oriunde tcp steaguri: FIN, SYN, RST, ACK/SYN limită: medie 1/sec burst 5 ACCEPT tcp -- oriunde, oriunde steaguri tcp: FIN, SYN, RST, ACK/RST limită: medie 1/sec burst 5 ACCEPT icmp -- oriunde, oriunde, limita cererilor de ecou ICMP: medie 1/sec rafală 5 Verifică din nou conexiunea syn: [root@web ~]# netstat -an | grep SYN | awk '{print $5}' | awk -F: '{print $1}' | sortează | uniq -c | sortează -nr | mai mult 20 10.92.10.220 1 125.43.36.199 Evident, numărul conexiunilor SYN a scăzut.
|