SDN mit SNAT, DHCP und direkter VM zu VM-Kommunikation

fbi

New Member
Nov 17, 2024
3
0
1
Hi!

Ich weiß gerade nicht weiter.

Mein Ziel ist es ein Proxmox Cluster aufzusetzen auf dem verschiedene Webaplikationen laufen sollen. Teilweise in Produktion, andere als Entwicklungsumgebung. Gerade ist aber erst ein Server im Schrank zur Evaluation.
Die Idee ist, mehrere Subnetze mit DHCP und SNAT anzulegen. Zum Beispiel ein Subnetz für einen Webservercluster (10.10.0.0/24) und ein Subnetz für ein Galera-Datenbankcluster (10.10.1.0/24). Auf den ersten Blick dachte ich mir, dass ich mir alles zusammenclicken kann. Ich möchte das Routing zwischen den Webservern und der Datenbank nicht über einen externen Router laufen lassen, sondern hatte eigentlich gehofft, dass es nicht so schwer sein wird, das auf dem Host zu konfigurieren. Aber das einzige, was ich hinbekomme ist, dass die Verbindung zwischen zwei VNets über das Gateway hergestellt wird und es auf der VM so aussieht, als ob die Verbindung vom Gateway kommt und nicht aus dem anderen Netz.
Mein konkretes Problem ist (und ich denke, dass es bei den anderen Verbindungen genau so sein wird), dass ich mich per SSH auf der ersten VM (172.40.0.3 ein Bastionsserver) anmelden kann und dann weiter zur 10.10.1.100 möchte. Da ich aber die zulässige IP-Adresse in der authorized_keys eingegeben habe, klappt das nicht, weil der sshd denkt, dass die Verbindung von 10.10.1.1 kommt.

Hier meine Frage:
Ich dachte eigentlich, dass das ein ziemlich einfacher Usecase ist. Wo ist mein Denkfehler?

Hier sind die beiden Konfigurationsdateien und die registrierten Routen:

Code:
root@pve:~# cat /etc/network/interfaces
# network interface settings; autogenerated
# Please do NOT modify this file directly, unless you know what
# you're doing.
#
# If you want to manage parts of the network configuration manually,
# please utilize the 'source' or 'source-directory' directives to do
# so.
# PVE will preserve these directives, but will NOT read its network
# configuration from sourced files, so do not attempt to move any of
# the PVE managed interfaces into external files!

auto lo
iface lo inet loopback

iface eno4 inet manual

iface eno1 inet manual

iface eno2 inet manual

iface eno3 inet manual

auto vmbr0
iface vmbr0 inet static
    address 192.168.100.74/24
    gateway 192.168.100.1
    bridge-ports eno4
    bridge-stp off
    bridge-fd 0

    # 192.168.111.75 as secondary ip address
    up ip addr add 192.168.100.75/24 dev vmbr0
    
    post-up iptables -t nat -A PREROUTING -d 192.168.100.75 -p tcp --dport 22 -j DNAT --to-destination 172.40.0.3:22
    post-up iptables -t nat -A POSTROUTING -s 172.40.0.3 -j MASQUERADE

    post-down iptables -t nat -D PREROUTING -d 192.168.100.75 -p tcp --dport 22 -j DNAT --to-destination 172.40.0.3:22
    post-down iptables -t nat -D POSTROUTING -s 172.40.0.3 -j MASQUERADE

root@pve:~# cat /etc/network/interfaces.d/sdn 
#version:28

auto vnet01
iface vnet01
    address 172.40.0.1/24
    post-up iptables -t nat -A POSTROUTING -s '172.40.0.0/24' -o vmbr0 -j SNAT --to-source 192.168.100.74
    post-down iptables -t nat -D POSTROUTING -s '172.40.0.0/24' -o vmbr0 -j SNAT --to-source 192.168.100.74
    post-up iptables -t raw -I PREROUTING -i fwbr+ -j CT --zone 1
    post-down iptables -t raw -D PREROUTING -i fwbr+ -j CT --zone 1
    bridge_ports none
    bridge_stp off
    bridge_fd 0
    alias dmz
    ip-forward on

auto vnet02
iface vnet02
    address 10.10.1.1/24
    post-up iptables -t nat -A POSTROUTING -s '10.10.1.0/24' -o vmbr0 -j SNAT --to-source 192.168.100.74
    post-down iptables -t nat -D POSTROUTING -s '10.10.1.0/24' -o vmbr0 -j SNAT --to-source 192.168.100.74
    post-up iptables -t raw -I PREROUTING -i fwbr+ -j CT --zone 1
    post-down iptables -t raw -D PREROUTING -i fwbr+ -j CT --zone 1
    bridge_ports none
    bridge_stp off
    bridge_fd 0
    alias galera
    ip-forward on

root@pve:~# ip route list
default via 192.168.100.1 dev vmbr0 proto kernel onlink 
10.10.1.0/24 dev vnet02 proto kernel scope link src 10.10.1.1 
172.40.0.0/24 dev vnet01 proto kernel scope link src 172.40.0.1 
192.168.100.0/24 dev vmbr0 proto kernel scope link src 192.168.100.74

Danke für dieses Forum, in dem jetzt schon viel gelesen habe und viele Grüße,
Florian
 
Hi, wenn du routest oder auch NAT benutzt, muss der Traffic immer zu einem Gateway. Wenn du kein Firewalling auf Ebene des Routings betreibst, kannst du deinem Jumphost auch ein Beinchen in jedem Netz geben. Dann muss die VM diesen Traffic nicht zum Gateway schicken.
 
Hi, die Idee mit den zusätzlichen Interfaces in den anderen Netzen hatte ich auch schon, finde es aber zu aufwendig. Bzw. will ich es dort machen, wo ich mir einen Effizienzgewinn erhoffe (zB zwischen DB-Loadbalancer und Datenbanken).
Dass der Traffic auch immer zu einem Gateway muss ist ja auch nicht das Problem (IMHO), sondern dass der Traffic zu der VM auch von dem Gateway kommt und nicht die Ursprüngliche IP beibehalten wird. Mit meinem Halbwissen bin ich davon ausgegangen, dass das IP-Forwarding genau das tut. Bin ich da auf dem Holzweg?
Eine weitere Vermutung war, dass ich das unerwünschte Verhalten explizit durch das MASQUERADE so konfiguriere. Aber ohne erreiche ich die VM nicht mehr.
 
Hi, die Idee mit den zusätzlichen Interfaces in den anderen Netzen hatte ich auch schon, finde es aber zu aufwendig. Bzw. will ich es dort machen, wo ich mir einen Effizienzgewinn erhoffe (zB zwischen DB-Loadbalancer und Datenbanken).
Dass der Traffic auch immer zu einem Gateway muss ist ja auch nicht das Problem (IMHO), sondern dass der Traffic zu der VM auch von dem Gateway kommt und nicht die Ursprüngliche IP beibehalten wird. Mit meinem Halbwissen bin ich davon ausgegangen, dass das IP-Forwarding genau das tut. Bin ich da auf dem Holzweg?
Eine weitere Vermutung war, dass ich das unerwünschte Verhalten explizit durch das MASQUERADE so konfiguriere. Aber ohne erreiche ich die VM nicht mehr.
Mit NAT verschleierst du ja die echten IPs.
 
Mit NAT verschleierst du ja die echten IPs.
Ja, das soll er auch machen, aber nur für die Verbindungen Richtung Internet. Für die Verbindungen zwischen den vnets soll er das nicht tun.

... jetzt wo ich das geschrieben habe, habe ich mal die lokalen Netze von dem Masquerading ausgeschlossen und es scheint zu funktionieren (zumindest ssh von draußen nach 172.40.0.3 und dann weiter zu 10.10.1.100) oder mache ich hier etwas falsch?

Hiermit werde ich es jetzt weiter probieren:
Code:
auto lo
iface lo inet loopback

iface eno4 inet manual

iface eno1 inet manual

iface eno2 inet manual

iface eno3 inet manual

auto vmbr0
iface vmbr0 inet static
    address 192.168.100.74/24
    gateway 192.168.100.1
    bridge-ports eno4
    bridge-stp off
    bridge-fd 0

    # 192.168.111.75 as secondary ip address
    up ip addr add 192.168.100.75/24 dev vmbr0
    
    post-up iptables -t nat -A PREROUTING -d 192.168.100.75 -p tcp --dport 22 -j DNAT --to-destination 172.40.0.3:22
    post-up iptables -t nat -A POSTROUTING -s 172.40.0.3 ! -d 10.10.0.0/8 -j MASQUERADE

    post-down iptables -t nat -D PREROUTING -d 192.168.100.75 -p tcp --dport 22 -j DNAT --to-destination 172.40.0.3:22
    post-down iptables -t nat -D POSTROUTING -s 172.40.0.3 ! -d 10.10.0.0/8 -j MASQUERADE
 

About

The Proxmox community has been around for many years and offers help and support for Proxmox VE, Proxmox Backup Server, and Proxmox Mail Gateway.
We think our community is one of the best thanks to people like you!

Get your subscription!

The Proxmox team works very hard to make sure you are running the best software and getting stable updates and security enhancements, as well as quick enterprise support. Tens of thousands of happy customers have a Proxmox subscription. Get yours easily in our online shop.

Buy now!