[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 Umleitungs-Adresse in rdr-Regeln, als Übersetzungs-Adresse in nat-Regeln und als Ziel-Adresse in route-to-, reply-to- und dup-to-Filter-Optionen 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-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.

nat on $ext_if inet from any to any -> { 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.

nat on $ext_if inet from any to any -> 192.0.2.4/31 source-hash

Diese nat-Regel verwende 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 }"

rdr on $ext_if proto tcp from any to any port 80 -> $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 route-to \
   { ($ext_if1 $ext_gw1), ($ext_if2 $ext_gw2) } round-robin \
   from $lan_net to any keep state

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. Bedenke, dass die route-to-Option bei jeder Filterregel anwesend sein muss, für die der Verkehr aufgeteilt wird. Antwort-Pakete werden über das gleiche externe Interface zurückgeleitet, das sie verlassen haben (dies wird durch die ISPs gemacht) und normal zurück zum internen Netzwerk geleitet.

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 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

Schlussendlich kann NAT ebenfalls auf alle ausgehenden Interfaces angewendet werden:

nat on $ext_if1 from $lan_net to any -> ($ext_if1)
nat on $ext_if2 from $lan_net to any -> ($ext_if2)

Ein komplettes Beispiel, das ,load balancing' auf den ausgehenden Verkehr ausübt, kann so ähnlich wiefolgt 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 auf ausgehende Verbindungen auf jedem Internet-Interface anwenden nat on $ext_if1 from $lan_net to any -> ($ext_if1) nat on $ext_if2 from $lan_net to any -> ($ext_if2) # standardmäßiges Blocken block in from any to any block out from any to any # lasse alle ausgehenden Pakete durch das interne Interface pass out on $int_if from any to $lan_net # lasse ,quick' (schnell) alle Pakete, die für das Gateway selbst # bestimmt sind, durch pass in quick on $int_if from $lan_net to $int_if # ,load balancing' auf ausgehenden tcp-Verkehr für das interne Netzwerk 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 # ,load balancing' für ausgehenden udp- und icmp-Verkehr vom internen # Netzwerk 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 # generelle ,pass out'-Regeln für die externen Interfaces 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 # leite Pakete von jeder IP vom $ext_if1 zum $ext_gw1 und das Gleiche # für $ext_if2 und $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

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


[zurück] www@openbsd.org
$OpenBSD: pools.html,v 1.18 2007/11/12 20:29:59 saad Exp $