URL: http://bolug.uni-bonn.de/wissen/stevens_masquerading/index.html
bolug :: wissen :: masquerading

Masquerading und NAT mit Linux

von Richard Stevens
 
» Einführung
» Wie richte ich Masquerading für den Linux Kernel 2.2 ein?
» Wie richte ich Masquerading für den Linux Kernel 2.4 ein?
» Schlussbemerkungen
» Quellen

Einführung:

Bitte auf jeden Fall die Schlussbemerkung lesen!

Der Linux Kernel bietet seit einigen Versionen sowohl die Möglichkeit, Zugriffe über das Netz einzuschränken oder selektiv freizugeben, sowie eine Netzverbindungen anderen Rechnern zur Verfügung zu stellen. Das erste Konzept ist auch unter dem Namen Firewall bekannt, das zweite unter den Namen Masquerading/NAT oder in der Windows Welt Internet Connection sharing. Unterstützung für beides lässt sich im Kernel einstellen.

Ich möchte in diesem kleinen Beitrag ein wenig über das Masquerading oder auch NAT (Network Adress Translation) erzählen, also über die Möglichkeit mehreren Rechnern eine Internetverbindung zur Verfüung zu stellen, ohne dass jeder Rechner selbst eine Verbindung zum Internet aufbauen muss und ohne dass jeder Rechner eine offizielle IP besitzen muss. Wenn die Rechner, die auf das Internt zugreiffen sollen offizielle Internet IPs besitzen, reicht es, die Linux Maschine als Router zu konfigurieren. Besitzen die Rechner hingegen keine IPs aus den offiziellen Adressbereichen, können sie ohne weiteres nicht auf das Netz zugreifen. NAT oder Masquerading müssen her.

Das grundsätzliche Setup stellt sich in der Regel so dar. Es existiert ein lokales TCP/IP Netzwerk und die verwendeten IPs stammen aus einem definierten Adressbereich, der im Internet nicht geroutet wird und für Lokale Netze reserviert ist (z.B. 192.168.x.x). Dadurch, dass dieser Adressbereich nicht geroutet wird, kann er auch mehrfach verwendet werden, wohingegen sonstige IPs eindeutig sind. Ein Rechner im Netzwerk (das Gateway) besitzt aber neben einer solchen internen IP auch noch eine externe, eindeutige. Diese kann im Falle einer Dial Up Verbindung jedesmal neu Zugewiesen werden oder aber im Falle einer Standleitung fest vergeben sein. Allen Rechnern im lokalen Netz muss nun mitgeteilt werden, dass Verbindungen mit Ziel ausserhalb des lokalen Netzwerks über diesen Rechener erfolgen sollen. Der Rechner wird also als default Gateway eingetragen. Bei Dialup Verbindungen wird der DNS-Server meist auch automatisch vergeben. Den Rechnern im lokalen Netz hingegen muss auch noch der Nameserver des gewählten Internet Service Providers mitgeteilt werden. Informationen dazu liefert der ISP.

Was aber passiert nun, wenn ein Rechner im lokalen Netz eine Verbindung zu einem Server im Internet aufbauen möchte. Man kann sich das so vorstellen. Das Paket mit der Anfrage kommt beim Gateway an. Das Gateway erkennt, dass es sich bei der IP um eine lokale handelt, setzt die Absenderadresse auf seine eigene offizielle um und leitet das Paket weiter. Kommt nun eine Antwort an, wird als Zieladresse wieder die Adresse des Rechners eingetragen, von dem die Anfrage stammt und das Paket wird ins lokale Netz weitergeleitet. Dabei muss sich das Gateway natürlich merken, welche Verbindungen zu welchem Rechner im lokalen Netz gehören.

Ich möchte nocheinmal erwähnen, dass meine Schilderung nur eine recht oberfächliche Betrachtung ist. Im Detail haben sich die Entwickler dieses Verfahrens noch über das ein oder andere Problem Gedanken machen müssen. Dies allerdings hier im Detail zu erörtern würde den Rahmen dieses kleienen Artikels deutlich sprengen. Ich empfehle hierzu die HowTos zum Thema IP-Masquerading/NAT sowie einschlägige Literatur zum Thema TCP/IP. Ein zumindest grundlegendes Verständnis der Eigenschaften des TCP/IP Protokolls sollte bei der Lektüre der HowTos vorhanden sein und ist ohnehin empfehlenswert.

Viel mehr möchte ich jetzt aber beschreiben, wie man Masquerading und NAT als Anwender nutzen kann. Wie in der Einleitung erwähnt hängen die notwendigen Einstellungen sehr eng mit den Firewallfunktionen des jeweiligen Kernels zusammen.

Wie richte ich Masquerading für den Linux Kernel 2.2 ein?

Neben den Kernel Einstellungen wird ipchains benötigt. Es ist auf folgender Webseite erhältlich: http://netfilter.filewatcher.org/ipchains/ Dort ist auch weiter Dokumentation verfügbar.

Die folgenden, notwendigen Einstellungen im Kernel habe ich direkt aus dem deutschen IP-Masquerading HowTo kopiert. Die meisten Distributionen sollten die nötigen Einstellungen allerdings schon mitbringen.

[*] In der Entwicklung befindliche und/oder experimentelle Treiber/Code anzeigen
Ja: Dieses wird Ihnen später die Wahl des IP-Masquerading-Funktionscodes erlauben.
[*] Unterstützung für ladbare Module
Ja: Erlaubt ladbare IP-Masq - Kernmodule.
[*] Networking support
Ja: Aktiviert die Netzwerkeinstellungen im Subsystem.
[*] Packet socket
Ja: Dieses Feature ist optional, jedoch sehr empfohlen, weil es die Lösung von möglichen Problemen mit IP-Masq erleichtert.
[*] Kernel/User network link driver
Ja: Diese Einstellung ist optional und erlaubt die Aufzeichnung der Firewallausgaben in eine Logdatei.
[ ] Routing Nachrichten
Nein: Diese Option hat nichts mit den Ausgaben des Firewalls zu tun.
[*] Firewall-Funktionalität
Ja: Aktiviert das Firewall-Werkzeug IPCHAINS.
[*] Unterstützung des TCP/IP-Protokolls
Ja: Aktiviert das TCP/IP-Protokoll.
[ ] Weiterentwickelte Unterstützung für IP-Router
Nein: Dieses wird nur für erweitertes ipchains/masq-Routing benötigt.
[*] Unterstützung ausführlicher IP-Routing-Anzeigen
Ja: Dieses ist nützlich wenn Sie den Routing-Code für die Abschreibung unerwünschter IP-Pakete einsetzen(sehr empfohlen) und die Einzelheiten aufzeichnen wollen.
[*] IP: Firewall-Funktionalität
Ja: Aktviert die Firewall-Funktionalität.
[*] Gerät zur Analyse von Netz-Paketen am Firewall
Ja: Optional, verbessert aber die Aufzeichnung der Firewall-Ausgaben.
[*] IP: IP-Pakete immer defragmentieren(für Masquerading erforderlich)
Ja: Dieses Feature wird im Zusammenhang mit der Aktivierung von Transparent-Proxies benötigt. Außerdem optimiert es IP-Masq.
[*] IP: Masquerading
Ja: Aktiviert IP-Masquerading.
[*] IP: ICMP Masquerading
Ja: Aktiviert die Maskierung für ICMP-Ping-Pakete. Ping ist ein wichtiges Werkzeug zur Lösung von Verbindungsproblemen.
[*] IP: Unterstützung für spezielle Masquerading-Module
Ja: Obwohl optional, erlaubt es später die Wahl einer Einstellung, deren Aktivierung externen Computern, von Außen her, eine direkte Verbindung zu internen, maskierten Maschinen ermöglicht.
[ ] IP: Unterstützung von ipautofw Masquerading(experimentell)
Nein: ipautofw ist eine Methode der TCP/IP-Portumleitung. Obwohl sie funktioniert, ist IPPORTFW derzeit die bessere Lösung, daher ist IPAUTOFW nicht empfohlen.
[*] IP: Unterstützung von ipportfw Masquerading(experimentell)
Ja: Diese Einstellung ist optional und für die 2.0.x - Kerne nur mittels Patch verfügbar. Mit dieser Einstellung können externe Computer im Internet direkten Kontakt mit internen, maskierten Maschinen aufnehmen. Diese Funktion wird typischerweise von internen SMTP-, TELNET-, und WWW-Servern genutzt. FTP-Portumleitung erläutert die Portumleiter-Sektion dieser HOWTO.
[ ] IP: Unterstützung von ipmarkfw Masquerading(experimentell)
Nein: Dieses erlaubt die Portumleitung direkt von IPCHAINS. Im Moment ist diese Funktion noch experimentell und die empfohlene Methode ist die Nutzung von IPMASQADM und IPPORTFW.
[*] IP: Optimierung für Router(nicht Host)
Ja: Dieses optimiert den Kern für das Netzwerk-Subsystem, wenn es auch keinen signifikanten Performance-Unterschied bringt.
[ ] IP: GRE Tunnel über IP
Nein: Diese optionale Einstellung aktiviert PPTP- und GRE-Tunneling durch IP.
[*] IP: Schutz for "SYN flooding"
Ja: Sehr empfohlen für grundliegende Netzwerksicherheit.
[*] Unterstützung für Netzwerk-Devices
Ja: Aktiviert die Linux-Netzwerk-Subschicht.
[*] Unterstützung für das /proc-Dateisystem
Ja: Erforderlich für die Aktivierung des Umleitungssystems im Linux-Netzwerk.

Jetzt braucht man nur noch ein Skript, dass das ganze auch wirklich anschaltet. Dafür habe ich wiederum das eben erwähnte HowTo konsultiert. Das folgende, kommentierte Skript habe ich auch direkt kopiert. Es ist allerdings zu beachten, dass noch einige Änderungen vorgenommen werden müssen, wie Anpassung an die verwendeten Adressbereiche etc., also bitte Kommentare sorfältig lesen.


# rc.firewall - einfaches Masquerading-Setup fuer 2.1.x- und
# 2.2.x-Kerne mittels IPCHAINS
#

# Laden von erforderlichen IP-Masq Modulen
#
# Hinweis: Laden Sie nur Module, die Sie auch nutzen wollen. Alle
#          derzeit verfuegbaren Masq-Module sind unten aufgefuehrt und vom
#          Laden auskommentiert.
#
/sbin/depmod -a

# Unterstuetzt optimierte FTP-Dateiuebertragung mittels der
# Port-Methode
#
# /sbin/modprobe ip_masq_ftp

# Unterstuetzt die Maskierung von Real Audio ueber das UDP-Protokoll.
# Real audio funktioniert auch ohne dieses Moduls, dann aber
# im TCP-Modus und das kann fuer Einbusen in der
# Soundqualitaet sorgen
#
#/sbin/modprobe ip_masq_raudio

# Erlaubt maskierte IRC DCC-Dateiuebertragung
#
#/sbin/modprobe ip_masq_irc

# Die Maskierung von Quake und Quake World wird per Voreinstellung
# unterstuetzt. Diese Module werden nur bei mehreren Spielern
# gleichzeitig hinter dem Masq-Server gebraucht. Wenn Sie QuakeI, II
# oder III ueber andere Serverports spielen wollen,
# dann ist das zweite Beispiel das Richtige
#
# Quake I / QuakeWorld(Ports 26000 and 27000)
#/sbin/modprobe ip_masq_quake
#
# Quake I, II und III / QuakeWorld(Ports 26000, 27000, 27910)
#/sbin/modprobe ports=ip_masq_quake 26000,27000,27910

# Unterstuetzt die Maskierung von
# CuSeeme(Can you See me)-Videokonferenz-Software
#
#/sbin/modprobe ip_masq_cuseeme

# Unterstuetzt die Maskierung von VDO-live Videokonferenz-Software
#
#/sbin/modprobe ip_masq_vdolive

# Kritisch: Aktiviert die IP-Umleitung(IP-forwarding), da sie
#           per Voreinstellung deaktiviert ist.
#
echo "1" > /proc/sys/net/ipv4/ip_forward

# Dynamische IP-Adressen:
#
# Wenn Ihnen die IP-Adresse dynamisch zugeteilt wird, ist die
# folgende Option von Vorteil, da sie das Arbeiten mit Diald
# und aehnlichen Programmen erheblich erleichtert.
#
#echo "1" > /proc/sys/net/ipv4/ip_dynaddr

# Masq-Auszeiten(timeouts)
#
#     2 Std.  Auszeit fuer TCP-Sitzungen
#     10 Sek. Verkehrsauszeit nach dem Empfang des letzten TCP/IP-Paketes
#     60 Sek. Auszeit fuer UDP-Verkehr(maskierte ICQ-Benutzer
#             muessen 30 Sek. Firewall-Auszeit im ICQ-Programm
#             selbst einstellen)
#
ipchains -M -S 7200 10 60

# Aktivierung von IP-Umleitung und Masquerading
#
# Hinweis:      Das folgende Beispiel steht fuer ein internes LAN
#               mit 192.168.0.x als Netzadresse und 255.255.255.0
#               oder 24-Bit als Subnetzmaske. Bitte aendern Sie die
#               Netzadresse und Subnetzmaske in die Ihres internen LAN
#
ipchains -P forward DENY
ipchains -A forward -s 192.168.0.0/24 -j MASQ

# DHCP:         Leute, die ihre externe IP-Adresse von entweder DHCP
#               oder BOOTP empfangen wie ADSL-Benutzer muessen dieses noch vor
#               dem deny-Befehl einbinden. Der Ausdruck
#               »bootp_client_net_if_name« steht fuer den Namen der
#               Schnittstelle, der der DHCP/BOOTP-Server eine
#               IP-Adresse zuordnet. Das kann etwa
#               wie eth0, eth1, etc. aussehen
#
#               Das Beispiel ist per Voreinstellung deaktiviert.
#
#ipchains -A input -j ACCEPT -w bootp_clients_net_if_name -s 0/0 68 -d 0/0 67 -p udp

Nach der Erstellung der Datei /etc/rc.d/rc.firewall muß diese mit dem chmod-Befehl ausführbar gemacht werden: chmod 700 /etc/rc.d/rc.firewall

Diese Datei kann nun automatisch beim Systemstart aufgerufen werden, um die Firewall hochzufahren. Dafür müssen Symlinks aus den Verzeichnissen für die verschiedenen Runlevel erzeugt werden. Falls die Linux Distribution BSD-Init verwenden sollte, muss das Skript in einer der init-Skripte Dateien aufgerufen werden.

Das sollte es schon sein.

Wie richte ich Masquerading für den Linux Kernel 2.4 ein?

Der Kernel 2.4.0 ist zum jetzigen Zeitpunkt noch nicht offiziell freigegeben. Allerdings gibt es schon einige Testreleases, mit denen man schon recht gut arbeiten kann. Demensprechend ist auch die verfügbare Doku noch in der Entstehungsphase. Aber es gibt schon etwas.

Sektion 4.1 des NAT Howtos erklärt kurz, was zu tun ist, um mit einem 2.4er Kernel NAT zu verwenden. Ich beschränke mich hier auf die Übersetzung dieses Abschnitts.

Ich möchte nur Masquerading! Hilfe!

Die meisten Menschen möchten nur folgendes: Es gibt eine dynamische IP von einer Wählverbindung und alle Pakete des internen Netzwerks sollen über diese so ins Internet weitergeleitet werden, dass sie aussehen, als stammten sie von dieser IP.

Hier nun die nötigen Schritte:


# Das NAT Modul laden, falls NAT nicht fest in den Kernel einkompiliert ist.
#(Dieses Modul zieht alle anderen benötigten Module)
modprobe iptable_nat

# In der NAT Tabelle (-t nat), die Regel (-A) nach dem Routen
# (POSTROUTING) für alle Pakete die über ppp0 hinausgehen (-o ppp0) anhängen.
# Dies heisst MASQUERADE die Verbindung (-j MASQUERADE).
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

# IP Forwarding anschalten
echo 1 > /proc/sys/net/ipv4/ip_forward

Hier werden keinerlei Firewallregeln verwendet, die die Sicherheit erhöhen.

Zusätzlich noch mein Skript:


#!/bin/bash
iptables --flush
echo "Setting Firewall Rules"
## Create chain which blocks new connections, except if coming from inside.
iptables -N block
iptables -A block -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A block -m state --state NEW -i ! ppp0 -j ACCEPT
iptables -A block -j DROP

## Jump to that chain from INPUT and FORWARD chains.
#(***)
#iptables -A INPUT -p tcp --dport 21 -j ACCEPT
#iptables -A INPUT -p tcp --dport 22 -j ACCEPT
#iptables -A INPUT -p udp --dport 22 -j ACCEPT
#iptables -A INPUT -p tcp --dport 80 -j ACCEPT
#iptables -A INPUT -p tcp --dport 6699 -j ACCEPT
#iptables -A INPUT -p tcp --dport 6347 -j ACCEPT ##Gnutella
#iptables -A INPUT -p tcp --dport 5000 -j ACCEPT
#iptables -A INPUT -p udp --dport 5000 -j ACCEPT
iptables -A INPUT -j block
iptables -A FORWARD -j ACCEPT
echo "Starting Masquerading"
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
echo 1 > /proc/sys/net/ipv4/ip_forward

Hinter der Stelle, die ich mit (***) markiert habe stehen einige Zeilen, die man auskommentieren kann, um bestimmte Dienste nach aussen freizugeben. In der jetzigen Konfiguration ist der Rechner weitestgehend unsichtbar von aussen.

Für den 2.4er Kernel kommt auch ein anderes Tool zur Konfiguration der Firewall zum Einsatz, das iptables heisst (Link unten).

Schlussbemerkungen:

Zum Schluss noch einige Bemerkungen. Ich habe die HowTos auch nicht deutlich weiter gelesen als es nötig war, das gewünschte Masquerading zum laufen zu bringen und einigermassen zu verstehen, was abläuft. Bei mir läuft der 2.4er Kernel in der jeweils aktuellen testXX Version. Ich möchte jedem, der sich mit Masquerading auseinandersetzen will raten, sich die unten angeführten Dokumente genau anzusehen. Sie ermöglichen ein besseres Verständnis, was passiert. Gerade wenn es darum geht, Rechner ans Netz zu lassen, die sensible Daten speichern, sollte man sich das Thema Firewall auch noch genauer ansehen. Aber die beste Sicherheit nach aussen nutzt nichts, wenn die Menschen an den Rechnern die zur Verfügung gestellte Internetverbindung missbrauchen. Neben den Firewallmöglichkeiten gibt es auch noch weitere Sicherheitstools, die Angriffe von aussen erkennen und gegebenenfalls warnen. Ich möchte diesen Artikel also lediglich als kleine Einstiegslektüre verstanden wissen, die ein paar Schritte vorgibt, um Masquerading/NAT ans Laufen zu bringen. Dieser Artikel kann aber unter keinen Umständen eine genaue Lektüre weiterer Quellen ersetzen und ein genaues Verständnis des Themas vermitteln. Bitte haben Sie im Hinterkopf, dass ich im Zweifel nicht weiß vovon ich schreibe. Verlassen Sie sich nicht darauf, dass die vorgestellten Skripte wirklich das tun, was sie sollen und vor allem nicht, dass auch nur annähernd Sicherheit erreicht wird.

Quellen:

HowTos:

Für Kernel 2.2:

http://www.e-infomax.com/ipmasq/howto-trans/de/DE-ipmasq-HOWTO-1_84.html
(Deutsches Masquerading HowTo)
http://www.e-infomax.com/ipmasq/howto/ipmasq-HOWTO-1.95c.html
(Das ganze in Englisch. Ich würde dieses HowTo vorziehen, da man dann die nötigen Parameter für den Kernel schneller wiederfindet)
http://ipmasq.cjb.net/
(Grundsätzliches zum Masquerading)

Für Kernel 2.4:

http://netfilter.filewatcher.org/unreliable-guides/NAT-HOWTO.html
(NAT)
http://netfilter.filewatcher.org/unreliable-guides/index.html
(Netfilter und NAT)

Benötigte Programme:

http://netfilter.filewatcher.org/ipchains/
(IPChains für 2.2er Kernel)
http://freshmeat.net/projects/iptables/download/iptables-1.1.2.tar.bz2
(IPTables für 2.4er Kernel)

© Bonner Linux User Group (BoLUG) und die Autoren Letzte Änderung: 13.12.2002, 20:19:32
  Druckdatum: 11.12.2017, 20:07:34