Я использую Linux с установленным FreePBX / Astrisk. Я заблокировал Китай и Гонконг, используя списки из ip2location. com / blockvisitorsbycountry.aspx. Мой fail2ban срабатывал каждые 3-9 минут с блокировками, и теперь у меня очень ограниченные попытки, обычно около 8-10 в день. Я бы хотел заблокировать больше, но боюсь, что если я добавлю еще 10k к таблицам, я могу вернуть систему обратно в каменный век. Что вы думаете?
Не волнуйтесь, в худшем случае это будут показатели железного века. (ухмылка)
Большое количество правил netfilter, которые ядро должно выполнять для каждого отдельного пакета, будут иметь негативное влияние на производительность системы и потребление ресурсов (как процессора, так и памяти). Приятно то, что есть ряд уловок, которые можно использовать, чтобы минимизировать проблемы.
-m state --state ESTABLISHED,RELATED -j ACCEPT
правило перед любое из правил списка фильтров.Фильтруйте только определенные порты: если вы используете веб-сервер, но на самом деле вас беспокоят только атаки перебора SSH, вы можете избежать обработки всего HTTP-трафика через список фильтров, поместив список фильтров в отдельный цепочка, а затем отправляет только трафик порта 22 через фильтр, например:
iptables -N geofilter
iptables -I geofilter -s <ip range> -j DROP
[etc etc etc]
iptables -I INPUT -p tcp --dport 22 -j geofilter
«Древовидная структура» ваших правил фильтрации: у вас может быть 10 000 правил фильтрации, но только одно из них будет соответствовать. Таким образом, вы можете использовать древовидную структуру, чтобы уменьшить количество правил, которые должен пройти один пакет, поместив все правила, скажем, для каждого / 8 в свою собственную цепочку. Продолжая предыдущий geofilter
пример:
iptables -N geofilter_1
iptables -N geofilter_2
[etc etc etc all the way to geofilter_223]
iptables -I geofilter -s 1.0.0.0/8 -j geofilter_1
iptables -I geofilter -s 2.0.0.0/8 -j geofilter_2
[etc etc etc]
iptables -I geofilter_1 -s 1.2.3.0/24 -j DROP
iptables -I geofilter_1 -s 1.5.9.0/18 -j DROP
[etc etc etc for all rules in 1/8]
iptables -I geofilter_2 -s 2.42.0.0/16 -j DROP
[etc etc etc for all rules in 2/8]
[continue pattern for all /8s]
Это означает, что любой пакет, который должен пройти через правила фильтрации, должен будет пройти не более 223 правил (все geofilter
rules) плюс сколько правил есть в любом из списков фильтров на / 8. (Почему 223, а не 254, 255 или 256 правил в geofilter
цепочка оставлена в качестве упражнения для проницательного читателя). Вы можете сделать это еще более эффективным, используя несколько уровней дерева: разделение на / 4, затем на / 8, затем на / 12 или что-то в этом роде. Вы можете добавить столько уровней, сколько хотите. Вы даже можете сделать это по-разному для разных цепочек: начните с разделения одного уровня на / 4, затем любой цепочки с более чем несколькими сотнями правил, разделите это на / 8 и любой цепочки, которая по-прежнему содержит более нескольких сотен правил, разделенных на / 12.
Правила агрегирования: я бы сделал разумную ставку на то, что списки используемых вами адресов не были оптимально агрегированы. Даже если они относятся к одной стране, после того как вы соберете вместе списки нескольких стран, могут появиться смежные блоки из разных стран, которые вы могли бы объединить. Например, скажем, у кого-то в Китае был 192.0.2.0/25
, и кто-то в Гонконге получил 192.0.2.128/25
(да, нереалистичные блоки, но RFC5737 дает нам только / 24 для документации). Вы можете объединить это в 192.0.2.0/24
и сохрани себе правило.
Как только вы начнете это делать, вы часто сможете уменьшить количество правил в своем списке. значительно. (В сочетании со следующим правилом вы можете уменьшить список правил вдвое или более.) Реализовать агрегирование легко; то netmask
Инструмент возьмет произвольный список блоков и вернет вам минимальный список блоков CIDR:
netmask -c 192.0.2.0/25 192.0.2.128/25 192.0.3.0/24 192.0.1.0/25
192.0.1.0/25
192.0.2.0/23
Отрицательные правила: часто вы обнаруживаете, что большое количество небольших блоков объединяется в один, много больший блок, Кроме для одного маленького кусочка посередине. В некоторых случаях почти все / 8 или / 10 выделяются одной стране, за исключением нескольких неудобных маленьких / 22, которые каким-то образом сбежали в другую часть мира. В этом случае вы можете поставить ACCEPT
правила для этих двух маленьких блоков из белого списка, за которыми следует DROP
правило для покрытия большего блока. Разработка оптимальных блоков потребует некоторой степени программирования, но это не ракетостроение.
Одно замечание: блоки IP довольно регулярно меняют свое географическое положение, особенно в эти «конечные времена» IPv4. Убедитесь, что вы не запустили и не забыли этот набор правил. Получите обновленные копии географических списков и заново создайте свой список фильтров на их основе. В противном случае однажды вы обнаружите, что отфильтрованный блок был принят вашим собственным интернет-провайдером, и вы заблокируете доступ к своему серверу, потому что вам был назначен IP-адрес, который вы ранее заблокировали. (Правдивая история)
Основная проблема с iptables
Правила заключаются в том, что они выполняются последовательно, и с большой вероятностью множества правил придется проанализировать несколько правил, прежде чем пакет будет либо предоставлен доступ, либо отклонен.
Ответ Уомбла уже объясняет довольно много стратегий по уменьшению этого штрафа за обработку путем умного упорядочивания правил, и, где я согласен, наиболее важной из них является использование межсетевой экран с полным контролем состояния конфигурация, в которой только НОВЫЕ соединения проверяются на соответствие полному набору правил, и после того, как первоначальный пакет, устанавливающий это соединение, был проверен и одобрен, всем последующим пакетам в том же соединении предоставляется доступ.
Предположим, у вас есть несколько правил DROP, блокирующих висторы:
# Source: http://www.ip2location.com/free/visitor-blocker
iptables -A INPUT -s 1.0.1.0/24 -j DROP
iptables -A INPUT -s 1.0.2.0/23 -j DROP
iptables -A INPUT -s 1.1.0.0/24 -j DROP
iptables -A INPUT -s 1.1.2.0/23 -j DROP
iptables -A INPUT -s 1.1.8.0/21 -j DROP
iptables -A INPUT -s 119.15.136.0/21 -j DROP
iptables -A INPUT -s 119.16.0.0/16 -j DROP
iptables -A INPUT -s 119.18.192.0/20 -j DROP
iptables -A INPUT -s 119.18.208.0/21 -j DROP
Эти правила можно свести к единое правило iptables используя ipset
утилита.
An Набор IP - это список сетевых адресов и / или диапазонов, поддерживаемых ядром, и сопоставление с ним выполняется намного быстрее, чем правила последовательного сопоставления в iptables.
Сначала создайте набор IP ( руководство рекомендует тип hash:net
для сетевых блоков произвольного размера):
ipset create blacklist-china hash:net hashsize 4096
Добавьте диапазоны CIDR, которые вы хотите заблокировать:
ipset add blacklist-china 1.0.1.0/24
ipset add blacklist-china 1.0.2.0/23
ipset add blacklist-china 1.1.0.0/24
ipset add blacklist-china 1.1.2.0/23
ipset add blacklist-china 1.1.8.0/21
ipset add blacklist-china 119.15.136.0/21
ipset add blacklist-china 119.16.0.0/16
ipset add blacklist-china 119.18.192.0/20
ipset add blacklist-china 119.18.208.0/21
Конфигурация вашего брандмауэра теперь уменьшена до:
iptables -m set --match-set blacklist-china src -j DROP
Еще один способ - использовать iptables ' xt_geoip
модуль. Хотя я не тестировал это на производительность против ipsets
(если я правильно понимаю источник xt_geoip
использует двоичный поиск d & c, а ipsets
использовать хеши). Преимущество этого, вероятно, в простом обновлении.
Например, Ubuntu по умолчанию поставляет это в xtables-addons-dkms.