OPNsense als Router auf Proxmox

Started by IchiTheChiller, September 23, 2024, 12:58:34 PM

Previous topic - Next topic
Hallöchen,

ich betreibe Proxmox, auf dem OPNsense als VM läuft. Das Ganze läuft auf einem KVM Root-Server mit nur einer IP-Adresse. Ich mache gerade eine Umschulung zum Fachinformatiker für Systemintegration, und dieses Projekt ist ein kleines Spaßprojekt für mich. Ein Freund hat mich darauf gebracht, und mit seiner Hilfe habe ich einfach mal angefangen, das kleine Projekt umzusetzen. Auf dem Server sollen dann VMs laufen, und eventuell möchte ich ihn auch als Testumgebung für ein Monitoring-Projekt nutzen.

Über meine WireGuard-VPN-Verbindung kann ich Proxmox unter https://10.20.0.2:8006 und die OPNsense-VM unter https://10.10.0.1:8080 erreichen. Die OPNsense-VM ist außerdem noch über das WAN erreichbar, was ich später unterbinden möchte, sodass nur noch der Zugriff über die VPN-Verbindung möglich ist.

Bis jetzt bin ich an dem Punkt, dass ich über die WireGuard-Verbindung auf Proxmox und OPNsense zugreifen kann. Beide haben eine Verbindung zum Internet. Allerdings habe ich das Problem, dass die von mir erstellten VMs keinen Internetzugang haben. Ich vermute, dass entweder die Firewall etwas blockiert oder es ein Problem beim Routing gibt.

Hier sind die Interface- und Routing-Konfigurationen von Proxmox. Die HA-Bridge ist vorerst nicht relevant. Vielleicht habt ihr eine Idee, was das Problem sein könnte. Den Netzwerkplan habe ich ebenfalls erstellt, um eine Übersicht zu haben. Ich weiß jedoch nicht ob er so korrekt ist in der Form.

auto lo
iface lo inet loopback

auto ens18
iface ens18 inet manual

auto vmbr0
iface vmbr0 inet static
        bridge-ports ens18
        bridge-stp off
        bridge-fd 0
#       address x.x.x.x/24
#       gateway x.x.x.x

#WAN

auto vmbr1
iface vmbr1 inet static
        address 10.10.0.2/24
        post-up ip route add default via 10.10.0.1
        bridge-ports none
        bridge-stp off
        bridge-fd 0

#LAN External

auto vmbr100
iface vmbr100 inet static
        address 10.100.0.0/24
        bridge-ports none
        bridge-stp off
        bridge-fd 0

#Firewall HA Bridge

auto vmbr2
iface vmbr2 inet static
        address 10.20.0.2/24
        bridge-ports none
        bridge-stp off
        bridge-fd 0

#LAN Internal

root@pve:~# ip route show
default via 10.10.0.1 dev vmbr1
10.10.0.0/24 dev vmbr1 proto kernel scope link src 10.10.0.2
10.20.0.0/24 dev vmbr2 proto kernel scope link src 10.20.0.2
10.100.0.0/24 dev vmbr100 proto kernel scope link src 10.100.0.0



September 23, 2024, 06:37:33 PM #1 Last Edit: September 23, 2024, 06:40:45 PM by meyergru
Ich würde davon abraten, den Proxmox ausschließlich hinter die OpnSense zu stellen. Wenn die dann nämlich nicht läuft, bist Du ziemlich aufgeschmissen.

Eine oft genutzte Variante ist, mit zwei oder drei Bridges auf dem Proxmox zu arbeiten:


  • vmrb0 als Bridge, an die sich ggf. VMs mit einer separaten IP anklinken können (selbst wenn man das nicht nutzt)
  • vmbr1 als Bridge, auf der das WAN der OpnSense liegt
  • vmbr2 als LAN, von dem aus alle VMs, OpnSense und Proxmox per VPN gemanaged werden können

Die Konfiguration sieht dann in etwa so aus:


auto lo
iface lo inet loopback

iface lo inet6 loopback

auto enp8s0
iface enp8s0 inet static
        address x.y.z.86/32
        gateway x.y.z.65
        post-up echo 1 > /proc/sys/net/ipv4/ip_forward
        #post-up echo 1 > /proc/sys/net/ipv4/conf/enp8s0/proxy_arp
        post-up echo 1 > /proc/sys/net/ipv6/conf/enp8s0/forwarding
        post-up iptables -t nat -A PREROUTING -i enp8s0 -p tcp -d x.y.z.86 -m multiport ! --dport 22,3128,8006 -j DNAT --to 172.30.30.1
        post-up iptables -t nat -A PREROUTING -i enp8s0 -p udp -d x.y.z.86 -j DNAT --to 172.30.30.1

iface enp8s0 inet6 static
        address 2a01:x:y:z:1234::15/128
        address 2a01:x:y:z:172::15/128
        gateway fe80::1

auto vmbr0
iface vmbr0 inet static
        address x.y.z.86/32
        bridge-ports none
        bridge-stp off
        bridge-fd 0
        up ip route add x.y.z.87/32 dev vmbr0
        up ip route add x.y.z.88/32 dev vmbr0
#Proxmox WAN Bridge

iface vmbr0 inet6 static
        address 2a01:x:y:z:1234::15/80

auto vmbr1
iface vmbr1 inet static
        address 172.30.30.0/31
        bridge-ports none
        bridge-stp off
        bridge-fd 0
        post-up   iptables -t nat -A POSTROUTING -s '172.30.30.1/31' -o enp8s0 -j MASQUERADE
        post-down iptables -t nat -D POSTROUTING -s '172.30.30.1/31' -o enp8s0 -j MASQUERADE
#OPNsense WAN - Proxmox LAN

iface vmbr1 inet6 static
        address 2a01:x:y:z:172::815/80
        post-up ip -6 route add 2a01:x:y:z:124::/80 via 2a01:x:y:z:172::1
        post-up ip -6 route add 2a01:x:y:rr00::/56 via 2a01:x:y:z:172::1

auto vmbr2
iface vmbr2 inet static
        address 10.0.0.2/24
        bridge-ports none
        bridge-stp off
        bridge-fd 0
        post-up ip route add 10.0.0.0/8 via 10.0.0.2 dev vmbr2
#LAN bridge

iface vmbr2 inet6 static

source /etc/network/interfaces.d/*


Dabei sind:

x.y.z.86 Haupt-IP mit x.y.z.65 als Gateway,
x.y.z.87 und x.y.z.z.88 Zusatz-IPs an vmbr0 (diese nutzen x.y.z.86 als Gateway, damit Ihre MAC nicht für den ISP sichtbar wird, Hetzner z.B. bräuchte dazu virtuelle MACs).

172.30.30.0 die IP von Proxmox auf vmbr1, um darüber IPv4 zur OpnSense zu routen.
172.30.30.1 die WAN-IP der OpnSense - darauf wird jeder eingehende IPv4-Traffic geNATet, bis auf die Ports für den Proxmox-Zugriff (kann man später zumachen, wenn alles läuft). Den Port-Forward und vor allem die Outvound NAT-Regel sollte man aber in jedem Fall machen, denn dadurch können sich OpnSense und Proxmox die IPv4 für ausgehenden Traffic teilen, schließlich brauchen beide ggf. Internet-Zugriff für Updates, Cloud-Dienste oder Paketinstallationen.

10.0.0.2 ist die LAN-IP für Proxmox, damit man es per VPN erreichen kann. Die 10er Route wird gesetzt, damit die VPN-Antworten auch hierüber und nicht auf das Default-Gateway geroutet werden.

IPv6 ist etwas komplexer:

2a01:x:y:z:: ist ein /64 Präfix, dass Du z.B. bei Hetzner bekommst. Es wird mit /80 weiter unterteilt zu:

2a01:x:y:z:1234::/80 für vmbr0 mit 2a01:x:y:z:1234::15/128 als externer IPv6 für Proxmox.
2a01:x:y:z:172::15/128 als Punkt-zu-Punkt IPv6 in vmbr1 für das OpnSense-WAN mit 2a01:x:y:z:172::1/128.

2a01:x:y:z:124::/80 als Subnetz für vmbr2, und zwar als IPv6-LAN für die OpnSense.

Somit verwaltet die OpnSense Ihr LAN mit 10.0.0.1/24 und kann dort DHCPv4 machen. Sie ist das Gateway und DNS-Server und macht NAT zum Internet über 172.30.30.0. Sie kann für IPv4 auch als Gateway dienen mit der IPv6  2a01:x:y:z:124::1/80.

Leider müssten bis hierhin aber alle VMs eine statische IPv6 bekommen oder per DHCPv6 bedient werden. Einfacher ist SLAAC, das geht aber nur mit einem ganzen /64er Subnetz. Dazu dient der zweite Präfix, 2a01:x:y:rr00::/56, den man dann auf der OpnSense in einzelne /64er Präfixe aufteilen und per SLAAC auf dem (oder den) LAN(s) verteilen kann. So etwas gibt es bei Hetzner für einmalig 15€.

Die Zusatz-IPs kann man nutzen, muss aber nicht. Diese "direkt angeschlossenen" VMs könnten z.B. auch IPv6 in 2a01:x:y:z:1234::/80 belegen.

Drei Punkte noch:

1. Man kann/sollte die Proxmox-Ports zumindest für IPv4 natürlich schließen, kann diese aber durchaus per IPv6 weiterhin zugänglich halten. Dadurch kommt man ggf. auch ohne laufende OpnSense an den Proxmox. Ein Risiko besteht kaum, wenn niemand die externe IPv6 kennt (Vorsicht: Einträge im DNS könnten sichtbar sein und jedes ACME-Zertifikat liegt offen, also wenn, nur Wildcards verwenden!), da Portscans in IPv6 kaum sinnvoll erscheinen.

2. Ich würde zusätzlich eine Client-VM einrichten, die ausschließlich im LAN liegt und eine grafische Oberfläche und einen Browser hat und die immer mitläuft. Solange der Proxmox funktioniert und sein GUI über Port 8006 erreichbar ist, hat man damit eine VM mit LAN-Zugriff und Browser. Das gilt dann auch, wenn die OpnSense vergurkt ist und aktuell gerade kein VPN funktioniert. Die Aufrufkette ist dann: Browser -> https://[2a01:x:y:z:1234::15]:8006, dort drin eine Konsole zur Client-VM, dort mit Browser auf https://10.0.0.1/ (OpnSense LAN-IP) zugreifen.

3. Vorsicht mit (asymmetrischen) Routen! Der Proxmox beispielsweise hat mehrere Interfaces, da ist es wichtig, die Routen ggf. korrekt zu setzen. Man beachte, dass ich für IPv6 keine Adresse auf vmbr2 gesetzt habe, weil das eigentlich nur für Zugriff per VPN über das LAN genutzt werden soll. Wenn allerdings die OpnSense auf dem LAN-Interface Router Advertisements macht, hat man auch für Proxmox schnell eine alternative Route...
Intel N100, 4 x I226-V, 16 GByte, 256 GByte NVME, ZTE F6005

1100 down / 800 up, Bufferbloat A+

Vielen lieben Dank für deine Ausführliche Antwort auf meine Frage @meyergru

Ich werde deine config im Hinterkopf behalten. Zur jetzigen Zeit bin ich zu faul um alles wieder neu einzustellen. Ich habe vielleicht einen anderen Ansatz gefunden mit Hybrid outbound NAT rule generation aber muss das noch testen.