xtables-addons: фільтруємо пакети країнами

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

Передісторія

Результати пошуку в Google на цю тему засмучують: більшість рішень давно «протухли» і часом здається, що цю тему відклали у довгу скриньку і назавжди забули про неї. Ми ж «прошерстили» багато старих записів та готові поділитися сучасною версією інструкції.

Рекомендуємо прочитати статтю повністю, перш ніж виконувати зазначені команди.

Підготовка операційної системи

Фільтрування налаштовуватиметься за допомогою утиліти Iptables, яка потребує розширення для роботи з GeoIP-даними. Таке розширення можна знайти у xtables-addons. xtables-addons встановлює розширення для iptables у вигляді самостійних модулів ядра, завдяки чому не потрібно перекомпілювати ядро ​​ОС.

На момент написання статті актуальна версія xtables-addons - 3.9. Тим не менш, у стандартних репозиторіях Ubuntu 20.04 LTS можна знайти лише 3.8, а в репозиторіях Ubuntu 18.04 – 3.0. Встановити розширення з пакетного менеджера можна наступною командою:

apt install xtables-addons-common libtext-csv-xs-perl

Зазначимо, що між версією 3.9 та поточним станом проекту є невеликі, але важливі відмінності, про які ми поговоримо пізніше. Для збирання з вихідних кодів встановлюємо всі необхідні пакети:

apt install git build-essential autoconf make libtool iptables-dev libxtables-dev pkg-config libnet-cidr-lite-perl libtext-csv-xs-perl

Клонуємо репозиторій:

git clone https://git.code.sf.net/p/xtables-addons/xtables-addons xtables-addons-xtables-addons

cd xtables-addons-xtables-addons

xtables-addons містить безліч розширень, але нас цікавить лише xt_geoip. Якщо не хочеться тягнути в систему непотрібні розширення, їх можна виключити зі збирання. Для цього потрібно відредагувати файл mconfig. Для всіх бажаних модулів поставити y, а всі непотрібні відзначити n. Збираємо:

./autogen.sh

./configure

make

І встановлюємо з правами суперкористувача:

make install

Під час встановлення модулів ядра може виникнути помилка приблизно такого змісту:

INSTALL /root/xtables-addons-xtables-addons/extensions/xt_geoip.ko
At main.c:160:
- SSL error:02001002:system library:fopen:No such file or directory: ../crypto/bio/bss_file.c:72
- SSL error:2006D080:BIO routines:BIO_new_file:no such file: ../crypto/bio/bss_file.c:79
sign-file: certs/signing_key.pem: No such file or directory

Така ситуація виникає через неможливість підписати модулі ядра, т.к. нічим підписувати. Вирішити цю проблему можна парою команд:

cd /lib/modules/(uname -r)/build/certs

cat <<EOF > x509.genkey

[ req ]
default_bits = 4096
distinguished_name = req_distinguished_name
prompt = no
string_mask = utf8only
x509_extensions = myexts

[ req_distinguished_name ]
CN = Modules

[ myexts ]
basicConstraints=critical,CA:FALSE
keyUsage=digitalSignature
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid
EOF

openssl req -new -nodes -utf8 -sha512 -days 36500 -batch -x509 -config x509.genkey -outform DER -out signing_key.x509 -keyout signing_key.pem

Скомпільований модуль ядра встановлений, але система його не визначає. Попросимо систему створити карту залежностей з урахуванням нового модуля, а потім завантажимо його:

depmod -a

modprobe xt_geoip

Переконаємося, що xt_geoip завантажений у систему:

# lsmod | grep xt_geoip
xt_geoip               16384  0
x_tables               40960  2 xt_geoip,ip_tables

Додатково переконаємося, що розширення завантажилося в iptables:

# cat /proc/net/ip_tables_matches 
geoip
icmp

Нас все влаштовує і залишається тільки додати назву модуля в / etc / modulesщоб модуль запрацював після перезавантаження ОС. З цього моменту iptables розуміє команди geoip, але йому не вистачає даних для роботи. Починаємо завантаження бази даних geoip.

Отримання бази даних GeoIP

Створюємо каталог, в якому зберігається інформація, зрозуміла розширенню iptables:

mkdir /usr/share/xt_geoip

На початку статті ми згадували, що між версією вихідного коду та версією пакетного менеджера є відмінності. Найпомітніша відмінність полягає у зміні постачальника бази даних та скрипті xt_geoip_dl, що завантажує актуальні дані.

Версія з пакетного менеджера

Скрипт лежить на шляху /usr/lib/xtables-addons, однак при спробі запуску можна побачити не найінформативнішу помилку:

# ./xt_geoip_dl 
unzip:  cannot find or open GeoLite2-Country-CSV.zip, GeoLite2-Country-CSV.zip.zip or GeoLite2-Country-CSV.zip.ZIP.

Раніше як базу даних використовувався продукт GeoLite, нині відомий як GeoLite Legacy, що розповсюджується за ліцензією Creative Commons ASA 4.0 компанією MaxMind. З цим продуктом сталося відразу дві події, які «зламали» сумісність із розширенням для iptables.

По-перше, у січні 2018 року оголосили про припинення підтримки продукту, і другого січня 2019 з офіційного сайту прибрали всі посилання на завантаження старої версії бази. Новим користувачам рекомендується використовувати продукт GeoLite2 або його платну версію GeoIP2.

По-друге, з грудня 2019 року MaxMind заявила про значну зміну у доступі до їх баз. Щоб відповідати Каліфорнійському закону про захист прав споживачів, компанія MaxMind вирішила "прикрити" поширення GeoLite2 реєстрацією.

Оскільки ми хочемо скористатися їх продуктом, зареєструємось на цій сторінці.

xtables-addons: фільтруємо пакети країнами
Після цього на пошту прийде повідомлення з проханням встановити пароль. Тепер, коли ми завели обліковий запис, потрібно створити ліцензійний ключ. В особистому кабінеті знаходимо пункт My License Keys, а потім натискаємо на кнопку Generate new License Key.

При створенні ключа нам поставлять лише одне питання: чи ми будемо використовувати цей ключ у програмі GeoIP Update? Відповідаємо негативно та натискаємо на кнопку підтвердити. У спливаючому вікні буде відображено ключ. Збережіть цей ключ у надійне місце, оскільки після закриття спливаючого вікна ви більше не зможете переглянути ключ повністю.

xtables-addons: фільтруємо пакети країнами
У нас є можливість завантажувати бази GeoLite2 в ручному режимі, але їх формат не сумісний із форматом, на який очікує скрипт xt_geoip_build. Тут на допомогу приходять скрипти GeoLite2xtables. Для роботи скриптів встановлюємо perl-модуль NetAddr :: IP:

wget https://cpan.metacpan.org/authors/id/M/MI/MIKER/NetAddr-IP-4.079.tar.gz

tar xvf NetAddr-IP-4.079.tar.gz

cd NetAddr-IP-4.079

perl Makefile.PL

make

make install

Далі клонуємо репозиторій зі скриптами та записуємо у файл отриманий раніше ліцензійний ключ:

git clone https://github.com/mschmitt/GeoLite2xtables.git

cd GeoLite2xtables

echo YOUR_LICENSE_KEY=’123ertyui123' > geolite2.license

Запускаємо в роботу скрипти:

# Скачиваем данные GeoLite2
./00_download_geolite2
# Скачиваем информацию о странах (для соответствия коду)
./10_download_countryinfo
# Конвертируем GeoLite2 базу в формат GeoLite Legacy 
cat /tmp/GeoLite2-Country-Blocks-IPv{4,6}.csv |
./20_convert_geolite2 /tmp/CountryInfo.txt > /usr/share/xt_geoip/dbip-country-lite.csv

MaxMind накладає обмеження в 2000 завантажень за добу і при великій кількості серверів пропонує кешувати оновлення на проксі-сервері.

Зверніть увагу, що вихідний файл обов'язково має називатися dbip-country-lite.csv. На жаль, 20_convert_geolite2 видає не ідеальний файл. Скрипт xt_geoip_build чекає три колонки:

  • початок діапазону адрес;
  • кінець діапазону адрес;
  • код країни на iso-3166-alpha2.

А вихідний файл містить шість колонок:

  • початок діапазону адрес (рядкове уявлення);
  • кінець діапазону адрес (рядкове подання);
  • початок діапазону адрес (числове подання);
  • кінець діапазону адрес (числове подання);
  • код країни;
  • назва країни.

Ця невідповідність критична і може бути виправлена ​​одним із двох способів:

  1. правити 20_convert_geolite2;
  2. правити xt_geoip_build.

У першому випадку скорочуємо printf до потрібного формату, а в другому - змінюємо привласнення змінної $cc на $row->[4]. Після цього можна виконувати збірку:

/usr/lib/xtables-addons/xt_geoip_build -S /usr/share/xt_geoip/ -D /usr/share/xt_geoip

. . .
 2239 IPv4 ranges for ZA
  348 IPv6 ranges for ZA
   56 IPv4 ranges for ZM
   12 IPv6 ranges for ZM
   56 IPv4 ranges for ZW
   15 IPv6 ranges for ZW

Зазначимо, що автор GeoLite2xtables не вважає свої скрипти готовими для продакшену та пропонує стежити за розробкою оригінальних скриптів xt_geoip_*. Тому перейдемо до збирання з вихідних кодів, де ці скрипти вже оновлені.

Версія з вихідних кодів

Під час встановлення з вихідних кодів скрипти xt_geoip_* розташовуються в каталозі /usr/local/libexec/xtables-addons. У цій версії скрипта використовується база даних IP to Country Lite. Ліцензія — Creative Commons Attribution License, а з доступних даних ті необхідні три стовпці. Завантажуємо та збираємо базу:

cd /usr/share/xt_geoip/

/usr/local/libexec/xtables-addons/xt_geoip_dl

/usr/local/libexec/xtables-addons/xt_geoip_build

Після цих дій iptables готовий до роботи.

Використовуємо geoip в iptables

модуль xt_geoip додає всього два ключі:

geoip match options:
[!] --src-cc, --source-country country[,country...]
	Match packet coming from (one of) the specified country(ies)
[!] --dst-cc, --destination-country country[,country...]
	Match packet going to (one of) the specified country(ies)

NOTE: The country is inputed by its ISO3166 code.

Способи формування правил для iptables, загалом, залишаються незмінними. Для використання ключів із додаткових модулів необхідно явно вказувати назву модуля із ключем -m. Наприклад, правило для блокування вхідних TCP-з'єднань на 443 порту не зі США на всіх інтерфейсах:

iptables -I INPUT ! -i lo -p tcp --dport 443 -m geoip ! --src-cc US -j DROP

Файли, створені xt_geoip_build, використовуються лише при створенні правил, але не враховуються під час фільтрації. Таким чином, для коректного оновлення бази geoip необхідно спочатку оновити iv*-файли, а потім перестворити всі правила, які використовують geoip в iptables.

Висновок

Фільтрування пакетів залежно від належності до країн — дещо забута часом стратегія. Незважаючи на це, програмні засоби для такої фільтрації розвиваються і, можливо, незабаром у пакетних менеджерах з'явиться нова версія xt_geoip з новим постачальником geoip даних, що значно спростить життя системним адміністраторам.

xtables-addons: фільтруємо пакети країнами

Тільки зареєстровані користувачі можуть брати участь в опитуванні. Увійдіть, будь ласка.

А вам доводилося використовувати фільтрацію країнами?

  • 59,1%Так13

  • 40,9%Ні9

Проголосували 22 користувача. Утрималися 3 користувачів.

Джерело: habr.com

Додати коментар або відгук