HowTo: Einzelne Ports an mehrere VMs über eine Floating IP weiterleiten

Floating IP Port Forwarding

In der OpenCloud können virtuelle Maschinen über Floating IPs aus dem Internet erreichbar gemacht werden. Dabei gibt es grundsätzlich drei verschiedene Ansätze:

  • Für jede VM eine eigene Floating IP allokieren
  • Einen Load Balancer einrichten
  • Mehrere VMs an eine einzelne Floating IP hängen (Gegenstand dieser Anleitung)

Wenn verschiedene Dienste auf unterschiedlichen VMs erreichbar sein sollen, können mittels Floating IP Port Forwarding einzelne Portweiterleitungen über eine einzige Floating IP eingerichtet werden. So lassen sich unterschiedliche externe Ports gezielt an verschiedene interne VM-Instanzen weiterleiten.

Voraussetzungen

Für die Einrichtung werden benötigt:

  • eine Floating IP
  • mehrere VM-Instanzen in einem Subnetz mit Router
  • passende Security Groups für die Ziel-Ports
  • Zugriff auf die OpenStack CLI

Ziel

Das Ziel dieser Anleitung soll sein, mittels einer einzigen Floating IP zwei verschiedene Backends über verschiedene Ports anzusprechen. Beispielhaft sollen zwei Instanzen einer Webanwendung einmal über Port 443 und einmal über Port 8443 erreichbar gemacht werden.

Wir gehen im nachfolgenden von folgendem Setup aus:

RessourceTypIPv4Ports
appVM10.10.10.100443 (tcp)
app-stageVM10.10.10.101443 (tcp)
wan-routerRouter10.10.10.1
Floating IP46.47.48.49
allow-httpsSecurity Group0.0.0.0/0443 (tcp)

Es gibt zwei VMs app und app-stage welche hier sinnbildlich für Produktiv- und Entwicklungsumgebung stehen, sowie ein Router, welcher Zugang zum Internet ermöglicht. Zusätzlich allokieren wir eine Floating IP und bereiten eine Security Group vor, welche eingehende Verbindungen auf Port 443 erlaubt.

📘

Hinweis: Die Security Group soll tatsächlich nur die internen Ports zulassen, also in beiden Fällen TCP-Port 443. Der externe Port 8443 spielt hier keine Rolle, da beide Instanzen der Anwendung identisch sind und demnach auf denselben Ports erreichbar sind. Die Weiterleitung passiert mittels NAT auf Ebene des OpenStack-Routers.

Port Forwarding per CLI einrichten

Für das Port Forwarding wird zunächst eine Floating IP benötigt. Wichtig ist, dass die Floating IP nur allokiert, nicht jedoch einer VM zugewiesen ist.

Falls noch keine Floating IP existiert, kann diese mit folgendem Befehl angelegt werden:

openstack floating ip create WAN-Default

Anhand der Ausgabe merken wir uns die IP-Adresse:

+---------------------+-------------+
| Field               | Value       |
+---------------------+-------------+
| floating_ip_address | 46.47.48.49 |
+---------------------+-------------+

Als nächstes müssen wir Name oder ID der OpenStack-Ports kennen, welche die VMs mit dem lokalen Netzwerk verbinden.

openstack port list
+------+-----------+-------------------+---------------------------------------------+
| ID   | Name      | MAC Address       | Fixed IP Addresses                          |
+------+-----------+-------------------+---------------------------------------------+
| xxxx | app       | fa:16:3e:6e:46:07 | ip_address='10.10.10.100', subnet_id='xyxy' |
| yyyy | app-stage | fa:16:3e:13:44:e0 | ip_address='10.10.10.101', subnet_id='xyxy' |
+------+-----------+-------------------+---------------------------------------------+

Eine Port-Weiterleitung wird nun mit folgendem Befehl erstellt:

openstack floating ip port forwarding create \
  --protocol tcp \
  --internal-protocol-port 443 \
  --external-protocol-port 443 \
  --internal-ip-address 10.10.10.100 \
  --port app \
  46.47.48.49
ParameterBeschreibung
--protocol tcpVerwendetes Protokoll, zum Beispiel tcp, udp
--internal-protocol-port 443Ziel-Port auf der VM
--external-protocol-port 443Port auf der Floating IP
--internal-ip-address 10.10.10.100Interne IP-Adresse der Ziel-VM
--port appID oder Name des Ports der Ziel-VM
46.47.48.49Floating IP, über die der Zugriff erfolgen soll

Für die zweite VM kann die Port-Weiterleitung analog erstellt werden:

openstack floating ip port forwarding create \
  --protocol tcp \
  --internal-protocol-port 443 \
  --external-protocol-port 8443 \
  --internal-ip-address 10.10.10.101 \
  --port app-stage \
  46.47.48.49

Hier wird lediglich der externe Port --external-protocol-port auf 8443 geändert sowie die IP-Adresse und OpenStack-Port der Ziel-VM angepasst.

Jetzt kann unsere Anwendung über die Floating IP und den entsprechenden Port aufgerufen werden:

URLZiel-VMZiel-Port
https://46.47.48.49 (:443 ist implizit)app443 (tcp)
https://46.47.48.49:8443app-stage443 (tcp)

Fazit

Floating IP Port Forwarding ermöglicht es, mehrere Dienste oder VMs über eine einzige öffentliche Floating IP erreichbar zu machen. Dadurch können Floating IPs effizienter genutzt werden, insbesondere wenn nur einzelne Ports öffentlich erreichbar sein sollen.