Вступ
Це оновлене попереднє керівництво, яке я написав раніше, Блокування за допомогою 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]