Защита от DDoS с iptables, готовый скрипт

Защита от DDoS с iptables, готовый скрипт

Надоели атаки на компьютер или на сервер, то я покажу готовый и хороший скрипт для решение DDoS атак на ваш сервер.

Сейчас я расскажу, про виды которые часто используются для защиты серверов или сайтов.

  1. Защита на уровне PHP. Честно, не могу врубится в работу этой логики. То есть, нужно запретить доступ для ботов на этот уровень, чтобы не было огромной нагрузки. Не очень хорошее решение!
  2. Защита на уровне Apache. Есть модуль mod_evasive, но толку от него тоже не сильно много, не больше чем от PHP!
  3. Защита на уровне nginx. Самый оптимальный вариант для решение многих атак. Можно прокешировать все страницы и энжинкс будет отдавать страницы почти без нагрузки на процессор. Только канал будет нагружаться весьма прилично. Также можно настроить и использовать  limit_req.
  4. Защита на уровне iptables. Это один из самых эффективных и надежных способов защиты вашего сервера от различных атак.

Для получения списка доступных модулей для IPTables, выполните:

# ls /lib/modules/$(uname -r)/kernel/net/ipv4/netfilter/

Чтобы получить информацию о всех модулях:

# modinfo /lib/modules/$(uname -r)/kernel/net/ipv4/netfilter/*.ko

Защита от атаки с использованием SYN flood.

Одна из распространенных DoS атак — это посылка  очень большого числа SYN пакетов к серверу.

Чтобы узнать о атаке SYN служит команда netstat, которая показывает список открытых подключений на сервере:

# netstat -n --tcp | grep SYN_RECV

Так же, можно подсчитать их количество, выполнив:

# netstat -n --tcp | grep SYN_RECV | wc -l

Первое что необходимо сделать, так это установить опцию tcp_syncookies в значение 1, посмотреть можно так:

# cat /proc/sys/net/ipv4/tcp_syncookies

Следующим действием служит увеличения очереди открытых соединений — tcp_max_syn_backlog, например до (но сначала проверим сколько сейчас):

# cat /proc/sys/net/ipv4/tcp_max_syn_backlog

Чтобы увеличить, выполните:

# echo "40000" > /proc/sys/net/ipv4/tcp_max_syn_backlog

Так же, уменьшаем время ожидания соединения — это параметр tcp_synack_retries,но посмотрим сколько имеется на данный момент:

# cat /proc/sys/net/ipv4/tcp_synack_retries

Уменьшим их до 1. Данный параметр говорит что будет ожидаться соединения около 9 секунд:

# echo "1" > /proc/sys/net/ipv4/tcp_synack_retries

Уменьшаем параметр tcp_fin_timeout — который определяет время хранения сокета в состоянии FIN-WAIT-2 и после чего будет закрыт на локальной стороне (выводим сколько сейчас):

# cat /proc/sys/net/ipv4/tcp_fin_timeout

Изменим данный параметр и уменьшим его до 30:

# echo "30" > /proc/sys/net/ipv4/tcp_fin_timeout

Уменьшаем опцию tcp_keepalive_probes  — это число служит для передачи проб keepalive, по завершению, соединение будет считаться разорванным. Данный параметр имеет 9 проб по умолчанию. Чтобы посмотреть какое число имеет данный параметр, используйте:

# cat /proc/sys/net/ipv4/tcp_keepalive_probes

Убавим его до 5:

# echo "5" > /proc/sys/net/ipv4/tcp_keepalive_probes

Опция tcp_keepalive_intvl задает интервал передачи для проб и по умолчанию, имеет число 75 сек. Уменьшим данный параметр, но прежде убедимся что он уже не прописан оптимальным:

# cat /proc/sys/net/ipv4/tcp_keepalive_intvl

Выставим его в 15:

# echo "15" > /proc/sys/net/ipv4/tcp_keepalive_intvl

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

# cat /proc/sys/net/core/netdev_max_backlog

Увеличиваем его до 20к:

# echo "20000" > /proc/sys/net/core/netdev_max_backlog

Выставляем оптимальное цисло для somaxconn который задает максимальное число всех открытых сокетов которые ждут соединения. Его нужно увеличить:

# cat /proc/sys/net/core/somaxconn

Увеличим:

# echo "20000" > /proc/sys/net/core/somaxconn

Прописываем еще один не маловажный параметр:

# echo 1 > /proc/sys/net/ipv4/tcp_syncookies

PS: Данные применения для опций ядра не сохраняются после перезагрузки ОС, то их нужно добавить  в /etc/rc.local:

# 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

После чего, нужно добавить ограничения в iptables:

# iptables -N syn_flood
# iptables -A INPUT -p tcp --syn -j syn_flood
# iptables -A syn_flood -m limit --limit 500/s --limit-burst 2000 -j RETURN
# iptables -A syn_flood -j DROP

В данных правилах, я задал определенное число для новых SYN пакетов ( 500 за сек), и если привысит ограничение 2000, то все новые новые пакеты будут заблокированы.

Добавляем в iptables еще полезные опции:

# iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP

Установить SYN и FIN:

# iptables -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP

Установить SYN и RST:

# iptables -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP

Установить FIN и RST:

# iptables -A INPUT -p tcp --tcp-flags FIN,RST FIN,RST -j DROP

Установить FIN, без ожидаемого сопутствующего ACK:

# iptables -A INPUT -p tcp --tcp-flags ACK,FIN FIN -j DROP

Установить PSH,без ожидаемого сопутствующего ACK:

# iptables -A INPUT -p tcp --tcp-flags ACK,PSH PSH -j DROP

Установить URG, без ожидаемого сопутствующего ACK:

# iptables -A INPUT -p tcp --tcp-flags ACK,URG URG -j DROP

Приведу скрипт, который нашел в интернете для зашиты от DDoS атак с использованием ipset. Почему именно я использую ipset а не iptables? Да все потому что, после блокировки больше чем 100 IP  адресов iptables начинает тормозить весь сервер.

PS: нужно установить пакет ipset. Если не знаете как, то можете воспользоваться инструкцией что ниже.

Установка IPset.

Для Redhat’s ОС:

# yum install ipset

Для Debian’s ОС:

# apt-get install ipset

После установки добавлем правило блокировки в iptables:

# iptables -I INPUT 1 -m set --set dos src -j DROP

dos — это таблица из ipset.

Следующим шагом необходимо создать хеш для таблицы dos:

# ipset -N dos iphash

ВНИМАНИЕ! При необходимости можно заблокировать даже всю подсети, но для этого вместо iphash стоит использовать nethash.

После завершения  необходимо сохранить все правила iptables:

#/sbin/service iptables save

Собственно, все уже готово, за исключением скрипта который будет блокировать флуд на сервере.

Вы его можете прочитать и поглядеть тут, чтобы скачать себе на сервер выполните команду:

# wget http://linux-notes.org/wp-content/uploads/scripts/Anti_SYN_Flood_IPTables.sh

После чего, запускаем скачанный скрипт:

# bash Anti_SYN_Flood_IPTables.sh

Стоит заметить, что целесообразно установить данный скрипт на выполнение в crontab на каждые 1-5 минут. Промежуток выберите сами. Если не знаете как, то можете воспользоваться моей инструкцией:

создать cron задание

Чтобы вывести все заблокированные IP адресы, выполняем команду:

# ipset -L | head

Более подробно о ipset я расскажу в своей статье:

Установка ipset в Linux (centOS/Debian/Ubuntu)

Защита от DDos атаки

Атаку можно найти если выполнить команду:

# netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n

Остальное будет скоро 😉

Вот еще полезный материал:

21 пример использования iptables для администраторов

Как настроить Iptables в CentOS

Как заблокировать IP адрес с помощью iptables на Linux

Настройка IPtables для web сервера на RedHat/CentOS/Fedora

На этом тема «Защита от DDoS с iptables, готовый скрипт» подошла к завершению. Надеюсь поможет этот скрипт, как помог он мне.

9 thoughts on “Защита от DDoS с iptables, готовый скрипт

    • Что вы имеете ввиду?
      Нужно подправить IP адрес в самом файле, остальное можно оставить таким же.

    • Нет, когда начинается DDos просто выполните этот скрипт:
      # sudo /путь_где_он_лежит/Anti_SYN_Flood_IPTables.sh

      Он запустится и должен помочь. Только не забываем подправить скрипт по себя ( необходимо сменить ИП адрес на свой).

  1. Уважаемый CAPTAIN — можно краткую инструкцию для чайника, по номерами, типа такую:
    1)закачиваешь файл Anti_SYN_Flood_IPTables.txt туда то…
    2)меняешь в нем ИП
    3)конфиг такой то там, можешь поправить под себя…
    4)запускаешь при помощи …, вот так…
    Буду ну ппц как признателен тебе. И думаю не только я.

    • Александр, на момент написание статьи, данный скрипт работал. Я его переписал на более оптимальный вариант. Пожалуйста ознакомьтесь, будет полезно. Данный скрипт работает лучше и не нагружает сервер, т.к я использую ipset (до этого использовался именно iptables). Спасибо за уместное замечание что нужно более подробно описывать все шаги.

  2. В общем пытался методом тыка, не получилось. Когда выполняю через ssh то пишет что команды не существует. Я явно что то не то делаю….

  3. Как правильно редактировать файл? Вот такие ошибки:

    Anti_SYN_Flood_IPTables.sh: line 17: $’\r’: команда не найдена
    Anti_SYN_Flood_IPTables.sh: line 19: syntax error near unexpected token `>’
    Anti_SYN_Flood_IPTables.sh: line 19: `for i in `netstat -ntu | grep SYN_RECV | awk ‘{print $5}’ | cut -f1 -d «:» | sort | uniq | grep -v ${serverip}` do ipset -‘ dos $i done ipset -S > /etc/sysconfig/ipset

    Система Дебиан 7 КВМ

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.