Задача блакавання трафіку з пэўных краін здаецца простай, але першае ўражанне зманлівае. Сёння раскажам, як гэта можна рэалізаваць.
перадгісторыя
Вынікі пошуку ў Google па гэтай тэме засмучаюць: большасць рашэнняў даўно "пратухлі" і часам здаецца, што гэтую тэму адклалі ў доўгую скрыню і назаўжды забыліся пра яе. Мы ж «прашэрсцілі» шмат старых запісаў і гатовы падзяліцца сучаснай версіяй інструкцыі.
Рэкамендуем прачытаць артыкул цалкам, перш чым выконваць указаныя каманды.
Падрыхтоўка аперацыйнай сістэмы
Фільтраванне будзе наладжвацца з дапамогай утыліты Iptables, якой патрабуецца пашырэнне для працы з GeoIP-дадзенымі. Такое пашырэнне можна знайсці ў
На момант напісання артыкула актуальная версія 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, які распаўсюджваецца па ліцэнзіі.
Па-першае, у студзені 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