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