[Zurück: Paket-Queueing und Priorisierung] [Inhalt] [Weiter: Pakete markieren]
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.
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.
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.
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]