Proxmox NAT mit zusätzlichen IP Adressen

  • Ich hoffe mir kann jemand auf die Sprünge helfen, ich komm bei meinem Problem einfach nicht weiter.

    Ich habe einen VPS Ostern M mit Proxmox am laufen und diesem zwei zusätzliche IP Adressen zugewiesen.
    Mein ideales Ziel wäre, dass ich drei Container habe, die alle auf einer einzelnen internen Bridge (vmbr1) hängen und je nach IP Adresse (Haupt, Zus1 und Zus2) denselben Port zugewiesen bekommen.
    Veranschaulicht sieht das so aus:

    Haupt IP Adresse a.a.a.a Port 1337 wird auf die interne Adresse 192.168.8.101:1337 weitergeleitet.
    Zus1 Adresse y.y.y.y Port 1337 auf 192.168.8.102:1337
    Zus2 Adresse z.z.z.z Port 1337 auf 192.168.8.103:1337


    Was ich bis jetzt probiert habe und was funktioniert.

    Das interne Netz 192.168.8.0/24 steht bereits und funktioniert auch soweit. Falls ein Port "genatted" werden soll wird dieser jedoch von der Hauptadresse a.a.a.a weitergereicht.
    Ich habe auch probiert die zusätzlichen IP Adressen direkt den zwei Containern .102 und .103 zuzuweisen (nicht die optimalste Lösung, ich könnte damit aber leben), das hat auch funktioniert (Container läuft -> Ping erreicht das Ziel, Container läuft nicht -> Keine Ping Antwort). Nur sobald ich versuche eine Verbindung über den Port 1337 aufzubauen lande ich jedoch immer auf dem Container der den Port von der Hauptadresse weitergereicht bekommt (192.168.8.101).

    Ich habe auch versucht eine eigene Bridge + zusätzliche interne Bridge für jede Zusatzip zu erstellen, das hat jedoch auch nicht geklappt (und auch das wäre auch nicht die optimale Lösung).
    Ich habe etliche Beiträge auf diesem und anderen Foren durchsucht, jedoch stecke ich noch immer fest. Was ich jedoch in einem Beitrag hier gefunden habe war ein Ansatz mit SNAT, jedoch hat das ebenfalls nicht funktioniert (oder eher ich nicht ganz verstanden), ich denke jedoch, dass das in die richtige Richtung geht.

    Hier meine /etc/network/interfaces:

    Ich danke bereits jedem der gewillt ist bis hier her zu lesen ^^:thumbup:.
    MfG Raphael

  • Hi,


    hast du die zusätzlichen IPs dem System so hinzugefügt wie in dem Wiki Eintrag beschrieben?

    https://www.netcup-wiki.de/wik…_Ubuntu_.28bis_17.04.29_2


    Dann das Alias-Interfaces der Bridge hinzufügen und die DNAT Regeln erstellen. Du musst dann aber bei den Regeln trotzdem für jede IP eine zusätzliche Regel erstellen, da ansonsten keine eindeutige Zuordnung besteht.


    Ist schon lange her wo ich sowas zuletzt gemacht habe, daher keine Garantie. Aber so hätte ich das nun probiert.


    MfG

  • hast du die zusätzlichen IPs dem System so hinzugefügt wie in dem Wiki Eintrag beschrieben?

    https://www.netcup-wiki.de/wiki/Zus%c3%a4tzliche_IP_Adresse_konfigurieren#Debian_und_Ubuntu_.28bis_17.04.29_2

    Ah, stimmt, ja hab ich probiert. Ich hätte die IP Adressen auch per up ip route add z.z.z.z/32 dev vmbr0der Bridge hinzugefügt. Hat beides funktioniert

    Dann das Alias-Interfaces der Bridge hinzufügen und die DNAT Regeln erstellen. Du musst dann aber bei den Regeln trotzdem für jede IP eine zusätzliche Regel erstellen, da ansonsten keine eindeutige Zuordnung besteht.

    Wie meinst du das, das ist mir nicht ganz klar? Und wie würde so eine zusätzliche Regel aussehen? Die DNAT Regel würde ja nur den Port weiterleiten, aber da hätte ich ja Duplikate. Ich weiß genau da nicht wie ich Regeln erstellen kann um anhand einer ZusatzIP zu differenzieren. Danke schonmal für die Hilfe!

  • Kurz und Knapp: du brauchst drei separate Regeln.

    Code
    iptables -t nat -A PREROUTING -p tcp -d a.a.a.a --dport 1337 -j DNAT --to-destination 192.168.8.101
    iptables -t nat -A PREROUTING -p tcp -d y.y.y.y --dport 1337 -j DNAT --to-destination 192.168.8.102
    iptables -t nat -A PREROUTING -p tcp -d z.z.z.z --dport 1337 -j DNAT --to-destination 192.168.8.103
  • Ich kann die Flag -d <IP-Adresse> nicht aber das hat das Problem gelöst.

    Der Parameter -d steht für "destination" ;)

    Braucht er nicht auch noch 3 s-nat regeln im Postrouting für den ausgehenden Traffic?

    Geht beides. Bei SNAT bestimmst du die Source Adresse statisch. Bei MASQUERADE wird die Source Adresse dynamisch bestimmt. In den meisten Fällen ist letzeres die bessere Wahl.

  • Bei SNAT bestimmst du die Source Adresse statisch. Bei MASQUERADE wird die Source Adresse dynamisch bestimmt. In den meisten Fällen ist letzeres die bessere Wahl.

    Würde es bei seinem Setup dann zum gleichen Ergebnis kommen? Oder hat er mit MASQUERADE dann asymmetrisches Routing?

    (Ich frage aus eigenem Interesse, weil ich beim Setup mit mehr als einer IP dann immer s-nat genommen habe, um sicher zu sein, dass die Container/VMs ausgehend die korrekte Adresse verwenden)

    Meine (Netcup) Produkte: S 1000 G7, VPS 200 G8 Ostern 2019, IPs, Failover..

  • Ah okay. Ich verstehe was du meinst. Naja, es kommt auf den Anwendungszweck drauf an. Wenn der Container einen Request in das WWW verschickt, dann ist es ja normalerweise egal, auf welche IP genattet wird, ähnlich wie in jedem Heimnetz. Außer man hat irgendeine spezielle Anwendung z.B. Mailserver wo die externe Sender IP nicht mehr egal ist. In letzterem Fall ist SNAT notwendig. Wenn der Container nur auf Requests antworten soll, dann stehen die notwendigen Informationen in der NAT Tabelle d.h. es wird auf jeden Fall bei dem Rückweg wieder die richtige IP zugeordnet.

  • Ah okay. Ich verstehe was du meinst. Naja, es kommt auf den Anwendungszweck drauf an. Wenn der Container einen Request in das WWW verschickt, dann ist es ja normalerweise egal, auf welche IP genattet wird, ähnlich wie in jedem Heimnetz. Außer man hat irgendeine spezielle Anwendung z.B. Mailserver wo die externe Sender IP nicht mehr egal ist. In letzterem Fall ist SNAT notwendig. Wenn der Container nur auf Requests antworten soll, dann stehen die notwendigen Informationen in der NAT Tabelle d.h. es wird auf jeden Fall bei dem Rückweg wieder die richtige IP zugeordnet.

    Ah, cool. Danke für die Erklärung! :thumbup:

    Meine (Netcup) Produkte: S 1000 G7, VPS 200 G8 Ostern 2019, IPs, Failover..

  • Wieso routest Du die zusätzlichen IP Adressen nicht direkt in die Container? Zum Beispiel hast Du so auch keinen ordentlichen IPv6 Support in deinen Anwendungen.


    IMHO solltest Du da auf NAT gänzlich verzichten und es lieber richtig machen.


    Dann muss auch nicht jeder Port einzeln gemapped werden.


    Habe das vor ein paar Jahren mal hier beschrieben, wie das mit dem Routing von zusätzlichen IPs bei netcup funktioniert:


    https://serverless.industries/…1/proxmox-lxc-netcup.html

  • So hallo, hab nicht mehr hier in den Thread geschaut, nachdem es (fast) funktioniert.

    Braucht er nicht auch noch 3 s-nat regeln im Postrouting für den ausgehenden Traffic?

    Dafür dann die Postrouting "MASQUERADE" regeln raus nehmen

    Genau da hänge ich gerade. Tatsächlich habe ich meine MASQUERADE Regel entfernt und es mit SNAT probiert, die Source Adresse zu ändern, das klappt jedoch nicht ganz.
    Hier die iptables Regeln

    iptables -t nat -A POSTROUTING -s '192.168.8.0/24' -o vmbr0 -j SNAT --to-source a.a.a.a
    iptables -t nat -A POSTROUTING -s '192.168.8.102/32' -o vmbr0 -j SNAT --to-source y.y.y.y

    iptables -t nat -A POSTROUTING -s '192.168.8.103/32' -o vmbr0 -j SNAT --to-source z.z.z.z

    Ich dachte, dass würde funktionieren, tuts aber nicht.

    Ich erhalte nach außen dennoch meine a.a.a.a HauptIP wenn ich von den Containern .102 und .103 ins Internet gelange.
    Zufällig eine Idee, ohne dass ich Interne Subnet hässlich in mehrere kleine aufsplitten muss?


    Wieso routest Du die zusätzlichen IP Adressen nicht direkt in die Container?

    Nun, wenn ich mehrere Services, die ich am laufen habe, wieder in einen einzelnen Container packe, nimmt das mMn so ziemlich den Sinn der Virtualisierung. Zumal ich ja die IPs auch für andere Anwendungen verwenden möchte und dennoch meine derzeitige Struktur beibehalten möchte.. Bei der Anzahl an Containern die ich derzeit schon habe wäre das nicht ganz praktikabel.


    Zum Beispiel hast Du so auch keinen ordentlichen IPv6 Support in deinen Anwendungen.

    Zur Komprimierung des Posts habe ich meine IPv6 Konfiguration weggelassen. Die ist sowieso nicht bridged sondern routed und spielt bei meinen Problem keine Rolle. Im Gegenteil, IPv6 macht mir hier das Leben einfacher durch die enorme Anzahl an Adressen die mir zur Verfügung gestellt wurden.

    IMHO solltest Du da auf NAT gänzlich verzichten und es lieber richtig machen.

    Was richtig oder falsch ist denke ich sollte jeder selbst entscheiden. Ich möchte dennoch ein internes Netz aufbauen, über das eine VM ins (IPv4) Internet gelangen kann ohne eine eigene PublicIP zu benötigen. Allein dafür benötige ich meines Wissen nach schon NAT. Und für zusätzliche (unnötige) IP Adressen muss ich auch nicht zahlen.

  • Ich erhalte nach außen dennoch meine a.a.a.a HauptIP wenn ich von den Containern .102 und .103 ins Internet gelange.

    Iptables geht der Reihenfolge nach. Deine erste Regeln mit "192.168.8.0/24" trifft ja schon passend zu, deswegen wird die genommen.

    Wenn du die Regeln mit /32 davor setzt, sollte es gehen.

    Meine (Netcup) Produkte: S 1000 G7, VPS 200 G8 Ostern 2019, IPs, Failover..

  • iptables -t nat -A POSTROUTING -s '192.168.8.0/24' -o vmbr0 -j SNAT --to-source a.a.a.a
    iptables -t nat -A POSTROUTING -s '192.168.8.102/32' -o vmbr0 -j SNAT --to-source y.y.y.y

    iptables -t nat -A POSTROUTING -s '192.168.8.103/32' -o vmbr0 -j SNAT --to-source z.z.z.z

    Hab das Problem behoben. Die Reihenfolge wie sie ausgeführt werden (und dadurch auch wie sie in der /etc/network/interfacesstehen) ist essentiell.
    Bei mir schaut das nun wie folgt aus:
    post-up iptables -t nat -A POSTROUTING -s '192.168.8.103/32' -o vmbr0 -j SNAT --to-source z.z.z.z
    post-down iptables -t nat -D POSTROUTING -s '192.168.8.103/32' -o vmbr0 -j SNAT --to-source z.z.z.z
    post-up iptables -t nat -A POSTROUTING -s '192.168.102/32' -o vmbr0 -j SNAT --to-source y.y.y.y

    post-down iptables -t nat -D POSTROUTING -s '192.168.8.102/32' -o vmbr0 -j SNAT --to-source y.y.y.y

    post-up iptables -t nat -A POSTROUTING -s '192.168.8./24' -o vmbr0 -j SNAT --to-source a.a.a.a

    post-down iptables -t nat -D POSTROUTING -s '192.168.8.0/24' -o vmbr0 -j SNAT --to-source a.a.a.a

    Vielen Dank noch einmal für die Hilfe!


    Da war ich einen Tick zu langsam

    Iptables geht der Reihenfolge nach. Deine erste Regeln mit "192.168.8.0/24" trifft ja schon passend zu, deswegen wird die genommen.

    Wenn du die Regeln mit /32 davor setzt, sollte es gehen.

    Genau so ists! ;)