Eine VM, die auf einem Hetzner-Rootserver unter virsh läuft, soll in einen existierenden Proxmox-Cluster umgezogen werden. Soweit kein Problem, aaaaber: die offizielle IP-Adresse, eine Hetzner-Zusatz-IP soll erhalten bleiben.
Da Hetzner die Zusatz-IPs nur maschinenspezifisch vergibt und keinen Umzug auf eine andere Maschine ermöglicht, muss der Traffic von der alten IP zur neuen VM im PVE umgeleitet werden. Nach Möglichkeit sollte das mit Bordmitteln (und zerotier) ohne iptables-Umleitungen funktionieren.
Zerotier
Das Mittel der Wahl, diverse Hosts performant miteinander zu verbinden, ist hier zerotier.
Unter der GUI wird ein neues Netzwerk angelegt, das alle teilnehmenden Hosts joinen.
Für den alten Virtualisierungshost (im Folgenden VH, wie Virsh-Host) genannt, sowie alle teinehmenden PVEs wird ein Eintrag in dieser Form angelegt:

VM-Networking
Auf dem alten Host wird eine Bridge mit einer privaten IP und einer Route zur Zusatz-IP angelegt:
auto vmbr1001 iface vmbr1001 address 10.111.222.1/24 bridge-ports none bridge-stp off bridge-fd 0 up brctl addif vmbr1001 ztks553soy up ip link set ztks553soy up up ip route add <Zusatz-IP>/32 dev vmbr1001 # bridge fuer alte VM
Die Zusatz-IP wird also auf diese Bridge geroutet
Auf den teilnehmenden PVEs wird eine ähnliche Bridge gleichen Namens (muss nicht!) angelegt, allerdings ohne IP-Adresse und Route.
auto vmbr1001 iface vmbr1001 bridge-ports none bridge-stp off bridge-fd 0 # siehe if-up.d/vmbr1001 # bridge fuer alte VM
Beide Bridges werden über das vorher erzeugte Zerotier-Interface verbunden.
Da die Zerotier-Interfaces erst nach dem kompletten Netzwerk-Setup gestartet werden, muss das weitere Setup zeitverzögert erfolgen. Leider unterstützt zerotier bislang keine Script-hooks, ähnlich if-up.d, sonst könnte das weitere Setup dort erfolgen. So erledigt diese Aufgabe das Script if-up.d/vmbr1001 mit dem etwas unschönen „sleep“.
!/bin/sh [ "$IFACE" != "vmbr1001" ] && exit 0 # Interface ztks553soy kommt erst mit zerotier hoch, # ist also jetzt noch nicht bereit. # Daher muss der folgende Block verzögert ausgeführt werden. ( sleep 30 brctl addif vmbr1001 ztks553soy ip link set ztks553soy up ip r add <guest ip>/32 dev vmbr1001 ) &
Guest Setup
Im portierten Guest wird als externes Interface jetzt die (auf dem PVE erzeugte) Bridge zugewiesen.
Im Gast wird jetzt die Hetzner Zusatz-IP dem externen Interface zugewiesen.
Im Guest muss jetzt noch das Gateway bekannt gemacht werden.
ip route add <private-ip-von-vmbr1001> dev eth0 ip route add default via <private-ip-von-vmbr1001> dev eth0
Danach sollte die Verbindung über die Bridge funktionieren.