Блокування за допомогою GeoIP

Я написав тут оновлене керівництво щодо блокування GeoIP на Ubuntu 20.04/22.04LTS.

Бувають випадки що мені не потрібно, щоб сервіс був відкритий для всього світу, і я можу обмежити його лише країною, у якій я перебуваю. Хорошим прикладом цього є поштовий сервер, яким користується моя родина та я , йому не потрібен відкритий для світу порт подання imaps або smtp – його можна легко обмежити IP-адресами в Україні. Сервер із відкритим портом ssh, яким керують люди з відомим тобі їх місцерозташуванням, також може бути хорошим прикладом того, де можна використовувати блокування GeoIP.

Точність списків GeoIP MaxMind є достатньою для мого використання.І тому це лише рівень захисту на додаток до інших інструментів, таких як Fail2ban.

Налаштувати блокування GeoIP легко. Цей посібник стосується Ubuntu 16.04LTS і 18.04LTS.

Встановлення необхідних умов

sudo apt-get update; sudo apt-get -y upgrade
sudo apt-get install curl unzip perl
sudo apt-get install xtables-addons-common
sudo apt-get install libtext-csv-xs-perl libmoosex-types-netaddr-ip-perl

Отримання скрипту для баз даних MaxMind GeoLite2

Модуль iptables xtables-addons використовує старіший формат бази даних MaxMind GeoLite, який було припинено в січні 2019 року. На щастя, Мартін Шміт написав скрипт для перетворення нового формату бази даних MaxMind GeoLite2 у застарілий формат.

cd /usr/local/src
sudo git clone https://github.com/mschmitt/GeoLite2xtables.git

Щоб це працювало

Спочатку отримайте ліцензійний ключ для використання нової бази даних GeoLite2. Зареєструйтеся тут і отримайте ліцензійний ключ, усе це безкоштовно.

Перемістіть файл ліцензійного ключа для сценарію перетворення.

sudo mv /usr/local/src/GeoLite2xtables/geolite2.license.example /usr/local/src/GeoLite2xtables/geolite2.license

Відредагуйте /usr/local/src/GeoLite2xtables/geolite2.license та замініть ліцензійний ключ, отриманий на веб-сайті MaxMind.

Створіть каталог для кінцевої бази даних, яку використовуватиме xtables-addons:

sudo mkdir /usr/share/xt_geoip

Створіть сценарій, щоб усе запрацювало /usr/local/bin/geo-update.sh

#!/bin/bash cd /usr/local/src/GeoLite2xtables
./00_download_geolite2
./10_download_countryinfo
cat /tmp/GeoLite2-Country-Blocks-IPv{4,6}.csv |./20_convert_geolite2 /tmp/CountryInfo.txt > /usr/share/xt_geoip/GeoIP-legacy.csv
/usr/lib/xtables-addons/xt_geoip_build -D /usr/share/xt_geoip /usr/share/xt_geoip/GeoIP-legacy.csv

Запустіть сценарій, і він заповнить базу даних даними GeoIP для першого використання. Налаштуйте cronjob для регулярного оновлення бази даних.

Перевірте, чи все спрацювало

Запустити :

modprobe xt_geoip
lsmod | grep ^xt_geoip

Результат має виглядати так:

xt_geoip               16384  2

Запустити :

iptables -m geoip -h

Вихідні дані мають виглядати (урізано):

iptables v1.6.1

Usage: iptables -[ACD] chain rule-specification [options]
       iptables -I chain [rulenum] rule-specification [options]
       iptables -R chain rulenum rule-specification [options]
       iptables -D chain rulenum [options]
       iptables -[LS] [chain [rulenum]] [options]
       iptables -[FZ] [chain] [options]
       iptables -[NX] chain
       iptables -E old-chain-name new-chain-name
       iptables -P chain target [options]
       iptables -h (print this help information)

Додавання правила

Ця команда не буде стійкою. Але це спосіб побачити, що все гаразд. Цей приклад правила відкидає весь трафік від RU та CN до порту 25.

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

На цьому етапі будь-які дії, зроблені вище, не будуть постійними, тому, якщо ви в кінцевому підсумку заблокуєте свою систему, перезавантажте її, і все буде добре. Просто переконайтеся, що у вас є доступ до способу перезавантаження системи або доступ до системної консолі. Будь-які дії нижче цього можуть назавжди заблокувати вас у вашій системі, тому переконайтеся, що у вас є спосіб потрапити в систему без доступу до мережі (консоль, гм).

Я використовую інший спосіб зробити це, оскільки моя система скидає пакети за замовчуванням, у мене є правила, які дозволяють проходити трафіку на основі геоданих. Цей приклад правила дозволяє трафік SSH лише з IP-адрес у США.

iptables -A INPUT -m geoip -p tcp --dport 22 --src-cc US -j ACCEPT

У мене вже був запущений UFW (ось чому система за замовчуванням блокує весь трафік), тому інтегрувати блокування GeoIP з UFW було досить легко, і це простий спосіб змусити правила зберігатися після перезавантаження. Є два файли (один, якщо ваша система не IPv6), які потрібно відредагувати:

/etc/ufw/before.rules
/etc/ufw/before6.rules

Як випливає з назви, файл before6.rules призначений для IPv6, а before.rules — для IPv4. Додавати правила до цих файлів легко. Просто додайте правило перед оператором COMMIT у кінці файлу. Приклад правила ACCEPT вище, додавайте подібну конфігурацію до файлів.

-A ufw-before-input -m geoip -p tcp --dport 22 --src-cc US -j ACCEPT

Якщо ви плануєте застосувати однакові правила країни до кількох портів, це виглядатиме так:

-A ufw-before-input -m geoip -p tcp -m multiport --dports 22,993,587 --src-cc US -j ACCEPT

Це все!

Якщо помітили помилки чи неточності, будь ласка, залишіть коментар чи напишіть листа на поштову адресу [email protected]

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *