Как блокировать страны по ip

Блокировка доступа к web серверу по странам с помощью iptables

Однажды мне понадобилось ограничить доступ к серверу по ip на основе стран. Я решил это сделать после того, как на этот сайт началось непонятное мне нашествие ботов. Шли они со всего мира и создавали хоть и не существенную, но нагрузку на сервер. Из спортивного интереса хотел их отсечь и искал средства, чтобы сделать это максимально эффективно. Ниже расскажу, как я в итоге настроил ограничение доступа к своему веб серверу на основе списка ip по странам.

Введение

Я заметил подозрительную активность на сайте. Заходили какие-то боты, немного скролили и тыкали по ссылкам. Кто и зачем направил их на мой сайт мне было не понятно. Ничего плохого, по сути, они не делали, просто нарушали подсчет статистики, искажая реальную картину. Я быстро прикинул по статистике сайта, с каких стран в основном ко мне заходят люди. В моем случае это страны СНГ и немного заграницы. Боты же лезли со всего мира. Было принято решение временно закрыть доступ к сайту для всех стран, кроме самых популярных, с которых приходит около 95-98% пользователей. Забегаю вперед скажу, что это дало очень хороший результат, отсеяв почти всех нежелательных посетителей.

Читайте также:  Список страны африки это

Есть разные способы решить данную задачу. Наиболее простой и популярный — воспользоваться модулем для nginx — http_geoip_module. Не стал его реализовывать по 2-м причинам:

  1. По-умолчанию, этот модуль не включен в сборку, необходимо собирать веб сервер заново.
  2. Nginx быстрый сервер, успешно справляется с высокими нагрузками, но все же мне казалось более правильно отсечь все лишнее еще на подходах к серверу.

В итоге решил блокировать ботов с помощью iptables. Если у вас он не настроен, можете воспользоваться моей статьей — настройка iptables. Первое, что пришло в голову, это вручную добавить полный список ip адресов конкретной страны. Эта информация без проблем ищется в интернете, например вот тут — http://ipdeny.com/ipblocks/. Я взял список адресов одной страны и загнал его в свой скрипт для iptables, о котором рассказано в моей статье.

Запуск скрипта с добавленным списком огромного количество ip адресов и диапазонов длился секунд 10. Сейчас уже точно не помню, какую страну взял, если не ошибаюсь, то список был на несколько тысяч строк. Я понял, что так дело не пойдет, но все же решил попробовать добавить еще одну страну. После запуска скрипта сервер просто завис. Перестал отвечать на запросы, по ssh меня отключило. Пошел в консоль и перезагрузил сервер.

Я понял, что просто в лоб нельзя в iptables загнать большие списки. Стал искать другой способ, как реализовать ограничение доступа к серверу на основе большого списка правил. Решение было найдено — ipset. Официальная страница проекта — http://ipset.netfilter.org/. Ipset представляет из себя модуль ядра и утилиту для настройки, поэтому работает все быстро и переваривает огромные списки правил. В iptables при этом добавляется только одно правило.

Читайте также:  Таможенный союз еаэс страны участницы

Дальше я расскажу, как установить и настроить ipset. Работать будем на сервере CentOS 7. В других дистрибутивах никаких отличий не будет, за исключением установки и запуска модуля ядра.

Установка ipset

Для установки ничего особенного не требуется. Устанавливаем ipset стандартным образом через yum.

Этого достаточно, можно приступать к настройке списка блокировки по странам.

Настройка блокировки доступа к сайту по странам

Дальше можно пойти двумя путями:

  1. Блокировать доступ определенным странам.
  2. Разрешить доступ списку стран, а от остальных закрыться.

Сначала я пошел по первому пути и стал вычислять страны, с которых приходит больше всего ботов и блокировать их. Потом я понял, что это не очень эффективно с точки зрения затраты времени. Список подходящих мне стран гораздо меньше, чем список нежелательных. Так что я пошел по другому пути и запретил доступ всем, кроме некоторых стран. Я расскажу дальше для примера оба способа. Технически они ничем не отличаются, просто разный подход.

Итак, у нас есть список ip адресов и подсетей, разделенных по странам. Списки очень большие, руками их обрабатывать не получится. Мы это дело автоматизируем, а пока пройдемся по теории. Разберемся с управлением списками в ipset. Для начала создадим список и назовем его — blacklist.

Этой командой я создал список blacklist типа nethash. Строго говоря, я создаю не список, а набор данных типа nethash. В данном случае это набор данных адресов подсетей. Именно в виде набора подсетей выглядят списки доступа стран по ip. Если у вас есть список ip адресов, то тип данных будет iphash. Более подробно о типах данных можно посмотреть в документации.

Добавим в наш список несколько подсетей.

Посмотрим содержимое списка blacklist.

Обращаю внимание на выделенные строки. Когда я создавал список стран для блокировки, он получился очень большой и не помещался весь в объект с дефолтными настройками. Их можно изменить таким образом:

Обратите внимание на занимаемую память. На маленьком VPS это может стать проблемой. В том числе из этих соображений я решил перейти к белому списку. Он существенно меньше, соответственно, меньше ресурсов тратится на его обработку.

Список мы создали, теперь его надо подключить в iptables. Для этого добавляем правило блокировки.

Смотрим, что получилось в правилах:

Все в порядке, правило добавили. Следите, чтобы запрещающее правило было первым и лишние подключения отваливались сразу. Давайте теперь на примере посмотрим, как организовать белый список. Создаем сам список.

Добавляем в него подсети.

Создаем правило в iptables, по которому к нашему серверу будут иметь доступ только адреса из списка. Сначала у меня стояли вот эти два правила, которые разрешают доступ к веб серверу всем.

Я их изменил на следующие.

Принцип работы ipset рассмотрели. Теперь автоматизируем все и создадим полный список ip адресов по странам, которым будет разрешен доступ к сайту. Я для этого написал простенький скрипт. Привожу его с комментариями.

Запускаете скрипт, он скачивает и объединяет списки нужных вам стран, затем добавляет их в ipnet и в конце делает экспорт в файл. Посмотрите на этот файл. Список в нем должен совпадать с исходным списком, плюс несколько информационных строк в самом начале. На этом все. Если вы добавили правила в iptables, ограничение доступа по ip уже начало работать.

Заключение

Я проверил на своем сайте. Способ простой и очень эффективный. Все лишние боты отваливаются на моменте подключения к серверу. Не нагружают сервер и не портят статистику. Если кто-то знает еще эффективные способы борьбы с нежелательными посетителями, прошу поделиться в комментариях. Когда нашествие ботов прекратилось, запреты убрал.

Этот способ хорош только как временная мера. Постоянно его нельзя использовать, так как часть пользователей все же не сможет попасть к вам на сайт. Но если у вас какой-то специфичный сервис, к которому точно не нужен доступ, к примеру, из Китая, можете воспользоваться описанным мной методом.

Полезную информацию по защите сайта от ботов можно посмотреть в моих статьях на тему настройки fail2ban:

Онлайн курс Основы сетевых технологий

Помогла статья? Подписывайся на telegram канал автора

Автор Zerox

13 комментариев

Подскажите очень жду

iptables -A INPUT -m set —match-set blacklist src -j DROP
iptables v1.8.2 (nf_tables): Set blacklist doesn’t exist.

Try `iptables -h’ or ‘iptables —help’ for more information.

Разобрался будет так
———————————
ipset create blacklist hash:ip

ipset add blacklist 223.0.0.0/8
ipset add blacklist 222.0.0.0/8
ipset add blacklist 221.0.0.0/8
ipset add blacklist 220.0.0.0/8
ipset add blacklist 219.0.0.0/8
ipset add blacklist 218.0.0.0/8
ipset add blacklist 212.129.50.0/24
ipset add blacklist 211.0.0.0/8
ipset add blacklist 210.0.0.0/8
ipset add blacklist 209.126.96.0/24
ipset add blacklist 203.0.0.0/8
ipset add blacklist 202.0.0.0/8
ipset add blacklist 201.0.0.0/8
ipset add blacklist 200.0.0.0/8
ipset add blacklist 198.0.0.0/8
ipset add blacklist 197.0.0.0/8
ipset add blacklist 196.0.0.0/8
ipset add blacklist 195.158.128.0/24
ipset add blacklist 195.154.146.0/24
ipset add blacklist 195.154.214.0/24
ipset add blacklist 192.228.100.0/24
ipset add blacklist 191.0.0.0/8
ipset add blacklist 190.0.0.0/8
ipset add blacklist 189.0.0.0/8
ipset add blacklist 188.227.170.0/24
ipset add blacklist 188.214.128.0/24
ipset add blacklist 187.0.0.0/8
ipset add blacklist 186.0.0.0/8
ipset add blacklist 185.107.94.0/24
ipset add blacklist 185.53.88.0/24
ipset add blacklist 183.0.0.0/8
ipset add blacklist 182.0.0.0/8
ipset add blacklist 181.0.0.0/8
ipset add blacklist 180.0.0.0/8
ipset add blacklist 179.0.0.0/8
ipset add blacklist 177.0.0.0/8
ipset add blacklist 175.0.0.0/8
ipset add blacklist 171.0.0.0/8
ipset add blacklist 163.0.0.0/8
ipset add blacklist 162.144.83.0/24
ipset add blacklist 156.96.150.0/24
ipset add blacklist 154.0.0.0/8
ipset add blacklist 153.0.0.0/8
ipset add blacklist 150.0.0.0/8
ipset add blacklist 133.0.0.0/8
ipset add blacklist 126.0.0.0/8
ipset add blacklist 125.0.0.0/8
ipset add blacklist 124.0.0.0/8
ipset add blacklist 123.0.0.0/8
ipset add blacklist 122.0.0.0/8
ipset add blacklist 121.0.0.0/8
ipset add blacklist 120.0.0.0/8
ipset add blacklist 119.0.0.0/8
ipset add blacklist 118.0.0.0/8
ipset add blacklist 117.0.0.0/8
ipset add blacklist 116.0.0.0/8
ipset add blacklist 115.0.0.0/8
ipset add blacklist 114.0.0.0/8
ipset add blacklist 113.0.0.0/8
ipset add blacklist 112.0.0.0/8
ipset add blacklist 111.0.0.0/8
ipset add blacklist 110.0.0.0/8
ipset add blacklist 107.150.32.0/24
ipset add blacklist 106.0.0.0/8
ipset add blacklist 105.0.0.0/8
ipset add blacklist 103.0.0.0/8
ipset add blacklist 102.0.0.0/8
ipset add blacklist 101.0.0.0/8
ipset add blacklist 94.26.121.0/24
ipset add blacklist 89.163.224.0/24
ipset add blacklist 88.150.253.0/24
ipset add blacklist 85.25.235.245
ipset add blacklist 85.25.220.0/24
ipset add blacklist 85.25.216.0/24
ipset add blacklist 85.25.213.0/24
ipset add blacklist 85.25.214.0/24
ipset add blacklist 80.84.55.0/24
ipset add blacklist 77.247.109.0/24
ipset add blacklist 77.247.110.0/24
ipset add blacklist 74.208.101.0/24
ipset add blacklist 74.208.0.0/16
ipset add blacklist 63.141.248.0/24
ipset add blacklist 62.210.0.0/16
ipset add blacklist 54.38.152.0/24
ipset add blacklist 49.0.0.0/8
ipset add blacklist 46.166.142.0/24
ipset add blacklist 46.166.187.0/24
ipset add blacklist 45.143.220.0/24
ipset add blacklist 45.0.0.0/8
ipset add blacklist 37.75.208.0/24
ipset add blacklist 37.49.231.0/24
ipset add blacklist 37.49.230.0/24
ipset add blacklist 37.49.229.0/24
ipset add blacklist 37.49.0.0/16
ipset add blacklist 37.8.13.0/24
ipset add blacklist 35.0.0.0/8
ipset add blacklist 34.0.0.0/8
ipset add blacklist 33.0.0.0/8
ipset add blacklist 30.0.0.0/8
ipset add blacklist 23.0.0.0/8
ipset add blacklist 12.0.0.0/8
ipset add blacklist 1.0.0.0/8

iptables -I INPUT -m set —match-set blacklist src -j DROP

Источник

Как блокировать IP-адреса из стран с помощью дополнения Geoip в Iptables

Главное меню » Операционная система Linux » Как блокировать IP-адреса из стран с помощью дополнения Geoip в Iptables

Обновление и установка зависимостей

Прежде всего, мы должны модернизировать нашу систему Linux, а затем мы будем двигаться вперед для установки зависимостей, которые необходимы для xtables-addons. Для того, чтобы сделать это, мы выполним следующие команды соответствующих дистрибутивам, работающих в нашей машине.

Система на основе Debian (Debian, Ubuntu, Linux Mint)

Система RedHat, основанная (CentOS, RHEL, Fedora)

Установка xtables-addons

После того, как наша система будет модернизирована и будут установлены все зависимости, мы установим xtables-addons в нашей машине. Для этого мы скачаем последний tar-архив с официального сайта проекта xtables-addons с помощью wget. После того, как он будет загружен, мы распакуем архив, а затем скомпилируем и установим его на нашей машине.

Разрешить SELinux для загрузки модулей (на основе системы RedHat)

Поскольку дистрибутивы на основе RedHat т.е. CentOS, RHEL, Fedora имеют включенную SELinux по умолчанию, мы должны скорректировать политику SELinux следующим образом. В противном случае, SELinux будет препятствовать IPTables для модуля загрузки xt_geoip.

Установка базы данных GeoIP

Далее, мы запустим модуль под названием xt_geoip , который поставляется с расширением Xtables-addons, который загружает базу данных GeoIP из MaxMind и преобразует его в двоичную форму, признанной в xt_geoip. После того, как он будет загружен, мы создадим его и переместим их к нужному в xt_geoip пути, т.е. /usr/share/xt_geoip/.

Блокировка трафика из страны

Если все прошло, как и следовало ожидать, мы должны в состоянии использовать на нашем брандмауэре утилиты программы IPTables, чтобы использовать модуль GeoIP.

Использование Iptables

Вот основной синтаксис для использования IPTables с модулем GeoIP для того, чтобы блокировать трафик, исходящий из или предназначенных для страны. Здесь мы должны использовать двух-буквенный код ISO3166 вместо страны, например, RU для России, IE для Ирландии, IN для Индии, CN для Китая и так далее.

Источник

Как заблокировать трафик на сайте из определенного региона?

Недавно столкнулся с проблемой: на сайт в огромном количестве повалил китайский трафик. Оказалось, что одна из размещенных на моем хосте картинок попала в китайские блоги. Провайдер, у которого я арендую сервер, тут же забил тревогу о несоответствии соотношений (три к двум) российского и зарубежного трафиков.

Переплачивать естественно не хотелось, поэтому я быстро выровнял соотношение и начал думать, как исправить ситуацию. Собственно, выход в своей ситуации я видел один — блокировать трафик с китайских IP-адресов. По крайней мере, в случае возникновения подобной ситуации. Для этого нужно было обзавестись актуальной геолокационной базой данных IP-адресов для определения китайского трафика и выбрать решение, чтобы блокировать подключения по географическому признаку.

Геолокационных баз данных IP-адресов (в формате «Город/Страна — IP») оказалось достаточно много, как собранных энтузиастами, так и профессиональными компаниями, которые продают их за деньги. Мне больше всего приглянулась бесплатная WIP-Base от сервиса WIPmania.com.

Решение задачи разделим на два пункта: выбор геолокационной базы данных IP-адресов для определения китайского трафика и настройку решения для блокировки подключений с нежелательных IP-адресов.

1. Различными энтузиастами и профессионалами созданы различные геолокационные базы данных IP-адресов (в формате «Город/Страна — IP»). Из всех предложений, присутствующих в интернете, мне больше всего нравится бесплатная WIP-Base от WIPmania.com. Она позволяет неограниченно определять реальные физические расположения IP-адресов. Она абсолютно бесплатна для персонального и бизнес-использования, постоянно обновляется, доступна в SQL, CIDR, текстовом формате и предоставляет ряд фишек:

  • WIP-API (удобный API для разработчиков);
  • WIP-Plugin (WorldIP-плагин для Mozilla Firefox);
  • WIP-Map (показывает IP-адреса прямо на карте).

Спектр применения довольно широк: геотаргетинг в электронной коммерции, борьба с фродом, фишингом, спамом и мошенничеством, защита серверов от различных видов атак по геопризнаку. Собственно, последнее и есть наша задача.

2.Для того чтобы ограничить трафик из какой-то определенной страны, есть разные решения. Мы же воспользуемся стандартной возможностью iptables, позволяющей проводить фильтрацию по геопризнаку. Кстати, это может применяться не только для блокировки нежелательных подключений, но и для балансировки запросов на разные бекенды, каждый из которых обрабатывает свой регион. Нам поможет модуль geoip из пакета расширений xtables-addons для iptables, у него свой формат геолокационной базы, но к счастью WorldIP-база от WIPmania теперь есть и в этом формате. Порядок действий такой:

  1. Устанавливаем xtables-addons (xtablesaddons.sourceforge.net).
  2. Подключаем базу для модуля geoip. Актуальная версия базы всегда доступна по URL — static.wipmania.com/static/worldip.iptables.tar.gz. Чтобы база обновлялась, ее можно обновлять по крону (скажем, раз в месяц).
  3. Далее можно настроить правила.

Блокируем доступ к http-серверу для всех клиентов из Китая:

iptables -A INPUT -p tcp —dport 80
-m geoip —src-cc CN -j DROP
iptables -A INPUT -p tcp —dport 80
-j ACCEPT

Можно поступить более радикально и разрешить доступ для клиентов из каких-то конкретных стран (например, России, Украины и Белоруссии):

iptables -A INPUT -p tcp —dport 80
-m geoip —src-cc RU,UA,BY -j ACCEPT
iptables -A INPUT -p tcp —dport 80
-j DROP

Источник

Оцените статью