GRE + routed IPs unter Proxmox

Ich poste hier mal meine funktionierende Config, falls jemand bei noez (oder generell) Probleme mit gerouteten IPs über GRE hat.
Das Ganze läuft bei mir unter Proxmox, sollte aber auch auf jedem anderen Debian/Ubuntu-Host funktionieren.


Voraussetzungen

  • GRE-Tunnel ist beim Provider eingerichtet
  • du hast eine lokale und eine entfernte Tunnel-IP (z. B. 192.168.4.2/30 ↔ 192.168.4.1/30)
  • und bekommst einen gerouteten IP-Block, z. B. 5.230.167.224/27

/etc/network/interfaces

auto vmbr1
iface vmbr1 inet static
        address 5.230.167.1/32
        post-up /root/gre_noez.sh
        bridge-ports none
        bridge-stp off
        bridge-fd 0
        post-up ip route add 5.230.167.224/27 dev vmbr1 scope link

Script / Setup (/root/gre_noez.sh)

# Basics
sysctl -w net.ipv4.ip_forward=1
for i in all default gre1 vmbr1; do sysctl -w net.ipv4.conf.$i.rp_filter=0; done

# GRE-Tunnel aufbauen
ip tunnel del gre1 2>/dev/null || true
ip tunnel add gre1 mode gre local A.A.A.A remote B.B.B.B ttl 255
ip addr add 192.168.4.2/30 dev gre1
ip link set gre1 up mtu 1476

# vmbr1 ist die Bridge für den gerouteten Block
# im /etc/network/interfaces liegt da z. B. 5.230.167.1/32 drauf
ip link set vmbr1 up

# Policy-Routing
# alte Regeln löschen (falls man schon getestet hat)
for x in $(seq 224 255); do ip rule del from 5.230.167.$x table 20 2>/dev/null || true; done
ip rule del from 5.230.167.224/27 table 20 2>/dev/null || true

# neue Regel für das ganze Subnetz
ip rule add from 5.230.167.224/27 table 20 pref 100

# Routing-Tabelle 20 befüllen
ip route flush table 20
ip route add 5.230.167.224/27 dev vmbr1 scope link table 20      # on-link für die IPs
ip route add 192.168.4.0/30 dev gre1 table 20                    # GRE-Subnetz
ip route add default via 192.168.4.1 dev gre1 table 20           # Standardroute über GRE

Die IPs A.A.A.A (lokal) und B.B.B.B (remote) ersetzt ihr natürlich durch eure echten Tunnel-Endpunkte.


Was das macht

  • der GRE-Tunnel baut die Verbindung zum Provider auf
  • vmbr1 ist euer virtuelles Interface für die gerouteten IPs
  • alle Pakete aus dem gerouteten Block werden über den GRE geschickt
  • rp_filter=0 ist wichtig, sonst blockt Linux die Rückpakete

Beispiel-Config für die VMs

Wenn ihr auf dem Host 5.230.167.1/32 verwendet, muss die VM ihre Route „on-link“ setzen.

Linux-VM:

ip addr add 5.230.167.224/32 dev eth0
ip route add 5.230.167.1 dev eth0
ip route add default via 5.230.167.1 dev eth0 onlink

Windows-VM:

netsh interface ipv4 set address name="Ethernet" static 5.230.167.224 255.255.255.255 none
route add 5.230.167.1 mask 255.255.255.255 5.230.167.224 -p
route add 0.0.0.0 mask 0.0.0.0 5.230.167.1 -p

Rückroute / NAT auf der Gegenseite nicht vergessen

Auf der Remote-Seite (also beim Provider oder deinem zweiten Server):

ip route add 5.230.167.224/27 via 192.168.4.2 dev gre1
# oder falls NAT gebraucht wird:
iptables -t nat -A POSTROUTING -s 5.230.167.224/27 -o eth0 -j MASQUERADE

Kurzer Check

ping -I 192.168.4.2 192.168.4.1
ip route get 8.8.8.8 from 5.230.167.224

→ sollte „via 192.168.4.1 dev gre1“ anzeigen.

Danach in der VM:

ping 8.8.8.8
ping google.com

Wenn 8.8.8.8 geht, aber google.com nicht → einfach DNS setzen (z. B. 8.8.8.8 oder 1.1.1.1).


Hinweise

  • MTU vom GRE-Interface auf 1476 setzen, vmbr1 und VMs können 1500 bleiben
  • Die Regel gilt für das ganze /27, man braucht keine einzelnen Regeln mehr
  • Wer mag, kann das Script beim Boot automatisch ausführen lassen (per post-up oder systemd-Unit)

Fertig – damit läuft das GRE-Routing bei mir absolut stabil.
Vielleicht hilft’s ja dem ein oder anderen, der bei noez oder ähnlichen Anbietern hängt. :upside_down_face: