[OpenBSD]

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

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:

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:
src_port
Der Quellport im Layer-4-Paketheader. Ports können wie folgt angegeben werden: 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:
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)]


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