|
Kiedy dziś rano dotarłem do firmy, czułem się dość wolny, gdy zalogowałem się na oficjalną stronę firmy, zalogowałem się na serwer, by sprawdzić status dostępu do oficjalnej strony: [root@web ~]# netstat -anp |awk '{print $6}'|sort|uniq -c |sort -rn 172 ZAŁOŻONO 59 POŁĄCZONYCH 589 SYN_RECV 15 STRUMIEŃ SYN jest tak wysoki, kontynuuj śledzenie SYN wysyłanego przez te adresy IP: [root@tweb ~]# netstat -an | grep SYN | awk '{print $5}' | awk -F: '{print $1}' | sort | Uniq -c | sort -nr | więcej 570 x.x.x.x (IP nie jest zapisane, jest IP Shandong Zaozhuang Unicom), ale ten jeden adres IP wysłał tak wiele połączeń SYN, a współbieżność naszego serwera WWW nie jest zbyt duża, więc normalne żądania użytkowników nie mogą być korespondowane, a strona nie może zostać otwarta. Ponieważ sprzętowa zapora jest zarządzana przez dział IT grupy, nie mam żadnych uprawnień, więc mogę podjąć tylko pewne działania na lokalnym serwerze, aby częściowo ograniczyć atak SYN. Przede wszystkim porozmawiajmy o zasadzie ataku w SYN: W protokole TCP/IP protokół TCP zapewnia niezawodne usługi połączenia, wykorzystując trzykierunkowy handshake do nawiązania połączenia. Pierwszy handshake: Podczas nawiązywania połączenia klient wysyła pakiet syn (syn=j) do serwera i wchodzi w stan SYN_SEND, czekając na potwierdzenie przez serwer. Drugi handshake: Gdy serwer otrzymuje pakiet SYN, musi potwierdzić SYN klienta (ack=j+1) oraz wysłać pakiet SYN (syn=k), czyli pakiet SYN+ACK, po czym serwer wchodzi w stan SYN_RECV. Trzeci handshake: Klient otrzymuje pakiet SYN+ACK od serwera i wysyła pakiet potwierdzający ACK (ack=k+1) do serwera. Po trzech uściskach ręki klient i serwer zaczynają przesyłać dane.
Jeśli użytkownik inicjuje żądanie połączenia z serwerem, a następnie po raz drugi uścisnie dłoń i nie odpowie serwerowi, serwer będzie czekał na potwierdzenie użytkownika. Dlatego wprowadzamy następujące zmiany bezpośrednio z połączenia SYN: Sprawdź domyślną konfigurację SYN w Linuksie: [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 to długość kolejki SYN, a jej wydłużenie pozwala na większą liczbę połączeń sieciowych oczekujących na połączenie. tcp_syncookies jest przełącznik do włączenia funkcji ciasteczek SYN, która może zapobiegać częściowym atakom SYN. tcp_synack_retries i tcp_syn_retries definiują liczbę połączeń powtórnych dla SYN oraz ograniczają domyślne parametry, aby kontrolować liczbę połączeń SYN tak bardzo, jak to możliwe. Poniżej przedstawiono parametry, które zmodyfikowałem, a które można dostosować do rzeczywistej sytuacji mojego serwera: [root@web ~]# więcej /etc/rc.d/rc.local #!/śmieć/sh # Ten scrip{filter}t zostanie wykonany *po* wszystkich pozostałych init scrip{filter}ts. # Możesz tu włożyć własne inicjalizacyjne rzeczy, jeśli nie # chcę zrobić pełne init w stylu Sys V. dotyk /var/lock/subsys/lokalny 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 Aby konfiguracja zaczęła działać natychmiast bez restartu serwera, można ją wykonać #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 Niektórzy lubią korzystać z list kontroli dostępu, aby zapobiegać atakom SYN, co do pewnego stopnia spowalnia ataki SYN: Atak powodzi syn #iptables -A INPUT -p tcp --syn -m limit --limit 1/s -j ACCEPT --limit 1/s ogranicz liczbę syn współbieżności do 1 czasu na sekundę Skanowanie antyportowe # iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT Ping śmierci # iptables -A FORWARD -p icmp --icmp-typ echo-request -m limit --limit 1/s -j ACCEPT #>iptables-save >/etc/sysconfig/iptables Do oglądania, #iptables -L ACCEPT tcp -- wszędzie i wszędzie, flagi TCP: FIN, SYN, RST, ACK/SYN limit: średnio 1/sekunda burst 5 ACCEPT tcp -- wszędzie wszędzie i wszędzie, flagi TCP: FIN, SYN, RST, ACK/RST limit: średnio 1/sekunda burst 5 ACCEPT icmp -- wszędzie gdziekolwiek i gdzie icmp echo-request limit: średnio 1/sek burst 5 Sprawdź ponownie połączenie syn: [root@web ~]# netstat -an | grep SYN | awk '{print $5}' | awk -F: '{print $1}' | sort | Uniq -c | sort -nr | więcej 20 10.92.10.220 1 125.43.36.199 Oczywiście liczba połączeń SYN spadła.
|