Новости из Блогов Защита от Apache от DDOS-атак

Discussion in 'Мировые новости. Обсуждения.' started by Suicide, 23 Mar 2012.

  1. Suicide

    Suicide Super Moderator
    Staff Member

    Joined:
    24 Apr 2009
    Messages:
    2,482
    Likes Received:
    7,062
    Reputations:
    693
    Защита от Apache от DDOS-атак

    Пару недель назад позвонил один знакомый и пожаловался, что плохо работает сайт и канал поменяли на FTTX с xDSL и тариф выбрали со скоростью повыше, но помогло мало — пользователи жалуются на HTTP/1.1 403 Forbidden. Сервер настраивал им не я, благо что установлена Ubuntu 10.04 LTS — люблю продукты семейства long time support — очень уж они хорошо. Получив доступ начал ковырять систему — первое что бросилось в глаза — практически пустой фаейр — десятка 2 правил на вход-выход ЛВС и сайта в мир. Набрав в консоли команду
    Code:
    netstat -n --tcp | grep SYN_RECV
    — несколько секунд наблюдал строчки вида:
    Code:
    tcp     0   0 xxx.xxx.xxx.xxx:80    206.192.175.100:1084    SYN_RECV   
    tcp     0   0 xxx.xxx.xxx.xxx:80    206.192.175.100:1228    SYN_RECV   
    tcp     0   0 xxx.xxx.xxx.xxx:80    206.192.175.100:2652    SYN_RECV   
    tcp     0   0 xxx.xxx.xxx.xxx:80    206.192.175.100:3446    SYN_RECV
    Сразу стало понятно — что сайт завален большим количеством syn-пакетов, потому так плохо и работает.
    Удаленно ковырять файер не гут, потому ограничился минимумом — загнал в конфиг несколько дополнительных команд, заодно ограничил количество syn-пакетов до 500 в секунду, при превышении порога в 1500 — новые пакеты блокируются:

    — выполняем с консоли и добавляем в /etc/rc.local на случай перезагрузки:
    Code:
    echo "20000" > /proc/sys/net/ipv4/tcp_max_syn_backlog
    echo "1" > /proc/sys/net/ipv4/tcp_synack_retries
    echo "30" > /proc/sys/net/ipv4/tcp_fin_timeout
    echo "5" > /proc/sys/net/ipv4/tcp_keepalive_probes
    echo "15" > /proc/sys/net/ipv4/tcp_keepalive_intvl
    echo "20000" > /proc/sys/net/core/netdev_max_backlog
    echo "20000" > /proc/sys/net/core/somaxconn
    — добавляем в наш firewall-скрипт:
    Code:
    iptables -N syn_flood
    $IPT -A INPUT -p tcp --syn -j syn_flood
    $IPT -A syn_flood -m limit --limit 500/s --limit-burst 1500 -j RETURN
    $IPT -A syn_flood -j DROP
    Портянка netstat стала существенно короче, но в логи все равно периодически выскакивала HTTP/1.1 403 Forbidden. Пришлось поковырять настройки apache2 — оказалось что подгружен mod_evasive — модуль для защиты от DOS/DDOS-атак, в принципе модуль неплохой, но для больших сайтов не годиться, потому решил что лучше его выключить и положиться на файер и настройки ядра, которые я сделал выше. Несколько дней понаблюдал за логами — HTTP/1.1 403 Forbidden выскочила раза 2-3, на том мы и остановились.


    Вкратце о том что же за команды такие добавлены в настройки системы:

    — tcp_syncookies — SYN cookies не использует очередь SYN, вместо этого ядро отвечает на каждый SYN пакет, как обычно SYN|ACK, но при этом в пакет будет включено специально сгенерированное число на основе IP адресов и портов источника и получателя, а также времени посылки пакета. Соответственно атакующий никогда не получит эти пакеты, а поэтому и не ответит на них. При реальном запросе, будет отправлен третий пакет, который содержащий число, а сервер проверит был ли это ответ на SYN cookie и, если да, то разрешит соединение даже в том случае, если в очереди SYN нет соответствующей записи. (З.Ы.: доступен только когда ядро собрано с CONFIG_SYNCOOKIES — тогда по умолчанию должен быть равен — 1)

    tcp_max_syn_backlog — размер очереди half-open connection (полуоткрытых соединений), по-умолчанию колеблется в диапазоне 1024-2048, лучше задавать от 15000 и выше.

    tcp_synack_retries — определяет сколько разрешено попыток повторной передачи пакетов SYNACK для пассивных соединений TCP. Не должно превышать 255. По-умолчанию значение 5 соответствует приблизительно 180 секундам на выполнение попыток организации соединения. Урезаем примерно до 9 секунд — присваиваем — 1.

    tcp_fin_timeout — определяет время сохранения сокета в состоянии FIN-WAIT-2 после его закрытия локальной стороной. Запрашивающая сторона может не закрыть это соединение никогда, поэтому следует закрыть его по своей инициативе по истечении тайм-аута. По умолчанию тайм-аут составляет 60 секунд, в некоторых старых ядрах linux — было 180 секунд. Если у WEB-сервера очень высокая нагрузкая смело поджимайте до 20-30.

    tcp_keepalive_probes — определяет keepalive-запросов, после которого соединение считается разорванным, По-умолчанию передается 9 запросов. Так как каналы у всех достаточно быстрые — жмем до 5, в принципе проблем не замечено и при 4, но когда из Нижних дыр юзеры лезут по диал-ап — могут быть проблемы.

    tcp_keepalive_intvl — определяет интервал передачи проб. Вычисляется как [tcp_keepalive_probes]*[tcp_keepalive_intvl] — результат дает нам время, по истечении которого соединение будет разорвано при отсутствии откликов. По умолчанию установлен интервал 75 секунд, таким образом разрыв соединения произойдет примерно через 675 секунд (больше 10 минут!!!!).

    netdev_max_backlog — определяет максимальное количество пакетов в очередь на обработку если интерфейс получает пакеты быстрее, чем ядро может их обработать. Для современного железа можно задавать высокие показатели, по-умолчанию 1000.

    somaxconn — определяет максимальное число открытых сокетов, ждущих соединения.


    З.Ы.: Если нужны более детальные описания — гугл в помощь, собственно описания команд в нем и нарыты, мною применено на реалии и обобщены. Как говориться Америку я не открыл, но может кому помог.


    Запись от 20 марта 2012
    greg_b
    http://sysadminblog.ru/linux/2012/03/20/zaschita-ot-apache-ot-ddos-atak.html
    http://sysadminblog.ru/ - SysAdminBlog Блоги сисадминов.
     
    _________________________
    #1 Suicide, 23 Mar 2012
    Last edited: 23 Mar 2012
  2. Ice_Burn

    Ice_Burn Member

    Joined:
    10 Feb 2009
    Messages:
    217
    Likes Received:
    26
    Reputations:
    1
    Книгу случ не посоветуете по настройке сервака под *unix ?
     
  3. [BES]

    [BES] Banned

    Joined:
    26 Jul 2009
    Messages:
    57
    Likes Received:
    68
    Reputations:
    1
    #3 [BES], 23 Mar 2012
    Last edited: 23 Mar 2012
Loading...