Завдання блокування трафіку з певних країн здається простим, але перше враження оманливе. Сьогодні розкажемо, як це можна реалізувати.
Передісторія
Результати пошуку в Google на цю тему засмучують: більшість рішень давно «протухли» і часом здається, що цю тему відклали у довгу скриньку і назавжди забули про неї. Ми ж «прошерстили» багато старих записів та готові поділитися сучасною версією інструкції.
Рекомендуємо прочитати статтю повністю, перш ніж виконувати зазначені команди.
Підготовка операційної системи
Фільтрування налаштовуватиметься за допомогою утиліти Iptables, яка потребує розширення для роботи з GeoIP-даними. Таке розширення можна знайти у
На момент написання статті актуальна версія 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, що розповсюджується за ліцензією
По-перше, у січні 2018 року
По-друге, з грудня 2019 року MaxMind
Оскільки ми хочемо скористатися їх продуктом, зареєструємось на цій сторінці.
Після цього на пошту прийде повідомлення з проханням встановити пароль. Тепер, коли ми завели обліковий запис, потрібно створити ліцензійний ключ. В особистому кабінеті знаходимо пункт My License Keys, а потім натискаємо на кнопку Generate new License Key.
При створенні ключа нам поставлять лише одне питання: чи ми будемо використовувати цей ключ у програмі GeoIP Update? Відповідаємо негативно та натискаємо на кнопку підтвердити. У спливаючому вікні буде відображено ключ. Збережіть цей ключ у надійне місце, оскільки після закриття спливаючого вікна ви більше не зможете переглянути ключ повністю.
У нас є можливість завантажувати бази 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.
А вихідний файл містить шість колонок:
- початок діапазону адрес (рядкове уявлення);
- кінець діапазону адрес (рядкове подання);
- початок діапазону адрес (числове подання);
- кінець діапазону адрес (числове подання);
- код країни;
- назва країни.
Ця невідповідність критична і може бути виправлена одним із двох способів:
- правити 20_convert_geolite2;
- правити xt_geoip_build.
У першому випадку скорочуємо
/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
Зазначимо, що автор
Версія з вихідних кодів
Під час встановлення з вихідних кодів скрипти xt_geoip_* розташовуються в каталозі /usr/local/libexec/xtables-addons. У цій версії скрипта використовується база даних
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 даних, що значно спростить життя системним адміністраторам.
Тільки зареєстровані користувачі можуть брати участь в опитуванні.
А вам доводилося використовувати фільтрацію країнами?
-
59,1%Так13
-
40,9%Ні9
Проголосували 22 користувача. Утрималися 3 користувачів.
Джерело: habr.com