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:
| Ressource | Typ | IPv4 | Ports |
|---|---|---|---|
| app | VM | 10.10.10.100 | 443 (tcp) |
| app-stage | VM | 10.10.10.101 | 443 (tcp) |
| wan-router | Router | 10.10.10.1 | |
| Floating IP | 46.47.48.49 | ||
| allow-https | Security Group | 0.0.0.0/0 | 443 (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-DefaultAnhand 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| Parameter | Beschreibung |
|---|---|
--protocol tcp | Verwendetes Protokoll, zum Beispiel tcp, udp |
--internal-protocol-port 443 | Ziel-Port auf der VM |
--external-protocol-port 443 | Port auf der Floating IP |
--internal-ip-address 10.10.10.100 | Interne IP-Adresse der Ziel-VM |
--port app | ID oder Name des Ports der Ziel-VM |
46.47.48.49 | Floating 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.49Hier 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:
| URL | Ziel-VM | Ziel-Port |
|---|---|---|
https://46.47.48.49 (:443 ist implizit) | app | 443 (tcp) |
https://46.47.48.49:8443 | app-stage | 443 (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.
