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.
Obsah
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

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.