Как наиболее эффективно заблокировать доступ к 8-10к IP-адресам?
На моем сервере работает EngineX на Debian.
Если возможно, я хотел бы показать всем адресам внутреннюю ошибку сервера (500).
IP-адреса разбросаны по отдельным подмножествам.
если адреса сгруппированы в одну или несколько непрерывных подсетей [например, несколько / 24сек] - я бы создал простое правило предварительной маршрутизации, которое будет передавать весь трафик на порт 80 от них к чему-либо, прослушивающему порт 81 [например, vhost от nginx], которое будет просто обслуживать страница ошибки:
iptables -t nat -A PREROUTING -p tcp -s 194.88.0.0/16 --dport 80 -j REDIRECT --to 81
если это 8-10k уникальных IPS, разбросанных «повсюду» ... это будет интересно; -] - я бы все равно пошел по сценарию выше, но для сопоставления я бы использовал ipset. что-то вроде этого:
ipset --create ban iphash
ipset --add ban 80.1.2.3
ipset --add ban 90.4.5.6
ipset --add ban 153.17.18.19
# ....
iptables -t nat -A PREROUTING -p tcp -m set --set ban src --dport 80 -j REDIRECT --to 81
Если у вас есть список этих адресов в файле, вы можете попробовать следующее в конфигурации Nginx:
1 Определите IP-группу с помощью директивы geo (внутри блока http):
http { ... geo $block { default 0; include blacklist; } ... }
Это означает, что по умолчанию переменная $ block будет установлена в 0.
2 Подготовьте файл черного списка, который будет выглядеть следующим образом:
192.168.0.0/24 1; 192.168.2.0/24 1; 10.0.0.0/8 1;
То есть установите для этих адресов переменную $ block равной 1.
3 Внутри блока `location 'проверьте эту переменную и сообщите об ошибке 500, если она равна 1:
if ($block = 1) { return 500; }
PS: Эффективность этого решения спорна, поскольку соединения с запрещенных IP-адресов принимаются () и передаются на веб-сервер. Однако, если эти крошечные накладные расходы не критичны для вашего хоста, я бы предпочел сделать это с помощью Nginx, а не с помощью iptables.
Можно взглянуть на: http://www.hipac.org/ Он довольно хорошо обрабатывает большое количество правил. Если существует шаблон IP-адресов, которые вы пытаетесь заблокировать, вы можете использовать правило MATCH. Правило предварительной маршрутизации pQd будет хорошо работать с nf-hipac, который использует хеш-таблицу для хранения правил и значительно быстрее, чем поиск по iptables по умолчанию.
Вы можете записать набор правил в запрещающие строки в блоке местоположения. Чтобы упростить задачу, вы можете включить файл, содержащий ваши запрещающие блоки, и ежечасно перезагружать конфигурацию. Поскольку он находится в файле конфигурации nginx, это не должно сильно влиять на производительность.