|
HakerTo pożądana i obiecująca kariera. Doceniam dobrych hakerów i nienawidzę złych hakerów. Tak zwany zły haker to ktoś, kto sprawia, że ktoś po drugiej stronie pracuje po godzinach. Ataki SYN Flood to typowy atak typu denial of service. Tak zwany atak typu denial of service ma na celu pośrednie osiągnięcie celu ataku poprzez uniemożliwienie ofierze hosta lub sieci zapewnienia dobrej usługi. Hakerzy lubią grać w tę grę, by pokazać, że są wyrównani, zdolni i odważni, zmuszając przeciwników do pracy na pełnych obrotach, ale w rzeczywistości to nic. 1: Czym jest atak SYN Flood? Ataki SYN Flood wykorzystują trójstronny proces handshake protokołu TCP w IPv4. Protokół ten stanowi, że jeśli jedna strona chce zainicjować połączenie TCP z drugą stroną, musi najpierw wysłać pakiet TCP SYN (synchronize) do drugiej strony, a druga strona wysyła pakiet TCP SYN + ACK po jego otrzymaniu, a następnie inicjator wysyła pakiet TCP ACK (znak ACKnowledge), tak aby trzy uściski ręki zakończyły się. W powyższym procesie pojawia się kilka ważnych pojęć: Kolejka nie jest połączona: W protokole trzystronnego handshake serwer utrzymuje niepołączoną kolejkę, która otwiera wpis dla każdego pakietu SYN klienta (syn=j), wskazujący, że serwer otrzymał pakiet SYN i wysyła potwierdzenie klientowi, oczekując na pakiet potwierdzający od klienta. Połączenie zidentyfikowane przez te wpisy znajduje się w stanie Syn_RECV na serwerze, a gdy serwer otrzyma pakiet potwierdzenia od klienta, wpis jest usuwany, a serwer wchodzi w stan USTANOWIONY. Innymi słowy, gdy serwer TCP otrzymuje pakiet żądania TCP SYN, przed wysłaniem pakietu TCP SYN+ACK z powrotem do klienta TCP, serwer TCP musi najpierw przydzielić obszar danych do obsługi połączenia TCP utworzonego przez tę rękę. Zazwyczaj stan połączenia pojawia się w momencie, gdy pakiet SYN zostaje odebrany, ale pakiet ACK jeszcze nie został odebranyPółotwarte połączenie(Półotwarte połączenie)。 Parametr backlogu: Wskazuje maksymalną liczbę niepołączonych kolejek. Liczba retransmisji SYN-ACK: Po wysłaniu pakietu SYN-ACK przez serwer, jeśli pakiet potwierdzenia klienta nie zostanie odebrany, serwer wykonuje pierwszą ponowną transmisję, czeka przez pewien czas i nie otrzymuje pakietu potwierdzającego klienta, a następnie wykonuje drugą retransmisję; jeśli liczba ponownych transmisji przekracza maksymalną liczbę powtórzeń określoną przez system, system usuwa informacje o połączeniu z kolejki półpołączenia. Należy zauważyć, że czas oczekiwania na każde ponowne przepuszczenie nie musi być taki sam. Półpołączony czas przetrwania: Odnosi się do maksymalnego czasu, przez jaki wpis w kolejce półpołączenia przeżywa, czyli maksymalnego czasu od momentu otrzymania pakietu SYN przez usługę do momentu potwierdzenia jego nieprawidłowości, a wartość czasu to suma maksymalnego czasu oczekiwania wszystkich pakietów żądań ponownej transmisji. Czasem nazywamy też półpołączony czas przetrwania SYN_RECV czasem przetrwania. W najczęstszym ataku zależnym SYN atakujący wysyła ofierze dużą liczbę pakietów TCP SYN w krótkim czasie, w którym atakującym jest klient TCP, a ofiarą serwer TCP. Zgodnie z powyższym opisem, ofiara przypisywałaby konkretną strefę danych do każdego pakietu TCP SYN, pod warunkiem, że pakiety SYN miały różne adresy źródłowe (co łatwo byłoby podrobić dla atakujących). To wywiera duże obciążenie na system serwera TCP i ostatecznie powoduje, że system nie będzie działał prawidłowo. 2. Zasada ciasteczek SYN Jednym ze sposobów skutecznego zapobiegania atakom SYN Flood są ciasteczka SYN. SYN Cookie Powód D. Wynaleziono przez J. Bernstaina i Erica Schenka. Ciasteczka SYN to modyfikacja protokołu TCP po stronie serwera i trójstronnego handshake, mająca na celu zapobieganie atakom SYN Flood.Jej zasada to:Gdy serwer TCP otrzymuje pakiet TCP SYN i zwraca pakiet TCP SYN+ACK, nie przydziela dedykowanego obszaru danych, lecz oblicza wartość ciasteczka na podstawie tego pakietu SYN. Gdy otrzymany jest pakiet ACK TCP, serwer TCP sprawdza jego wiarygodność na podstawie wartości ciasteczka. Jeśli jest to legalne, przydzielany jest dedykowany obszar danych do obsługi przyszłych połączeń TCP. Porozmawiajmy o tym, jak skonfigurować parametry jądra, aby zaimplementować ciasteczka SYN w Linuksie i FreeBSD Po trzecie: Ustawienia Linuksa Jeśli konfiguracja serwera nie jest dobra, liczba gniazd TCP TIME_WAIT sięga 20 000 lub 30 000, a serwer może być łatwo przeciągnięty do końca. Poprzez modyfikację parametrów jądra Linuksa można zmniejszyć liczbę TIME_WAIT gniazd na serwerze. TIME_WAIT można wyświetlić za pomocą następującego polecenia: - 以下是代码片段:
- netstat -an | grep "TIME_WAIT" | wc -l
Skopiuj kodNa Linuksie, takim jak CentOS, można to osiągnąć, modyfikując plik /etc/sysctl.conf. Dodaj następujące linie: - 以下是代码片段:
- 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
Skopiuj kodIlustrują: net.ipv4.tcp_syncookies = 1 oznacza, że ciasteczka SYN są włączone, co jest BOOLEEM. Gdy SYN czeka, aż kolejka się przepełni, włącz ciasteczka, aby się z nią poradzić, co może zapobiec niewielkiej liczbie ataków SYN, a domyślnie jest 0, co oznacza, że jest zamknięta. net.ipv4.tcp_tw_reuse = 1 oznacza, że ponowne użycie jest włączone, co jest BOOLEEM. Pozwala na ponowne użycie gniazd TIME-WAIT dla nowych połączeń TCP, domyślnie ustawionych na 0, co oznacza zamknięcie; net.ipv4.tcp_tw_recycle = 1 oznacza umożliwienie szybkiego recyklingu gniazd TIME-WAIT w połączeniach TCP, co jest BOOLEEM, a domyślne jest 0, co oznacza, że jest zamknięte. net.ipv4.tcp_fin_timeout = 30 oznacza, że jeśli gniazdo zostanie zamknięte przez lokalne żądanie, ten parametr określa, jak długo pozostanie ono w stanie FIN-WAIT-2. Jednostka to sekundy. net.ipv4.tcp_keepalive_time = 1200 wskazuje, jak często TCP wysyła wiadomości keepalive, gdy używa się keepalive. Domyślnie to 2 godziny, zmienione na 20 minut. Jednostka to sekundy. net.ipv4.ip_local_port_range = 1024 65000 oznacza zakres portów używanych do połączeń zewnętrznych. Domyślna przypadka jest mała: 32768 do 61000, zmieniona na 1024 na 65000. net.ipv4.tcp_max_syn_backlog = 8192 oznacza długość kolejki SYN, która domyślnie wynosi 1024, a długość zwiększonej kolejki to 8192, aby pomieścić więcej połączeń sieciowych oczekujących na połączenie. net.ipv4.tcp_max_tw_buckets = 5000 oznacza maksymalną liczbę gniazd, jaką system utrzymuje w TIME_WAIT jednocześnie, a jeśli ta liczba zostanie przekroczona, TIME_WAIT gniazd zostanie natychmiast usuniętych i wydrukowany zostanie komunikat ostrzegawczy. Domyślna wartość to 180000, zmieniona na 5000. Dla serwerów takich jak Apache i Nginx parametry z poprzednich linii mogą TIME_WAIT zmniejszyć liczbę gniazd, ale w przypadku Squid efekt ten nie jest duży. Ten parametr kontroluje maksymalną liczbę gniazd TIME_WAIT, aby zapobiec przeciąganiu serwera Squid przez dużą liczbę gniazd TIME_WAIT. net.ipv4.tcp_synack_retries i net.ipv4.tcp_syn_retries definiują liczbę powtórzeń SYN. Wykonaj następujące polecenie, aby konfiguracja zadziałała: Jeśli nie chcesz modyfikować /etc/sysctl.conf, możesz też użyć polecenia, aby to zrobić: - 以下是代码片段:
- /sbin/sysctl -w key=value
Skopiuj kodPo czwarte, skonfigurowane pod FreeBSD Osobisty punkt widzenia yayu: obrona przed syn w FreeBSD może nie być taka sama jak w Linuksie, skonfigurowane parametry nie są dokładnie takie same, a odpowiednia konfiguracja i rozumienie mogą być nieprawidłowe :) Jest jeden w łączu TCPMSL (maksymalny czas życia segmentu)KoncepcjaMaksymalny czas generowaniaWartość MSL jest przyjmowana przez 30 sekund w ogólnych implementacjach, a niektóre wymagają 2 minut. "Pasywne wyłączanie" w maszynie stanów TCP: Od CLOSE_WAIT do LAST_ACK obowiązuje następująca zasada: Gdy TCP wykonuje aktywne wyłączenie i wysyła ostatni ACK, połączenie musi pozostać w stanie TIME_WAIT dwa razy dłużej niż MSL. Pozwala to TCP wysłać ostatni ACK ponownie w razie jego utraty (drugi koniec wygasa i wysyła ostatni FIN). Istnienie tej reguły oznacza, że łącze (adres klienta, port i adres po stronie serwera, port) na tym miejscu nie może być używane w tym czasie 2*MSL. Na przykład, jeśli zamkniesz link po jego utworzeniu, a następnie szybko go zrestartujemy, port będzie niedostępny. TIME_WAIT czas to 2*MSL. Możesz więc skrócić TIME_WAIT czas, dostosowując net.inet.tcp.msl. Dla serwera WWW tę wartość można dostosować do 7500 lub 2000 (dostęp do sieci internetowej – strona nie może być wgrana dłużej niż 4~15 sekund, można rozważyć rezygnację z -_-) Odniesienie do ustawienia parametrów: - 以下是引用片段:
- 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
Skopiuj kodNa FreeBSD yayu nie widział polecenia typu "/sbin/sysctl -p", które mogłoby sprawić, że zawartość /etc/sysctl.conf będzie skuteczna, więc po prostu użył polecenia: - 以下是代码片段:
- sysctl net.inet.tcp.syncookies=1 net.inet.tcp.msl=7500 net.inet.tcp.blackhole=2 net.inet.udp.blackhole=1
Skopiuj kod
|