Найти тему
Imho Life

GeoIP на Ubuntu. Или как заблокировать страну или весь мир.

Оглавление

В определенный момент приходит в голову вопрос, а как ещё можно помочь серверу в борьбе с хакерами, конкурентами и другими заинтересованными в падении сервера людьми? И кажется ну вот я настроил Iptables с правилами запрещено всё что не разрешено, и fail2ban исправно выписывает штрафы и denyhosts пыхтит записывая всех провинившихся. Но логи растут не по минутам, а по секундам. И вот тут просматривая адреса с которых ломятся плохие человечки приходит мысль, а нужен ли для работы моего сервера Китай? Или Америка? Или, если это простой шлюз для раздачи интернета в небольшом офисе, весь мир кроме страны в которой я живу?

И вот тут на помощь приходит GeoIP - это глобальная база геолокационных данных с привязкой к IP адресу. С помощью GeoIP можно определить местоположение страны, города или конкретного дома. Да есть ошибки и погрешности, куда же без них. Но по моему мнению сейчас это наиболее точная база данных. Самое главное, с поставленной задачей он справляется и количество попыток достучаться до сервера падает минимум в 70%. Это не отдельный инструмент, это, если можно так выразиться, шпаргалка для вашего Iptables.

1. Подготовка сервера Ubuntu к установке GeoIP.

Для начала обновим локальные индексы пакетов до последних изменений в репозиториях

$ sudo apt-get update

Теперь установим пакеты необходимые для распаковки и сборки базы GeoIP

$ sudo apt-get install curl unzip perl
$ sudo apt-get install libtext-csv-xs-perl libmoosex-types-netaddr-ip-perl

Установим xtables-addons-common который содержит в себе модули необходимые для состыковки Iptables и GeoIP

$ sudo apt-get install xtables-addons-common

Создадим папку для geoip баз:

$ sudo mkdir /usr/share/xt_geoip

С этим этапом закончили.

2. Получение ключа Maxmind для GeoIP.

-2

Изначально была GeoIP бесплатной и общедоступной. Но всё в этом мире, хорошо это или плохо сложно сказать, делается ради денег. Из-за этого как только база получила известность и стала востребованной за нее решили брать деньги. Но нас это не касается! Мы будем использовать небольшую часть возможностей, а для этого достаточно зарегистрироваться и получить ключ, который нужен в дальнейшем для скачивания баз. Т.е. без финансовых потерь с нашей стороны.

Итак. Для регистрации идём сюда https://www.maxmind.com/en/geolite2/signup

Заполняем примерно как на картинке ниже. Электронную почту указать действующую, т.к. на нее придет очень нужное письмо.

-3

Письмо будет следующего содержания

-4

Нам нужно сгенерировать пароль к личному кабинету. Для этого жмем на слово помеченное красной стрелкой и переходим на страницу, где вводим пароль два раза и попадаем в личный кабинет. В кабинете жмем на пункт My License Key, а затем Generate new license key

-5

Выбираем Yes (будем обновлять GeoIP) и первый пункт в раскрывшемся окне. И Confirm.

-6

Новое окно нам покажет заветный ключик для скачивания и обновления баз GeoIP, а также будет возможность скачать уже готовый конфиг для обновления баз.

-7

На самом деле это была самая муторная часть))))

3. Получаем базы GeoIP и адаптируем для Iptables.

-8

Описание скрипта можно почитать тут. Опять таки спасибо добрым людям. https://github.com/mschmitt/GeoLite2xtables

Возвращаемся на наш сервер и переходим в директорию в которую скачаем необходимые скрипты

$ cd /usr/local/src

Скачиваем

$ sudo wget https://github.com/mschmitt/GeoLite2xtables/archive/master.zip

Распаковываем и переходим в появившуюся папку

$ sudo unzip master.zip
$ cd /usr/local/src/GeoLite2xtables-master/

-9

Чтобы у скриптов все получилось их нужно сделать исполняемыми

$ sudo chmod 0740 ./00_download_geolite2
$ sudo chmod 0740 ./10_download_countryinfo
$ sudo chmod 0740 ./20_convert_geolite2

Теперь нужно создать файлик с ключем который нам выдал maxmind.

$ touch geolite2.license     

И вносим свой ключ

YOUR_LICENSE_KEY='ВАШ КЛЮЧ'

Далее запускаем каждый скрипт по порядку и на выходе получаем собранную базу GeoIP

$ sudo ./00_download_geolite2
$ sudo ./10_download_countryinfo

-10

$ sudo cat /tmp/GeoLite2-Country-Blocks-IPv{4,6}.csv |./20_convert_geolite2 /tmp/CountryInfo.txt > /usr/share/xt_geoip/GeoIP-legacy.csv

$ sudo /usr/lib/xtables-addons/xt_geoip_build -D /usr/share/xt_geoip /usr/share/xt_geoip/GeoIP-legacy.csv

Вот всё и готово. Для проверки можно перейти в папку с собранными базами

$ cd /usr/share/xt_geoip

-11

4. Знакомим Iptables с GeoIP и блокируем страны.

-12

Чтобы Iptables мог работать с базами, нужно включить модуль ядра. Для этого вводим

$ modprobe xt_geoip

$ lsmod | grep ^xt_geoip

Без этих двух команд система будет ругаться на отсутствие modprobe и xtables-addon.

После всего выше проделанного, можно переходить к правилам блокировки.

Блокировать можно как отдельный порт:

$ iptables -A INPUT -m geoip -p tcp –dport 25 –src-cc CN,HK -j DROP

В данном случае Китай и Корея не смогут писать нам письма обращаясь к 25 порту.

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

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

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

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

Или просто заблокировать доступ к нашему серверу из Китая и Кореи:

$ iptables -A INPUT -m geoip --source-country CN,HK -j REJECT --reject-with icmp-port-unreachable

Вариантов как, что, кого и для чего заблокировать много. Подбирайте под свои нужды и потребности.

Но как всегда напомню, что GeoIP не является панацеей, 100% вариантом с гарантированным результатом. Т.к. этот вариант не спасет от подменных IP и прокси-серверов, а также не забываем про ошибки в самой базе GeoIP. Зато разгрузить сервер это да. В первый момент после запуска я думал что сделал что-то не так и заблокировал мир, потому что в логах наступила кратковременная тишина. Потом конечно полезли, но количество стучащихся упало в разы.

P.S. Всем кто дочитал до конца спасибо! Буду рад если поможет в работе.

Всё что понаписано выше проверено на Ubuntu Server 18.04 и работает по сей день.