Я написав тут оновлене керівництво щодо блокування 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]