[OpenBSD]

[Wstecz: Kolejkowanie] [Spis treści] [Dalej: Packet Tagging]

PF: Pule adresów i kierowanie ruchem


Spis treści


Wstęp

Pula adresów jest zbiorem dwóch lub więcej adresów, które, w razie konieczności, są dzielone pomiędzy użytkowników. Znajdują one zastosowanie jako zestawy adresów dla przekierowań w regułach rdr, jako adresy użyte przy translacji adresów w regułkach nat, lub też jako adresy docelowe przy opcjach route-to, reply-to oraz dup-to filtra pakietów.

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.

Pula adresowa dla NAT

Pula adresowa może być używana jako adres do mapowania w regułach nat. Połączenia obsługiwane przez NAT będą miały adres źródłowy zamieniony, przy użyciu jednej z wcześniej opisanych metod, na adres z puli adresowej. Takie wykorzystanie puli adresowej jest niezwykle użyteczna w sytuacjach gdy PF jest używany do mapowania adresów w bardzo dużej sieci. Ponieważ ilość mapowanych połączeń dla jednego adresu zewnętrznego jest ograniczona, dodanie kilku adresów wykorzystywanych do obsługi NAT pozwala zwiększyć ilość obsługiwanych użytkowników.

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.

Równoważenie obciążenia dla połączeń przychodzących

Pule adresowe znajdują także zastosowanie przy równoważeniu obciążenia serwerów obsługujących nadchodzące wywołania. Na przykład żądania dla serwera stron www mogą być rozłożone na różne serwery posiadające te same zasoby:
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 \
    round-robin sticky-address
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.

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.

Równoważenie obciążenia ruchu wychodzącego

Pule adresowe, w połączeniu z opcja route-to filtra pakietów, doskonale nadają się do równoważenia ruchu wychodzącego pomiędzy dwa (lub więcej) interfejsy zapewniające połączenia z Internetem, kiedy żaden z odpowiednich protokołów wyznaczania tras (jak np.: BGP4) jest niedostępny. Użycie opcji route-to wraz z pulą adresową obsługiwaną metodą round-robin sprawia, że połączenia wychodzące mogą być równomiernie rozłożone pomiędzy różne zewnętrzne interfejsy sieciowe.

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]


[wstecz] www@openbsd.org
$OpenBSD$