[OpenBSD]

[Wstecz: Pierwsze kroki] [Spis treści] [Dalej: Tabele]

PF: Listy i makra


Spis treści


Listy

Listy pozwalają na podawanie wielu podobnych kryteriów w jednej regule. Na przykład, wielu protokołów, numerów portów, adresów, itp. Dzięki temu, zamiast pisać regułę filtrującą dla każdego adresu IP, który ma być blokowany, można zapisać te adresy IP w postaci listy. Listy są definiowane poprzez wymienienie elementów w nawiasach klamrowych ({ }).

Gdy pfctl(8) napotyka listę podczas ładowania zestawu reguł, tworzy wiele regułek, po jednej dla każdego elementu z listy. Na przykład:

block out on fxp0 from { 192.168.0.1, 10.5.32.6 } to any

jest rozwijane do:

block out on fxp0 from 192.168.0.1 to any
block out on fxp0 from 10.5.32.6 to any

Wiele list może być wyspecyfikowanych w jednej regule. Listy nie są ograniczone jedynie do reguł filtrujących:

rdr on fxp0 proto tcp from any to any port { 22 80 } -> \
   192.168.0.6
block out on fxp0 proto { tcp udp } from { 192.168.0.1, \
   10.5.32.6 } to any port { ssh telnet }

Zwróć uwagę, że przecinki pomiędzy elementami list są opcjonalne.

Listy mogą także zawierać zagnieżdżone listy:

trusted = "{ 192.168.1.2 192.168.5.36 }"
pass in inet proto tcp from { 10.10.0.0/24 $trusted } to port 22

Wystrzegaj się konstrukcji jak poniższa. Inaczej nazwane "wykluczające się listy", są częstym błędem:

pass in on fxp0 from { 10.0.0.0/8, !10.1.2.3 }

Podczas gdy zamierzone znaczenie to dopasowanie równoznaczne "dowolny adres w 10.0.0.0/8, z wyjątkiem 10.1.2.3", reguła ta jest rozwijana do:

pass in on fxp0 from 10.0.0.0/8
pass in on fxp0 from !10.1.2.3

która pasuje do dowolnego adresu. Zamiast tego, powinieneś skorzystać z tablic.

Makra

Makra są definiowanymi przez użytkownika zmiennymi które mogą przechowywać adresy IP, numery portów, nazwy interfejsów sieciowych, itp. Makra mogą ograniczyć komplikację zestawu reguł PF, a także powodują, że wprowadzanie zmian jest znacznie prostsze.

Nazwy makr muszą zaczynać się od litery i mogą zawierać: litery, cyfry oraz podkreślniki. Nazwy makr nie mogą być zarezerwowanymi słowami, takimi jak pass, out, queue, itp.

ext_if = "fxp0"

block in on $ext_if from any to any

W tym przykładzie utworzono makro ext_if. Gdy odwołuje się do makra po jego zdefiniowaniu, robi się to poprzedzając jego nazwę znakiem $.

Makra mogą być także listami, jak np:

friends = "{ 192.168.1.1, 10.0.2.5, 192.168.43.53 }"

Makra mogą być definiowane rekursywnie. Ponieważ makra nie są rozszerzane pomiędzy nawiasami, stosuje się następującą składnię:

host1 = "192.168.1.1"
host2 = "192.168.1.2"
all_hosts = "{" $host1 $host2 "}"

Makro $all_hosts jest teraz rozszerzane do 192.168.1.1, 192.168.1.2.

[Wstecz: Pierwsze kroki] [Spis treści] [Dalej: Tabele]


[wstecz] www@openbsd.org
$OpenBSD$