[OpenBSD]

[Zurück: Paket-Queueing und Priorisierung] [Inhalt] [Weiter: Pakete markieren]

PF: Adress-Pools und Load Balancing


Inhaltsverzeichnis


Einführung

Ein Adress-Pool ist eine Ansammlung von zwei oder mehreren Adressen, deren Verwendung unter einer Gruppe an Benutzern geteilt wird. Ein Adress-Pool kann als Zieladresse der nat-to, rdr-to, route-to, reply-to und dup-to Filteroptionen angegeben werden.

Es gibt vier Methoden, um einen Adress-Pool zu verwenden:

Abgesehen von der round-robin-Methode, muss der Adress-Pool als ein CIDR- (Classless Inter-Domain Routing) Netzwerkblock angegeben werde. Die round-robin-Methode wird mehrere individuelle Adressen annehmen, die in einer Liste oder Tabelle angegeben worden sind.

Die sticky-address-Option kann mit den random- und round-robin-Pool-Arten verwendet werden, um sicherzustellen, dass eine bestimmte Source-Adresse jedes Mal zur gleichen Umleitungs-Adresse zugewiesen wird.

NAT-Adress-Pool

Ein Adress-Pool kann als Übersetzungs-Adresse in nat-to-Regeln verwendet werden. Die Source-Adresse einer Verbindung wird somit immer in eine Adresse übersetzt, die aus dem Pool stammt, je nach gewählter Methode. Dies kann in Situationen gebräuchlich sein, in denen PF als NAT für ein sehr großes Netzwerk arbeitet. Da die Anzahl der Verbindungen, auf die NAT angewandt wurde, pro Übersetzungs-Adresse begrenzt ist, wird das Hinzufügen zusätzlicher Übersetzungs-Adressen dem NAT-Gateway erlauben, eine noch größere Anzahl Anwender verwalten zu können.

In diesem Beispiel wird ein Pool, der aus zwei Adressen besteht, verwendet, um ausgehende Pakete zu übersetzen. Für jede ausgehende Verbindung wird PF durch die Adressen in einer ,round-robin'-Manier wechseln.

match out on $ext_if inet nat-to { 192.0.2.5, 192.0.2.10 }

Ein Nachteil bei dieser Methode ist, dass erfolgreiche Verbindungen von der gleichen internen Adresse nicht immer mit der gleichen Übersetzungs-Adresse übersetzt werden. Dies kann Störungen verursachen, zum Beispiel, wenn Webseiten besucht werden, die Benutzerlogins anhand der IP-Adresse verfolgen. Ein anderer Weg ist das Verwenden der source-hash-Methode, sodass jede interne Adresse immer mit der gleichen Übersetzungs-Adresse übersetzt wird. Um das zu machen, muss der Adress-Pool ein CIDR-Netzwerkblock sein.

match out on $ext_if inet nat-to 192.0.2.4/31 source-hash

Diese Regel verwendet den Adress-Pool 192.0.2.4/31 (192.0.2.4 - 192.0.2.5) als Übersetzungs-Adresse für ausgehende Pakete. Jede interne Adresse wird wegen dem source-hash-Schlüsselwort immer mit der gleichen Übersetzungs-Adresse übersetzt.

Load Balance für eingehende Verbindungen

Adress-Pools können verwendet werdem, um Load Balance für eingehende Verbindungen durchzuführen. Zum Beispiel können eingehende Webserver-Verbindungen über eine Webserver-Farm verteilt werden:
web_servers = "{ 10.0.0.10, 10.0.0.11, 10.0.0.13 }"

match in on $ext_if proto tcp to port 80 rdr-to $web_servers \
    round-robin sticky-address

Erfolgreiche Verbindungen werden zu den Webservern in einer ,round-robin'-Manier verteilt und zwar mit Verbindungen der gleichen Quelle, die zum gleichen Webserver gesendet werden. Die ,sticky Verbindung' wird existieren, so lange ,states' zu dieser Verbindung verweisen. Sobald der ,state' ausläuft, wird auch die ,sticky' Verbindung verschwinden. Weitere Verbindungen von diesem Host werden zum nächsten Webserver in der Runde umgeleitet.

Load Balance für ausgehende Verbindungen

Adress-Pools können in Verbindung mit der route-to-Filteroption verwendet werden, um Load Balance mit zwei oder mehr Internetverbindungen zu erreichen, wenn ein ordentliches ,multi-path routing'-Protokoll (wie zum Beispiel BGP4) nicht verfügbar ist. Mit der Verwendung von route-to in Verbindung mit einem round-robin-Adress-Pools, werden ausgehende Verbindung gleichmäßig über mehrere Ausgänge verteilt.

Eine weitere Information, die benötigt wird, um dies machen zu können, ist die IP-Adresse des angrenzenden Routers jeder Internetverbindung. Diese wird der route-to-Option übergeben, um das Ziel der ausgehenden Pakete zu kontrollieren.

Das folgende Beispiel teilt den ausgehenden Verkehr auf zwei Internetverbindungen auf:

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 from $lan_net \
   route-to { ($ext_if1 $ext_gw1), ($ext_if2 $ext_gw2) }\
   round-robin

Die route-to-Option wird auf den Verkehr, der durch in in das interne Interface kommt, angewandt, um die ausgehenden Interfaces anzugeben, über die der Verkehr aufgeteilt werden soll, mit den jeweiligen Gateways. Beachte, dass die Option route-to bei jeder Filterregel angegeben sein muss, für die Verkehr aufgeteilt werden soll (sie kann nicht mit match Regeln genutzt werden).

Um sicherzustellen, dass Pakete mit einer Source-Adresse, die zum $ext_if1 gehören, immer über $ext_gw1 geleitet werden (und so ähnlich auch für $ext_if2 und $ext_gw2), sollten die folgenden beiden Zeilen in den Regelsatz eingefügt werden:

pass out on $ext_if1 from $ext_if2 \
   route-to ($ext_if2 $ext_gw2)
pass out on $ext_if2 from $ext_if1 \
   route-to ($ext_if1 $ext_gw1)

Schlussendlich kann NAT ebenfalls auf alle ausgehenden Interfaces angewendet werden:

match out on $ext_if1 from $lan_net nat-to ($ext_if1)
match out on $ext_if2 from $lan_net nat-to ($ext_if2)

Ein komplettes Beispiel, das ,load balancing' auf den ausgehenden Verkehr ausübt, kann so ähnlich wie folgt aussehen:

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"

#  nat outgoing connections on each internet interface
match out on $ext_if1 from $lan_net nat-to ($ext_if1)
match out on $ext_if2 from $lan_net nat-to ($ext_if2)

#  default deny
block in
block out

#  pass all outgoing packets on internal interface
pass out on $int_if to $lan_net
#  pass in quick any packets destined for the gateway itself
pass in quick on $int_if from $lan_net to $int_if
#  load balance outgoing traffic from internal network. 
pass in on $int_if from $lan_net \
    route-to { ($ext_if1 $ext_gw1), ($ext_if2 $ext_gw2) } \
    round-robin
#  keep https traffic on a single connection; some web applications,
#  especially "secure" ones, don't allow it to change mid-session
pass in on $int_if proto tcp from $lan_net to port https \
    route-to ($ext_if1 $ext_gw1)

#  general "pass out" rules for external interfaces
pass out on $ext_if1
pass out on $ext_if2

#  route packets from any IPs on $ext_if1 to $ext_gw1 and the same for
#  $ext_if2 and $ext_gw2
pass out on $ext_if1 from $ext_if2 route-to ($ext_if2 $ext_gw2)
pass out on $ext_if2 from $ext_if1 route-to ($ext_if1 $ext_gw1) 

[Zurück: Paket-Queueing und Priorisierung] [Inhalt] [Weiter: Pakete markieren]


[zurück] www@openbsd.org
$OpenBSD: pools.html,v 1.28 2013/02/20 14:08:03 ajacoutot Exp $