Цель работы

Настроить интегрированную систему фильтрации трафика на сервере Ubuntu. Система должна блокировать доступ по IP-адресам (из файла ips.txt) и по строке User-Agent (из файла ua.txt), возвращая посетителю HTTP-код 403 Forbidden без выполнения редиректа.

Ключевые требования

  • Автоматическая загрузка списков IP и User-Agent из текстовых файлов после перезагрузки.
  • Использование ipset для эффективного хранения больших списков IP.
  • Настройка iptables для проверки User-Agent на L7-уровне (с помощью модуля u32 или string).
  • Безусловная блокировка с ответом 403 без изменения URL (не редирект, а полный отказ в доступе).
  • Защита доступа по SSH от блокирующих правил (белый список или исключение).
  • Поддержание системы в рабочем состоянии после каждого перезапуска сервера.

Инструкции по эксплуатации

Добавление IP или подсети

Вносите запись в формате (например, 1.2.3.4 или 5.6.7.8/24) в файл /etc/ips.txt. После внесения изменений вызовите скрипт обновления ipset, либо перезапустите службу ipset. Правила начнут действовать практически мгновенно.

Добавление User-Agent строки

Добавьте искомую фразу в файл /etc/ua.txt. Примените обновление iptables через специальную команду в рамках нашего скрипта (команда разделяется). Правила будут скомпилированы и активированы заново.

Проверка блокировки изнутри системы

curl -I -X GET 'https://my-server/' -H 'User-Agent: BadBot'

команда должна вернуть код 403. С обычным легитимным User-Agent должен проходить только трафик на порт SSH (22), всё остальное (если попадает в условие юзера-агента) - блокируется.

Принудительное отключение всей блокировки (аварийный случай)

systemctl stop ipset;
systemctl disable iptables-restore;
iptables -F;
iptables -X;

После отключения система откроет любой входящий TCP-доступ

Требования к системе автозагрузки рестарта

  • Создайте unit/proposition для ipset, который подкачивает адреса из ips.txt при запуске и старте рестарта сервера (встроенный хук netfilter-persistent)
  • Итоговые команды iptables должны сохраняться (iptables-persistent). При каждом имениии файла ua.txt должен происходить перезалив правил
  • SCRIPT должен выполнять HTTP-объяснение блок сообщение. Право интегрироваться в стандартом процесс.