xtables-addons: фільтруем пакеты па краінах

xtables-addons: фільтруем пакеты па краінах
Задача блакавання трафіку з пэўных краін здаецца простай, але першае ўражанне зманлівае. Сёння раскажам, як гэта можна рэалізаваць.

перадгісторыя

Вынікі пошуку ў Google па гэтай тэме засмучаюць: большасць рашэнняў даўно "пратухлі" і часам здаецца, што гэтую тэму адклалі ў доўгую скрыню і назаўжды забыліся пра яе. Мы ж «прашэрсцілі» шмат старых запісаў і гатовы падзяліцца сучаснай версіяй інструкцыі.

Рэкамендуем прачытаць артыкул цалкам, перш чым выконваць указаныя каманды.

Падрыхтоўка аперацыйнай сістэмы

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

На момант напісання артыкула актуальная версія xtables-addons – 3.9. Тым не менш, у стандартных рэпазітарах Ubuntu 20.04/3.8 LTS можна знайсці толькі 18.04, а ў рэпазітарах Ubuntu 3.0/XNUMX - XNUMX. Усталяваць пашырэнне з пакетнага мэнэджара можна наступнай камандай:

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

Нас усё задавальняе і застаецца толькі дадаць назву модуля ў / і г.д. / модулі, Каб модуль зарабіў пасля перазагрузкі АС. З гэтага моманту 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 кампаніяй МаксМінд. З гэтым прадуктам адбылося адразу дзве падзеі, якія "зламалі" сумяшчальнасць з пашырэннем для 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

Дадаць каментар