Routing: DNAT zu weiterem Host

Hier wird kurz erläutert, wie Proxmox mit einer öffentlichen IP zwei VM's bedienen kann. Der Traffic wird per Weiterleitung an die VM übergeben.

Ein Beispiel für die Weiterleitung des SSH-Dienstes an die VM von öffentlichen Port 2222.

 

Container/VM ------------ Proxmox Server -------------- öffentliche IP
10.21.21.5:22 --- 10.21.21.5:22 NAT to 1.2.3.4:2222 --- 1.2.3.4:2222

 

Standardmäßig erstellt Proxmox eine Bridge, vmbr0. Die Konfiguration sieht so aus:

 

# /etc/network/interfaces
auto vmbr0
iface vmbr0 inet static
    address 1.2.3.4
    netmask 255.255.255.0
    network 1.2.3.0
    broadcast 1.2.3.255
    gateway 1.2.3.1
    bridge_ports eth0
    bridge_stp off
    bridge_fd 0

 

Ersetze 1.2.3.X mit deiner öffentlichen IP, Netzwerk, Gateway und weitere. Mache dir Notizen zu weiteren Netzwerkkarten, z.B.  vmbr1 für ipv6.

Wir erstellen eine neue Brücke, auf auf die wir NAT einschalten, wenn wir die Brücke starten. Schreib dies in deine Datei:

 

# /etc/network/interfaces:
auto vmbr2
iface vmbr2 inet static
    address 10.21.21.254
    netmask 255.255.255.0
    bridge_ports none
    bridge_stp off
    bridge_fd 0
    post-up echo 1 > /proc/sys/net/ipv4/ip_forward
    post-up iptables -t nat -A POSTROUTING -s '10.21.21.0/24' -o vmbr0 -j MASQUERADE
    post-down iptables -t nat -D POSTROUTING -s '10.21.21.0/24' -o vmbr0 -j MASQUERADE
    post-up iptables -t nat -A PREROUTING -i vmbr0 -p tcp --dport 2222 -j DNAT --to 10.21.21.5:22
    post-down iptables -t nat -D PREROUTING -i vmbr0 -p tcp --dport 2222 -j DNAT --to 10.21.21.5:22

 

Der erste Teil:

 

address 10.21.21.254
netmask 255.255.255.0
bridge_ports none
bridge_stp off
bridge_fd 0

 

definiert die IP-Adresse und die Subnetmaske von dem neuen Netzwerkgerät. Außerdem teilt es der Brücke mit, das gerade keine aktuellen Ports (z.B. eth0) verknüpft und die Baumtopologie sollte ausgeschaltet sein.

 

post-up echo 1 > /proc/sys/net/ipv4/ip_forward

 

Schaltet die IP Weiterleitung ein, wenn das Netzwerkgerät eingeschaltet wird. Es läuft dem Host, die ankommenden Pakete weiterzuleiten.

 

post-up iptables -t nat -A POSTROUTING -s '10.21.21.0/24' -o vmbr0 -j MASQUERADE
post-down iptables -t nat -D POSTROUTING -s '10.21.21.0/24' -o vmbr0 -j MASQUERADE

 

Diese beiden Zeilen schalten das aktuelle NATing von Paketen im Quellnetzwerk '10.21.21.0/24' ein und setzen vmbr0 als Ausgangs-Netzwerkgerät. Falls das WAN (öffentliche IP) Netzwerkgerät einen anderen Namen hat, bitte wechseln. Die erste Zeile schaltet das Natting beim Starten ein und die zweite Zeile löscht die Firewallregel beim abschalten des Netzwerkgerätes.

 

post-up iptables -t nat -A PREROUTING -i vmbr0 -p tcp --dport 2222 -j DNAT --to 10.21.21.5:22
post-down iptables -t nat -D PREROUTING -i vmbr0 -p tcp --dport 2222 -j DNAT --to 10.21.21.5:22

 

Diese beiden Regeln schalten den aktuellen TCP Port 2222  fürs Weiterleiten ein und aus auf der öffentlichen IP (WAN) zum internen TCP Port 22 im internen Netzwerk mit der IP Adresse 10.21.21.5. Hier ist ebenfalls das WAN Netzwerkgerät (in diesem Beispiel das Eingangsgerät) vmbr0.

Falls du für dieses Beispiel den TCP Port 80 von der VM mit der IP 10.21.21.6 auf die öffentliche IP von Port 80 legen möchtest, kannst du diese Zeilen verwenden:

 

post-up iptables -t nat -A PREROUTING -i vmbr0 -p tcp --dport 80 -j DNAT --to 10.21.21.6:80
post-down iptables -t nat -D PREROUTING -i vmbr0 -p tcp --dport 80 -j DNAT --to 10.21.21.6:80

 

Wenn du eine KVM VM erstellt, sei dir sicher, dass die Netzwerkkarte in der Brücke vmbr2ist. Es sollte eine feste IP Konfiguration geben. OpenVZ venet Netzwerkgeräte arbieten mit einer IP in diesem Bereich automatisch.

Vergesse nicht zum Schluss die Netzwerkkonfiguration neu zu starten (am besten per Reboot):

 

/etc/init.d/networking restart