README.md

Для защиты от небольшого DDOS я взял наиболее простой и быстрый с точки зрения производительности вариант: ipset + iptables. Если ваш канал и сервер в целом вывозят нагрузку и вас не блокирует провайдер, указанная связка будет наиболее лёгкой и эффективной с точки зрения потребления ресурсов.

Рассказываю, что делает скрипт с использованием iptables и ipset:

1️⃣ Проверяет установку ipset, создаёт списки.

2️⃣ Проверяет установку rsyslog, чтобы логировать заблокированные подключения. Это нужно на момент отладки и в обычное время, когда нет ддоса. Если начали ддосить, логирование надо отключить.

3️⃣ Создаёт конфигурацию rsyslog для хранения логов в отдельных файлах. Настраивает ротацию через logrotate.

4️⃣ Дальше идут переменные, касающиеся правил iptables: имя и ip адрес WAN интерфейса, белый список IP, с которых разрешено всё, разрешённые TCP и UDP порты, на которые мы принимаем соединения. Всё остальное блокируем.

5️⃣ Дальше идут наборы правил:

  • очистка всех правил
  • запрет всего, что не разрешено явно
  • разрешаем установленные соединения
  • разрешаем localhost и icmp
  • разрешаем исходящие соединения сервера
  • разрешаем все соединения от белого списка
  • блокируем неопознанные и нулевые пакеты
  • блокируем новые соединения без статуса NEW
  • блокируем списки ipset, которые формируются ниже
  • добавляем в список тех, кто открывает более 10-ти соединений с сервером в течении секунды, логируем таких товарищей
  • разрешаем доступ к открытым портам, в данном примере это порты 80, 443 TCP и 443 UDP
  • тех, кто обращается к другим портам, добавляем в список ipset
  • сохраняю все правила в файл

Сразу скажу, что я не занимался плотной отладкой этого набора правил в реальной ситуации. Набросал правила на основе своего опыта и протестировал в ручном режиме. Под реальной нагрузкой и спамом запросов не проверял.

Для проверки работы надо установить на сервере iptables, ipset, rsyslog:

apt install iptables ipset rsyslog

Скопировать и заполнить переменные в bash скрипте. Особое внимание уделить переменным WAN, WAN_IP, WLIST, WPORT_TCP, WPORT_UDP. На основе них будут сформированы правила iptables. Отдельного правила для SSH я не делал. Подразумевается, что подключаться куда-либо кроме открытых 80 и 443 портов можно только из списка WLIST. Туда можно добавлять IP адреса или подсети через запятую.

После выполнения скрипта, смотрим правила iptables:

iptables -L -v -n

Проверял работу так. Установил веб сервер. Попробовал с другой машины подключиться к серверу через telnet на любой отличный от HTTP порт:

telnet 85.143.173.182 23

Получил бан с занесением в список BANPORT. Смотреть этот список так:

ipset -L BANPORT

Далее установил ab и попробовал спам запросов в 50 потоков к веб серверу:

ab -c 50 -n 30000 "http://85.143.173.182/"

Получил бан с занесением в список BANDDOS. Оба бана были отражены в лог файлах ipset_portscan.log и ipset_ddos.log. При этом если ничего из описанного выше не делать, а просто ходить на веб сайт, доступ открыт, всё работает нормально.

⚡️На работающем сервере запускать такие скрипты не рекомендую, особенно если нет доступа к консоли. Сначала проверьте и отладьте на тестовой виртуалке. Убедитесь, что не отрубаете себе доступ. В целом, тут небольшой и относительно простой набор правил.

Конвейеры
0 успешных
0 с ошибкой