|
Коли я прийшов до компанії сьогодні вранці, я відчував себе досить повільно, коли увійшов на офіційний сайт компанії, увійшов на сервер, щоб перевірити статус доступу до офіційного сайту: [root@web ~]# netstat -anp |awk '{print $6}'|sort|uniq -c |sort -rn 172 ЗАСНОВАНИЙ 59 CONNECTED 589 SYN_RECV 15 ПОТІК SYN насправді настільки високий, що продовжуйте відстежувати SYN, надісланий цими IP-адресами: [root@tweb ~]# netstat -an | grep SYN | awk '{друк $5}' | awk -F: '{print $1}' | сортувати | uniq -c | sort -nr | більше 570 x.x.x.x (IP не записується, це IP компанії Shandong Zaozhuang Unicom), але ця одна IP надіслала так багато SYN-запитів, і конкурентність нашого веб-сервера не дуже висока, тому звичайні запити користувачів не можуть відповідати, і сторінку неможливо відкрити. Оскільки апаратний фаєрвол управляється ІТ-відділом групи, у мене немає повноважень, тому я можу лише частково вжити заходів на локальному сервері, щоб частково зменшити атаку на SYN. Перш за все, давайте поговоримо про принцип атаки в SYN: У протоколі TCP/IP протокол TCP забезпечує надійні сервіси з'єднання шляхом тристороннього рукостискання для встановлення з'єднання. Перше рукостискання: Під час встановлення з'єднання клієнт надсилає син-пакет (syn=j) на сервер і переходить у стан SYN_SEND, очікуючи підтвердження сервером. Друге рукостискання: Коли сервер отримує пакет SYN, він повинен підтвердити SYN клієнта (ack=j+1), а також надіслати пакет SYN (syn=k), тобто пакет SYN+ACK, після чого сервер переходить у стан SYN_RECV. Третє рукостискання: Клієнт отримує пакет SYN+ACK від сервера і надсилає пакет підтвердження ACK (ack=k+1) на сервер. Після трьох рукостискань клієнт і сервер починають передавати дані.
Якщо користувач ініціює запит на підключення до сервера, щоб потиснути руку вдруге, і не відповідає серверу, сервер продовжує чекати підтвердження користувача. Отже, ми робимо наступні зміни безпосередньо з SYN-з'єднання: Перевірте стандартну конфігурацію SYN у 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 — довжина черги SYN, і збільшення її довжини може вмістити більше мережевих з'єднань, які чекають на підключення. tcp_syncookies — це перемикач для увімкнення функції cookie SYN, яка може запобігти частковим атакам SYN. tcp_synack_retries і tcp_syn_retries визначають кількість повторних з'єднань для SYN і зменшують параметри за замовчуванням, щоб максимально контролювати кількість SYN-з'єднань. Нижче наведені параметри, які я змінив і які можна коригувати відповідно до реальної ситуації мого сервера: [root@web ~]# більше /etc/rc.d/rc.local #!/bin/sh # Цей скрип{фільтр}т буде виконаний *після* всіх інших init scrip{filter}ts. # Можеш додати сюди свої ініціалізаторні матеріали, якщо ні # хочу зробити повний стиль Sys V init. дотик /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 Щоб конфігурація набула чинності одразу без перезавантаження сервера, її можна виконати #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 Деяким людям подобається використовувати списки контролю доступу, щоб запобігти SYN-атакам, що певною мірою уповільнює SYN-атаки: Атака син-флудом #iptables -A INPUT -p tcp --syn -m limit --limit 1/s -j ПРИЙНЯТИ --limit 1/s обмежує кількість syn concurrency до 1 разу на секунду Антипортове сканування # iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT Пінг смерті # iptables -A FORWARD -p icmp --icmp-тип echo-request -m limit --limit 1/s -j ПРИЙНЯТИ #>iptables-save >/etc/sysconfig/iptables Щоб подивитися, #iptables -L ПРИЙНЯТИ tcp — будь-де і будь-де tcp-прапорці: FIN,SYN,RST,ACK/SYN обмеження: в середньому 1/сек burst 5 ACCEPT tcp — будь-де і будь-де tcp-прапорці: FIN,SYN,RST,ACK/RST обмеження: в середньому 1/сек burst 5 ПРИЙНЯТИ ICMP — будь-де і будь-де, обмеження запиту на ехо-запит ICMP: середній показник 1/сек 5 Перевірте з'єднання Syn ще раз: [root@web ~]# netstat -an | grep SYN | awk '{друк $5}' | awk -F: '{print $1}' | сортувати | uniq -c | sort -nr | більше 20 10.92.10.220 1 125.43.36.199 Очевидно, кількість SYN-з'єднань зменшилася.
|