Iptables: как заблокировать (обработать) адреса X-Forwarded-For?

(На самом деле я нахожусь в CentOS за AWS ELB. Но я не хочу, чтобы этот вопрос был специфичным только для AWS ELB, но для общего понимания.)

Я работаю над CentOS 6.5 коробка, которая находится за Load-balancer который только проходит X-Forwarded-For IP для меня. Как веб-сервер, я знаю, что поступают плохие IP-адреса, и мне нужно БЛОКИРОВАТЬ их самим сервером. (Предполагая, что впереди нет никаких IPS/IDS/Firewall, на которые можно положиться.)

До сих пор я не знаю (я не могу) заблокировать эти плохие IP своими iptables потому что нет реального ip, а только X-Forwarded-For IPs переданы мне. (Так что я делаю, я использую .htaccess блокировать. И это работает)

Как этого добиться с помощью соответствующего уровня брандмауэра?

4 ответа

Я хотел бы сделать то же самое. У меня есть очень длинный список IP-адресов для блокировки в формате CIDR, и преобразование его в регулярные выражения для использования в файле.htaccess просто не кажется правильным. И вы знаете, что с точки зрения загрузки процессора, регулярные выражения в.htaccess даже не находятся в той же галактике, что и целочисленная битовая обработка, которую может делать iptables. Но я не верю, что для этого можно использовать iptables. Iptables работает в ядре и блокирует входящие IP-адреса на низком уровне, прежде чем любой заголовок будет прочитан.

В моем случае я использую только балансировщик нагрузки в качестве удобного способа обработки запросов https, мне не нужно балансировать большую нагрузку между несколькими экземплярами веб-сервера. Итак, я подумал о том, чтобы запустить отдельный экземпляр с обратным прокси-сервером nginx для обработки https для моего веб-сервера apache, добавив заголовки X_FORWARDED точно так же, как это делает балансировщик нагрузки AWS. Таким образом, я могу использовать iptables на экземпляре, на котором выполняется nginx, и мне не нужно трогать мою конфигурацию apache или веб-приложения, работающие за балансировщиком нагрузки.

Вы теряете избыточность нескольких IP-адресов для самого балансировщика нагрузки, а также интеграцию с AWS Cloud Front для балансировки внутренней нагрузки, но вы получаете возможность использовать iptables и можете разгрузить обработку статического содержимого из apache, возможно, уменьшив время отклика., Поскольку говорят, что nginx гораздо легче, чем apache, для простой обработки запросов, вам не нужно много сил в этом случае. Интересно, являются ли балансировщики нагрузки AWS просто экземплярами, запускающими nginx? Если вы посмотрите на цены, почасовая стоимость балансировщика нагрузки примерно такая же, как у экземпляра t2.small linux.

Я сам еще не пробовал, так как конфигурация nginx является для меня совершенно новой, и для этого потребовалось бы купить и установить сертификат SSL вместо использования удивительно простого и удобного менеджера сертификатов.

Интересно, рассмотрит ли AWS запросы пользовательских функций для настройки балансировщиков нагрузки с помощью iptables...

ОБНОВЛЕНИЕ: я только что опубликовал это на форуме AWS EC2.

ОБНОВЛЕНИЕ 2: Мой запрос к функции в AWS с просьбой о настройке iptables для балансировщика нагрузки получил ответ с объяснением того, как использовать сетевой ACL для блокировки запросов, поступающих из любого CIDR в списке, от достижения балансировщика нагрузки. Для меня это такое же хорошее решение. ОП искало решение, не относящееся к AWS, и оно не соответствует этому критерию. Если у вас есть эта проблема с каким-либо сервером, который находится за обратным прокси-сервером, просто невозможно использовать брандмауэр в стиле iptables этого сервера для блокировки входящих запросов на основе исходного IP-адреса - брандмауэр должен решить, следует ли блокировать запрос задолго до того, как он читает заголовки, что является единственным местом, где можно найти исходный запрашивающий адрес. Если вы используете AWS, вы можете использовать сетевой ACL. В противном случае вам понадобится полный контроль над сервером, выполняющим обратный прокси-сервер, и установите правила брандмауэра на этом сервере.

Похоже, вы можете сопоставлять шаблоны с IP-таблицами: http://wiztelsys.com/Article_iptables_bob2.html

Итак, вам нужно сделать это, например:

      iptables -I INPUT 1 -p tcp --dport <port> -m string --string "X-Forwarded-For: <ip>" --algo bm -j DROP

"-m": тип соответствия = строка

"--string": какая строка

"--algo bm": алгоритм Бойера-Мура для сопоставления с образцом

Поскольку вы упоминаете.htaccess, похоже, что вы используете Apache Webserver, поэтому я бы рекомендовал добавить эти правила вместо iptables. Основной способ блокировки на основе X-Forwarded-For в Apache заключается в следующем:

RewriteCond %{HTTP:X-FORWARDED-FOR} ^171.42.6.123$
RewriteRule .* - [F,L]

Так как IP-адрес - это просто строка, с которой сопоставляются, вы можете указать все виды регулярных выражений в вашем состоянии. Посмотрите этот вопрос для примера того, как это сделать.

За исключением того, что вы можете иметь только 20 правил для ACL.

Другие вопросы по тегам