Блокировка Tor в nginx
Источник: https://gongled.ru/2017/01/03/how-to-block-tor-network-in-nginx.html
Недобросовестные предприниматели часто заказывают DDoS-атаки на проекты конкурентов. Последствиями таких нападений становятся репутационные потери и издержки, вызванные недоступностью ресурса для партнеров и клиентов.
Сайты часто атакуют на уровне приложения из сети Tor: это страницы со сложными фильтрами и поиском, обработка которых замедляет работу сервиса. Такой любительский DDoS несложно отразить.
Идея защитной стратегии — блокировка HTTP-запросов из подсетей Tor network. Проект Tor Project регулярно обновляет списки выходных узлов сети в формате TorDNSEL:
[...] ExitNode FF0D1841086637CA0920E21AFA4C6A43905EA2BD Published 2017-01-02 11:00:24 LastStatus 2017-01-02 12:03:41 ExitAddress 45.76.159.203 2017-01-02 12:12:29 ExitNode FFB8575D7C8E40AC6E48C1B7AA32AC7701E04AB9 Published 2017-01-01 16:10:32 LastStatus 2017-01-01 20:03:40 ExitAddress 80.15.98.127 2017-01-01 18:10:35 ExitNode FFB94702D023B6F824D8B3BC68F33EA02AFA70D8 Published 2017-01-02 08:37:56 LastStatus 2017-01-02 09:02:40 ExitAddress 51.15.39.2 2017-01-02 09:07:51
Загрузка
curl -Ls https://check.torproject.org/exit-addresses | grep ExitAddress | awk '{print $2}' | sort | uniq > tor.list
Полученный список приводим к формату файла в ngx_http_geo_module
и используем вместе с опцией include
для объявления переменной:
geo $is_tor { default 0; include /etc/nginx/conf.d/tor.list; }
В секции server
виртуального хоста указываем условие или объявляем формат для логирования запросов:
if ($is_tor) { return 403; }
Рекомендую также поэкспериментировать со ответами веб-сервера: иногда атакующий прекращает DDoS при получении статус-кодов 5XX. Ещё один верный способ — закрывать соединение с помощью внутреннего кода 444. Я подготовил скрипт, где всё уже работает.
Обсуждение