IPset GeoIP iptables firewall country IPv4 block list

IP sada (ipset) představují rámec uvnitř jádra Linuxu, který lze spravovat pomocí stejnojmenného nástroje. V závislosti na typu může sada IP uchovávat adresy IP, sítě, čísla portů (TCP/UDP), adresy MAC, názvy rozhraní nebo jejich kombinace způsobem, který zajišťuje bleskovou rychlost při porovnávání záznamu se sadou.

Pokud chcete uložit více IP adres nebo čísel portů a porovnat je se stávajíci sadou najednou; dynamicky aktualizovat pravidla firewallu proti adresám IP nebo portům bez snížení výkonu; vyjádřit složité sady pravidel založené na IP adresách a portech pomocí jediného pravidla fw a využít rychlosti sad IP pak pro vás může být vhodným nástrojem. Autorem „sady IP“ je Jozsef Kadlecsik a vychází z nástroje ippool od Joakima Axelssona, Patricka Schaafa a Martina Josefssona.

Netfilter addon IPset vs Xtables

Technicky vzato, ochrana serveru pomocí ipset je o něco pružnější než ochrana serveru pomocí xt_geoip (xtables). V prvním i druhém případě se jedná o nástavbu pro Netfilter, který funguje v rámci linuxového jádra. Pracuje pouze s jedním black listem a pravidlo fw lze umístit prakticky kdekoliv v řetězci INPUT. Nejdůležitější je, že si set vzájemně nevadí s fail2ban pravidlem a sety ip adres jsou na rozdíl od xtables čitelné.

Jak nastavit set + firewall?

Vytvoříme nový set blacklist pomocí -N, přidáme IP adresu do setu pomocí -A, vložíme set pomocí -m set –match set do fw

ipset -N blacklist nethash
ipset -A blacklist 81.212.0.0/14
iptables -A INPUT -m set --match-set blacklist src -j REJECT ## Nemusí fungovat :)
iptables -I INPUT 5 -m set --match-set blacklist src -j REJECT ## Stejné pravidlo vloženo ale na řádek 5

Větší seznamy a bulk import do setu je možný pomocí standardních Linux nástrojů, dva příklady sed + awk jsou uvedeny před koncem textu.

Dvě možnosti

1. Filtrovat seznam zranitelností zneužívajících IP adres, přímo na vstupu, bez logování pomocí předvolby -I INPUT 5 Ta je použita pro zápis pravidla na správnou pozici {v našem případe číslo pět}. Předvolba -A by zapsala pravidlo jako poslední v řetězci INPUT.

iptables -I INPUT 5 -m set --match-set blacklist src -j REJECT

2. Další možnost je vytvořit vlastní řetězec MUJ_CHAIN, následně vše (z IP adres uvedených v blacklistu) posílat do vytvořeného řetězce MUJ_CHAIN, zapisovat do logu a až následně pakety zahodit (DROP) nebo odmítnout (REJECT).

iptables -N MUJ_CHAIN
iptables -I INPUT 5 -m set --match-set blacklist src -j MUJ_CHAIN
iptables -A MUJ_CHAIN -m limit --limit 2/min -j LOG --log-prefix "MUJ_CHAIN-Zahozeno: "
iptables -A MUJ_CHAIN -j DROP

Export černé listiny do souboru (libovolná koncovka, libovolný název)

ipset save > /backup/blacklist
ipset save > /backup/blacklist.txt
ipset save > /backup/blacklist.conf

Každý blacklist nebo whitelist začíná řádkem který obsahuje příkaz + seznam IP adres. Po editaci, exportu či obnově ze zálohy lze použít příkaz restore pro nahrání zálohy. Exportovaný soubor černé listiny blacklist otevřený pomocí nano vypadá takto

create blacklist hash:net family inet hashsize 4096 maxelem 65536
add blacklist 1.2.3.0/18
add blacklist 4.5.6.0/24
...

Obnova ze zálohy s force rewrite (přepíše stejnojmenný set)

ipset restore -! < /backup/blacklist

Odstranění setu (s aktivním pravidlem fw set nelze odstranit, zmažeme tedy nejdřív iptables pravidlo) a až pak set

iptables -D INPUT 5
ipset destroy blacklist
nebo
ipset -X blacklist

Všechyn sety odstraníme pomocí

ipset destroy

Download sady IP adres

Seznamy adres lze stáhnout třeba z webu country ip blocks. Podporované formáty ACL ke stažení jsou Apache .htaccess Deny, Apache .htaccess Allow, CIDR, Cisco ACL, Cisco bit bucket, Decimal/CIDR, IP Range, Inverse Netmask, Juniper Junos, Linux iptables, MicroTik, Netmask, Network-Object, Peerguardian2, web.config Deny, web.config allow, Custom CIDR, Custom Netmask.

Agregace IP

Užitečná vychytávka která mimo primární účel rovněž odhalí skryté chyby (znak mezera, escape..) v souboru ipsetu. Umí zmenšit (zejména větší) ipset až o 70% se jmenuje agregace setu. Tím, že sloučí všechny sousední sítě do většího subnetu s nižší maskou. Příklad 1.0.1.0/24 + 1.0.2.0/24 = 1.0.1.0/23. Funkční perl skript aggregate-cidr-addresses.pl na github denji. V příkladu je ipset vstup pojmenován blacklist_neagregovany.txt, výstup blacklist_agregovany.txt

wget https://gist.github.com/denji/17e30bddb9ce9e50294a/archive/66c60d7f312b19ecef5a095be8b13d79082d7bc5.zip
unzip 66c60d7f312b19ecef5a095be8b13d79082d7bc5.zip
mv 17e30bddb9ce9e50294a/archive/66c60d7f312b19ecef5a095be8b13d79082d7bc5/aggregate-cidr-addresses.pl /moje/složka/
perl aggregate-cidr-addresses.pl blacklist_neagregovany.txt > blacklist_agregovany.txt
ipset restore -! < /cesta/k/souboru/blacklist_agregovany.txt

Porovnání vstupu a výstupu;

958/3072 = 0.31184895833333
0.31184895833333 x 100 = 31.1849%

Rozdíl mínus cca 70%

ls -alh blackl*
-rw-r--r-- 1 user user 3.0M Jun 16 05:36 blacklist_neagregovany.txt
-rw-r--r-- 1 user user 0.9K  Jun 16 05:42 blacklist_agregovany.txt

Zmenšení je užitečné, ale.. V případě, že používáte dynamický ipset, bude vás použití agregačního skriptu do jisté míry omezovat průnikem již zpracovaných a nových CIDR. To znamené, bude nutné vést jako doposud neagregovaný ipset, nové IP adresy přídávat do něj a z něj teprve agregovat exportní ipset..

Zkratky

U generátoru či agregátorů setů se můžete setkat se zkratkami; mimo známé CIDR, Mask, Range, Apache existují i méně obvyké B-N, HTA, ZBB. Nejznámější CIDR je tvar 1.0.0.0/24. Range je 1.0.0.0 – 1.0.0.255 (někdy i obvyklejší tvar bez čísla sítě a broadcastu 1.0.0.1 – 1.0.0.254). B-H je bad neighbours tvar a ZBB je ZB-block ve tvaru $ax += cidrblock($address,’1.0.0.0/24′,’0. ‚); Toolset který vygenruje pravidlo přímo pro zápisu do iptables je například technoblog.org.

Nástroje ipcalc sed awk cat sort

Vychytávka na úpravu seznamu CIDR bloků IP adres je sed. Raw seznam IP adres upravíme tak, že na začátek každého řádku souboru CIDR1.txt s obsahem IP adres (který chceme použít ve fw)

1.1.1.0/24
2.2.2.0/30
...

pomocí sed přidáme jméno setu + mezeru

sed 's/^/add blacklist /' ip_bez_ipsetu.txt  > ip_s_ipsetem.txt

Obsah souboru po úpravě, připravený na import setu do pravidel fw

create blacklist hash:net family inet hashsize 4096 maxelem 65536
add blacklist 1.1.1.0/24
add blacklist 2.2.2.0/30
...

Máte k dispozici raw seznam rozepsaných IP adres ve formátu MaxMind nebo jiné .csv s oddělovačem „-„ a potřebujete konvertovat

1.1.1.0 - 1.1.1.255
2.2.2.0 - 2.2.2.255
...

Převedení seznamu IP adres do CIDR bloků? Stačí doinastalovat ipcalc a použít jej s awk + tail v příkazu

awk '{system("ipcalc -rn "$1 "| tail -n +2")}' ip_bez_cidr.txt > ip_s_cidr.txt

Výstup

1.1.1.0/24
2.2.2.0/30
...

následně skonvertujeme hore uvedeným příkazem sed. Skontrolujeme zda-li první řádek obsahuje příkaz a můžeme set importovat do sady pravidel fw..

Seřadit IP adresy od nejnižší po nejvyšší číslo lze příkazem sort

cat /cest/k/soubor_neserazene_IP.txt | sort -t . -k 1,1n -k 2,2n -k 3,3n -k 4,4n > /cest/k/soubor_serazene.txt

Vizualizace

Netfilter iptables ipset firewall
firewall paket

Užitečné

Text GeoIP xtables fw černá listina dle států.
Domovská stránka ipdeny.com
Domovská stránka IPst

ICTIS.CZ