[Zurück: Pakete filtern]
[Inhalt]
[Weiter: Verkehr-Umleitung (Port-Weiterleitung)]
PF: Network Address Translation (NAT)
Inhaltsverzeichnis
Einführung
Network Address Translation (NAT) ist ein Weg, um ein gesamtes
Netzwerk (oder Netzwerke) einer einzigen IP-Adresse zuzuweisen.
NAT ist notwendig, wenn du mehr Rechner besitzt, denen du
Internetzugriff ermöglichen möchtest, als dir dein Internetanbieter
IP-Adressen bereitgestellt hat. Im
RFC 1631
»The IP Network Address Translator (NAT)« wird NAT beschrieben.
NAT erlaubt dir den Vorteil der reservierten Adressblöcke zu
nutzen, wie sie in
RFC 1918
»Address Allocation for Private Internets« beschrieben werden.
Normalerweise wird dein internes Netzwerk so eingerichtet sein, dass
einer dieser Netzwerkblöcke verwendet wird. Diese sind:
10.0.0.0/8 (10.0.0.0 - 10.255.255.255)
172.16.0.0/12 (172.16.0.0 - 172.31.255.255)
192.168.0.0/16 (192.168.0.0 - 192.168.255.255)
Ein OpenBSD-System, das NAT durchführt, muss mindestens zwei
Netzwerkadapter besitzen: einen in Richtung Internet und die anderen
in Richtung internes Netzwerk. NAT wird die Anfragen vom internen
Netzwerk so übersetzen, dass sie so wirken, als wenn sie alle vom
OpenBSD-NAT-System kommen würden.
Wie NAT funktioniert
Wenn ein Client im internen Netzwerk eine Maschine im Internet
kontaktiert, sendet er IP-Pakete, die für diese Maschine bestimmt
sind. Diese Pakete beinhalten alle Adressinformationen, die benötigt
werden, um am Ziel anzukommen. NAT befasst sich mit diesen
Informationen:
- Quell-IP-Adresse (zum Beispiel 192.168.1.35)
- Quell-TCP- oder -UDP-Port (zum Beispiel 2132)
Wenn das Paket durch das NAT-Gateway gesendet wird, wird es so
modifiziert, dass es wirkt, als wenn es vom NAT-Gateway geschickt
worden wäre. Das NAT-Gateway wird sich die Änderungen in der
Statustabelle merken, sodass es a) die Änderungen für die
Antwortpakete wieder rückgängig machen kann und b) sicherstellen kann,
dass die Antwortpakete durch die Firewall gelassen und nicht geblockt
werden. Zum Beispiel können die folgenden Änderungen durchgeführt
werden:
- Quell-IP: ersetzt mit der externen Adresse des Gateways
(zum Beispiel 24.5.0.5)
- Quell-Port: ersetzt mit einem zufällig gewählten, unbenutzten Port
des Gateways (zum Beispiel 53136)
Weder die interne Maschine noch der Internethost wissen etwas von
diesen Übersetzungsschritten. Für die interne Maschine ist das
NAT-System einfach ein Internetgateway. Für den Internethost
scheinen die Pakete vom NAT-System direkt zu kommen; er weiß noch
nicht einmal, dass die interne Workstation überhaupt existiert.
Wenn der Internethost auf die Pakete der internen Maschine antwortet,
werden sie an die externe IP des NAT-Gateways (24.5.0.5) und den
Übersetzungsport (53136) gerichtet sein. Das NAT-Gateway durchsucht dann
die Statustabelle, ob die Antwortpakete zu einer bereits erstellten
Verbindung gehören. Ein einzigartiger Treffer (basierend auf der
IP/Port-Kombination) wird gefunden, der PF mitteilt, dass die
Pakete zu einer Verbindung gehören, die von der internen Maschine
192.168.1.35 eröffnet wurde. PF wird dann die entgegengesetzten
Änderungen, die an den gesendeten Paketen gemacht worden sind,
vornehmen und die Antwortpakete an die interne Maschine weiterleiten.
Die Übersetzung von ICMP-Paketen findet auf eine ähnliche Art und Weise
statt, aber ohne der Quellport-Modifizierung.
IP-Weiterleitung
Da NAT fast ausschließlich auf Routern und Netzwerkgateways verwendet
wird, ist es wahrscheinlich notwendig, IP-Weiterleitung zu aktivieren,
sodass die Pakete zwischen den Netzwerkinterfaces der OpenBSD-Maschine
ausgetauscht werden können. IP-Weiterleitung wird über den
sysctl(3)-Mechanismus aktiviert:
# sysctl net.inet.ip.forwarding=1
# sysctl net.inet6.ip6.forwarding=1 (wenn IPv6 verwendet wird)
Um diese Änderungen dauerhaft zu machen, sollten die folgenden
Zeilen in die
/etc/sysctl.conf eingetragen werden:
net.inet.ip.forwarding=1
net.inet6.ip6.forwarding=1
Diese Zeilen sind zwar in der Standardinstallation bereits vorhanden,
aber auskommentiert (vor ihnen steht eine Raute #).
Entferne die # und speicher die Datei. IP-Weiterleitung
wird aktiviert, wenn die Maschine neustartet.
NAT konfigurieren
Anmerkung: Diese Information ist für OpenBSD 4.7.
Die Konfiguration von NAT unterschied sich in früheren Versionen signifikant.
NAT wird durch einen optionalen Parameter nat-to zu einer abgehenden
pass-Regel spezifiziert.
Oft wird, statt des direkten Setzens in der pass-Regel, eine
match-Regel benutzt.
Wird ein Paket durch eine match-Regel selektiert, so werden die
Parameter dieser Regel (z. B. nat-to) erinnert und auf das Paket
angewandt, wenn eine auf das Paket passende pass-Regel erreicht wird.
Dies erlaubt die Verarbeitung einer ganzen Klasse von Paketen durch eine
einzige match-Regel, woraufhin spezifische Entscheidungen darüber, ob
der Verkehr zugelassen werden soll, mit Hilfe von block und
pass-Regeln getroffen werden können.
Das generelle Format der pf.conf sieht in etwa so aus:
match out on interface [af] \
from src_addr to dst_addr \
nat-to ext_addr [pool_type] [static-port]
...
pass out [log] on interface [af] [proto protocol] \
from ext_addr [port src_port] \
to dst_addr [port dst_port]
- match
- Wenn ein Paket einen Regelsatz durchläuft und in einer match-Regel
eine Entsprechung findet, so werden alle spezifizierten optionalen Parameter
der Regel für die spätere Nutzung erinnert (sie werden »sticky« gemacht).
- pass
- Diese Regel erlaubt die Übertragung des Pakets.
Wurde das Paket vorher einer match-Regel mit Parametern zugeordnet, so
werden selbige auf das Paket angewandt.
pass-Regeln können ihre eigenen Parameter haben; diese haben Vorrang
über Parameter, die in match-Regeln spezifiziert wurden.
- out
- Spezifiziert die Richtung des Paketflusses, auf welche diese Regel
zutrifft.
nat-to darf nur auf ausgehende Pakete angewandt werden.
- log
- Zeichne zutreffende Pakete mittels
pflogd(8) auf.
Normalerweise wird nur das erste
zutreffende Paket aufgezeichnet. Damit alle Pakete protokolliert
werden verwende log (all).
- interface
- Der Name oder die Gruppe der Netzwerkschnittstelle, auf dem die Pakete
überstragen werden sollen.
- af
- Die Adressfamilie: inet für IPv4 oder inet6
für IPv6. PF ist normalerweise in der Lage, das selbst anhand der
Quell/Ziel-Adresse(n) herauszufinden.
- protocol
- Die Protokollfamilie (z. B. tcp, udp, icmp), deren Pakete erlaubt
werden sollen.
Wenn src_port oder dst_port spezifiziert sind, so muss
das Protokoll ebenfalls angegeben werden.
- src_addr
- Die (interne) Quelladresse der Pakete, die übersetzt werden
sollen.
Die Quelladresse kann wie folgt angegeben werden:
- Eine einzelne IPv4- oder IPv6-Adresse.
- Ein
CIDR-Netzwerkblock.
- Ein »fully qualified domain name«, der per DNS aufgelöst werden
kann, wenn der Regelsatz geladen wird. Alle resultierenden IP-Adressen
werden in die Regel eingesetzt.
- Der Name oder die Gruppe eines Netzwerkinterfaces. Jegliche
IP-Adressen, die dem Interface zugeordnet worden sind, werden in die
Regel zur Ladezeit eingesetzt.
- Der Name eines Netzwerkinterfaces, gefolgt von
/netmask (z. B. /24). Jede IP-Adresse auf
dem Interface wird mit der Netzmaske kombiniert, um einen
CIDR-Netzwerkblock zu bilden, der in die Regel eingesetzt wird.
- Der Name oder die Gruppe eines Netzwerkinterfaces, gefolgt von einem
dieser Modifizierer:
- :network - fügt den CIDR-Netzwerkblock ein (z. B.
192.168.0.0/24)
- :broadcast - fügt die Netzwerkbroadcastadresse ein
(z. B. 192.168.0.255)
- :peer - fügt die IP-Adresse eines Peers von einem
Point-to-Point-Link ein
- Zusätzlich kann der :0-Modifizierer einem
Interfacenamen/der Interfacegruppe oder einem der vorher genannten
Modifizierer angehängt werden, um PF mitzuteilen, dass keine
IP-Adressaliase mit eingefügt werden sollen. Diese Modifizierer können
ebenfalls verwendet werden, wenn das Interface sich in Klammern
befindet. Beispiel: fxp0:network:0
- Eine Tabelle.
- Irgendeine der zuvor genannten Möglichkeiten, aber mit dem !-
(»nicht«) Modifizierer.
- Ein Satz an Adressen unter Verwendung einer
Liste.
- Das Schlüsselwort any, das für alle Adressen steht
- src_port
- Der Quellport im Layer-4-Paketheader. Ports können wie folgt
angegeben werden:
- Eine Nummer zwischen 1 und 65535
- Ein gültiger Servicename aus
/etc/services
- Ein Satz an Ports unter Verwendung einer
Liste
- Ein Bereich:
- != (ungleich)
- < (kleiner als)
- > (größer als)
- <= (kleiner oder gleich)
- >= (größer oder gleich)
- >< (Bereich)
- <> (invertierter Bereich)
- Die letzten beiden sind Binäroperatoren (sie nehmen zwei
Argumente) und fügen diese Argumente nicht mit in den Bereich
ein.
- : (inklusiver Bereich)
- Der Operator für den inklusiven Bereich ist ebenfalls ein
Binäroperator und fügt die Argumente mit in den Bereich ein.
Die port-Option wird normalerweise nicht in nat-Regeln
verwendet, da das Ziel normalerweise ist, NAT auf den Verkehr
auszuüben - unabhängig davon, welche Ports verwendet werden.
- dst_addr
- Die Zieladresse der Pakete, die übersetzt werden sollen. Die
Zieladresse wird genauso wie die Quelladresse angegeben.
- dst_port
- Der Zielport im Layer-4-Paketheader. Dieser Port wird genauso
wie der Quellport angegeben.
- ext_addr
- Die externe (Übersetzungs-)Adresse des NAT-Gateways, die die
übersetzten Pakete annehmen soll. Die externe Adresse kann wie folgt
angegeben werden:
- Eine einzelne IPv4- oder IPv6-Adresse.
- Ein
CIDR-Netzwerkblock.
- Ein »fully qualified domain name«, der per DNS aufgelöst werden
kann, wenn der Regelsatz geladen wird. Alle resultierenden IP-Adressen
werden in die Regel eingesetzt.
- Der Name oder die Gruppe der externen Netzwerkschnittstelle.
Alle IP-Adressen, die der Schnittstelle zugeordnet wurden, werden zur Ladezeit
in die Regel eingesetzt.
- Der Name des externen Netzwerkinterfaces in Klammern ( ).
Dies teil PF mit, dass die Regel neugeladen werden soll, wenn die
IP-Adresse(n) des genannten Interfaces sich über DHCP oder dial-up
ändern. Somit mus der Regelsatz nicht immer neugeladen werden, wenn sich
die Adresse ändert.
- Der Name oder die Gruppe einer Netzwerkschnittstelle, gefolgt von einem
dieser Modifikatoren:
- :network - fügt den CIDR-Netzwerkblock ein (z. B.
192.168.0.0/24)
- :peer - fügt die IP-Adresse eines Peers von einem
Point-to-Point-Link ein
- Zusätzlich kann der Modifikator :0 entweder an einen
Schnittstellen- oder Gruppennamen oder aber an einen der oben genannten
Modifikatoren angehängt werden, um PF mitzuteilen, dass es keinerlei
IP-Adressen-Alias mit einfügen soll.
Diese Modifikatoren können ebenfalls verwendet werden, wenn die Schnittstelle
sich in Klammern befindet.
Beispiel: fxp0:network:0.
- Ein Satz an Adressen unter Verwendung einer
Liste.
- pool_type
- Gibt den Typ des Adresspools an, der
für die Übersetzung verwendet werden soll.
- static-port
- Teilt PF mit, den Quellport in TCP- und UDP-Paketen nicht zu
verändern.
Dies würde in der einfachsten Form zu Zeilen ähnlich den folgenden führen:
match out on tl0 from 192.168.1.0/24 to any nat-to 24.5.0.5
pass on tl0 from 192.168.1.0/24 to any
oder du benutzt einfach
pass out on tl0 from 192.168.1.0/24 to any nat-to 24.5.0.5
Diese Regel besagt, dass NAT auf dem tl0-Interface für
alle Pakete ausgeführt werden soll, die von 192.168.1.0./24 aus kommen,
und sie mit der Quell-IP-Adresse von 24.5.0.5 übersetzt werden sollen.
Während die vorher genannte Regel korrekt ist, ist es keine empfohlene
Form. Die Verwaltung könnte schwierig sein, da jegliche Änderung an
den internen oder externen Netzwerknummern eine Änderung der Zeile
zur Folge hätte. Vergleiche sie stattdessen mit dieser einfacher zu
verwaltenen Zeile (tl0 ist extern, dc0 intern):
pass out on tl0 from dc0:network to any nat-to tl0
Der Vorteil sollte recht klar sein: du kannst die IP-Adressen von
einem der Interfaces ändern, ohne die Regeln ändern zu müssen.
Wenn ein Interfacename für die Übersetzungsadresse wie zuvor
angegeben wird, wird die IP-Adresse zur Ladezeit von pf.conf
ermittelt - nicht während der Verwendung! Wenn du DHCP verwendest, um
dein externes Interface zu konfigurieren, kann dies zu einem Problem
werden. Wenn deine zugewiesene IP-Adresse sich ändert, wird NAT
weiterhin die hinausgehenden Pakete mit der alten IP-Adresse übersetzen.
Dies wird dazu führen, dass ausgehende Verbindungen nicht mehr
funktionieren werden. Um dies zu umgehen, kannst du PF sagen, dass die
Übersetzungsadresse automatisch aktualisiert werden soll, indem
Klammern um den Interfacenamen herum gesetzt werden:
pass out on tl0 from dc0:network to any nat-to (tl0)
Diese Methode funktioniert für Übersetzungen von IPv4- und
IPv6-Adressen.
Bidirektionale Abbildung (1:1 Abbildung)
Eine bidirektionales Abbildung kann durch die Verwendung des Parameters
binat-to erzielt werden.
Eine binat-to-Regel etabliert eine Eins-zu-eins-Umsetzung zwischen
einer internen IP-Adresse und einer externen Adresse.
Dies kann zum Beispiel nützlich sein, um einen Webserver im internen Netzwerk
mit seiner eigenen externen IP-Adresse auszustatten.
Verbindungen aus dem Internet zu der externen Adresse werden zu der internen
Adresse übersetzt werden, und Verbindungen des Webservers (wie DNS-Anfragen)
werden auf die externe Adresse übersetzt.
TCP- und UDP-Ports werden niemals mit binat-to-Regeln modifiziert,
da sie von nat-Regeln erfaßt werden.
Beispiel:
web_serv_int = "192.168.1.100"
web_serv_ext = "24.5.0.6"
pass on tl0 from $web_serv_int to any binat-to $web_serv_ext
Übersetzungsregel-Ausnahmen
Wenn du den meisten Verkehr Übersetzen musst, aber für einige Fälle Ausnahmen
benötigst, so stelle sicher das die Ausnahmen von Filterregeln behandelt
werden, die keinen nat-to-Parameter enthalten.
Zum Beispiel, wenn obiges NAT-Beispiel modifiziert werden würde, um so
auszusehen:
pass out on tl0 from 192.168.1.0/24 to any nat-to 24.2.74.79
pass out on tl0 from 192.168.1.208 to any
Dann würde das gesamte 192.168.1.0/24-Netzwerk alle Pakete auf die externe
Adresse 24.2.74.79 übersetzt bekommen, mit Ausnahme von 192.168.1.208.
Den NAT-Status abfragen
Um die aktiven NAT-Übersetzungen zu betrachten, wird
pfctl(8) mit der Option -s state verwendet. Diese Option
wird alle momentanen NAT-Sitzungen auflisten:
# pfctl -s state
fxp0 tcp 192.168.1.35:2132 (24.5.0.5:53136) -> 65.42.33.245:22 TIME_WAIT:TIME_WAIT
fxp0 udp 192.168.1.35:2491 (24.5.0.5:60527) -> 24.2.68.33:53 MULTIPLE:SINGLE
Erklärungen (nur die erste Zeile):
- fxp0
- Gibt das Interface an, an welches der Status gebunden ist. Das Wort
self wird erscheinen, wenn der Status
»floating«« ist.
- TCP
- Das Protokoll, das von der Verbindung genutzt wird.
- 192.168.1.35:2132
- Die IP-Adresse (192.168.1.35) der Maschine im internen Netzwerk.
Der Quellport (2132) wird nach der Adresse angezeigt. Dies ist ebenfalls
die Adresse, die im IP-Header ersetzt wird.
- 24.5.0.5:53136
- Die IP-Adresse (24.5.0.5) und Port (53136) vom Gateway, mit denen
die Pakete übersetzt werden.
- 65.42.33.245:22
- Die IP-Adresse (65.42.33.245) und der Port (22), mit denen die
interne Maschine verbunden ist.
- TIME_WAIT:TIME_WAIT
- Dies gibt an, was PF glaubt, zu welchem Status die TCP-Verbindung
gehört.
[Zurück: Pakete filtern]
[Inhalt]
[Weiter: Verkehr-Umleitung (Port-Weiterleitung)]
www@openbsd.org
$OpenBSD: nat.html,v 1.31 2013/02/20 14:08:03 ajacoutot Exp $