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