В определенный момент приходит в голову вопрос, а как ещё можно помочь серверу в борьбе с хакерами, конкурентами и другими заинтересованными в падении сервера людьми? И кажется ну вот я настроил 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.
Изначально была GeoIP бесплатной и общедоступной. Но всё в этом мире, хорошо это или плохо сложно сказать, делается ради денег. Из-за этого как только база получила известность и стала востребованной за нее решили брать деньги. Но нас это не касается! Мы будем использовать небольшую часть возможностей, а для этого достаточно зарегистрироваться и получить ключ, который нужен в дальнейшем для скачивания баз. Т.е. без финансовых потерь с нашей стороны.
Итак. Для регистрации идём сюда https://www.maxmind.com/en/geolite2/signup
Заполняем примерно как на картинке ниже. Электронную почту указать действующую, т.к. на нее придет очень нужное письмо.
Письмо будет следующего содержания
Нам нужно сгенерировать пароль к личному кабинету. Для этого жмем на слово помеченное красной стрелкой и переходим на страницу, где вводим пароль два раза и попадаем в личный кабинет. В кабинете жмем на пункт My License Key, а затем Generate new license key
Выбираем Yes (будем обновлять GeoIP) и первый пункт в раскрывшемся окне. И Confirm.
Новое окно нам покажет заветный ключик для скачивания и обновления баз GeoIP, а также будет возможность скачать уже готовый конфиг для обновления баз.
На самом деле это была самая муторная часть))))
3. Получаем базы GeoIP и адаптируем для Iptables.
Описание скрипта можно почитать тут. Опять таки спасибо добрым людям. 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/
Чтобы у скриптов все получилось их нужно сделать исполняемыми
$ 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
$ 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
4. Знакомим Iptables с GeoIP и блокируем страны.
Чтобы 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 и работает по сей день.