EDIT du 02/07/23 : promis je fais une relecture et le reste en début de semaine xD
EDIT du 06/07/23 : pas eu le termps 🤣
EDIT du 15/01/24 : update, corrections et ajout ipv6

Hello les geeks,

Je profite d'une mise en condition enfin d'une demande que l'on m'a posé cette après midi 🙂 (poke @faces et @Jade/Ewa )

Bon et si on expliquait le but de la manœuvre :
Il fallait avoir un proxmox + des vms le tout sans ip supplémentaire ( money money ) alors oui on aurait pu faire de l'iptables dans tous les sens avec ou sans grand plaisir 🤣

Me voilà partit commander une machine chez nos copains Hetzner, moins de 10 mn entre la commande et la livraison, et 20mn en tout pour installer debian + proxmox ( oui je prend que des machines avec nvme ou ssd pour l'OS a minima !

Etape 1

On va décommenter dans :

/etc/sysctl.conf

les lignes :

# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward=1
...
# Uncomment the next line to enable packet forwarding for IPv6
net.ipv6.conf.all.forwarding=1
...
# Do not send ICMP redirects (we are not a router)
net.ipv4.conf.all.send_redirects = 0

Une fois décommentez, on applique avec la commande :

sysctl -p

Eh oui on va quand même un peu faire de forward en prerouting

Etape 2

On va corriger le réseau et préparer nos 2 (ou plus) bridges.

source /etc/network/interfaces.d/*

auto lo
iface lo inet loopback
iface lo inet6 loopback

auto enp0s31f6
iface enp0s31f6 inet static
        address 195.201.XXX.YYY/26
        gateway 195.201.XXX.193
        up route add -net 195.201.XXX.192 netmask 255.255.255.192 gw 195.201.XXX.193 dev enp0s31f6
        post-up iptables -t nat -A PREROUTING -i enp0s31f6 -p tcp -m multiport ! --dports 22,8006 -j DNAT --to 10.10.10.1
        post-up iptables -t nat -A PREROUTING -i enp0s31f6 -p udp -j DNAT --to 10.10.10.1
# route 195.201.XXX.192/26 via 195.201.XXX.193

iface enp0s31f6 inet6 static
        address 2a01:4f8:XXXX:71a::2/128
        gateway fe80::1

auto vmbr0
iface vmbr0 inet static
        address 10.10.10.0/31
        bridge-ports none
        bridge-stp off
        bridge-fd 0
        post-up iptables -t nat -A POSTROUTING -s '10.10.10.1/31' -o enp0s31f6 -j MASQUERADE
        post-down iptables -t nat -D POSTROUTING -s '10.10.10.1/31' -o enp0s31f6 -j MASQUERADE
# OPNSense WAN - Proxmox LAN

iface vmbr0 inet6 static
        address 2a01:4f8:13b:XXXX::4/127
        up ip route add 2a01:4f8:13b:XXXX::/64 via 2a01:4f8:13b:XXXX::5

auto vmbr1
iface vmbr1 inet manual
        bridge-ports none
        bridge-stp off
        bridge-fd 0
#LAN

Allez je suis gentil on va décortiquer :

        post-up iptables -t nat -A PREROUTING -i enp0s31f6 -p tcp -m multiport ! --dport 22,8006 -j DNAT --to 10.10.10.1
        post-up iptables -t nat -A PREROUTING -i enp0s31f6 -p udp -j DNAT --to 10.10.10.1

Ces 2 lignes dans l'interfaces physiques vont faire en sortes que tout ce qui sera du tcp hormis le port 22 et 8006 seront renvoyé à 10.10.10.1 qui sera notre OPNSense.
Donc en gros on garde l'accès à proxmox par le port 22 et 8006 ( si t'a besoin je te rappelle que Proxmox embarque un firewall qui permet de limiter l'accès 😉
aussi SI TU AS CHANGER LE PORT SSH DE PROXMOX, ACCORDES CETTE LIGNE AVEC TON PORT !
La deuxième ligne fait que tout le traffic UDP part sur OPNSense.

Ok voyons notre premier vmbr, ce bridge permettra de faire la connexion entre proxmox et opnsense, opnsense n'aura donc pas d'ip public a proprement parler.

auto vmbr0
iface vmbr0 inet static
        address 10.10.10.0/31
        bridge-ports none
        bridge-stp off
        bridge-fd 0
        post-up iptables -t nat -A POSTROUTING -s '10.10.10.1/31' -o enp0s31f6 -j MASQUERADE
        post-down iptables -t nat -D POSTROUTING -s '10.10.10.1/31' -o enp0s31f6 -j MASQUERADE
# OPNSense WAN - Proxmox LAN

iface vmbr0 inet6 static
        address 2a01:4f8:13b:XXXX::4/127
        up ip route add 2a01:4f8:13b:XXXX::/64 via 2a01:4f8:13b:XXXX::5

explications :
10.10.10.0/30 sera l'adresse de proxmox avec un mask à 30 on peut se limiter à 3 adresses. Pas besoin d'avoir un /24 pour 2 adresses hein !
Le bridge ports on le laisse a none hein ! ca serait con de foutre des ips privés dans le réseau public !
tu trouveras 2 lignes iptables, l'une pour le start et l'autre pour down, quand tu appliques des changements c'est utile.
Bref cette règle permettra à opnsense de se connecter à internet et iptables réécrit les paquets pour que ces derniers viennent de l'ip public 😉
celle du dessous tu l'auras compris permet de la delete...

Petit ajout de l'ipv6, on va utiliser le bloc /64 qu'on a. Cependant petit subtilité, on bloque l'adresse sur le port physique à ::2/128 ce qui fait que déjà cette interface ne va pas s'accaparer le bloc entier. Ensuite dans le vmbr0 inet6 on va donner a cette interface l'adresse en ::4/127 ce qui fait que magie magie des masques on a ::4 et ::5, cette derniere sera l'ip de notre patte wan sur opnsense.
PS : pour les frileux de l'ipv6 passer votre chemin, bisous !

Donc là on a 2 interfaces, la physique qui permet d'être connecté au monde, vmbr0 qui permet de faire le lien entre proxmox et le port wan de opnsense.
Maintenant faudrait quand même qu'on ait des VM et que ces dernières puisse se connecter à internet et être protéger par un firewall et pouvoir faire du NAT.

Ajoutons vmbr1, qui sera la "patte" LAN,

auto vmbr1
iface vmbr1 inet manual
        bridge-ports none
        bridge-stp off
        bridge-fd 0
#LAN

aucune conf ici c'est juste un port de connexion pour les vm et opnsense et ce dernier se débrouillera pour le firewall, le nat etc !

Petit exemple avec une autre conf réseau, ici je suis chez Free en bridge, je vais utilisé un seul /64.

source /etc/network/interfaces.d/*

auto lo
iface lo inet loopback

auto enp37s0
iface enp37s0 inet static
        address 82.XX.YY.29/24
        gateway 82.XX.YY.254
        post-up iptables -t nat -A PREROUTING -i enp37s0 -p tcp -m multiport ! --dport 22,8006 -j DNAT --to 10.10.10.1
        post-up iptables -t nat -A PREROUTING -i enp37s0 -p udp -j DNAT --to 10.10.10.1

iface enp37s0 inet6 static
        address 2a01:e0a:XX:YYYY::2/128
        gateway 2a01:e0a:XX:YYYY::1

auto vmbr0
iface vmbr0 inet static
        address 10.10.10.0/31
        bridge-ports none
        bridge-stp off
        bridge-fd 0
        post-up iptables -t nat -A POSTROUTING -s '10.10.10.1/31' -o enp37s0 -j MASQUERADE
        post-down iptables -t nat -D POSTROUTING -s '10.10.10.1/31' -o enp37s0 -j MASQUERADE
#WAN - OPNSense

iface vmbr0 inet6 static
        address 2a01:e0a:XX:YYYY::4/127
        up ip route add 2a01:e0a:XX:YYYY::/64 via 2a01:e0a:XX:YYYY::5

auto vmbr1
iface vmbr1 inet manual
        bridge-ports none
        bridge-stp off
        bridge-fd 0
#LAN
un mois plus tard

du coup moi aussi , j'ai envie de tester ça 😂

    MattProd oui c'est possible, mais ca risque d'être drôle qd même

    Bonjour. Je réctifie aussi la commande du nat, c'est --dports (avec un S)

    post-up iptables -t nat -A PREROUTING -i enp0s31f6 -p tcp -m multiport ! --dports 22,8006 -j DNAT --to-destination 10.10.10.1
    post-up iptables -t nat -A PREROUTING -i enp0s31f6 -p udp -j DNAT --to-destination 10.10.10.1

      bastienwolf woups oui en effet coquille en écrivant :/ et comme j'ai clairement eu 0 temps pour relire, finir :/

      5 mois plus tard

      Salut a tous.

      J'ai bien suivi le tuto pour la configuration du reseau, j'ai ensuite installé OPNSense, pui une VM debian sur le reseau LAN pour acceder a l'interface de OPNSense.

      Mon probleme est que je n'ai pas internet ?
      Depuis la console OPNsense j'arrive a ping 8.8.8.8 mais pas www.google.fr

      Depuis la VM j'ai acces a OPNsnse GUI mais pas a internet ni au ping 8.8..8.8

      Avez vous une idée ? Surement un probleme de regle parfeu mais je ne trouve pas.

      Merci d'avance

      Alors pour faire suite à ton post @BobRegMan ( on a eu la discussion sur Discord )
      Il s'agissait d'un problème de gateway sur la patte wan : réglé en autodetect là où on devait avoir 10.10.10.0 ( exemple )

        un mois plus tard

        @MattProd i love you!!!

        With your guide I was able to get everything working the first time, I only have one problem.

        my public IP is 78.78.78.78 for example...

        I have 2 virtual machines with Windows 7 and a hello world with python... port 7775 and 7776

        when I access 78.78.78.78:7775 or 78.78.78.78:7776 from outside... I see the Hello World correctly.

        But... if from the virtual machine I try to access 78.78.78.78:7775 or 7776... or even 78.78.78.78:9000 (opnsense) but i can access from outside to 78.78.78.78:9000 (opnsense admin)

        I can't access... I can browse the entire Internet without problems from the virtual machines but I can't access my own Public IP...

        On the other hand, if I can access 192.168.1.10:7775 and 192.168.1.11:7776 from both without problem as well

          KatiaSis you're welcome 😊
          Yep, I see the problem about the "loopback", before my ten days away from home I tried to solve it because another user asks me the same thing 😱
          I'm absolutely sure the thing it's easy like Hello 😅

          Stay in touch if we find you or me the properly solution 😉

          PS : sorry for my English by the way 😂

            MattProd

            Apparently it is a problem with OPNSense, in my homelab I have it installed on one server and on another I have proxmox but the virtual machines see each other over the WAN without a problem, I have not configured anything extra... but I remember having had that problem once and it was something about reflection, now I'm going to activate it and restart everything to see if that's it.

            If I find the solution, I'll post it!

            in my homelab i have this:

            Firewall -> Settings -> Advanced

            Network Address Translation
            Reflection for port forwards
            Reflection for 1:1
            Automatic outbound NAT for Reflection

            all enableds...

            @MattProd !!!!

            Firewall -> Settings -> Advanced

            Network Address Translation
            Reflection for port forwards
            Reflection for 1:1
            Automatic outbound NAT for Reflection

            and... in NAT - > Port Forward...

            LAN WAN	TCP/UDP	*	*	*	7775	192.168.1.11	7775

            in Destination set "Any" from Network

            NAT reflection... select -> Use system default... in Filter rule association... select -> None

            And the VM can access to other VM over Public IP too!!!

              20 jours plus tard

              @MattProd Hello!

              I have found another problem, in my homelab it does not happen but in the hetzner server it does...

              I have a virtual machine with any, any, any... at the IP 192.168.1.100 as the last rule (type dmz)

              The problem is that when it is active, the other virtual machines are accessible from the outside, but they cannot browse the internet...

              For example, another virtual machine with IP 192.168.1.30 255.255.255.0 192.168.1.1
              DNS: 1.1.1.1

              Browse the internet as long as the dmz rule of 192..168.1.100... is deactivated.

              Note that when the virtual machine cannot navigate and you do a ping, the one that responds is 192.168.1.100.... My idea would be that being in DMZ it captures DNS port 53 and forces it to go through 192.168.1.100 but. .. if I create a new dns rule and point it to 192.168.1.1 and place it above the dmz.... it doesn't work either.

                KatiaSis Hello 🙂
                Can you paste an screenshot of your rules ? or DM me on Discord

                un mois plus tard
                un mois plus tard

                Bonjour,

                Cela ne fonctionne pas pour moi. J'ai biensur du faire un truc stupide... Vu mes compétances réseau.

                Mon fichier interface :

                source /etc/network/interfaces.d/*
                
                auto lo
                iface lo inet loopback
                iface lo inet6 loopback
                
                auto enp0s31f6
                iface enp0s31f6 inet static
                        address 94.130.XXX.YYY/26
                        gateway 94.130.XXX.65
                        up route add -net 94.130.XXX.64 netmask 255.255.255.192 gw 94.130.XXX.65 dev enp0s31f6
                        post-up iptables -t nat -A PREROUTING -i enp0s31f6 -p tcp -m multiport ! --dports 22,8006 -j DNAT --to-destination 10.0.0.1
                        post-up iptables -t nat -A PREROUTING -i enp0s31f6 -p udp -j DNAT --to-destination 10.0.0.1
                # route 94.130.XXX.64/26 via 94.130.XXX.65
                
                iface enp0s31f6 inet6 static
                        address 2a01:4f8:XXX:YYYY::2/64
                        gateway fe80::1
                
                auto vmbr0
                iface vmbr0 inet static
                        address 10.0.0.0/26
                        bridge-ports none
                        bridge-stp off
                        bridge-fd 0
                        post-up iptables -t nat -A POSTROUTING -s '10.0.0.1/26' -o enp0s31f6 -j MASQUERADE
                        post-down iptables -t nat -D POSTROUTING -s '10.0.0.1/26' -o enp0s31f6 -j MASQUERADE
                # OPNSense WAN - Proxmox LAN
                
                auto vmbr1
                iface vmbr1 inet manual
                        bridge-ports none
                        bridge-stp off
                        bridge-fd 0

                Comment dois-je configurer mon interface WAN dans OPNsense ?

                Je suis perdu.

                Répondre…