ipset sposobem na zmniejszenie liczby reguł iptables

ipset służy do tworzenia list adresów IP, sieci, adresów MAC i portów, to jedno z narzędzi, które jest dostępne w kernelach linuksa począwszy od 2.4. listami IP zarządzamy poleceniem ipset, a wykorzystać możemy je na przykład w iptables.

Wspierana typy list (wyciągnięta z ipset -h)

hash:ip
hash:ip,port
hash:ip,port,ip
hash:ip,port,net
hash:net
hash:net,iface
bitmap:ip
bitmap:ip,mac
bitmap:port

Opiszę typy list na przykładach danych, jakie przechowują

hash:ip

ipset create TestHashIP hash:ip
ipset add TestHashIP 192.168.1.1

hash:ip,port

ipset create TestHashIPPort hash:ip,port
ipset add TestHashIPPort 192.168.1.1,443

hash:ip,port,ip

ipset create TestHashIPPortIP hash:ip,port,ip
ipset add TestHashIPPortIP 192.168.1.1,33,10.0.0.1

hash:ip.port,net

ipset create TestHashIPPortNet hash:ip,port,net
ipset add TestHashIPPortNet 192.168.2.1/23,33,10.2.0.1/24

hash:net

ipset create TestHashNet hash:net
ipset add TestHashNet 192.168.1.1/23

hash: net,iface

ipset create HashNetIface hash:net,iface
ipset add HashNetIface 192.168.0.1/24,eth10

bitmap:ip

ipset create BitmapIP bitmap:ip range 10.0.0.0/16
ipset add BitmapIP 10.0.0.8

bitmap:ip,mac

ipset create BitmapIPMac bitmap:ip,mac range 192.168.0.0/16
ipset add BitmapIPMac 192.168.0.1,00:30:4F:30:30:30

bitmap:port

ipset create BitmapPort bitmap:port range 0-65535
ipset add BitmapPort 443

To już wszystkie typy, zapewne już podczas czytania przykładów nasunęły się każdemu pomysły, jak to wykorzystać u siebie, aby tworzyć reguły efektywniej. Ale pozwolę sobie przedstawić kilka odpowiedników w czystym iptables i z użyciem ipset.

  • Łańcuch forward, akceptuję tylko klientów, których adres IP odpowiada adresowi MAC, który znam.
iptables -t filter -A FORWARD -s 10.1.30.2/32 ! -d 10.0.0.0/8 -m mac --mac-source 00:02:00:00:00:02 -j ACCEPT
iptables -t filter -A FORWARD -s 10.1.30.3/32 ! -d 10.0.0.0/8 -m mac --mac-source 00:03:00:00:00:03 -j ACCEPT
iptables -t filter -A FORWARD -s 10.1.30.4/32 ! -d 10.0.0.0/8 -m mac --mac-source 00:04:00:00:00:04 -j ACCEPT
iptables -t filter -A FORWARD -s 10.1.30.5/32 ! -d 10.0.0.0/8 -m mac --mac-source 00:05:00:00:00:05 -j ACCEPT
iptables -t filter -A FORWARD -s 10.1.40.12/32 ! -d 10.0.0.0/8 -m mac --mac-source 00:06:00:00:00:06 -j ACCEPT
iptables -t filter -A FORWARD -s 10.1.30.13/32 ! -d 10.0.0.0/8 -m mac --mac-source 00:07:00:00:00:07 -j ACCEPT
iptables -t filter -A FORWARD -s 10.1.30.14/32 ! -d 10.0.0.0/8 -m mac --mac-source 00:08:00:00:00:08 -j ACCEPT
iptables -t filter -A FORWARD -s 10.1.30.15/32 ! -d 10.0.0.0/8 -m mac --mac-source 00:09:00:00:00:09 -j ACCEPT

A teraz przykład z użyciem ipset

ipset add KlienciWewnetrzni 10.1.30.2,00:02:00:00:00:02
ipset add KlienciWewnetrzni 10.1.30.3,00:03:00:00:00:03
ipset add KlienciWewnetrzni 10.1.30.4,00:04:00:00:00:04
ipset add KlienciWewnetrzni 10.1.30.5,00:05:00:00:00:05
ipset add KlienciWewnetrzni 10.1.40.12,00:06:00:00:00:06
ipset add KlienciWewnetrzni 10.1.30.13,00:07:00:00:00:07
ipset add KlienciWewnetrzni 10.1.30.14,00:08:00:00:00:08
ipset add KlienciWewnetrzni 10.1.30.15,00:09:00:00:00:09
iptables -t filter -A FORWARD ! -d 10.0.0.0/8 -m set --match-set KlienciWewnetrzni src -j ACCEPT

Otwieram na serwerze kilkanaście portów z użyciem samego iptables

iptables -t filter -A INPUT -p tcp -i bond0.200 -d 10.0.1.1 --dport 6789 -m conntrack --ctstate NEW -j ACCEPT
iptables -t filter -A INPUT -p tcp -i bond0.200 -d 10.0.1.1 --dport 3389 -m conntrack --ctstate NEW -j ACCEPT
iptables -t filter -A INPUT -p tcp -i bond0.200 -d 10.0.1.1 --dport 443 -m conntrack --ctstate NEW -j ACCEPT
iptables -t filter -A INPUT -p tcp -i bond0.200 -d 10.0.1.1 --dport 8080 -m conntrack --ctstate NEW -j ACCEPT
iptables -t filter -A INPUT -p tcp -i bond0.200 -d 10.0.1.1 --dport 22 -m conntrack --ctstate NEW -j ACCEPT
iptables -t filter -A INPUT -p tcp -i bond0.200 -d 10.0.1.1 --dport 25 -m conntrack --ctstate NEW -j ACCEPT
iptables -t filter -A INPUT -p tcp -i bond0.200 -d 10.0.1.1 --dport 110 -m conntrack --ctstate NEW -j ACCEPT
iptables -t filter -A INPUT -p tcp -i bond0.200 -d 10.0.1.1 --dport 465 -m conntrack --ctstate NEW -j ACCEPT

A teraz z użyciem ipset

ipset create Hosting bitmap:port range 0-65535
ipset add Hosting 6789
ipset add Hosting 3389
ipset add Hosting 443
ipset add Hosting 8080
ipset add Hosting 22
ipset add Hosting 25
ipset add Hosting 110
ipset add Hosting 465
iptables -t filter -A INPUT -p tcp -i bond0.200 -d 10.0.1.1 -m conntrack --ctstate NEW -m set --match-set Hosting dst -j ACCEPT

Poza przykładami tworzenia ipset, przyda się jeszcze umiejętność wypisywania oraz usuwania pojedynczych wpisów z setów oraz usuwania całych setów.

Aby wypisać istniejące sety

ipset -l -n

Aby wypisać zawartość setu

ipset -l pl.zone
Aby usunąć wpis z setu wpisujemy
ipset del pl.zone 91.189.21.0/23

A żeby usunąć cały set

ipset destroy pl.zone

Jestem teraz w trakcie tworzenia możliwie najprostszego  rozwiązania opartego na ipset, które zastąpi mi moduł geoip, postaram się je niedługo opublikować.