Už jsem dlouho žádný článek o RouterOS nenapsal a trochu mě to mrzí, protože od toho posledního se do něj dostala spousta novinek. Dokonce si někteří čtenáři psali o pokračování a i když jsem říkal, že nějaké bude, nevěděl jsem kdy. Nyní nastala ideální příležitost, protože i když v naší komunitní síti řešíme firewall přes Linux a iptables, musel jsem v jedné firmě od dobrých zvyků upustit a použít implementaci firewallu v RouterOS.
Pokud stojíte také před podobným problémem a máme před sebou nějaký RouterBoard 433 a deset počítačů prahnoucích po chráněném přístupu na internet, vězte, že můžete hned z kraje narazit. Pokud RB běžel do teď v pořádku, firewall by ho mohl srazit na kolena. Implementace firewallu disponuje jak základním vytvářením pravidel, tak i pokročilým detekováním typu dat, ukrytých v jednotlivých paketech. To jsou samozřejmě náročné techniky a vezmou si patřičné množství systémových prostředků. Mohli byste být nemile překvapeni, až druhý den přijdou zaměstnanci do práce a znechuceně budou koukat, jak se jim pomalu načítá intranetový systém, zatímco se zálohuje server.
Bohužel vám neřeknu, ve kterém případě použít jaký RB. Náročnost je závislá jak na samotných pravidlech, tak na datech, která protékají. Známý zabiják je nezkrocený BitTorrent, ale šifrovaný přenos dat mezi pobočkami dokáže firewallu také znepříjemnit život. Určitě nepočítejte s tím, že malá RB600 zvládne komplexně chránit 50 uživatelů. Je možné, že zjistíte, že výkon krabiček nestačí a pokud se vám bude zdát jako rozumná volba nějaký router poskládaný z běžné dostupných součástek, je rozumnější použít klasický Linux a iptables. Alespoň mně se s ním pracuje mnohem lépe.
Tok paketů
Tak jako u Linuxu, i u RouterOS má paket nějakou cestu. Za určitých podmínek prochází různými částmi síťového subsystému a v některých ho můžeme zachytit, otestovat a pak zahodit nebo poslat dál. Pro konfiguraci firewallu je nutné tuto cestu znát. Manuál si to myslí také, takže v sekci Packet flow najdete mapy, které znázorňují, kudy se pakety toulají. Já nejsem zastánce bridge a i když je možné chránit na RouterOS i ten, budu článek orientovat na routování mezi rozhraními s oddělenými podsítěmi. To bude pro většinu z vás nejpoužívanější varianta firewallu. V odkazované stránce najdete i mapy pro ostatní případy.
S trochou snahy v něm najdete tři základní chainy, z nichž jedním bude paket vždy procházet. Chainem rozumíme místo, přes které paket prochází a které seskupuje pravidla. Dokonce si můžete vytvořit chainy vlastní a odkazovat do nich z hlavních chainů. Můžete v nich mít pravidla rozdělená pro různé druhy uživatelů nebo zvolíte rozdělení podle služeb, fantazii se meze nekladou a záleží hlavně na situaci.
- forward – pakety, které na zařízení přišly a budou předány dál
- input – pakety určené pro zařízení
- output – pakety vytvořené zařízením odeslané ven
Stejně jako u Linuxu je cílem firewallu regulovat pakety, které protékají jedním z chainů. Když paket do daného chainu vstoupí, začne se testovat na jednotlivá pravidla a to od shora dolů. To znamená v tom pořadí, ve kterém je vložíte, a v jednom z konfiguračních rozhraní. Jednotlivá pravidla jsou tedy procházena podobně jako na Linuxu.
Rozhraní
RouterOS se dá konfigurovat hned několika způsoby. Tím prvním, častým a na mnoho věcí pohodlným, je příkazová řádka, která je podobná Ciscu, ale opravdu jen podobná. V minulých dílech jsme o ní už mluvili, takže ji nebudu znovu rozebírat. Důležitou informací pro vás je, že se v ní dá nastavit firewall a pokud nepotřebujete vyloženě testovat nová a nová pravidla, bude vám vyhovovat.
Na druhou stranu je tu WinBox, klikací program držící podobnou strukturu, jaká je k dispozici v příkazové řádce a pokud se nebojíte myši, firewall zde uděláte také. Za sebe mohu říct, že to je dokonce pohodlnější, protože je možné různě měnit pořadí pravidel bez nutnosti je znovu přepisovat a jedním kliknutím nastavíte jak matcher, tak action.
První pravidlo a příklady
Jak bylo řečeno, pravidla jsou podobná jako u Linuxu a skládají se ze dvou částí. Tou první je matcher a jde o parametry, podle kterých se vybere paket. Například zdrojová adresa nebo cílový port. Matchrem může být i regulární výraz testující obsah paketu, ale nedokážu si představit, co to na malých krabičkách udělá s výkonem. Druhou částí je action, a jak už jste asi pochopili, tím se určuje, co se s paketem stane. Můžeme na něj aplikovat některý z NATů nebo ho prostě zahodit a dál si ho nevšímat. Samozřejmě lze paket pustit dál. Zde bych zmínil, že jednou z akcí je i přeposlání paketu určenému chainu, což je bohužel řešeno dost nešikovně a vůbec použití vlastních chainů nepomáhá v čitelnosti pravidel, spíš naopak.
Než se pustíme do příkladů, které vám nakonec ukáží, jak se ten firewall nastavuje, tak při jeho stavbě počítejte s tím, že jednoduchá pravidla by měla být na začátku (limity, maximální počet spojení, zdrojové, cílové adresy, a podobně.) a ta složitější na konci. Určitě nechcete, aby byl každý paket testován regulárním výrazem, když by mohl být už dávno odstřelen jedním z předchozích pravidel. Podobně hledejte problémy, kdy se po zavedení firewallu začne síť chovat z ničeho nic podivně.
Než se rozhodnete zabít všechno, co proleze, nezapomeňte, že RouterOS má stavový firewall, takže pustit pakety patřící vytvořeným spojením není špatný nápad. Podobně na tom je protokol ICMP, který slouží pro monitorování i samoregulaci sítě. I když jeho propouštěním umožníte případnému útočníkovi, aby si udělal částečný obrázek o vnitřku vaší sítě, zvažte, zda jsou rizika větší než přínos.
Povolení portu 80, 443 a zbytek odstřihnout
Jedno z nejběžnějších použití firewallu je odstřihnout všechny příchozí spojení, povolit všechny odchozí a vybrat pár portů, které mohou i dovnitř. To v RouterOS není nějak složité, stačí v menu / ip firewall filter přidat tyto pravidla:
add chain=forward action=accept protocol=icmp in-interface=ether1
add chain=forward action=accept protocol=tcp in-interface=ether1 dst-port=80
add chain=forward action=accept protocol=tcp in-interface=ether1 dst-port=443
add chain=forward action=accept connection-state=established in-interface=ether1
add chain=forward action=accept connection-state=related in-interface=ether1
add chain=forward action=accept out-interface=ether1
add chain=forward action=drop in-interface=ether1
V příkladě předpokládám, že ether1 je rozhraní připojené do internetu. Na prvním řádku povolíme veškerou komunikaci přes ICMP protokol, čímž si zjednodušíme případnou diagnostiku problému. Následují pravidla, kde povolíme port 80 a 443, což by mělo stačit pro běžný webový server. Další dvě pravidla povolí vstup paketů pro spojení, která byla už vytvořena. Nakonec povolíme vše, co jde ven, a nic, co zůstalo z toho, co jde dovnitř. Výsledek je takový, že zvenku je do sítě vidět jenom portem 80 a 443. Jde o nejjednodušší firewall, který ne se vším pomůže.
Když chcete povolit komunikaci konkrétním IP adresám, použijte parametry dst-address a src-address, kde můžete uvést i adresu sítě.
Destionation a source NAT,
Destination NAT (DNAT) a source NAT (SNAT) vám pomohou, když chcete přesměrovat všechny porty nebo jenom některé z nich na neveřejnou adresu v síti. V praxi to funguje tak, že nastavíte DNAT třeba pro port 80 a nasměrujete ho dovnitř. Při příchozím spojení router upraví hlavičku tak, že paket bude pokračovat dál vnitřní sítí a samotný server nic nezpozoruje. U některých služeb, které posílají na vyšší vrstvě svoji adresu (Direct Connection), to nemusí fungovat a je potřeba adresu nastavit manuálně v daném programu.
Source NAT je opakem DNATu a umožňuje odchozím paketům ze sítě nastavit konkrétní vnější IP adresu. Vše, co s NATem souvisí, se nastavuje v / ip firewall nat.
add chain=srcnat action=src-nat to-addresses=109.238.208.59 src-address=192.168.2.80 out-interface=ether1
add chain=dstnat action=dst-nat to-addresses=192.168.2.80 dst-address=109.238.208.59 in-interface=ether1
Když si příklad spustíte, můžete pozorovat, že pakety odeslané z adresy 192.168.2.80 budou pro vnější svět přepsány na 109.238.208.59. Díky pravidlu v chain dstnat to tak bude i obráceně.
Maškaráda, schování sítě za jednu adresu
Předchozí příklad budete možná chtít vylepšit o maškarádu, což je speciální případ SNATu, kde není daná adresa, na kterou se budou pakety přepisovat, nýbrž se určí automaticky. Pravidlo je taktéž jednoduché.
add chain=srcnat action=masquerade out-interface=ether1-gateway
Odstřihnutí P2P protokolů v nastaveném čase
Pokud budete chtít zkomplikovat práci P2P protokolům, můžete použít layer7 matcher, který dokáže pakety patřící P2P sítím identifikovat a vy už si s nimi můžete dělat, co chcete. Není to samospásné a je to tak náročné, že to bych si nedovolil to nasadit v reálném provozu, někomu to ale může fungovat.
add p2p=all-p2p action=accept chain=forward
Logování
Když už něco zahodíme, bylo by fajn vědět o tom něco, takže předposlední pravidlo by mohlo vypadat nějak takto:
add chain=forward limit=5/1m,5 action=log
Pravidlo se dá slovy přeložit jako „prvních 5 paketů a pak dalších 5 během jedné minuty se zalogují“. První argument je počet paketů a za lomítkem během jaké doby. Posledním argumentem je počet paketů, které se do maximálního počtu nepočítají.
Závěr
Firewall v malé síti by měl být samozřejmostí a měl by nahradit podivné firewally, které si lidé instalují na své počítače. U velkých sítí bych neřekl, že je zrovna firewall z RouterOS tím pravým, ale když dáte stranou pohodlí, dokážete s ním hodně. Těch několik uvedených příkladů patří k tomu nejzákladnějšímu a můžete je různě kombinovat a doplňovat o další parametry, které najdete v dokumentaci.