Этот вопрос, очевидно, задавали много раз в самых разных формах, но я не могу найти реального ответа на конкретный план, который у меня есть. У нас есть популярный европейский сайт коммерческих сделок, и мы получаем большое количество входящих регистраций / трафика из стран, которые даже не могут участвовать в предлагаемых нами сделках (а многие розничные торговцы даже не известны за пределами Западной Европы).
Я определил проблемную область, чтобы заблокировать большую часть этого трафика, но (как и ожидалось) требуются тысячи диапазонов IP-адресов.
Теперь мой вопрос (наконец-то!). На тестовом сервере я создал сценарий для блокировки каждого диапазона в iptables, но время, которое потребовалось для добавления правил, было большим, и затем iptables после этого не отвечал (особенно при попытке iptables -L).
Каков наиболее эффективный способ блокировки большого количества диапазонов IP-адресов:
Лучше всего мы использовали MaxMinds база данных во время регистрации. Бесплатная версия привязана к стране, и вы можете заплатить за большую детализацию.
Преимущество того, что вы делаете это только во время регистрации, заключается в том, что вы не создадите неудобства для клиентов, которые уже зарегистрировались и путешествуют.
Насколько я понимаю, вопрос не в том, где взять список IP-адресов, которые нужно заблокировать, а в том, как эффективно заблокировать их с помощью iptables. Сценарий, выполняющий серию команд «iptables -A», потребует очень много времени для загрузки правил, и в это время брандмауэр работает с несогласованной политикой. Это также существенно влияет на его производительность.
Предлагаю вам попробовать модуль ipset ( http://ipset.netfilter.org/ ). Он позволяет вам напрямую управлять таблицами блоков адресов, вам нужно только одно правило iptables, чтобы соответствовать всему набору. Вам нужно будет поэкспериментировать с различными типами наборов, чтобы найти тот, который может вместить количество блоков IP-адресов, которые необходимо заблокировать, и обеспечить необходимую производительность. В любом случае он намного лучше сопоставляет длинные списки блоков адресов и позволяет перезагружать его с помощью инструмента командной строки, не затрагивая правила.
Обратите внимание, что не все дистрибутивы Linux включают ipsets в свою конфигурацию по умолчанию, поэтому вам может потребоваться перекомпилировать модули ядра и iptables.
Блоки адресов страны время от времени меняются, поэтому вам нужно периодически обновлять свой набор адресов. Чтобы перезагрузить уже используемый набор, вы можете использовать инструмент командной строки «ipset», и его легко обернуть в сценарий оболочки для автоматизации процесса. Или вы можете использовать fwbuilder для генерации вашей политики iptables и использовать созданный им скрипт для управления ipset ( http://www.fwbuilder.org/4.0/docs/users_guide/address-table-object.html см. «5.2.13.1. Использование объектов таблиц адресов с наборами IP iptables» в этой главе)
Linux iptables годен для базового брандмауэра и не подходит для всего остального.
Брандмауэр pf (используемый большинством систем BSD) значительно облегчит вашу жизнь. В столы Функция брандмауэра pf аналогична модулю ipset в netfilter.
OpenBSD, FreeBSD, NetBSD, pfSense и OPNSense используют pf. Мне нравится OpenBSD как дистрибутив брандмауэра, но если вам нужен графический интерфейс для вашего брандмауэра, pfSense и OPNSense выполнят свою работу.
Что касается того, что помещать в таблицы pf, я держу обновленный архив Блоки CIDR по странам здесь.
я использую http://www.countryipblocks.net. Мне нравится, что он бесплатный (регистрация не требуется) и поддерживает множество различных форматов для маршрутизаторов, веб-серверов и т. Д.
Список блоков IP для каждой страны в формате, который может быть легко использован многими брандмауэрами (я использую таблицы PF во FreeBSD, которые можно загружать из файла): http://www.ipdeny.com/ipblocks/