|
ХакерТова е желана и обещаваща кариера. Оценявам добрите хакери и мразя лошите хакери. Така нареченият лош хакер е човекът, който кара някой от другата страна да работи извънредно. SYN Flood атаките са типични атаки за отказ на услуга. Т.нар. атака за отказ на услуга е да се постигне косвено целта на атаката, като се направи жертвният хост или мрежа неспособен да предостави качествена услуга. Хакерите обичат да играят това, за да покажат, че са уравновесени, способни и смели, като карат другата страна да работи извънредно, но всъщност това не е нищо. 1: Какво е атака SYN Flood? SYN Flood атаките използват тристранния ръкостискащ процес на TCP протокола в IPv4. Този протокол постановява, че ако единият край иска да инициира TCP връзка към другия край, първо трябва да изпрати TCP SYN (синхронизиране) пакет на другата страна, а другата страна изпраща TCP SYN + ACK пакет обратно след получаването му, след което инициаторът изпраща TCP ACK (ACKnowledge Character) пакет обратно, така че трите ръкостискания приключват. В горния процес има някои важни концепции: Опашката не е свързана: В протокола за тристранно ръкостискане сървърът поддържа несвързана опашка, която отваря запис за SYN пакета на всеки клиент (syn=j), който показва, че сървърът е получил SYN пакета и изпраща потвърждение на клиента, очаквайки потвърждението на клиента. Връзката, идентифицирана от тези записи, е в Syn_RECV състояние на сървъра и когато сървърът получи потвърждаващ пакет от клиента, записът се изтрива и сървърът влиза в състояние УСТАНОВЕНО. С други думи, когато TCP сървърът получи пакета за заявка TCP SYN, преди да изпрати TCP SYN+ACK пакета обратно към TCP клиента, TCP сървърът първо трябва да отдели област с данни, която да обслужва TCP връзката, формирана от тази ръка. Обикновено състоянието на връзка, когато SYN пакетът е получен, но ACK пакетът все още не е полученПолуотворена връзка(Полуотворена връзка)。 Параметър за натрупване: Показва максималния брой несвързани опашки. SYN-ACK брой повторни предавания: След като сървърът изпрати пакета SYN-ACK, ако пакетът за потвърждение на клиента не бъде получен, сървърът извършва първото повторно предаване, изчаква известно време и не получава пакета за потвърждение на клиента, и извършва второто повторно предаване; ако броят на повторните предавания надвишава максималния брой повторни предавания, определен от системата, системата изтрива информацията за връзката от опашката за полувръзка. Имайте предвид, че времето за изчакване при всяко повторно преминаване не е непременно еднакво. Полусвързано време за оцеляване: Отнася се до максималното време, през което запис в опашката за полувръзка оцелява, тоест максималното време от момента, в който услугата получава SYN пакета, до момента, в който пакетът е потвърден като невалиден, а времевата стойност е сумата от максималното време за изчакване за всички пакети за повторно изпращане. Понякога наричаме полусвързаното време за оцеляване време SYN_RECV време за оцеляване. При най-честата SYN flood атака нападателят изпраща голям брой TCP SYN пакети на жертвата за кратък период от време, като в този момент нападателят става TCP клиентът, а жертвата – TCP сървърът. Според описанието по-горе, жертвата би присвоила конкретна зона за данни на всеки TCP SYN пакет, стига SYN пакетите да имат различни изходни адреси (което би било лесно за нападателите да фалшифицират). Това ще натовари TCP сървърната система и в крайна сметка ще доведе до неправилна работа. 2. Принципът на бисквитките SYN Един от начините за ефективно предотвратяване на атаки SYN Flood са SYN бисквитките. SYN Cookie Причина D. Изобретен от Дж. Бърнстейн и Ерик Шенк. SYN бисквитките са модификация на TCP сървърния протокол за тристранно ръкостискане, за да се предотвратят атаки с SYN Flood.Нейният принцип е:Когато TCP сървърът получи TCP SYN пакет и върне TCP SYN+ACK пакет, той не отделя отделна област за данни, а изчислява стойност на бисквитки въз основа на този SYN пакет. Когато се получи TCP ACK пакет, TCP сървърът проверява легитимността на TCP ACK пакета въз основа на тази стойност на бисквитките. Ако е законно, се отделя специална област за данни за обработка на бъдещи TCP връзки. Нека поговорим за това как да конфигурираме параметрите на ядрото за реализиране на SYN бисквитки в Linux и FreeBSD Трето: Linux настройки Ако конфигурацията на сървъра ви не е добра, броят на TCP TIME_WAIT сокети достига 20 000 или 30 000 и сървърът лесно може да бъде издърпан до смърт. Чрез промяна на параметрите на ядрото на Linux може да се намали броят на TIME_WAIT сокети на сървъра. TIME_WAIT може да се види със следната команда: - 以下是代码片段:
- netstat -an | grep "TIME_WAIT" | wc -l
Копирай кодВ Linux, като CentOS, това може да се постигне чрез модифициране на файла /etc/sysctl.conf. Добавете следните редове: - 以下是代码片段:
- 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
Копирай кодИлюстрирам: net.ipv4.tcp_syncookies = 1 означава, че SYN бисквитките са активирани, което е BOOLEAN. Когато SYN чака опашката да се препълни, активирайте бисквитките да се справят с нея, което може да предотврати малък брой SYN атаки, и по подразбиране е 0, което означава, че е затворена. net.ipv4.tcp_tw_reuse = 1 означава, че повторната употреба е активирана, което е BOOLEAN. Позволява повторно използване на TIME-WAIT сокети за нови TCP връзки, като по подразбиране е 0, което означава затваряне; net.ipv4.tcp_tw_recycle = 1 означава да се позволи бързо рециклиране на TIME-WAIT сокети в TCP връзки, което е булево значение, а по подразбиране е 0, което означава, че е затворен. net.ipv4.tcp_fin_timeout = 30 означава, че ако сокет е затворен чрез локална заявка, този параметър определя колко дълго ще остане в състояние FIN-WAIT-2. Единицата е секундна. net.ipv4.tcp_keepalive_time = 1200 показва колко често TCP изпраща keepalive съобщения, когато се използва keepalive. По подразбиране са 2 часа, променени на 20 минути. Единицата е секундна. net.ipv4.ip_local_port_range = 1024 65000 показва обхвата на портовете, използвани за външни връзки. Стандартният калъф е малък: 32768 до 61000, променен на 1024 на 65000. net.ipv4.tcp_max_syn_backlog = 8192 показва дължината на SYN опашка, която по подразбиране е 1024, а дължината на увеличената опашка е 8192, за да се осигурят повече мрежови връзки, чакащи връзка. net.ipv4.tcp_max_tw_buckets = 5000 означава максималния брой сокети, които системата поддържа TIME_WAIT едновременно, и ако това число бъде надвишено, TIME_WAIT гнезда се изчистват незабавно и се отпечатва предупредително съобщение. По подразбиране е 180000, променено на 5000. За сървъри като Apache и Nginx параметрите в предишните редове могат TIME_WAIT да намалят броя на сокетите, но при Squid ефектът не е добър. Този параметър контролира максималния брой TIME_WAIT сокета, за да предотврати изтеглянето на Squid сървъра от голям брой TIME_WAIT сокета. net.ipv4.tcp_synack_retries и net.ipv4.tcp_syn_retries определят броя на повторенията на SYN. Изпълнете следната команда, за да накарате конфигурацията да влезе в сила: Ако не искате да модифицирате /etc/sysctl.conf, можете също да използвате командата за това: - 以下是代码片段:
- /sbin/sysctl -w key=value
Копирай кодЧетвърто, създаден под FreeBSD Личната гледна точка на Yayu за учене: защитата срещу syn в FreeBSD може да не е същата като в Linux, конфигурираните параметри не са напълно еднакви и съответната конфигурация и разбиране може да не са правилни :) Има такъв в TCP линкаMSL (максимален живот на сегментите)Концепцията заМаксимално време за генериранеMSL стойността се приема за 30 секунди в общи имплементации, а някои реализации отнемат 2 минути. "Пасивно изключване" в машината на състоянието TCP: От CLOSE_WAIT до LAST_ACK има следното правило: Когато TCP извърши активно изключване и върне последния ACK, връзката трябва да остане в състояние TIME_WAIT два пъти по-дълго от MSL. Това позволява на TCP да изпрати последния ACK отново, ако се загуби (другият край излиза и преизпраща последния FIN). Съществуването на това правило води до това, че връзката (клиентски адрес, порт и сървърен адрес, порт) на този адрес не може да се използва през този 2*MSL период. Например, ако затворим връзка след създаването ѝ и бързо я рестартираме, тогава портът ще бъде недостъпен. TIME_WAIT време е 2*MSL. Така че можете да намалите времето TIME_WAIT, като коригирате net.inet.tcp.msl. За уеб сървъра тази стойност може да се коригира до 7500 или 2000 (достъп до уеб, страницата не може да се флашва повече от 4~15 секунди, можеш да обмислиш да се откажеш от -_-) Референция за настройка на параметри: - 以下是引用片段:
- 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
Копирай кодВъв FreeBSD yayu не видя команда като "/sbin/sysctl -p", която да направи съдържанието на /etc/sysctl.conf ефективно, затова просто използва командата: - 以下是代码片段:
- sysctl net.inet.tcp.syncookies=1 net.inet.tcp.msl=7500 net.inet.tcp.blackhole=2 net.inet.udp.blackhole=1
Копирай код
|