OpenBSD Network Adress Translation Howto von Dobin Rutishauser (anthraxx@gmx.net) v0.3, Juli 2000 0) Copyright 1) Einfuehrung 1.1) Was ist NAT? 1.2) Wie Funktioniert NAT? 2) NAT unter OpenBSD einrichten 2.1) Installation 2.2) Konfiguration 2.3) Running 3) Zusaetzliche Konfiguration 3.1) Anzeigen der NAT Einstellungen und Statuses 3.2) FTP Konfiguration 3.3) Port Redirecting 0) Copyright Dieser Text darf frei Kopiert, aber nicht veraendert werden. Copyright liegt bei Dobin Rutishauser. Kommentare, Berichtigungen, Anregungen oder Hinweise bitte zu dobin.rutishauser@gmx.net 1) Einfuehrung 1.1) Was ist NAT? NAT (Network Adress Translation) ist in der Linux Welt auch unter Masquerading bekannt (Windows unterstuetzt es seit neustem auch). Jedes Gereat, das im Internet kommunizieren will, braucht eine Eindeutige IP Adresse. Diese ist auf der ganzen Welt einzigartig, und genau einem Gereat zugewiesen, d.h das mehrere Geraete niemals diesselbe IP Adresse haben koennen. IPs werden meistens dynamisch beim Verbingsaufbau vom ISP vergeben. Je nach Art der Leitung kann man auch eine Statische IP haben, oder mehrere. Nur werden die Oeffentlichen IP Adressen leider immer knapper, und so immer teurer. Was, wenn man mehrere PC Zuhause herumstehen hat, und jeder ins Internet will? Wenn man ein normales Analog oder ISDN Modem dazu benuetzt, muesste man mehrere Leitungen kaufen, mehrere Modems und sich mit jedem Computer einzeln ins Internet verbinden. Bei einem Cable Modem oder aehnlichem musste man zusaetzliche IPs beantragen, und diese kosten und sind meistens in der Anzahl begrenzt. Das ist weder effektiv noch billig, und hier kommt NAT ins Spiel. Mit NAT koennen Computer in einem privaten LAN ueber einen Gateway zb ins Internet Connecten. Der Gateway verbindet sich mit dem ISP und bekommt von diesem eine IP zugewiesen. Wenn die anderen Hosts dann ins Internet wollen, geht ihre Verbindung ueber den Gateway, der dann die IP Adresse der Hosts auf seine eigene Umwandelt. Dadurch koennen unbestimmt viele Hosts eine einzige Leitung benuetzen, ohne fuer weitere IP Adressen zu zahlen. 1.2) Wie Funktioniert NAT? NAT funktioniert eigentlich ganz einfach. Wenn sich ein Client im LAN zu einem Server im Internet verbinden will, sendet er ein TCP SYN Packet zur Anfrage des Verbindungsaufbaus. Dieses Packet enthaelt die IP Adresse des Clients (zb 192.168.1.1) und die IP des Servers, zu dem er Connecten will (zb 222.222.222.222). Die Maschiene, auf der NAT laueft (der Gateway) aendert die IP Adresse des Clients in die Oeffentliche IP des Gateways (zb 212.40.0.10). Wenn der Server das Packet empfaengt denkt er, er kommuniziere mit dem Gateway (anm: Wenn der Gateway die IP nicht geandert haette, wuerde das Packet irgendwann mal verloren gehen, oder der Server wuerde die Anfrage ablehnen, da 192.168.1.1 eine private [also nicht Routbare] IP ist). Er sendet dann eine Antwort an unseren Gateway. Dieser erkennt, das dass Packet nicht von ihm, sondern von einem seiner Clients gesendet wurde und aendert dann die Empfaenger IP (die bis dahin immer noch die des Gateways war) zurueck in die des Clients und schickt das Packet an den Client weiter. Der Client bekommt davon ueberhaupt nichts mit und denkt, er kommuniziere direkt mit dem Server. Und der Server denkt, er kommuniziere mit dem Gateway. Der Ablauf ist also fuer beide Seiten total transparent. Hier eine Darstellung von zwei Packets ueber einen NAT Gateway: |------------LAN----------------| NAT |--------------Internet-------------| CLIENT -------------------- xl0 [GATEWAY] ppp0 -------------- Internet Server 192.168.1.1 ------ 192.168.1.10 [GATEWAY] 212.40.0.10 ------- 222.222.222.222 OUTGOING PACKET OUTGOING PACKET Von: 192.168.1.1 --> NAT --> Von: 212.40.0.10 Zu: 222.222.222.222 Zu: 222.222.222.222 INCOMING PACKET INCOMING PACKET Von: 222.222.222.222 Von: 222.222.222.222 Zu: 192.168.1.1 <-- NAT <-- Zu: 212.40.0.10 2) NAT unter OpenBSD einrichten 2.1) Installation Damit NAT laueft, muss man zuerst IPF und NAT starten. Dazu muss man die untenstehen Dateien aendern. /etc/rc.conf ipfilter=YES # ipfilter starten ipnat=YES # ipnat starten /etc/sysctl.conf net.inet.ip.forwarding=1 # ip forwarding aktivieren Um die Einstellungen dann zu aktivieren, muessen sie entweder OpenBSD neu starten, oder diese Befehle eingeben: # ipf -Fa -f /etc/ipf.rules -E # startet IPFilter # ipnat -CF -f /etc/ipnat.rules # startet IPNAT # sysctl -w net.inet.ip.forwarding=1 # ip forwarding aktivieren 2.2) Konfiguration Als ersten muessen die IPFilter Regeln angepasst werden. Da dieses Dokument nicht die einrichten einer Firewall beschreibt, verweise ich hier auf die OpenBSD FAQ (Kapitel 6.2). Wir lassen also jeglichen Verkehr zu und aus dem Gateway zu. Dazu muss die /etc/ipf.rules so aussehen: pass in from any to any pass out from any to any Die NAT Konfigurationsdatei (/etc/ipnat.rules) hat eine sehr einfache Syntax. Nach der obigen Konfiguration sieht die Datei so aus: map ppp0 192.168.1.0/24 -> ppp0/32 portmap tcp/udp 10000:20000 map ppp0 192.168.1.0/24 -> ppp0/32 Beschreibung der Zeilen: map - ist der Befehl fuer ipnat, eine IP Adresse zweischen dem LAN und dem Internet zu wechseln. ppp0 - Das Interface, das mit dem Internet verbunden ist (dh eine Oeffentliche IP hat). 192.168.1.0/24 - Die IP Range, die gemappt werden soll. Meistens das Lokale Subnet. /24 ist die CIDR Notation fuer /255.255.255.0 ppp0/32 - Die IP Adresse und Netmask, in die die IP des Clients gewechselt wird. Ich habe hier ppp0/32 genommen, da ich keine Statische IP habe. ppp0 wird dann einfach in die (dynamisch zugewiesene) IP die das Interface besitzt umgewandelt. Bei Statischen IPs kann man zb "212.40.0.10/32" benutzen. "/32" steht fuer genau einen Host, oder fuer genau diese IP. Fals man ein ganzes Subnet an Oeffentlichen IP Adressen hat, kann man zb "/24" nehmen. Damit werden die Client auf eine Anzahl von IPs gemappt, und nicht nur auf eine (das ist der Vorteil von NAT gegenueber Masquerading). "portmap tcp/udp 10000:20000" - Mappt alle TCP und UDP Packets auf die Ports zwischen 10000:20000 auf dem Gateway. Die zweite Zeile ist fast identisch, ausser der "portmap..." Option. Die Zeile sagt IPNAT, das alles andere (also nicht TCP oder UDP) den Port bekommt, den es Verlangt (wird fuer unbekannt Protokolle benutzt, die IPNAT nicht benutzen). Anm: "ppp0/32" und "192.168.1.0/24" muss natuerlich den eigenen Voraussetzungen angepasst werden. Nun ist IPNAT startbereit. 2.3) Running Sobald die Konfiguration abgeschlossen ist, gibt es zwei Wege um IPNAT zu starten. Die saubere, aber umstaendlichere Loesung ware den Rechner neu zu starten. Die schnellere waere, folgende Befehle einzugeben: # ipf -Fa -f /etc/ipf.rules -E # startet IPFilter # ipnat -CF -f /etc/ipnat.rules # startet IPNAT # sysctl -w net.inet.ip.forwarding=1 # ip forwarding aktivieren Nach aenderungen in der /etc/ipnat.rules oder ipf.rules muss man IPF/IPNAT so neustarten: # ipf -Fa -f /etc/ipf.rules # startet IPFilter neu # ipfnat -CF -f /etc/ipnat.rules # startet IPNAT neu 3) Zusaetzliche Konfiguration 3.1) Anzeigen der NAT Einstellungen und Statuses Um zu sehen, ob NAT laeuft und was genau es macht, gibt es die "-l" Option. Diese Option zeigt alle Einstellungen und die gerade ueber NAT Laufenden verbindungen. # ipnat -l map ppp0 192.168.1.0/24 -> ppp0/32 portmap 10000:20000 map ppp0 192.168.1.0/24 -> ppp0/32 List of active sessions: MAP 192.168.1.1 1234 <- -> 212.40.0.10 12345 [222.222.222.222 80] Die ersten Zwei Zeilen bestaetigen die Einstellungen die wir in der /etc/ipnat.rules gemacht haben. Die Zeilen darunter Zeigen die aktuell laufenden Verbindungen ueber NAT. "MAP 192.168.1.1 1234" - Zeigt die IP Adresse der Maschiene im LAN, die NAT benutzt. "<- ->" - Zeigt das NAT den Traffic in beide Richtungen uebernimmt "212.40.0.10 12345" - Zeigt das die Verbindung via 212.40.0.10 ueber den Port 12345 ins Internet geht. "222.222.222.222 80" - Die IP und Port, zu welcher der Client eine Verbindung hat.