|
Quando sono arrivato in azienda stamattina, mi sono sentito piuttosto lento quando ho effettuato l'accesso al sito ufficiale dell'azienda, ho effettuato l'accesso al server per controllare lo stato di accesso del sito ufficiale: [root@web ~]# netstat -anp |awk '{print $6}'|sort|uniq -c |sort -rn 172 FONDAZIONE 59 COLLEGATI 589 SYN_RECV 15 STREAM Il SYN è in realtà così alto, continua a tracciare il SYN inviato da quegli IP: [root@tweb ~]# netstat -an | grep SYN | awk '{print $5}' | awk -F: '{print $1}' | Ordina | uniq -c | Ordina -nr | di più 570 x.x.x.x (L'IP non è scritto, è un IP di Shandong Zaozhuang Unicom), ma questo singolo IP ha inviato così tante connessioni di richiesta SYN, e la concorrenza del nostro server web non è molto alta, quindi le richieste normali degli utenti non possono essere corrispondenti e la pagina non può essere aperta. Poiché il firewall hardware è gestito dal dipartimento IT del gruppo, non ho autorità, quindi posso prendere solo alcune misure sul server locale per mitigare parzialmente l'attacco SYN. Prima di tutto, parliamo del principio di attacco di SYN: Nel protocollo TCP/IP, il protocollo TCP fornisce servizi di connessione affidabili utilizzando una stretta di mano a tre vie per stabilire una connessione. Prima stretta di mano: Quando si stabilisce una connessione, il client invia un pacchetto syn (syn=j) al server ed entra nello stato SYN_SEND, aspettando la conferma del server. La seconda stretta di mano: Quando il server riceve il pacchetto SYN, deve confermare il SYN del cliente (ack=j+1) e inviare anche un pacchetto SYN (syn=k), cioè pacchetto SYN+ACK, momento in cui il server entra nello stato SYN_RECV. Terzo handshake: Il client riceve il pacchetto SYN+ACK dal server e invia il pacchetto di conferma ACK (ack=k+1) al server. Dopo tre strette di mano, client e server iniziano a trasmettere dati.
Se l'utente avvia una richiesta di connessione con il server solo per stringersi la mano per la seconda volta e non risponde al server, il server continuerà ad attendere la conferma dell'utente. Quindi apportiamo le seguenti modifiche direttamente dalla connessione SYN: Controlla la configurazione SYN predefinita su 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 è la lunghezza della coda SYN, e aumentare la lunghezza della coda SYN può accogliere più connessioni di rete in attesa di essere connesse. tcp_syncookies è un interruttore per attivare la funzione cookie SYN, che può prevenire attacchi SYN parziali. tcp_synack_retries e tcp_syn_retries definiscono il numero di connessioni di ritentativo per il SYN e riducono i parametri predefiniti per controllare il numero di connessioni SYN il più possibile. Di seguito sono riportati i parametri che ho modificato, che possono essere modificati in base alla situazione reale del mio server: [root@web ~]# more /etc/rc.d/rc.local #!/bin/sh # Questo scrip{filter}t verrà eseguito *dopo* tutti gli altri scrip{filter}ts di init. # Puoi mettere qui dentro le tue cose di inizializzazione se non lo fai # voglio fare tutto il materiale in stile Sys V init. touch /var/lock/subsys/locale 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 Per far sì che la configurazione entri in vigore immediatamente senza riavviare il server, può essere eseguita #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 Alcune persone amano usare le liste di controllo accessi per prevenire attacchi SYN, il che rallenta in una certa misura gli attacchi SYN: Attacco a inondazione sinica #iptables -A INPUT -p tcp --syn -m limite ---limite 1/s -j ACCETTA --limite 1/s limita il numero di concorrenza sinologica a 1 volta al secondo Scansione anti-porta # iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST limite --limite 1/s -j ACCETTA Segnale della morte # iptables -A FORWARD -p icmp --icmp-type echo-request -m limite ---limite 1/s -j ACCETTA #>iptables-save >/etc/sysconfig/iptables Per vedere, #iptables -L ACCETTA tcp -- ovunque ovunque ovunque tcp flag: FIN, SYN, RST, ACK/SYN limite: media 1/sec burst 5 ACCETTA tcp -- ovunque ovunque ovunque tcp flag: FIN, SYN, RST, ACK/RST limite: media 1/sec burst 5 ACCETTA icmp -- ovunque ovunque limite richiesta eco ICMP: media 1/s burst 5 Controlla di nuovo la connessione syn: [root@web ~]# netstat -an | grep SYN | awk '{print $5}' | awk -F: '{print $1}' | Ordina | uniq -c | Ordina -nr | di più 20 10.92.10.220 1 125.43.36.199 Ovviamente il numero di connessioni SYN è diminuito.
|