[Wstecz: Kolejkowanie] [Spis treści] [Dalej: Packet Tagging]
Istnieją cztery metody używania pul adresów:
Z wyjątkiem metody round-robin, pule adresów muszą być podane jako bloki sieci w formacie CIDR (Classless Inter-Domain Routing). Metoda round-robin akceptuje wiele pojedynczych adresów IP podanych jako lista bądź tabela.
Opcja sticky-address może być używana wraz pulami random lub round-robin aby zapewnić, że dany adres źródłowy jest zawsze mapowany do tego samego adresu przy przekierowaniu.
Poniższy przykład przedstawia wykorzystanie puli składającej się z dwóch adresów do translacji wychodzących pakietów. Dla każdego połączenia PF będzie przypisywał, na zmianę, jeden z adresów wchodzących w skład puli, zgodnie z metodą round-robin.
nat on $ext_if inet from any to any -> { 192.0.2.5, 192.0.2.10 }
Jedną z wad tej metody jest fakt, że kolejne połączenia z tego samego adresu z sieci wewnętrznej nie zawsze będą mapowane na ten sam adres zewnętrzny. Może to powodować problemy, na przykład, podczas przeglądania stron, które śledzą użytkowników na podstawie adresu IP. Alternatywnym rozwiązaniem problemu może być wykorzystanie metody source-hash, w której dla danego adresu wewnętrznego przypisywany jest dokładnie ten sam adres zewnętrzny. Aby wykorzystać tą metodę niezbędne jest zdefiniowanie puli adresowej jako bloku sieci w formacie CIDR.
nat on $ext_if inet from any to any -> 192.0.2.4/31 source-hash
Ta przykładowa reguła nat używa puli adresowej 192.0.2.4/31 (192.0.2.4 - 192.0.2.5) do translacji adresów dla wychodzących pakietów. Dany wewnętrzny adres będzie zawsze przetłumaczony na ten sam adres zewnętrzny ponieważ zostało użyte słowo kluczowe source-hash.
web_servers = "{ 10.0.0.10, 10.0.0.11, 10.0.0.13 }"Nawiązane połączenia będą przekierowywane do danego serwera zgodnie z metodą round-robin. Tak długo jak długo istnieje wpis w tabeli stanów odnośnie danego połączenia, tak długo opcja "sticky-address" powodować będzie, że ten sam adres źródłowy przekierowany będzie do tego samego serwera. Po wygaśnięciu wpisu w tabeli, nowe połączenie może być przekierowane do następnego serwera. Gdy dany stan wygaśnie, wygaśnie także powiązanie połączeń. Następne połączenia z danego hosta będą przekierowywane do następnego serwera www z tabeli round robin.
rdr on $ext_if proto tcp from any to any port 80 -> $web_servers \
round-robin sticky-address
Tak samo jak w przypadku przykładu dla NAT, jeśli serwery www będą znajdować się w jednym bloku CIDR, opcja source-hash może być użyta do zapewnienia, że wywołania z danego adresu IP będą zawsze przekierowane do tego samego serwera. Takie zachowanie może być wymagane do utrzymania sesji podczas przeglądania strony www.
Informacją niezbędną do wykonania równoważenia ruchu wychodzącego jest adres IP granicznego routera dla każdego połączenia z Internetem. Jest to niezbędne dla opcji route-to do określenia miejsca przeznaczenia dla wychodzących pakietów.
Poniższy przykład prezentuje równoważanie ruchu wychodzącego do Internetu poprzez dwa interfejsy sieciowe:
lan_net = "192.168.0.0/24"
int_if = "dc0"
ext_if1 = "fxp0"
ext_if2 = "fxp1"
ext_gw1 = "68.146.224.1"
ext_gw2 = "142.59.76.1"
pass in on $int_if route-to \
{ ($ext_if1 $ext_gw1), ($ext_if2 $ext_gw2) } round-robin \
from $lan_net to any keep state
Opcja route-to jest używana dla ruchu przychodzącego na wewnętrznym interfejsie do określenia zewnętrznego interfejsu sieciowego, poprzez który mają zostać skierowane pakiety, których adres źródłowy zostanie podmieniony na adres określonej bramki. Proszę zauważyć, że opcja route-to musi zostać określona dla każdej regułki, która definiuje równoważenie obciążenia. Powracające pakiety będą skierowane do tego samego interfejsu zewnętrznego, przez który wyszły na świat (realizuje to dostawca usług internetowych), a następnie do wewnętrznego interfejsu sieciowego.
Aby zapewnić, że pakiety z adresem źródłowym należącym do interfejsu $ext_if1 były przekazywane do interfejsu $ext_gw1 (oraz odpowiednio dla $ext_if2 i $ext_gw2), dwie poniższe linie powinny zostać włączone do zestawu reguł:
pass out on $ext_if1 route-to ($ext_if2 $ext_gw2) from $ext_if2 \
to any
pass out on $ext_if2 route-to ($ext_if1 $ext_gw1) from $ext_if1 \
to any
I na końcu, NAT powinien zostać włączony na każdym wychodzącym interfejsie:
nat on $ext_if1 from $lan_net to any -> ($ext_if1)
nat on $ext_if2 from $lan_net to any -> ($ext_if2)
Kompletny, przykładowy zestaw reguł, który będzie równoważyć obciążenie ruchu wychodzącego może wyglądać mniej więcej tak:
lan_net = "192.168.0.0/24"
int_if = "dc0"
ext_if1 = "fxp0"
ext_if2 = "fxp1"
ext_gw1 = "68.146.224.1"
ext_gw2 = "142.59.76.1"
# włączenie NAT dla każdego wychodzącego interfejsu
nat on $ext_if1 from $lan_net to any -> ($ext_if1)
nat on $ext_if2 from $lan_net to any -> ($ext_if2)
# domyślne blokowanie
block in from any to any
block out from any to any
# przepuszczenie wszystkich wychodzących pakietów na interfejsie wewnętrznym
pass out on $int_if from any to $lan_net
# natychmiastowe przepuszczenie wszystkich pakietów skierowanych do routera
pass in quick on $int_if from $lan_net to $int_if
# równoważenie wychodzącego ruchu na protokole TCP z sieci wewnętrznej
pass in on $int_if route-to \
{ ($ext_if1 $ext_gw1), ($ext_if2 $ext_gw2) } round-robin \
proto tcp from $lan_net to any flags S/SA modulate state
# równoważenie wychodzącego ruchu na protokołach ICMP i UDP z sieci wewnętrznej
pass in on $int_if route-to \
{ ($ext_if1 $ext_gw1), ($ext_if2 $ext_gw2) } round-robin \
proto { udp, icmp } from $lan_net to any keep state
# przepuszczenie wychodzących pakietów na interfejsach zewnętrznych
pass out on $ext_if1 proto tcp from any to any flags S/SA modulate state
pass out on $ext_if1 proto { udp, icmp } from any to any keep state
pass out on $ext_if2 proto tcp from any to any flags S/SA modulate state
pass out on $ext_if2 proto { udp, icmp } from any to any keep state
# skierowanie pakietów z dowolnego IP na interfejsie $ext_if1 do $ext_gw1 i
# tak samo dla $ext_if2 i $ext_gw2
pass out on $ext_if1 route-to ($ext_if2 $ext_gw2) from $ext_if2 to any
pass out on $ext_if2 route-to ($ext_if1 $ext_gw1) from $ext_if1 to any
|
[Wstecz: Kolejkowanie] [Spis treści] [Dalej: Packet Tagging]