Autor: sutrus

Datum: 12 pro 2021 18:33
Kategorie: Zabezpečení routeru

Zobrazení: 3140
Komentáře: 0

Budování pokročilého firewallu

Popis: Building Advanced Firewall

Odkaz na článek (bb-code [URL]): Kopírovat

[url=https://spssoftware.cz/knowledgebase/article?k=62]Budování pokročilého firewallu[/url]

Přímý odkaz: Kopírovat

https://spssoftware.cz/knowledgebase/article?k=62

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
Zahazujeme všechny nedestnované IPv4 pakety, abychom se ochránili před přímými útoky na klienty, pokud útočník zná vnitřní síť LAN. Obvykle by toto pravidlo nebylo nutné, protože RAW filtry takové pakety zahazují, nicméně pravidlo je zde kvůli dvojímu zabezpečení pro případ, že by se pravidla RAW náhodou pokazila.

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
Všimněte si pravidel IPsec policy. Je velmi důležité, aby zapouzdřený provoz IPsec obcházel zrychlenou cestu. Proto jsme pro ilustraci přidali drop pravidlo pro přijímání provozu odpovídajícího zásadám IPsec. Kdykoli se na směrovači používají tunely IPsec, mělo by být toto pravidlo povoleno. U protokolu IPv6 je to mnohem jednodušší, protože nemá podporu zrychleného postupu.

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
Všimněte si zakázaného pravidla pro porovnávání zásad, stejně jako ve filtrech brány firewall musí být provoz IPSec vyloučen z NATování (s výjimkou specifických scénářů, kdy je politika IPsec nakonfigurována tak, aby odpovídala NATované adrese). Kdykoli se tedy na směrovači používají tunely IPsec, musí být toto pravidlo povoleno.



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