Cloud serveur Proxmox 6.x sur un serveur Kimsufi avec pfSense et Openvpn |
Article original Publié le : 17 avril 2021 Mise a jour le : 25 aout 2022 Mise a jour le : 15 mai 2022 |
Pour faire suite a l’article https://it.izero.fr/proxmox-cloud-serveur-proxmox-6-x-sur-un-serveur-kimsufi/
Pour les premiers tests, j’ouvrais les flux avec iptables mais cela devient vite trop lourd à gérer.
Du coup, Les vm’s seront exposé derriere un firewall pfSense et administrable via Openvpn
L’ensemble du trafic sera re-routé a l’exception du port ssh, http/https et du webui serveur proxmox qui reste ouvert depuis iptables sur mes ip’s publiques.
Bref, j’ai essayé de schématiser 😆
I. Configuration réseau sur le socle Proxmox
Il faut créer les bridges virtuels vmbr1 et 2
En cli
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
auto lo iface lo inet loopback iface enp1s0 inet manual iface enp2s0 inet manual auto vmbr0 iface vmbr0 inet dhcp bridge-ports enp1s0 bridge-stp off bridge-fd 0 auto vmbr1 iface vmbr1 inet static address 10.0.0.1 netmask 30 bridge-ports none bridge-stp off bridge-fd 0 auto vmbr2 iface vmbr2 inet static address 192.168.50.1 netmask 24 bridge-ports none bridge-stp off bridge-fd 0 |
le vmbr0 est lié à l’interface qui porte l’IP publique
le vmbr1 servira de passerelle avec la pate wan du pfSense, son plan d’adressage sera 10.0.0.1/30
le vmbr2 servira aux vm’s et a la pate lan du pfSense, son plan d’adressage sera 192.168.50.1/24
II. pfSense
Pour les specs ca tourne correctement avec 1GO ram, 2 vcpu, 10GO hdd et deux cartes réseaux
net0 qui sera rattaché a vmbr1
net1 qui sera rattaché a vmbr2
Récupérer l’iso depuis le repo officiel https://www.pfsense.org/ puis assigner les interfaces réseaux a l’installation
l’adresse WAN sera sur l’interface vtnet0 et portera l’adresse 10.0.0.2/30
IPv4 Upstream gateway: 10.0.0.1
l’adresse LAN sera sur l’interface vtnet1 et portera l’adresse 192.168.50.2/24
IPv4 Upstream gateway: none
III. Tunneling ssh
Pour la première connexion a pfSense, le plus simple, c’est de faire un tunnel ssh sur le seul port ouvert en redirigeant le 80 vers 8080
Une autre solution serait de créer une vm avec une interface graphique sur le bond vmbr2, qui permettra d’avoir un accès direct depuis le mode console
1 |
$ ssh -p2222 ip_public_kimsufi -L 8080:ip_lan_pfSense:80 |
Se connecté sur l’interface depuis localhost sur le port declaré
On profite pour changer le mot de passe et le port d’administration en https
Il faudra également activer la rule wan pour administrer le firewall depuis l’extérieur et autorisé en source son ip public
On peut en profiter pour changer le port d’administration 443 par 8443
Aller dans Interface / Wan et décocher Block private networks and loopback addresses
Puis aller dans System / Advanced / Admin Access
Puis dans les rules
IV. Iptables
/!\ Un recap de l’état de l’iptables avec un INPUT et OUTPUT en drop
#INPUT
1 2 3 4 5 6 7 8 9 10 11 |
$ sudo iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT $ sudo iptables -A INPUT -p udp -m udp --sport 67:68 --dport 67:68 -m comment --comment "dhcp ovh port" -j ACCEPT $ sudo iptables -A INPUT -p icmp -j ACCEPT $ sudo iptables -A INPUT -i lo -j ACCEPT $ sudo iptables -A INPUT -s mon_ip_publique/32 -p tcp -m tcp --dport 2222 -m comment --comment "ssh port" -j ACCEPT $ sudo iptables -A INPUT -s mon_ip_publique/32 -p tcp -m tcp --dport 8006 -m comment --comment "webgui port" -j ACCEPT $ sudo iptables -A INPUT -p tcp -m tcp --dport 53 -m comment --comment "dns port" -j ACCEPT $ sudo iptables -A INPUT -p udp -m udp --dport 53 -m comment --comment "dns port" -j ACCEPT $ sudo iptables -A INPUT -p tcp -m tcp --dport 5900:5999 -m comment --comment "vnc port" -j ACCEPT $ sudo iptables -A INPUT -p tcp -m tcp --dport 443 -m comment --comment "Lets encrypt port" -j ACCEPT $ sudo iptables -A INPUT -p tcp -m tcp --dport 80 -m comment --comment "Lets encrypt port" -j ACCEPT |
#FORWARD
1 |
$ sudo iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT |
#OUTPUT
1 2 3 4 5 6 7 8 9 10 11 |
$ sudo iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT $ sudo iptables -A OUTPUT -p udp -m udp --sport 67:68 --dport 67:68 -j ACCEPT $ sudo iptables -A OUTPUT -p icmp -j ACCEPT $ sudo iptables -A OUTPUT -o lo -j ACCEPT $ sudo iptables -A OUTPUT -s mon_ip_publique/32 -p tcp -m tcp --dport 2222 -j ACCEPT $ sudo iptables -A OUTPUT -p udp -m udp --dport 53 -j ACCEPT $ sudo iptables -A OUTPUT -p tcp -m tcp --dport 53 -j ACCEPT $ sudo iptables -A OUTPUT -p udp -m udp --dport 123 -j ACCEPT $ sudo iptables -A OUTPUT -p tcp -m tcp --dport 5900:5999 -j ACCEPT $ sudo iptables -A OUTPUT -p tcp -m tcp --dport 443 -j ACCEPT $ sudo iptables -A OUTPUT -p tcp -m tcp --dport 80 -j ACCEPT |
Pour l’interface pfSense
1 2 |
<del>$ sudo iptables -A OUTPUT -s mon_ip_publique/32 -p tcp -m tcp --dport 8443 -j ACCEPT $ sudo iptables -A INPUT -s mon_ip_publique/32 -p tcp -m tcp --dport 8443 -j ACCEPT</del> |
Si ces regles sont correctes, on peut passer au nat
Activer le FORWARD
1 |
$ echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward |
Pour le PREROUTING, voici l’ordre pour conserver la connexion au ssh et au webgui
Port SSH
1 |
$ sudo iptables -t nat -A PREROUTING -i vmbr0 -p tcp --dport 2222 -j ACCEPT |
Port WEB
1 |
$ sudo iptables -t nat -A PREROUTING -i vmbr0 -p tcp --dport 8006 -j ACCEPT |
Port Let’s Encrypt (a n’activer qu’au besoin si service externe utilisé)
1 2 |
$ sudo iptables -t nat -A PREROUTING -i vmbr0 -p tcp --dport 80 -j ACCEPT $ sudo iptables -t nat -A PREROUTING -i vmbr0 -p tcp --dport 443 -j ACCEPT |
Enfin renvoyer tout le traffic vers la pate WAN du pfSense
1 |
$ sudo iptables -t nat -A PREROUTING -i vmbr0 -j DNAT --to 10.0.0.2 |
Activer la SNAT
1 |
$ sudo iptables -t nat -A POSTROUTING -o vmbr0 -j SNAT -s 10.0.0.0/30 --to-source IP_PUB_KIMSUFI |
# Rediriger les paquets destinés au LAN pour l’interface WAN du pfSense
1 |
$ sudo ip route change 192.168.50.0/24 via 10.0.0.2 dev vmbr1 |
Voici ce que l’on devrait avoir en listant les routes
1 |
$ sudo ip route |
1 2 3 4 |
default via PASSERELLE_KIMSUFI dev vmbr0 10.0.0.0/30 dev vmbr1 proto kernel scope link src 10.0.0.1 RANGE_KIMSUFI/24 dev vmbr0 proto kernel scope link src IP_PUB_KIMSUFI 192.168.50.0/24 via 10.0.0.2 dev vmbr1 |
1 |
$ sudo route -n |
1 2 3 4 5 6 |
Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 IP_PUB_KIMSUFI 0.0.0.0 UG 0 0 0 vmbr0 10.0.0.0 0.0.0.0 255.255.255.252 U 0 0 0 vmbr1 RANGE_KIMSUFI 0.0.0.0 255.255.255.0 U 0 0 0 vmbr0 192.168.50.0 10.0.0.2 255.255.255.0 UG 0 0 0 vmbr1 |
Normalement on est bon, on peut verifier les règles iptables
1 |
$ sudo iptables -L |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
Chain INPUT (policy DROP) target prot opt source destination ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED ACCEPT udp -- anywhere anywhere udp spts:bootps:bootpc dpts:bootps:bootpc ACCEPT icmp -- anywhere anywhere ACCEPT all -- anywhere anywhere ACCEPT tcp -- mon_ip_publique anywhere tcp dpt:2222 ACCEPT tcp -- mon_ip_publique anywhere tcp dpt:8006 ACCEPT tcp -- anywhere anywhere tcp dpt:domain ACCEPT udp -- anywhere anywhere udp dpt:domain ACCEPT tcp -- anywhere anywhere tcp dpts:5900:5999 ACCEPT tcp -- anywhere anywhere tcp dpt:https ACCEPT tcp -- anywhere anywhere tcp dpt:http Chain FORWARD (policy ACCEPT) target prot opt source destination ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED Chain OUTPUT (policy DROP) target prot opt source destination ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED ACCEPT udp -- anywhere anywhere udp spts:bootps:bootpc dpts:bootps:bootpc ACCEPT icmp -- anywhere anywhere ACCEPT all -- anywhere anywhere ACCEPT tcp -- mon_ip_publique anywhere tcp dpt:2222 ACCEPT udp -- anywhere anywhere udp dpt:domain ACCEPT tcp -- anywhere anywhere tcp dpt:domain ACCEPT udp -- anywhere anywhere udp dpt:ntp ACCEPT tcp -- anywhere anywhere tcp dpts:5900:5999 ACCEPT tcp -- anywhere anywhere tcp dpt:https ACCEPT tcp -- anywhere anywhere tcp dpt:http ACCEPT tcp -- mon_ip_publique anywhere tcp dpt:8443 |
1 |
$ sudo iptables -t nat --line-numbers -L |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Chain PREROUTING (policy ACCEPT) num target prot opt source destination 1 ACCEPT tcp -- anywhere anywhere tcp dpt:2222 2 ACCEPT tcp -- anywhere anywhere tcp dpt:8006 3 ACCEPT tcp -- anywhere anywhere tcp dpt:80 4 ACCEPT tcp -- anywhere anywhere tcp dpt:443 5 DNAT all -- anywhere anywhere to:10.0.0.2 Chain INPUT (policy ACCEPT) num target prot opt source destination Chain OUTPUT (policy ACCEPT) num target prot opt source destination Chain POSTROUTING (policy ACCEPT) num target prot opt source destination 1 SNAT all -- 10.0.0.0/30 anywhere to:IP_PUB_KIMSUFI |
On peux maintenant sauvegarder les règles d’iptables dans un fichier
1 |
$ iptables-save | sudo tee /etc/network/save-iptables |
Editer le fichier interface et ajouter lui l’instruction pour la restauration du fichier au demarrage
1 |
$ sudo vim /etc/network/interfaces |
1 |
post-up iptables-restore < /etc/network/save-iptables |
V. Uptime Robot
Je rajoute ce pavé pour superviser l’etat du service avec ce monitor en ligne.
Voici la plage d’adresse a autorisé (je suis pas sur de la finalité de mettre toutes les ips), pour une meilleure lisibilité, j’ai taggué un commentaire
https://uptimerobot.com/inc/files/ips/IPv4andIPv6.txt
1 2 3 4 5 6 7 8 9 |
$ sudo iptables -A INPUT -s 216.144.250.150,46.137.190.132,122.248.234.23,188.226.183.141,178.62.52.237,54.79.28.129,54.94.142.218,104.131.107.63,54.67.10.127,54.64.67.106,159.203.30.41,46.101.250.135,18.221.56.27,52.60.129.180,159.89.8.111,146.185.143.14,139.59.173.249,165.227.83.148,128.199.195.156,138.197.150.151,34.233.66.117 -p tcp -m tcp --dport 8006 -m comment --comment "IP UPTIMEROBOT" -j ACCEPT $ sudo iptables -A INPUT -m iprange --src-range 69.162.124.226-69.162.124.237 -p tcp -m tcp --dport 8006 -m comment --comment "IP UPTIMEROBOT" -j ACCEPT $ sudo iptables -A INPUT -m iprange --src-range 63.143.42.242-63.143.42.253 -p tcp -m tcp --dport 8006 -m comment --comment "IP UPTIMEROBOT" -j ACCEPT $ sudo iptables -A INPUT -m iprange --src-range 216.245.221.82-216.245.221.92 -p tcp -m tcp --dport 8006 -m comment --comment "IP UPTIMEROBOT" -j ACCEPT $ sudo iptables -A INPUT -m iprange --src-range 208.115.199.18-208.115.199.30 -p tcp -m tcp --dport 8006 -m comment --comment "IP UPTIMEROBOT" -j ACCEPT |
VI. Openvpn
Dans les grandes lignes, j’utilise le module OpenVpn via pfSense,
La plage d’adresses pour les clients vpn est 192.168.51.0/24
La CA
Le certificat serveur (et client)
VII. Les règles pfSense pour Openvpn
Avec le Wizard les règles seront crées automatiquement
VII. Export du certificat client
Pour pouvoir exporter son certificat dans différents formats (.cer, ovpn …)
il faut installer le plugin openvpn-client-export depuis le menu SystemPackage / ManagerInstalled / Packages
VIII. NAT pfSense
Exemple pour l’ouverture de flux pour Let’s Encrypt pour une vm nécessitant le besoin
Il faut ouvrir le port 80 et 443 sur firewalld, et coté pfSense, naté les 2 ports et autorisé les ports entrants sur le lan
IX. Tips
Petit mémo pour l’administration d’iptables
- Lister les règles de NAT
1 |
$ sudo iptables -t nat --line-numbers -L |
- Pour supprimer une règle de PREROUTING
1 |
$ sudo iptables -t nat -D PREROUTING numero_regle |
- Pour supprimer une règle de POSTROUTING
1 |
$ sudo iptables -t nat -D POSTROUTING numero_regle |
- Lister les règles INPUT
1 |
$ sudo iptables -L INPUT --line-numbers |
- Pour supprimer une regle INPUT
1 |
$ sudo iptables -D INPUT numero_regle |
- Lister les règles OUTPUT
1 |
$ sudo iptables -L OUTPUT --line-numbers |
- Pour supprimer une règle OUTPUT
1 |
$ sudo iptables -D OUTPUT numéro_règle |
Shutdown Manually
1 |
$ echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward |
1 |
$ sudo ip route change 192.168.50.0/24 via 10.0.0.2 dev vmbr1 |
X. Sources
Quelques liens utiles
–https://computerz.solutions/pfsense-nat-pat-deux-serveurs-dns/
–https://www.pc2s.fr/pfsense-installation-et-configuration/