GeoIP tables XT_GeoIP iptables firewall country IPv4 block list

Netfilter je rámec poskytovaný linuxovým jádrem, který umožňuje implementovat různé operace související se sítí ve formě přizpůsobených obslužných programů. Netfilter nabízí různé funkce a operace firewallu pro filtrování paketů, překlad síťových adres a překlad portů, které poskytují funkcionalitu potřebnou pro směrování paketů sítí a zabraňující paketům, aby dosáhly citlivých míst v síti.

Netfilter představuje sadu háčků uvnitř linuxového jádra, která umožňuje konkrétním modulům jádra zaregistrovat funkce zpětného volání do síťového zásobníku jádra. Tyto funkce, obvykle aplikované na provoz ve formě filtrovacích a modifikačních pravidel, jsou volány pro každý paket, který prochází příslušným hákem v rámci síťového zásobníku.

Kombinace iptables, geoip a xt_geoip umí efektívně blokovat veškerý provoz v závislosti na tom odkud přichází. Přesnost záleží pouze na aktuálním stavu databáze IP adres.

Xtables GeoIP firewall

Pomocí xt_geoip rozšíření a GeoIP databáze lze snadno implementovat filtrování provozu firewallem IPtables. Použití UFW toto rozšíření nevylučuje. Návod je testován na operačním systému Debian 11.

Instalace xt_geoip balíčku (Debian, Ubuntu..). Lze rovněž stáhnout zdroják a kompilovat – v tom případě budete kompilaci + modprobe opakovat pravděpodobně po každém uprgade kernelu.

apt install xtables-addons-common

Dočasné složky

mkdir -p /usr/share/xt_geoip/tmp/
mkdir -p /usr/share/xt_geoip/tmp/ip2loc/

Stažení GeoIP databáze

wget https://mailfud.org/geoip-legacy/GeoIP-legacy.csv.gz -O /usr/share/xt_geoip/tmp/GeoIP-legacy.csv.gz
gunzip /usr/share/xt_geoip/tmp/GeoIP-legacy.csv.gz

(Lze vynechat) Další zdroje databáze IPv4 a IPv6 adres a IP adresních rozsahů na github.com/sapics/ip-location-db

wget -P /usr/share/xt_geoip/tmp/ https://cdn.jsdelivr.net/npm/@ip-location-db/geo-whois-asn-country/geo-whois-asn-country-ipv4.csv
wget -P /usr/share/xt_geoip/tmp/ https://cdn.jsdelivr.net/npm/@ip-location-db/geo-whois-asn-country/geo-whois-asn-country-ipv6.csv
wget -P /usr/share/xt_geoip/tmp/ https://cdn.jsdelivr.net/npm/@ip-location-db/iptoasn-country/iptoasn-country-ipv4.csv
wget -P /usr/share/xt_geoip/tmp/ https://cdn.jsdelivr.net/npm/@ip-location-db/iptoasn-country/iptoasn-country-ipv6.csv
wget -P /usr/share/xt_geoip/tmp/ https://cdn.jsdelivr.net/npm/@ip-location-db/dbip-country/dbip-country-ipv4.csv
wget -P /usr/share/xt_geoip/tmp/ https://cdn.jsdelivr.net/npm/@ip-location-db/dbip-country/dbip-country-ipv6.csv
wget -P /usr/share/xt_geoip/tmp/ https://cdn.jsdelivr.net/npm/@ip-location-db/geolite2-country/geolite2-country-ipv4.csv
wget -P /usr/share/xt_geoip/tmp/ https://cdn.jsdelivr.net/npm/@ip-location-db/geolite2-country/geolite2-country-ipv6.csv

Zpracování (všech) .csv

cat /usr/share/xt_geoip/tmp/*.csv | tr -d '"' | cut -d, -f1,2,5 > /usr/share/xt_geoip/tmp/GeoIP-legacy-processed.csv
rm /usr/share/xt_geoip/tmp/GeoIP-legacy.csv

Příkaz odstraní z cca 60MB .csv souboru pro náš účel zbytečné sloupce. Tabulka obsahuje ca 370 000 IPv4 adresních rozsahů. Soubor před úpravou obsahuje:

"1.0.0.0","1.0.0.255","16777216","16777471","AU","Australia"
"1.0.1.0","1.0.1.255","16777472","16777727","CN","China"
"1.0.2.0","1.0.3.255","16777728","16778239","CN","China"
"1.0.4.0","1.0.7.255","16778240","16779263","AU","Australia"
"1.0.8.0","1.0.15.255","16779264","16781311","CN","China"

Po úpravě pouze začátek a konec rozsahu + country codea. Tím je i o cca 75% menší. Po úpravě pomocí hore uvedeného je obsah zradukován na:

1.0.0.0,1.0.0.255,AU
1.0.1.0,1.0.1.255,CN
1.0.2.0,1.0.3.255,CN
1.0.4.0,1.0.7.255,AU
1.0.8.0,1.0.15.255,CN

Jednoduchý formát umožňuje vytvořit vlastní seznam a kompilovat vlastní binárku, kde stačí umístit vlastní rozsahy a nahradit country code specifickou značkou, třeba A3.

cd /usr/share/xt_geoip/tmp/
cat *.csv > geoip.csv
sort -u geoip.csv -o /usr/share/xt_geoip/tmp/dbip-country-lite.csv

Kompilace databáze pomocí xt_geoip_build očekávajícího soubor dbip-country-lite.csv ve složce /usr/share/xt_geoip/tmp/

cd /usr/share/xt_geoip/tmp/
bash /usr/libexec/xtables-addons/xt_geoip_build

to samé s -D definovanou složkou kde se uloží soubor(y) + soubor .csv pro vstup

/usr/libexec/xtables-addons/xt_geoip_build -D /usr/share/xt_geoip/tmp/ geoip.csv

Výstup

656832 entries
...
56 IPv6 ranges for YE
79 IPv4 ranges for YT
18 IPv6 ranges for YT
28 IPv4 ranges for YU
0 IPv6 ranges for YU
2294 IPv4 ranges for ZA
888 IPv6 ranges for ZA
172 IPv4 ranges for ZM
35 IPv6 ranges for ZM
...
AD.iv4  AW.iv6  BO.iv4  CH.iv6  DE.iv4  FI.iv6  GM.iv4  HT.iv6  dbip-country-lite.csv
...

Obsah souboru po komiplaci pomocí xt_geoip_build:

2e13 8900 2e13 89ff 2e13 8f00 2e13 8fff
3e49 0800 3e49 09ff 3feb 9bd2 3feb 9bd2
400c 7617 400c 7617 400c 7658 400c 7658
432b 9c00 432b 9cff 450a 8b00 450a 8bff
46e8 f500 46e8 f5ff 4a52 09e0 4a52 09e0
5d73 5200 5d73 53ff 5d73 5400 5d73 55ff

Celou tuto procedůru lze obejít stažením již kompilovaných souborů .iv4/6 a jejích umístěním (všech nebo vybraných) do složky /usr/share/xt_geoip/
Odkaz kde stažení z ufficyio.com na konci textu viz odstavec Užitečné.

Instalace geoip-bin

apt install geoip-bin

geoiplookup 77.75.76.3
GeoIP Country Edition: CZ, Czech Republic

Ověření zavedeného ovladače xt_geoip

lsmod | grep ^xt_geoip
xt_geoip               16384  1

Další XT skripty

S xtables-addons (Debian 11 instaluje verzi 3.18, z Git lze stáhnout t.č verzi 3.22 – nutno kompilovat) jsou instalovány i další skripty

ls /usr/libexec/xtables-addons
xt_geoip_build  xt_geoip_build_maxmind  xt_geoip_dl  xt_geoip_dl_maxmind

IPtables XT pravidlo

Přidání iptables pravidla DROP s proměnnou geoip -src-cc Čína a Rusko. Následuje výpis všech pravidel pomocí přepínače -L

iptables -A INPUT -m geoip --src-cc CN,RU -j DROP
iptables -L INPUT --line-numbers -vn

Výstup

iptables -L INPUT --line-numbers -vn

Chain INPUT (policy DROP 5688 packets, 298K bytes)
num   pkts   bytes   target     prot   opt   in     out                     source               destination
...
9          202    10143   DROP     all  --  *      *        0.0.0.0/0          0.0.0.0/0            -m geoip --source-country RU,CN
...

Vlastní adresní rozsahy

Do / mezi stažené soubory lze před kompilací přidat vlastní soubor .csv (kupříkladu A3.csv) s obsahem všech adresních rozsahů například AmazonAWS. To znamená filtrovat provoz na úrovni poskytovatele místo lokality. Podobných služeb které hostují tisíce botů je několik a generování zbytečného provoz po celém světě, dle některých statistik až o 30% provozu webových stránek. Po kompilaci lze soubor AWS.ip4 použít pomocí proměnné country ASW v pravidlech firewallu pomocí přepínače

-m geoip --source-country RU,CN,HK,A3

Kdy geoip nefunguje?

GeoIP xtables netfilter jako rozšíření iptables, pro filtrování nebude jako pravidlo firewallu fungovat na vstupu (INPUT) určitě v případě kdy další pravidlo otevřete (povolí) libovolný (konkrétní) port. Takové pravidlo musí zákonite před GeoIP filtrovací pravidlo, tím pádem projde i provoz z blokované země či adresního rozsahu. Pokud chcete odříznou provoz hned na začátku a zároveň upravit provoz pomocí dalších pravidel lepší (a určitě i jedodušší) bude použití ipset. IPset v kombinaci s IPtables rovněž umí optimalizovat seznam IP adres do jednoho řetězce.

Jak vymazat /tmp

Standardní příkaz rm *.iv6 v případě, že si chcete ve složce /tmp ponechat .iv4 souboru a .iv6 odstranit fungovat nebude. Bash přidá hvězdičku ke každému odpovídajícímu souboru, čímž vznikne velmi dlouhý příkaz. Pokus umazat stovky souborů .iv6 skončí hláškou

-bash: /usr/bin/rm: Argument list too long

Řešení?

find . -name "*.iv6" -print0 | xargs -0 rm

Co je .iv4 a .iv6 koncovka

Formát 16bit souboru .iv je Endian kompilát používaný MaxMind jako databáze. Mapuje adresy IPv4 a IPv6 do datových položek pomocí efektivního binárního vyhledávacího stromu. Zkratka znamená Integer Vector. Tak vypadá 10 řádků souboru A1iv4:

0210 0200 0210 02ff 0210 3c04 0210 3c07
0210 3c0c 0210 3c0f 0210 3c14 0210 3c17
0210 3c1c 0210 3c1d 0210 3c1e 0210 3c1e
0210 3c44 0210 3c47 0210 3c4c 0210 3c4f
0210 3c54 0210 3c57 0210 3c5c 0210 3c5f
0210 3c64 0210 3c67 0210 3c6c 0210 3c6f
0210 3c74 0210 3c75 0210 3c77 0210 3c77
0210 3c7c 0210 3c7c 0210 3c7e 0210 3c7e
0210 3c84 0210 3c87 0210 3c8c 0210 3c8f
0210 3c94 0210 3c97 0210 3c9c 0210 3c9f

Co je A1, A2, BE, LE složka?

Složka A1 jsou IP adresy anonymní proxy, A2 satelitní telefón (internet).
Když soubory s IP adresamy stáhnete předkompilované (přímo v .iv formátu), může se stát, že v archivu najdete místo jedné složky dva, LE a BE. V každé pak od pohledu stejný počet stejně velikých soubory .iv. Nejde o duplicity. Jedna složka obsahuje soubory zapsané pomocí Big Endian, druhá pomocá Little Endian. Lze použít obe složky, nebo pouze soubor(y) z jedné z nich. V odstavci nad tímto textem je zápis deseti IP adres a Country code v Big Endian. Jak zjistit verzi endianu na serveru?

echo -n I | od -to2 | head -n1 | cut -f2 -d" " | cut -c6
0

Číslo 1 ve výpisu znamená Little Endian, číslo 0 znamená Big Endian. Pro AIX a HPUX server použijeme příkaz:

echo I | tr -d [:space:] | od -to2 | head -n1 | awk '{print $2}' | cut -c6

GeoIP generátor Linux

bash /usr/lib/geoip/geoip-generator --help
Usage: /usr/lib/geoip/geoip-generator [OPTION] [CSV-FILE]...
Convert a GeoIP database from CSV to GeoIP binary format.

-4, --inet                              set database type to GEOIP_COUNTRY_EDITION, v4 addresses (default)
-6, --inet6                            set database type to GEOIP_COUNTRY_EDITION_V6, v6 addresses
-t, --type=TYPE                 set database type explicitly (e.g. to GEOIP_CITY_EDITION_REV1)
-i, --info=TEXT                  add copyright or other info TEXT to output
-l, --location-csv=FILE  set location CSV file name (required for GEOIP_CITY_EDITION_REV1)
-o, --output=FILE            write the binary data to FILE, not stdout
-v, --verbose                     show what is going on
--help                                  display this help and exit

Ovladače

compat_xtables.ko, xt_ACCOUNT.ko, xt_CHAOS.ko, xt_DELUDE.ko, xt_DHCPMAC.ko, xt_DNETMAP.ko, xt_ECHO.ko, xt_IPMARK.ko, xt_LOGMARK.ko, xt_PROTO.ko, xt_SYSRQ.ko, xt_TARPIT.ko, xt_condition.ko, xt_fuzzy.ko, xt_geoip.ko, xt_iface.ko, xt_ipp2p.ko, xt_ipv4options.ko, xt_length2.ko, xt_lscan.ko, xt_pknock.ko, xt_psd.ko, xt_quota2.ko

Zpracování routovaného paketu

Ilustrace schéma zpracování routovaného paketu Netfiltrem

xt_geoip firewall ufw paket
Netfilter tabulka procesování routovaného paketu

Užitečné

GeoIP databáze ke staženi z ufficyo.com (včetne vygenerovaných souborů ve formátu .iv).
GeoIP .dat databáze ke stažení z miyuru.lk
Omezené filtrování HTTP provozu.
Nginx geolite2legacy GitHub.
Domovská stránka Xtables.

ICTIS.CZ