NAT-Netzwerkkonfiguration für verschiedene Virtualisierungslösungen
From RootForum Community » Wiki
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