Блокування за допомогою GeoIP на Ubuntu 20.04/22.04LTS

Вступ

Це оновлене попереднє керівництво, яке я написав раніше, Блокування за допомогою GeoIP, яке працювало для Ubuntu 16.04LTS і 18.04LTS, але, очевидно, не для Ubuntu 20.04/22.04LTS.

Поточна версія скрипту xt_geoip_build у новому пакеті xtables-addons перейшла на використання бази даних GeoIP з db-ip замість MaxMind. Цей крок спрощує весь процес і усуває необхідність реєструвати обліковий запис MaxMind і використовувати обхідні засоби для завантаження та перетворення бази даних MaxMind.

Для зручності читання більша частина попереднього документа знаходиться тут, і я переглянув частини, які змінилися для Ubuntu 20.04/22.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

Отримання оновлень

sudo mkdir /usr/share/xt_geoip

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

#!/bin/bash 
MON=$(date +"%m")
YR=$(date +"%Y")

wget https://download.db-ip.com/free/dbip-country-lite-${YR}-${MON}.csv.gz -O /usr/share/xt_geoip/dbip-country-lite.csv.gz
gunzip /usr/share/xt_geoip/dbip-country-lite.csv.gz
/usr/lib/xtables-addons/xt_geoip_build -D /usr/share/xt_geoip/ -S /usr/share/xt_geoip/
rm /usr/share/xt_geoip/dbip-country-lite.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 адреса не оприлюднюватиметься. Обов’язкові поля позначені *