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 с ошибкой