[Wstecz: Kolejkowanie] [Spis treści] [Dalej: Packet Tagging]
Istnieją cztery metody używania pul adresów:
Dla większości z wyżej wymienionych sposobów, pule adresów muszą być podane jako bloki sieci w formacie CIDR (Classless Inter-Domain Routing). jedynie metoda round-robin akceptuje wiele pojedyńczych adresów IP podanych jako lista bądź tabela.
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 }"
rdr on $ext_if proto tcp from any to any port 80 -> $web_servers
Nadchdzące połączenia będą przekierowywane do kolejnych serwerów zgodnie z metodą round-robin.
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]