[Настройка Linux, Сетевые технологии, Системное администрирование] xtables-addons: фильтруем пакеты по странам
Автор
Сообщение
news_bot ®
Стаж: 6 лет 9 месяцев
Сообщений: 27286
Задача блокировки трафика из определенных стран кажется простой, но первое впечатление обманчиво. Сегодня расскажем, как это можно реализовать.
Предыстория
Результаты поиска в 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.
Во-вторых, c декабря 2019 года MaxMind заявила о значительном изменении в доступе к их базам. Чтобы соответствовать Калифорнийскому закону о защите прав потребителей, компания MaxMind приняла решение «прикрыть» распространение GeoLite2 регистрацией.
Так как мы хотим воспользоваться их продуктом, зарегистрируемся на этой странице.
После на почту придет сообщение с просьбой установить пароль. Теперь, когда мы завели аккаунт, нужно создать лицензионный ключ. В личном кабинете находим пункт My License Keys, а затем нажимаем на кнопку Generate new License Key.
При создании ключа нам зададут только один вопрос: будем ли мы использовать этот ключ в программе GeoIP Update? Отвечаем отрицательно и нажимаем на кнопку Confirm. Во всплывающем окне будет отображен ключ. Сохраните этот ключ в надежное место, так как после закрытия всплывающего окна вы больше не сможете посмотреть ключ полностью.
У нас есть возможность скачивать базы 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.
В первом случае сокращаем 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-данных, что значительно упростит жизнь системным администраторам.
===========
Источник:
habr.com
===========
Похожие новости:
- [IT-инфраструктура, Разработка систем связи, Сетевые технологии] Через сегмент оптоволоконной сети впервые передали данные со скоростью 800 Гбит/с
- [Kubernetes, Серверное администрирование, Системное администрирование] Приглашаем на видеокурс по Docker: узнать новое, закрепить старое
- [Open source, Системное администрирование, Визуализация данных] Обновился наш плагин для Grafana — Statusmap panel 0.3.0
- [Системное администрирование] Короткая заметка по инциденту с перегревом RAID-контроллера LSI в сервере в холодном ЦОДе
- [Будущее здесь, Космонавтика, Научно-популярное] Пуски всех тяжелых ракет-носителей переносятся на 2021 год… наверное
- [DevOps, Kubernetes, Серверное администрирование, Системное администрирование] Логирование в Kubernetes: EFK против PLG (перевод)
- [Настройка Linux, Системное администрирование, Облачные вычисления, Серверное администрирование, DevOps] Основы Ansible, без которых ваши плейбуки — комок слипшихся макарон, часть 2
- [Системное администрирование] Clickhouse против Postgres — какую базу данных использовать для анализа логов nginx (перевод)
- [DevOps, Настройка Linux] Используем nftables в Red Hat Enterprise Linux 8 (перевод)
- [Удалённая работа, Управление персоналом] 10 историй про IT-трансформацию в режиме самоизоляции
Теги для поиска: #_nastrojka_linux (Настройка Linux), #_setevye_tehnologii (Сетевые технологии), #_sistemnoe_administrirovanie (Системное администрирование), #_iptables, #_addons, #_geoip, #_geolocation, #_filtering, #_blog_kompanii_selectel (
Блог компании Selectel
), #_nastrojka_linux (
Настройка Linux
), #_setevye_tehnologii (
Сетевые технологии
), #_sistemnoe_administrirovanie (
Системное администрирование
)
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 19:38
Часовой пояс: UTC + 5
Автор | Сообщение |
---|---|
news_bot ®
Стаж: 6 лет 9 месяцев |
|
Задача блокировки трафика из определенных стран кажется простой, но первое впечатление обманчиво. Сегодня расскажем, как это можно реализовать. Предыстория Результаты поиска в 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. Во-вторых, c декабря 2019 года MaxMind заявила о значительном изменении в доступе к их базам. Чтобы соответствовать Калифорнийскому закону о защите прав потребителей, компания MaxMind приняла решение «прикрыть» распространение GeoLite2 регистрацией. Так как мы хотим воспользоваться их продуктом, зарегистрируемся на этой странице. После на почту придет сообщение с просьбой установить пароль. Теперь, когда мы завели аккаунт, нужно создать лицензионный ключ. В личном кабинете находим пункт My License Keys, а затем нажимаем на кнопку Generate new License Key. При создании ключа нам зададут только один вопрос: будем ли мы использовать этот ключ в программе GeoIP Update? Отвечаем отрицательно и нажимаем на кнопку Confirm. Во всплывающем окне будет отображен ключ. Сохраните этот ключ в надежное место, так как после закрытия всплывающего окна вы больше не сможете посмотреть ключ полностью. У нас есть возможность скачивать базы 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 скачиваний в сутки и при большом количестве серверов предлагает кэшировать обновление на прокси-сервере.
А выходной файл содержит шесть колонок:
Это несоответствие критично и может быть исправлено одним из двух способов:
В первом случае сокращаем 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-данных, что значительно упростит жизнь системным администраторам. =========== Источник: habr.com =========== Похожие новости:
Блог компании Selectel ), #_nastrojka_linux ( Настройка Linux ), #_setevye_tehnologii ( Сетевые технологии ), #_sistemnoe_administrirovanie ( Системное администрирование ) |
|
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 19:38
Часовой пояс: UTC + 5