Minule jsme si řekli, jak funguje firewall IPFW a jak se zapisují pravidla. U zápisu pravidla je pár věcí, které docela zpříjemňují život:
Slovo me znamená všechny IP adresy mého FreeBSD
# ipfw add allow icmp from any to me
Specifikace více portů
# ipfw add allow tcp from any 5000,5100-5200 to any
Negace
# ipfw add allow ip from not 1.2.3.4 to any
Omezení jen na některé IP
# ipfw add deny ip from 192.168.0.0/24{11,24-34} to any
Lookup table
A poslední věc, kterou zmíním, je lookup table. Pokud potřebujeme porovnávat větší množinu adres, je dobré takovou tabulku využít. Ve firewallu bude jediné pravidlo, třeba pro zákaz ssh na náš stroj:
# ipfw add deny tcp from table(1) to me dst-port 22
Tabulku můžeme plnit třeba skriptem, který čte logy a hledá v nich útoky na ssh. Přidání IP je snadné
# ipfw table 1 add a.b.c.d/32
Výpis tabulky se provádí příkazem list:
# ipfw table 1 list 8.5.6.9/32 0 18.15.16.19/32 0
Tím jsme probrali pravidla, poslední věc, co zmíním, nám to celé posouvá ještě o kousek dál. Když si vypíšete pravidla, jedná se o tzv. set. Pro běžné použití to stačí, ale u velkých dynamicky generovaných firewallů můžete využít dalších 30 setů. Měl jsem síť, kde se firewall generoval každých 15 minut z MySQL, odečítal i přenesená data a celé tohle nějakou dobu trvalo. Tam je set velmi výhodný.
Máme aktivní firewall (set 0), mezitím si připravíme nový (třeba set 1) a potom mezi nimi přepneme. Někdo toto používá i k testování správné konfigurace:
# ipfw set disable 18 # ipfw add NN set 18 ... # ipfw add NN set 18 ... # ipfw set enable 18; echo done; sleep 30 && ipfw set disable 18
Přehled všech tabulek najednou:
# ipfw table all list ---table(1)--- 192.168.1.0/24 0 192.168.3.0/24 0 192.168.10.0/24 0 192.168.11.0/24 0 192.168.60.10/32 0 ---table(2)--- 192.168.111.2/32 0 192.168.111.3/32 0 192.168.111.4/32 0 192.168.112.2/32 0 …
Nastavení v jádře
Na závěr ukázka, jak s IPFW začít. V GENERIC kernelu je IPFW zapnuté. Pokud si chcete kompilovat vlastní kernel, je možné použít:
options IPFIREWALL options IPFIREWALL_VERBOSE options IPFIREWALL_VERBOSE_LIMIT=100 options IPFIREWALL_DEFAULT_TO_ACCEPT options IPFIREWALL_NAT options DUMMYNET
Pokud ipfw nezadáte do konfigurace kernelu, je automaticky zkompilován jako modul a je možné automatické načtení zařídit v /boot/loader.conf
:
ipfw_load="YES"
Ve výchozím stavu je výchozí pravidlo zákazové, výše v kernel option je volba, která toto změní. Další možností je sysctl:
sysctl net.inet.ip.fw net.inet.ip.fw.enable: 1 net.inet.ip.fw.dyn_keepalive: 1 net.inet.ip.fw.dyn_short_lifetime: 5 net.inet.ip.fw.dyn_udp_lifetime: 600 net.inet.ip.fw.dyn_rst_lifetime: 1 net.inet.ip.fw.dyn_fin_lifetime: 1 net.inet.ip.fw.dyn_syn_lifetime: 20 net.inet.ip.fw.dyn_ack_lifetime: 1800 net.inet.ip.fw.dyn_max: 4096 net.inet.ip.fw.dyn_count: 0 net.inet.ip.fw.curr_dyn_buckets: 256 net.inet.ip.fw.dyn_buckets: 256 net.inet.ip.fw.static_count: 164 net.inet.ip.fw.default_to_accept: 1 net.inet.ip.fw.tables_max: 128 net.inet.ip.fw.default_rule: 65535 net.inet.ip.fw.verbose_limit: 1000 net.inet.ip.fw.verbose: 1 net.inet.ip.fw.autoinc_step: 100 net.inet.ip.fw.one_pass: 0
Bavili jsme se třeba o one_pass. Takže přes sysctl máte další možnost, jak ji přepnout.
Tím máme připravený systém, ipfw zapnete v /etc/rc.conf
. I zde je více možností. V souboru /etc/firewall
je i několik připravných firewallů, které můžete jen několika volbami v /etc/rc.conf
nakonfigurovat a máte hotovo. Více v souborech /etc/rc.firewall
a /etc/defaults/rc.conf
, druhém hledejte slovo firewall.
Určitě jsem neukázal všechny možnosti IPFW. Dal by se napsat celý seriál, ale chtěl jsem článek pojmout spíše jako ukázku, jak to dělají jiné systémy než Linux. Osobně pracuji s oběma a IPFW je mi o dost bližší a přijde mi přehlednější než iptables. Zkuste sami a porovnejte.