logo_header

icon_bubbles Forum

icon_bubbles Wiki

icon_bubbles Planet

RootForum Community » Wiki

NAT-Netzwerkkonfiguration für verschiedene Virtualisierungslösungen

From RootForum Community » Wiki

Jump to:navigation, search

Contents

Einleitung

Die Switches vieler Serveranbieter sind so konfiguriert, dass Server sofort automatisch gesperrt werden, welche eine fremde, ihnen nicht zugeordnete MAC-Adresse verwenden und somit MAC-Spoofing betreiben. Bei Virtualisierungslösungen wie Xen, OpenVZ, VirtualBox oder VMWare werden verschiedene Varianten angeboten, wie die einzelnen virtuellen Maschinen auf das Netzwerk zugreifen können.

Eine der Varianten ist die Anbindung über eine sogenannte "Bridge" oder "Bridged Networking". Der Nachteil dieses Verfahrens ist, dass die künstlich erzeugten MAC-Adressen der einzelnen virtuellen Maschinen dabei über das Netzwerk geschickt werden und den oben beschriebenen Sperrmechanismus auslösen.

Beispielkonfiguration

Als Beispiel dient hier ein kleines Setup mit OpenVZ und zwei virtuellen Maschinen (VE - Virtual Environment). Die Konfiguration lässt sich allerdings auch auf alle anderen Virtualisierungslösungen übertragen, bei denen die einzelnen virtuellen Maschinen eine IP-Adresse aus dem privaten Netzbereich (gemäß RFC 1918) erhalten.

Ausgangssituation: Zwei laufende VEs mit je einer eigenen privaten IP-Adresse:

root@p12345678:~# vzlist
      VEID      NPROC STATUS  IP_ADDR         HOSTNAME
         1          3 running 10.0.0.1        -
         2          3 running 10.0.0.2        -

Packetforwarding

Damit das Wirtssystem die Pakete für die einzelnen VEs weiterleitet, muss das sogenannte Packetforwarding aktiviert werden. Die Einstellung kann mit dem Programm sysctl gesetzt werden:

root@p12345678:~# sysctl net.ipv4.ip_forward=1

Alternativ kann die Einstellung auch in der Datei /proc/sys/net/ipv4/ip_forward eingetragen werden:

root@p12345678:~# echo '1' > /proc/sys/net/ipv4/ip_forward

Damit die Einstellung auch bei einem Neustart erhalten bleibt, kann ein gleichlautender Eintrag in der Datei /etc/sysctl.conf erstellt werden:

root@p12345678:~# echo 'net.ipv4.ip_forward=1'>>/etc/sysctl.conf
root@p12345678:~# cat /etc/sysctl.conf
net.ipv4.ip_forward=1


NAT mittels Netfilter/iptables

Um den VEs eine Kommunikation mit dem Internet zu erlauben, müssen entsprechende Regeln für den Paketfilter eingerichtet werden. Dabei werden eigene Einträge für ein- und ausgehenden Netzwerkverkehr benötigt.

Um z. B. allen VEs im Subnetz 10.0.0.0/24 ausgehende Netzwerkverbindungen mit der IP-Adresse 192.168.1.1 zu erlauben, ist folgende Regel notwendig:

root@p12345678:~# iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o eth0 -j SNAT --to 192.168.1.1

Dabei ist 10.0.0.0/24 das private Subnetz, aus dessen IP-Addressbereich die einzelnen virtuellen Maschinen eine IP-Adresse besitzen, und 192.168.1.1 ist eine der IP-Adressen des Root-Servers.

Anstatt alle VEs über die gleiche IP-Adresse nach außen zu routen, könnte natürlich auch für jede VE ein eigener Eintrag erfolgen:

root@p12345678:~# iptables -t nat -A POSTROUTING -s 10.0.0.2 -o eth0 -j SNAT --to 192.168.1.2
root@p12345678:~# iptables -t nat -A POSTROUTING -s 10.0.0.3 -o eth0 -j SNAT --to 192.168.1.3

Mit diesen beiden Regeln werden die VEs mit den IP-Adressen 10.0.0.2 bzw. 10.0.0.3 über die IP-Adressen 192.168.1.2 bzw. 192.168.1.3 nach außen geroutet.

Um die einzelnen VEs auch vom Internet aus erreichbar zu machen, sind weitere Regeln notwendig. Dabei können entweder einzelne Dienste bzw. Ports gemapped werden oder der komplette Netzwerkverkehr auf eine IP-Adresse des Root-Servers zu einer VE geleitet werden.

Im folgenden Beispiel soll der SSH-Dienst (Port 22/tcp) auf die VE mit der IP-Adresse 10.0.0.1 gemapped werden. Dabei ist 192.168.1.1 wiederum eine öffentliche IP-Adresse des Root-Servers und 10.0.0.1 die IP-Adresse der VE.

root@p12345678:~# iptables -t nat -A PREROUTING -p tcp -d 192.168.1.1 --dport 22 -i eth0 -j DNAT --to-destination 10.0.0.1:22

Wenn nur eine öffentliche IP-Adresse verfügbar ist, kann natürlich auch ein anderes Mapping eingerichtet werden, z. B. 192.168.1.1:2222 auf 10.0.0.1:22.

root@p12345678:~# iptables -t nat -A PREROUTING -p tcp -d 192.168.1.1 --dport 2222 -i eth0 -j DNAT --to-destination 10.0.0.1:22

Es ist zu beachten, dass falls Sie nur eine IP-Adresse verfügbar ist und ein Mapping von 192.168.1.1:22 auf 10.0.0.1:22 eingerichtet wird, kein Zugriff mehr auf den SSH-Dienst des Root-Servers möglich ist, da jeglicher Netzwerkverkehr sofort an die VE weitergeleitet wird.

Mit diesem Vorgehen müsste für jeden Dienst in einer der VEs ein eigenes Mapping eingerichtet werden. Das hat den Vorteil, dass nicht explizit freigegebene Dienste von außerhalb nicht erreichbar sind. Wenn eine IP-Adresse dediziert für eine VE vorgesehen ist, lässt sich aber auch einfach ein direktes Mapping für jeden Dienst einrichten:

root@p12345678:~# iptables -t nat -A POSTROUTING -s 10.0.0.1 -o eth0 -j SNAT --to 192.168.1.1
root@p12345678:~# iptables -t nat -A PREROUTING -p tcp -d 192.168.1.1 -i eth0 -j DNAT --to-destination 10.0.0.1
root@p12345678:~# iptables -L -n -t nat
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
DNAT       tcp  --  0.0.0.0/0            192.168.1.1     to:10.0.0.1
 
Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
SNAT       all  --  10.0.0.1             0.0.0.0/0       to:192.168.1.1
 
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Bei diesem Beispiel erhält die VE mit der internen IP-Adresse 10.0.0.1 ein Mapping auf die öffentliche IP-Adresse 192.168.1.1 des Root-Servers.

Dies sollte nicht für die "Haupt"-IP-Adresse des Root-Servers ausgeführt werden, da ansonsten nur noch die zugeordnete VE erreichbar ist. Sollte dennoch eine entsprechende Regel eingerichtet worden sein, müssen die Zuordnungen über die hoffentlich vorhandene serielle Konsole oder das Rescue-System wieder aufgehoben werden.

Die eingerichteten Regeln können mit folgendem Kommando wieder gelöscht werden.

root@p12345678:~# iptables -F -t nat


Beispielskript

Damit die Einstellungen auch einen Neustart des Systems überleben, muss ein kleines Startskript angelegt werden, das während des Bootvorgangs ausgeführt wird. Viele Distributionen bieten hierfür einen entsprechenden Mechanismus an. Unter Gentoo Linux könnte das Skript beispielsweise in /etc/conf.d/local.start (alt) bzw. /etc/conf.d/local, bei SuSE Linux in /etc/boot.local und bei Red Hat basierten Distributionen in /etc/rc.d/rc.local eingebunden werden. Teilweise werden auch spezielle Dateien für die Netfilter/iptables Konfiguration angeboten.

TODO: Beispielskript


Weiterführende Quellen