WiBSD zatím používá jako firewall ipfw, ale do budoucna se plánuje možnost používat i pf (portovaný z OpenBSD) s tim, že současný způsob konfigurace zůstane zachován.
Pro aktivování firewallu je potřeba nastavit proměnnou fw_enable="YES" a fw_type="ipfw".
Do proměnné fw_wan_interface se vloží název rozhranní, kterým je router připojen k Internetu.
Pokud chcete provádět překlad neveřejných adres, musíte nastavit natd_enable="YES" a do natd_interface vložit rozhranní nad kterých chcete provádět překlad (tj. to rozhranní, vedoucí do Internetu, větsinou to stejné jako fw_wan_interface).
Pokud neuvedete žádná další pravidla, ale ponecháte pouze základní nastavení (fw_enable a fw_type), vygenerují se následují pravidla. Pro názornost vynecháváme pravidla "count" která pouze počítají, kolik dat danou větví proteklo.
Example 3.1. Firewall bez pravidel
00100 allow ip from any to any via lo0
00120 deny ip from any to 127.0.0.0/8
00140 deny ip from 127.0.0.0/8 to any
#
02000 skipto 55000 tcp from any to me setup
02020 skipto 55000 udp from any to me dst-port 0-1023
#
50000 allow icmp from me to any
50020 allow icmp from any to me
#
65500 deny ip from any to any
65535 allow ip from any to any
První část provádí takzvaný antispoofing, tj. povolí všechen provoz na vnitřním rozhranní lo0 (zpětná smyčka), ale zakáže adresy které patří na toto vnitřní rozhranní ale přišly z jiného rozhranní.
Druhá čast provádí pouze odskoky do jiné části firewallu, pokud přicházi data pro samotný router. Protože je těchto dat minumum, nebudeme těmito pravidly zatěžovat každý paket.
Do "mezery" mezi druhou a třetí částí se budou vkládat pravidla pro klienty na vnitřní síti, viz. další sekce.
Třetí část povoluje veškerý icmp provoz z a na router. Protože je ho minumum, jsou tyto pravidla až na samém konci firewallu.
Poslední částí zakazujeme všechen ostatní provoz, který jsme dříve nepovolili. Firewall neobsahuje jako poslední pravidlo "65535 deny ip from any to any", protože pokud firewall nezapneme, nebo v jeho konfiguraci uděláme nejakou zásadní chybu, tak bysme se na box potom nedostali. Tímto si zajistíme, že "65500 deny ip from any to any" bude přidán až na konci inicializačního skriptu a pouze tehdy, pokud vše proběhlo v pořádku.
Většinou je vhodné definovat ještě proměnnou fw_wan_interface. Pokud ji nastavíme na "sis0", způsobí to, že se přidá pravidlo "09000 allow ip from any to any via sis0", čímž povolíme routeru komunikovat s vnějším světem, ale nepovolujeme tím žádné nové spojení na router zvenčí.
Pokud máte pouze jednu veřejnou adresu na routeru a zbytek vnitřní sítě má adresy z privátního rozsahu, budete potřebovat zapnout překlad adres, NAT.
Nastavte proměnnou natd_enable="YES" a do natd_interface vložte rozhranní, které vás připojuje k síti WAN (větsinou k Internetu).
Tímto se do firewallu automaticky vygeneruje pravidlo "08000 divert natd ip from any to any via sis0", pokud je natd_interface="sis0" a spustí se program natd, který překlad provádí.
Po úpravě proměnných podle této a předchozí sekce, vypadají pravidla firewallu následovně:
Example 3.2. Firewall s předkladem adres a WAN interface
00100 allow ip from any to any via lo0
00120 deny ip from any to 127.0.0.0/8
00140 deny ip from 127.0.0.0/8 to any
#
02000 skipto 55000 tcp from any to me setup
02020 skipto 55000 udp from any to me dst-port 0-1023
#
08000 divert 8668 ip from any to any via sis0
09000 allow ip from any to any via sis0
#
50000 allow icmp from me to any
50020 allow icmp from any to me
#
65500 deny ip from any to any
65535 allow ip from any to any
Tím máme velice základní ale plně funkční konfiguraci firewallu, která dovoluje routeru inicializovat komunikaci s okolím, překládá adresy vnitřní sítě na veřejnou adresu, routuje je dále a posílá zpět odpovědi.
Dosavadní konfigurace je sice funkční v tom smyslu, že všechny počítače z vnitřní sítě mají neomezený přístup do Internetu, ale pokud bychom se chtěli vzdáleně na router přihlásit a upravovat konfiguraci, nebo bychom chtěli některé porty routeru zpřístupnit z ostatních počítačů, tak to firewall nepovolí.
Proto pro povolení spojení na router, vložte do proměnné fw_allowed_access identifikátory služeb které chcete povolit, a pro každou takovou služby vložte do proměnné fw_allowed_sluzna_access blok ve formátu "zdrojova_adresa_1 zdrojova_adresa_2:protokol:cislo_portu:dalsi_vlastnosti:povolit_jen_pres_wan:"
Zdrojových adres může být libovolný počet a jsou odděleny mezerou. Pokud chcete zadat celou síť, zadejte ji ve formátu síť/maska.
Protokol může být pouze tcp, udp, gre.
Další vlastnosti jsou například keep-state, setup a všechny ty, které se mohou na tomto místě ve firewallu používat.
Libovolná hodnota v dalším poli způsobí, že toto pravidlo bude aplikováno pouze na rozhranní WAN (tj. nepůjde se připojit z vnitřních sítí).
Následuje příklad povolení ssh pouze z důvěryhodných adres 1.2.3.4 a 11.12.13.14, a webu odevšad.
Někdy je potřeba omezit na jaké adresy a/nebo porty mají mít klienti ze svých počítačů přístup, a pokud mají veřejnou IP adresu, tak i ze kterých počítačů je přístup na klienty. Tato sekce se však nezabývá omezovaním rychlosti, to je popsáno v další sekci.
Klienti se dělí na ty, kteří mají veřejnou IP adresu a jsou přístupní z Internetu a na ty, kteří mají adresu z privátního rozsahu a přístup na Internet je pro ně řešen překladem adres na routeru, a z Internetu se na ně není možné připojit.
Pro jejich omezování se používají proměnné fw_private_client_blocks a fw_public_client_blocks, jediný rozdíl mezi nimi je v tom, že adresy z fw_public_client_blocks "přeskočí" pravidlo "divert natd", tj. jejich adresy se nepřeloží na vnější adresu routeru.
Pokud s veřejnými adresami opravdu chcete zacházet jako s veřejnými, je potřeba je minimálně vložit přímo do fw_public_client_blocks oddělené mezerou (můžete i vložit celou síť ve formátu síť/maska). Tím povolíte veškerou komunikaci na veřejných adresách.
Pokud chcete explicitně povolit komunikaci z privátních adres do Internetu, vložte je stejně jako veřejné adresy, ale tentokrát do proměnné fw_private_client_blocks.
Někdy je však potřeba zakázat (popř. povolit) spojení jen na určité služby. Syntaxe je stejná pro fw_public_client_blocks i pro fw_private_client_blocks. Pouze u fw_private_client_blocks nemá valný smysl vytvářet "in" omezení pro spojení přicházející z Internetu, protože takováto spojení díky překladu adres skončí na routeru a dál se nedostanou. Taková pravidla potom budou platit jen pro počítače z přímo připojených vnitřních sítí.
Pro takovéto případy jsou vytvořeny takzvané "feature bloky", to jsou pojmenované bloky, jejichž jména se do fw_public_client_blocks a fw_private_client_blocks vkládají místo IP adres (nebo sítí) a samotné bloky jsou definovány dalšími proměnnými.
Pokud chcete vytvořit feature blok, vytvořte proměnnou fw_block_jmenoBloku. Jméno bloku nesmí začínat číslem ani obsahovat podtržítka. Jako obsah vložte adresu počítače nebo sítě (Případně více adres oddělených čárkou). Dále je potřeba vytvořit proměnnou jejíž jméno začíná fw_block_jmenoBloku a pokračuje podle toho, k čemu chcete omezit přístup a její obsah je adresa nebo síť, které chcete přístup omezit.
Například pro zakázání přístupu protokolem tcp z adresy 10.0.0.1 na adresu 1.2.3.4, požijte následujíci feature blok.
Example 3.4. Zakázání přístupu klienta na určitou adresu
fw_private_client_blocks="klient1"
fw_block_klient1="1.2.3.4"
fw_block_klient1_deny_tcp_in_access_limited_to="10.0.0.1"
Pokud si přejete zakázat pouze některé porty, nadefinujte je v proměnné fw_block_klient1_ports="80, 8080". Toto vygeneruje následující pravidlo pro firewall "10020 deny tcp from 10.0.0.1 to 1.2.3.4 dst-port 80, 8080".
Jestli chcete zaměnit allow za deny, proveďte to i v názvu proměnné, stejně tak i pro záměnu tcp za jiný protokol. Pokud zaměníte _in_ za _out_, obrátí se i směr pravidla ve firewallu, pro předchozí proměnnou dostanete záměnou in za out toto pravidlo "10020 deny tcp from 1.2.3.4 80, 8080 to 10.0.0.1".
Analogicky můžete postupovat pro fw_public_client_blocks.
Pro každou vnitřní adresu můžeme omezit maximalní rychlost, které je schopna dosáhnout.
Toto se řeší pomocí "pipes" (roury na data), které se musí nejprve nadefinovat, jak je jasně vidět na následujícím příkladu.
Example 3.5. Vytváření pojmenovaných rour
fw_pipes="data telefony"
fw_pipe_data="512/128"
fw_pipe_telefony="256/128"
#
fw_block_lan1="192.168.0.0/24"
fw_block_lan1_pipe="data"
fw_block_lan1_pipe_access_limited_to="any"
Tím jsme vytvořili čtyři roury, dvě pro data a dvě pro telefony, pro každý směr spojení jednu. Data mají povolenou rychlost downloadu 512 Kbit/s a uploadu 128 Kbit/s, telefony 256 Kbit/s a 128 Kbit/s.
Nyní je potřeba vybrat packety, které chceme protahovat námi vytvořenými rourami. Proto se použijí uplně stejné "feature" bloky jako v předchozí sekci, pouze nepoužíváme fw_block_klient1_deny_tcp_in_access_limited_to ani fw_block_klient1_deny_tcp_in_access_limited_to, ale používáme fw_block_klient1_pipe_tcp_in_access_limited_to. A k dannému feature bloku navíc připojíme jméno roury, do které má směrovat, přes proměnnou fw_block_klient1_pipe.
Mějte na paměti, že se takto směrují data pouze do jedné roury, podle toho, zda používáme v proměnné _in_ nebo _out_. Pokud chceme (a to většinou ano) omezit i druhý směr spojení, musíme vytvořit stejnou proměnnou s nahrazeným in za rout a obráceně.
Následuje příklad pro omezení rychlosti všech packetů z adres 10.0.0.1, 10.0.0.2, 10.0.0.3, 10.0.0.4 skrz rouru data do Internetu na maximální souhrnou rychlost 128 Kbit/s. Předpokládáme natavení rour podle předchozího příkladu.
Pro ipfw lze do rc.conf zapsat vlastní statická pravidla, která nebudou skripty nijak ovlivňována. Tato pravidla však nebudou kompatabilní s tím, pokud budete chtít použít jiný firewall (až bude implementován). V takovém případě je budete muset přepsat v syntaxi nového firewallu.
Dále je potřeba dávat pozor, kam dané pravidlo mezi ostatní zařadíte, aby mělo žádaný účinek. Nejlepší je napsat celý firewall pomocí proměnných WiBSD a pouze problematické části nakonec napsat přímo.
K tomu použijte proměnnou ipfw_fw_static_rules. Následující příklad zakáže veškerý provoz na rozhranní vr0.