Přehled
Na základě všech dosavadních poznatků se pokusíme vytvořit pokročilý firewall. V tomto příkladu sestavení firewallu se pokusíme použít co nejvíce funkcí firewallu, abychom ilustrovali, jak fungují a kdy je třeba je použít správným způsobem.
Většina filtrování bude provedena v RAW firewallu, běžný firewall bude obsahovat jen základní sadu pravidel pro přijímání navázaných, souvisejících a nesledovaných spojení a také zahazování všeho ostatního, co nepochází z LAN, aby byl směrovač plně chráněn.
Seznamy rozhraní - Interface Lists
Pro snadnější budoucí správu budou použity dva seznamy rozhraní WAN a LAN. Rozhraní připojená ke globálnímu internetu by měla být přidána do seznamu WAN, v tomto případě je to ether1!
Kód: Vybrat vše
/interface list
add comment=defconf name=WAN
add comment=defconf name=LAN
/interface list member
add comment=defconf interface=bridge list=LAN
add comment=defconf interface=ether1 list=WAN
Ochrana zařízení
Hlavním cílem je povolit přístup k routeru pouze ze sítě LAN a upustit od všeho ostatního.
Všimněte si, že je zde přijímán i ICMP, slouží k přijímání ICMP paketů, které prošly pravidly RAW.
Kód: Vybrat vše
/ip firewall filter
add action=accept chain=input comment="defconf: accept ICMP after RAW" protocol=icmp
add action=accept chain=input comment="defconf: accept established,related,untracked" connection-state=established,related,untracked
add action=drop chain=input comment="defconf: drop all not coming from LAN" in-interface-list=!LAN
IPv6 část je trochu složitější, navíc je akceptován UDP traceroute, DHCPv6 klient PD a IPSec (IKE, AH, ESP) podle doporučení RFC.
Kód: Vybrat vše
/ipv6 firewall filter
add action=accept chain=input comment="defconf: accept ICMPv6 after RAW" protocol=icmpv6
add action=accept chain=input comment="defconf: accept established,related,untracked" connection-state=established,related,untracked
add action=accept chain=input comment="defconf: accept UDP traceroute" port=33434-33534 protocol=udp
add action=accept chain=input comment="defconf: accept DHCPv6-Client prefix delegation." dst-port=546 protocol=udp src-address=fe80::/10
add action=accept chain=input comment="defconf: accept IKE" dst-port=500,4500 protocol=udp
add action=accept chain=input comment="defconf: accept IPSec AH" protocol=ipsec-ah
add action=accept chain=input comment="defconf: accept IPSec ESP" protocol=ipsec-esp
add action=drop chain=input comment="defconf: drop all not coming from LAN" in-interface-list=!LAN
Ochrana klientů
Před vlastní sadou pravidel vytvořme nezbytný seznam adres, který bude obsahovat všechny adresy IPv4/6, které nelze předávat.
Všimněte si, že v tomto seznamu je přidán rozsah adres multicast. Je tam proto, že ve většině případů se multicast nepoužívá. Pokud hodláte používat předávání multicastu, pak by tato položka seznamu adres měla být zakázána.
Kód: Vybrat vše
/ip firewall address-list
add address=0.0.0.0/8 comment="defconf: RFC6890" list=no_forward_ipv4
add address=169.254.0.0/16 comment="defconf: RFC6890" list=no_forward_ipv4
add address=224.0.0.0/4 comment="defconf: multicast" list=no_forward_ipv4
add address=255.255.255.255/32 comment="defconf: RFC6890" list=no_forward_ipv4
Stejně tak v případě protokolu IPv6. Pokud se používá multicast, by měla být položka vícesměrového vysílání v seznamu adres zakázána.
Kód: Vybrat vše
/ipv6 firewall address-list
add address=fe80::/10 comment="defconf: RFC6890 Linked-Scoped Unicast" list=no_forward_ipv6
add address=ff00::/8 comment="defconf: multicast" list=no_forward_ipv6
Forward řetězec bude mít o něco více pravidel než Input:
- Povolit established, related a untracked spojení
- FastTrack established, related spojení (v současnosti pouze IPv4)
- zahodit neplatná spojení
- zahodit špatné IP adresy, protože v řetězcích RAW nemůžeme spolehlivě určit, které pakety jsou předávány
- zahodit spojení iniciovaná z internetu (ze strany WAN, která nejsou za NATem)
- zahodit falešné IP adresy, které by neměly být předávány
Kód: Vybrat vše
/ip firewall filter
add action=accept chain=forward comment="defconf: accept all that matches IPSec policy" ipsec-policy=in,ipsec disabled=yes
add action=fasttrack-connection chain=forward comment="defconf: fasttrack" connection-state=established,related
add action=accept chain=forward comment="defconf: accept established,related, untracked" connection-state=established,related,untracked
add action=drop chain=forward comment="defconf: drop invalid" connection-state=invalid
add action=drop chain=forward comment="defconf: drop all from WAN not DSTNATed" connection-nat-state=!dstnat connection-state=new in-interface-list=WAN
add action=drop chain=forward src-address-list=no_forward_ipv4 comment="defconf: drop bad forward IPs"
add action=drop chain=forward dst-address-list=no_forward_ipv4 comment="defconf: drop bad forward IPs"
Forward IPv6 je velmi podobný s tím rozdílem, že IPsec a HIP jsou akceptovány podle doporučení RFC a ICMPv6 s hop-limit=1 je vyřazen.
Kód: Vybrat vše
/ipv6 firewall filter
add action=accept chain=forward comment="defconf: accept established,related,untracked" connection-state=established,related,untracked
add action=drop chain=forward comment="defconf: drop invalid" connection-state=invalid
add action=drop chain=forward src-address-list=no_forward_ipv6 comment="defconf: drop bad forward IPs"
add action=drop chain=forward dst-address-list=no_forward_ipv6 comment="defconf: drop bad forward IPs"
add action=drop chain=forward comment="defconf: rfc4890 drop hop-limit=1" hop-limit=equal:1 protocol=icmpv6
add action=accept chain=forward comment="defconf: accept ICMPv6 after RAW" protocol=icmpv6
add action=accept chain=forward comment="defconf: accept HIP" protocol=139
add action=accept chain=forward comment="defconf: accept IKE" protocol=udp dst-port=500,4500
add action=accept chain=forward comment="defconf: accept AH" protocol=ipsec-ah
add action=accept chain=forward comment="defconf: accept ESP" protocol=ipsec-esp
add action=accept chain=forward comment="defconf: accept all that matches IPSec policy" ipsec-policy=in,ipsec
add action=drop chain=forward comment="defconf: drop everything else not coming from LAN" in-interface-list=!LAN
Dalším přístupem k řešení problému IPsec je přidání pravidel RAW, o této metodě budeme hovořit později v části RAW
Masquerade místní síťě
Aby mohla místní zařízení za směrovačem přistupovat k internetu, musí být místní sítě maskovány. Ve většině případů se doporučuje místo maškarády použít src-nat, avšak v tomto případě, kdy je adresa WAN dynamická, je to jediná možnost.
Kód: Vybrat vše
/ip firewall nat
add action=accept chain=srcnat comment="defconf: accept all that matches IPSec policy" ipsec-policy=out,ipsec disabled=yes
add action=masquerade chain=srcnat comment="defconf: masquerade" out-interface-list=WAN
Filtrování RAW
Seznamy IPv4 adresy
Před nastavením pravidel RAW vytvořme několik seznamů adres potřebných pro naše zásady filtrování. Jako odkaz použijeme RFC 6890.
První seznam adres obsahuje všechny adresy IPv4, které nelze použít jako src/dst/předané atd. (pokud se taková adresa objeví, bude okamžitě zahozena).
Kód: Vybrat vše
/ip firewall address-list
add address=127.0.0.0/8 comment="defconf: RFC6890" list=bad_ipv4
add address=192.0.0.0/24 comment="defconf: RFC6890" list=bad_ipv4
add address=192.0.2.0/24 comment="defconf: RFC6890 documentation" list=bad_ipv4
add address=198.51.100.0/24 comment="defconf: RFC6890 documentation" list=bad_ipv4
add address=203.0.113.0/24 comment="defconf: RFC6890 documentation" list=bad_ipv4
add address=240.0.0.0/4 comment="defconf: RFC6890 reserved" list=bad_ipv4
Další seznam adres obsahuje všechny adresy IPv4, které nelze směrovat globálně.
Kód: Vybrat vše
/ip firewall address-list
add address=0.0.0.0/8 comment="defconf: RFC6890" list=not_global_ipv4
add address=10.0.0.0/8 comment="defconf: RFC6890" list=not_global_ipv4
add address=100.64.0.0/10 comment="defconf: RFC6890" list=not_global_ipv4
add address=169.254.0.0/16 comment="defconf: RFC6890" list=not_global_ipv4
add address=172.16.0.0/12 comment="defconf: RFC6890" list=not_global_ipv4
add address=192.0.0.0/29 comment="defconf: RFC6890" list=not_global_ipv4
add address=192.168.0.0/16 comment="defconf: RFC6890" list=not_global_ipv4
add address=198.18.0.0/15 comment="defconf: RFC6890 benchmark" list=not_global_ipv4
add address=255.255.255.255/32 comment="defconf: RFC6890" list=not_global_ipv4
A poslední dva seznamy adres pro adresy, které nemohou být cílovou nebo zdrojovou adresou.
Kód: Vybrat vše
/ip firewall address-list
add address=224.0.0.0/4 comment="defconf: multicast" list=bad_src_ipv4
add address=255.255.255.255/32 comment="defconf: RFC6890" list=bad_src_ipv4
add address=0.0.0.0/8 comment="defconf: RFC6890" list=bad_dst_ipv4
add address=224.0.0.0/4 comment="defconf: RFC6890" list=bad_dst_ipv4
Pravidla IPv4 RAW
Pravidla Raw IPv4 provedou následující akce:
- add disabled "accept" rule lze použít k rychlému vypnutí filtrování RAW bez vypnutí všech pravidel RAW
- accept zjišťování DHCP - většinu paketů DHCP firewall IP nevidí, ale některé ano, takže je třeba zajistit, aby byly akceptovány
- drop pakety, které používají falešné IP adresy
- drop neplatné SRC a DST IP adresy
- drop globálně neroutovatelné IP adresy přicházející z WAN
- drop paketů se zdrojovou adresou, která se nerovná 192.168.88.0/24 (výchozí rozsah IP), přicházející z LAN
- drop paketů přicházejících z WAN, které mají být přesměrovány do sítě 192.168.88.0/24, což chrání před útoky, pokud útočník zná vnitřní síť
- drop špatné ICMP, UDP a TCP;
- accept vše ostatní přicházející z WAN a LAN
- drop vše ostatní, aby bylo zajištěno, že každé nově přidané rozhraní (například připojení PPPoE k poskytovateli služeb) je chráněno proti náhodné chybné konfiguraci.
Kód: Vybrat vše
/ip firewall raw
add action=accept chain=prerouting comment="defconf: enable for transparent firewall" disabled=yes
add action=accept chain=prerouting comment="defconf: accept DHCP discover" dst-address=255.255.255.255 dst-port=67 in-interface-list=LAN protocol=udp src-address=0.0.0.0 src-port=68
add action=drop chain=prerouting comment="defconf: drop bogon IP's" src-address-list=bad_ipv4
add action=drop chain=prerouting comment="defconf: drop bogon IP's" dst-address-list=bad_ipv4
add action=drop chain=prerouting comment="defconf: drop bogon IP's" src-address-list=bad_src_ipv4
add action=drop chain=prerouting comment="defconf: drop bogon IP's" dst-address-list=bad_dst_ipv4
add action=drop chain=prerouting comment="defconf: drop non global from WAN" src-address-list=not_global_ipv4 in-interface-list=WAN
add action=drop chain=prerouting comment="defconf: drop forward to local lan from WAN" in-interface-list=WAN dst-address=192.168.88.0/24
add action=drop chain=prerouting comment="defconf: drop local if not from default IP range" in-interface-list=LAN src-address=!192.168.88.0/24
add action=drop chain=prerouting comment="defconf: drop bad UDP" port=0 protocol=udp
add action=jump chain=prerouting comment="defconf: jump to ICMP chain" jump-target=icmp4 protocol=icmp
add action=jump chain=prerouting comment="defconf: jump to TCP chain" jump-target=bad_tcp protocol=tcp
add action=accept chain=prerouting comment="defconf: accept everything else from LAN" in-interface-list=LAN
add action=accept chain=prerouting comment="defconf: accept everything else from WAN" in-interface-list=WAN
add action=drop chain=prerouting comment="defconf: drop the rest"
Všimněte si, že jsme použili několik vlastních řetězců, přičemž první řetězec "bad_tcp" zahazuje pakety TCP, o nichž je známo, že jsou neplatné.
Kód: Vybrat vše
/ip firewall raw
add action=drop chain=bad_tcp comment="defconf: TCP flag filter" protocol=tcp tcp-flags=!fin,!syn,!rst,!ack
add action=drop chain=bad_tcp comment=defconf protocol=tcp tcp-flags=fin,syn
add action=drop chain=bad_tcp comment=defconf protocol=tcp tcp-flags=fin,rst
add action=drop chain=bad_tcp comment=defconf protocol=tcp tcp-flags=fin,!ack
add action=drop chain=bad_tcp comment=defconf protocol=tcp tcp-flags=fin,urg
add action=drop chain=bad_tcp comment=defconf protocol=tcp tcp-flags=syn,rst
add action=drop chain=bad_tcp comment=defconf protocol=tcp tcp-flags=rst,urg
add action=drop chain=bad_tcp comment="defconf: TCP port 0 drop" port=0 protocol=tcp
A další řetězec pro ICMP. Všimněte si, že pokud chcete mít velmi přísný firewall, pak lze takové přísné filtrování ICMP použít, ale ve většině případů to není nutné a pouze to zvyšuje zátěž procesoru routeru. Omezení rychlosti ICMP je ve většině případů také zbytečné, protože jádro Linuxu již omezuje pakety ICMP na 100pps.
Kód: Vybrat vše
/ip firewall raw
add action=accept chain=icmp4 comment="defconf: echo reply" icmp-options=0:0 limit=5,10:packet protocol=icmp
add action=accept chain=icmp4 comment="defconf: net unreachable" icmp-options=3:0 protocol=icmp
add action=accept chain=icmp4 comment="defconf: host unreachable" icmp-options=3:1 protocol=icmp
add action=accept chain=icmp4 comment="defconf: protocol unreachable" icmp-options=3:2 protocol=icmp
add action=accept chain=icmp4 comment="defconf: port unreachable" icmp-options=3:3 protocol=icmp
add action=accept chain=icmp4 comment="defconf: fragmentation needed" icmp-options=3:4 protocol=icmp
add action=accept chain=icmp4 comment="defconf: echo" icmp-options=8:0 limit=5,10:packet protocol=icmp
add action=accept chain=icmp4 comment="defconf: time exceeded " icmp-options=11:0-255 protocol=icmp
add action=drop chain=icmp4 comment="defconf: drop other icmp" protocol=icmp
Seznamy IPv6 adres
Seznam IPv6 adres, které by měly být okamžitě vyřazeny.
Kód: Vybrat vše
/ipv6 firewall address-list
add address=::1/128 comment="defconf: RFC6890 lo" list=bad_ipv6
add address=::ffff:0:0/96 comment="defconf: RFC6890 IPv4 mapped" list=bad_ipv6
add address=2001::/23 comment="defconf: RFC6890" list=bad_ipv6
add address=2001:db8::/32 comment="defconf: RFC6890 documentation" list=bad_ipv6
add address=2001:10::/28 comment="defconf: RFC6890 orchid" list=bad_ipv6
add address=::/96 comment="defconf: ipv4 compat" list=bad_ipv6
Seznam adres IPv6, které nejsou globálně směrovatelné
Kód: Vybrat vše
/ipv6 firewall address-list
add address=100::/64 comment="defconf: RFC6890 Discard-only" list=not_global_ipv6
add address=2001::/32 comment="defconf: RFC6890 TEREDO" list=not_global_ipv6
add address=2001:2::/48 comment="defconf: RFC6890 Benchmark" list=not_global_ipv6
add address=fc00::/7 comment="defconf: RFC6890 Unique-Local" list=not_global_ipv6
Seznam adres s neplatnou cílovou adresou
Kód: Vybrat vše
/ipv6 firewall address-list add address=::/128 comment="defconf: unspecified" list=bad_dst_ipv6
Seznam adres s neplatnou zdrojovou adresou
Kód: Vybrat vše
/ipv6 firewall address-list
add address=::/128 comment="defconf: unspecified" list=bad_src_ipv6
add address=ff00::/8 comment="defconf: multicast" list=bad_src_ipv6
Pravidla IPv6 RAW
Pravidla IPv6 Raw provedou následující akce:
- add disabled accept rule lze použít k rychlému vypnutí filtrování RAW bez vypnutí všech pravidel RAW
- drop paketů, které používají falešné IP adresy
- dropneplatných IP adres SRC a DST
- drop globálně nesměrovatelných IP adres přicházejících z WAN
- drop špatných ICMP
- accept vše ostatní přicházející z WAN a LAN;
- drop vše ostatní, aby bylo zajištěno, že každé nově přidané rozhraní (např. připojení PPPoE k poskytovateli služeb) je chráněno proti náhodné chybné konfiguraci.
Kód: Vybrat vše
/ipv6 firewall raw
add action=accept chain=prerouting comment="defconf: enable for transparent firewall" disabled=yes
add action=drop chain=prerouting comment="defconf: drop bogon IP's" src-address-list=bad_ipv6
add action=drop chain=prerouting comment="defconf: drop bogon IP's" dst-address-list=bad_ipv6
add action=drop chain=prerouting comment="defconf: drop packets with bad SRC ipv6" src-address-list=bad_src_ipv6
add action=drop chain=prerouting comment="defconf: drop packets with bad dst ipv6" dst-address-list=bad_dst_ipv6
add action=drop chain=prerouting comment="defconf: drop non global from WAN" src-address-list=not_global_ipv6 in-interface-list=WAN
add action=jump chain=prerouting comment="defconf: jump to ICMPv6 chain" jump-target=icmp6 protocol=icmpv6
add action=accept chain=prerouting comment="defconf: accept local multicast scope" dst-address=ff02::/16
add action=drop chain=prerouting comment="defconf: drop other multicast destinations" dst-address=ff00::/8
add action=accept chain=prerouting comment="defconf: accept everything else from WAN" in-interface-list=WAN
add action=accept chain=prerouting comment="defconf: accept everything else from LAN" in-interface-list=LAN
add action=drop chain=prerouting comment="defconf: drop the rest"
Všimněte si, že byl použit vlastní řetězec ICMP. Pokud chcete mít velmi přísný firewall, pak lze takové přísné filtrování ICMP použít, ale ve většině případů to není nutné a pouze to zvyšuje zátěž procesoru směrovače. Omezení rychlosti ICMP je ve většině případů také zbytečné, protože jádro Linuxu již omezuje pakety ICMP na 100pps
Kód: Vybrat vše
/ipv6 firewall raw
# Be aware that different operating systems originate packets with different default TTL values
add action=accept chain=icmp6 comment="defconf: rfc4890 drop ll if hop-limit!=255" dst-address=fe80::/10 hop-limit=not-equal:255 protocol=icmpv6
add action=accept chain=icmp6 comment="defconf: dst unreachable" icmp-options=1:0-255 protocol=icmpv6
add action=accept chain=icmp6 comment="defconf: packet too big" icmp-options=2:0-255 protocol=icmpv6
add action=accept chain=icmp6 comment="defconf: limit exceeded" icmp-options=3:0-1 protocol=icmpv6
add action=accept chain=icmp6 comment="defconf: bad header" icmp-options=4:0-2 protocol=icmpv6
add action=accept chain=icmp6 comment="defconf: Mobile home agent address discovery" icmp-options=144:0-255 protocol=icmpv6
add action=accept chain=icmp6 comment="defconf: Mobile home agent address discovery" icmp-options=145:0-255 protocol=icmpv6
add action=accept chain=icmp6 comment="defconf: Mobile prefix solic" icmp-options=146:0-255 protocol=icmpv6
add action=accept chain=icmp6 comment="defconf: Mobile prefix advert" icmp-options=147:0-255 protocol=icmpv6
add action=accept chain=icmp6 comment="defconf: echo request limit 5,10" icmp-options=128:0-255 limit=5,10:packet protocol=icmpv6
add action=accept chain=icmp6 comment="defconf: echo reply limit 5,10" icmp-options=129:0-255 limit=5,10:packet protocol=icmpv6
add action=accept chain=icmp6 comment="defconf: rfc4890 router solic limit 5,10 only LAN" hop-limit=equal:255 icmp-options=133:0-255 in-interface-list=LAN limit=5,10:packet protocol=icmpv6
add action=accept chain=icmp6 comment="defconf: rfc4890 router advert limit 5,10 only LAN" hop-limit=equal:255 icmp-options=134:0-255 in-interface-list=LAN limit=5,10:packet protocol=icmpv6
add action=accept chain=icmp6 comment="defconf: rfc4890 neighbor solic limit 5,10 only LAN" hop-limit=equal:255 icmp-options=135:0-255 in-interface-list=LAN limit=5,10:packet protocol=icmpv6
add action=accept chain=icmp6 comment="defconf: rfc4890 neighbor advert limit 5,10 only LAN" hop-limit=equal:255 icmp-options=136:0-255 in-interface-list=LAN limit=5,10:packet protocol=icmpv6
add action=accept chain=icmp6 comment="defconf: rfc4890 inverse ND solic limit 5,10 only LAN" hop-limit=equal:255 icmp-options=141:0-255 in-interface-list=LAN limit=5,10:packet protocol=icmpv6
add action=accept chain=icmp6 comment="defconf: rfc4890 inverse ND advert limit 5,10 only LAN" hop-limit=equal:255 icmp-options=142:0-255 in-interface-list=LAN limit=5,10:packet protocol=icmpv6
add action=drop chain=icmp6 comment="defconf: drop other icmp" protocol=icmpv6