Hlavní navigace

Firewall IPFW ve FreeBSD: tipy pro zpříjemnění života

Petr Macek

V minulém článku jsme si probrali praktickou práci s firewallem ve FreeBSD. Dnes přidáme pár tipů, které mohou správci usnadnit život a práci s IPFW mu zjednodušit.

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.

Našli jste v článku chybu?