OpenBSD PF
Epe (vitalap | szerkesztései) |
Epe (vitalap | szerkesztései) |
||
74. sor: | 74. sor: | ||
Amennyiben egy interfész neve zárójelben szerepel egy szabályban, akkor a PF minden alkalommal az interfész aktuális IP címét fogja halsználni, így a helyi dinamikus IP címek könnyen kezelhetőek. |
Amennyiben egy interfész neve zárójelben szerepel egy szabályban, akkor a PF minden alkalommal az interfész aktuális IP címét fogja halsználni, így a helyi dinamikus IP címek könnyen kezelhetőek. |
||
− | |||
Az utolsó előtti paraméterrel a TCP flag-ek ellenőrzése kapcsolható be. Egy tipikus beállítás az alábbi, amely csak a kapcsolat kezdeményezű üzenetváltáshoz hajlandó állapotot létrehozni: |
Az utolsó előtti paraméterrel a TCP flag-ek ellenőrzése kapcsolható be. Egy tipikus beállítás az alábbi, amely csak a kapcsolat kezdeményezű üzenetváltáshoz hajlandó állapotot létrehozni: |
||
81. sor: | 80. sor: | ||
</pre> |
</pre> |
||
A forgalom tiszítása (scrubbing) magától eltávolítja az érvénytelen flag-eket tartalamzó csomagokat (pl. SYN és RST egyszerre), így azokkal nem kell itt külön törődni. |
A forgalom tiszítása (scrubbing) magától eltávolítja az érvénytelen flag-eket tartalamzó csomagokat (pl. SYN és RST egyszerre), így azokkal nem kell itt külön törődni. |
||
− | |||
Az utolsó paraméter, az állapot követés. Az állapot követés célja a kiértékelés jelentős gyorsítása azáltal, hogy az összetartozó csomagok esetén csak az elsőre értékelődnek ki a szabályok, a többire az elsőre érvényes művelet hajtódik végre. A stat érteke az alábbi lehet: |
Az utolsó paraméter, az állapot követés. Az állapot követés célja a kiértékelés jelentős gyorsítása azáltal, hogy az összetartozó csomagok esetén csak az elsőre értékelődnek ki a szabályok, a többire az elsőre érvényes művelet hajtódik végre. A stat érteke az alábbi lehet: |
||
90. sor: | 88. sor: | ||
Az egyes szabályok kiértékelése sorban, egymás után történik. Az utolsó illeszkedő szabály határozza meg, hogy a csomaggal mi történjen. Ez alól az egyedüli kivételek a quick kulcsszóval ellátott szabályok, melyek illeszkedése esetén a PF az adott szabályt tekinti az utolsónak. |
Az egyes szabályok kiértékelése sorban, egymás után történik. Az utolsó illeszkedő szabály határozza meg, hogy a csomaggal mi történjen. Ez alól az egyedüli kivételek a quick kulcsszóval ellátott szabályok, melyek illeszkedése esetén a PF az adott szabályt tekinti az utolsónak. |
||
− | |||
Lehetőség van a hamis feladójú csomagok szűrésére az antispoof segítségével. Egy tipikus ilyen bejegyzés az alábbi: |
Lehetőség van a hamis feladójú csomagok szűrésére az antispoof segítségével. Egy tipikus ilyen bejegyzés az alábbi: |
||
104. sor: | 101. sor: | ||
==== Címfordítás ==== |
==== Címfordítás ==== |
||
+ | |||
+ | A címfordítás használatához engedélyezni kell az operációs rendszerben a csomagok továbbítását interfészek között. (Erre tűzfal esetén egyébként is szükség van.) |
||
+ | <pre> |
||
+ | # sysctl net.inet.ip.forwarding=1 |
||
+ | </pre> |
||
+ | |||
+ | A NAT-ot az alábbi általános szabály segítségével lehet konfigurálni: |
||
+ | <pre> |
||
+ | nat [pass] [log] on interface [af] from src_addr [port src_port] to \ |
||
+ | dst_addr [port dst_port] -> ext_addr [pool_type] [static-port] |
||
+ | </pre> |
||
+ | |||
+ | Az IP címek akár egy-egy megfeleltethetőek egymással a binat szabály használatával. |
||
+ | |||
+ | |||
+ | ==== Port-forwarding ==== |
||
+ | |||
+ | A port-forwarding akkor válik szükségessé, ha van egy gép a tűfal mögött, amit a külvilág számára elérhetővé kell tenni. (Ez persze biztonsági rést is jelenthet, így az ilyen gépeket célszerű egy DMZ-ben összegyűjteni.) A következő példában egy webszervert üzemeltetünk a belső hálózaton, mely kívülről is elérhető: |
||
+ | <pre> |
||
+ | rdr on tl0 proto tcp from any to any port 80 -> 192.168.1.20 |
||
+ | </pre> |
||
+ | |||
+ | Az rdr után a pass paramétert megadva a csomag azonnal továbbításra kerül, így nincs szükség egy szabály megadására, mely az adott kapcsolatot engedélyezi. Lehetőség van portokat és port tartományokat is továbbítani. |
||
A lap 2007. november 25., 00:47-kori változata
A PF (Packet Filter) az OpenBSD beépített tűzfal rendszere, az OpenBSD 3.0 óta a hivatalos kernel része. Megtalálható a legtöbb egyéb BSD rendszerben is, így a FreeBSD, a NetBSD és a DragonFlyBSD is támogatja.
Tartalomjegyzék[elrejtés] |
1 A PF aktiválása
A PF boot idejű elindításához a /etc/rc.conf.local fájlba a pf=YEY bejegyzést kell rögzíteni, mely beállítás a következő reboot hatására lép életbe.
A PF az operációs rendszer működése közben is aktiválható és deaktiválható az általános sedédprogram a pfctl segítségével:
# pfctl -e # pfctl -d
2 Konfiguráláció
2.1 A konfigurációs fájl betöltése
Az tűzfal beállításai a /etc/pf.conf fájlban találhatók, ahonnan a PF a konfigurációt az indulása közben beolvassa. A konfiguráció módosítása a fájl szerkesztésével történhet, mely a pfctl -f /etc/pf.conf parancs hatására kerül a működő rendszerbe betöltésre. A parméter módosításával természetesen más konfigurációs fájl is használható.
2.2 A pf.conf felépítése
A pf.conf fájl hét részből áll, melyek opcionáliask, de az első kettőt kivéve a sorrend rögzített:
- Makrók: a felhasználó által definiált változók: IP címek és tartományok, interfész nevek...
- Táblázatok: (nagy számú) IP cím tárolására kitalált struktúrák, melyekben a keresés nagyon gyors
- Beállítások: általános beállítások a PF viselkedésével kapcsolatban
- Forgalom tisztítás: a csomagok darabjainak összeállítása, hibás (illegális tartalmú) csomagok eldobása
- Várakozási sorok: a sávszélesség elosztása, illetve csomagok prioritásának beállítása
- Címfordítás és port-forwarding: a NAT beállításai és port-forwarding továbbítási szabályok
- Szűrési szabályok: a csomagok szűrése a megadott szabályok alapján
2.2.1 Listák és makrók
Listák és makrók segítéségvel egy szabály több IP-cmíre vagy interfészre is alkalmazható:
block out on fxp0 from { 192.168.0.1, 10.5.32.6 } to any
A listák a szabályok betöltése során felbontásra kerülnek, így az előző sor a betöltés után két szabályt eredményez majd:
block out on fxp0 from 192.168.0.1 to any block out on fxp0 from 10.5.32.6 to any
A makrók segítségével a listáknak nevek adhatók, illetve listák egymásba ágyazására is lehetőség nyílik. A makrók a későbbiek során a beállítások között bárhol felhasználhatóak, így nagyban egyszerüsítik a konfiguráció átláthatóságát, illetve a módosításokat is csak a makró definíciójában kell végrehajtani.
host1 = "192.168.1.1" host2 = "192.168.1.2" all_hosts = "{" $host1 $host2 "}"
2.2.2 Táblázatok
A táblázatok célja nagy mennyiségű IP címet hatékonyan tárolni. Táblázat használata esetén a keresés nagyon gyors, a tábla méretétől szinte függetlenül. Amennyiben a táblákat a konfiguráció során a persist paraméterrel hozzuk létre, akkor lehetőség van a tábla tartalmát futási időben módosítani is.
table <goodguys> { 192.0.2.0/24 } table <rfc1918> const { 192.168.0.0/16, 172.16.0.0/12, 10.0.0.0/8 } table <spammers> persist block in on fxp0 from { <rfc1918>, <spammers> } to any pass in on fxp0 from <goodguys> to any
A spammers táblához egy külső fájl is rendelhető, melynek tartalma a konfiguráció betöltése közben a táblába kerül. A pftcl segítségével lehetőség van a táblák tartalmát működés közben módosítani, elemeket felvenni és törölni.
2.2.3 Csomagszűrés
A szabályok általános alakja az alábbi:
action [direction] [log] [quick] [on interface] [af] [proto protocol] \ [from src_addr [port src_port]] [to dst_addr [port dst_port]] \ [flags tcp_flags] [state]
Amennyiben egy interfész neve zárójelben szerepel egy szabályban, akkor a PF minden alkalommal az interfész aktuális IP címét fogja halsználni, így a helyi dinamikus IP címek könnyen kezelhetőek.
Az utolsó előtti paraméterrel a TCP flag-ek ellenőrzése kapcsolható be. Egy tipikus beállítás az alábbi, amely csak a kapcsolat kezdeményezű üzenetváltáshoz hajlandó állapotot létrehozni:
pass in on fxp0 proto tcp from any to any port ssh flags S/SA
A forgalom tiszítása (scrubbing) magától eltávolítja az érvénytelen flag-eket tartalamzó csomagokat (pl. SYN és RST egyszerre), így azokkal nem kell itt külön törődni.
Az utolsó paraméter, az állapot követés. Az állapot követés célja a kiértékelés jelentős gyorsítása azáltal, hogy az összetartozó csomagok esetén csak az elsőre értékelődnek ki a szabályok, a többire az elsőre érvényes művelet hajtódik végre. A stat érteke az alábbi lehet:
- keep state: hagyományos állapot követés
- modulate state: csak TCP esetén működik, a PF "erős" sequence number-eket generál az illeszkedő csomagokhoz
- synproxy state: az előző kettő együtt, és proxy-zza a bejövő TCP kapcsolatokat, így megvédhető egy belső szerver a TCP SYN flood-tól
A kapcsolatok állapotának követése során a PF mindkét irányba képes a csomagokat azonosítani, így egy bejövő csomagra érkező válasz a bejövő csomaghoz tartozó állapot alapján kerül elbírálásra. Ennek köszönhetően még az adott kapcsolathoz tarotozó ICMP üzenetek is gond nélkül átjutnak a tűzfalon.
Az egyes szabályok kiértékelése sorban, egymás után történik. Az utolsó illeszkedő szabály határozza meg, hogy a csomaggal mi történjen. Ez alól az egyedüli kivételek a quick kulcsszóval ellátott szabályok, melyek illeszkedése esetén a PF az adott szabályt tekinti az utolsónak.
Lehetőség van a hamis feladójú csomagok szűrésére az antispoof segítségével. Egy tipikus ilyen bejegyzés az alábbi:
antispoof for fxp0 inet
Ennek hatására a konfiguráció betöltése során az alábbi két szabály jön létre, ha az fxp0 IP címe 10.0.0.1:
block in on ! fxp0 inet from 10.0.0.0/24 to any block in inet from 10.0.0.1 to any
2.2.4 Címfordítás
A címfordítás használatához engedélyezni kell az operációs rendszerben a csomagok továbbítását interfészek között. (Erre tűzfal esetén egyébként is szükség van.)
# sysctl net.inet.ip.forwarding=1
A NAT-ot az alábbi általános szabály segítségével lehet konfigurálni:
nat [pass] [log] on interface [af] from src_addr [port src_port] to \ dst_addr [port dst_port] -> ext_addr [pool_type] [static-port]
Az IP címek akár egy-egy megfeleltethetőek egymással a binat szabály használatával.
2.2.5 Port-forwarding
A port-forwarding akkor válik szükségessé, ha van egy gép a tűfal mögött, amit a külvilág számára elérhetővé kell tenni. (Ez persze biztonsági rést is jelenthet, így az ilyen gépeket célszerű egy DMZ-ben összegyűjteni.) A következő példában egy webszervert üzemeltetünk a belső hálózaton, mely kívülről is elérhető:
rdr on tl0 proto tcp from any to any port 80 -> 192.168.1.20
Az rdr után a pass paramétert megadva a csomag azonnal továbbításra kerül, így nincs szükség egy szabály megadására, mely az adott kapcsolatot engedélyezi. Lehetőség van portokat és port tartományokat is továbbítani.