Forum Linux.général Auto-hébergement derrière CGNAT et OpenVPN avec connexion internet d'un tiers

Posté par  . Licence CC By‑SA.
Étiquettes :
3
12
mai
2025

Bonjour la compagnie 👋,

Je lance aujourd'hui une bouteille à la mer.
Bien que je n'avais plus le temps de faire autre chose que les mises à jour sur mon petit serveur auto-hébergé à la maison, celui-ci était bien utilisé, notamment par ma famille que j'avais (difficilement) réussi à convaincre de basculer sur mon serveur de messagerie matrix (avec en complément un bridge whatsapp)

Ma ligne internet est coupée depuis 5 jours 🥵 et la réparation via le FAI pourrait désormais ne pas avoir lieu avant la fin du mois 😱…
Une box 4G m'a été prêtée mais évidement pas possible d'attaquer l'IP publique de cette box 4G pour atteindre le serveur.

Depuis j'essaye de mettre en place un VPN pour utiliser la connexion internet d'un tiers habitant à proximité. J'ai réussi à installer un serveur temporaire OpenVPN chez lui et à établir la connexion depuis le réseau derrière la box 4G 👍️

🆘 Si certains sont calés en iptables, nftables et OpenVPN, j'aurais besoin d'un coup de mains pour que tout cela communique correctement. (ce n'est pas le cas actuellement).
=> Je suppose qu'il faut créer des routes, des ponts, d'autres choses?

Avant la coupure cela fonctionnait ainsi:
001_Hebergement avant panne

Chaque service tourne dans un conteneur LXC unpriviligied indépendant.
Alors je sais beaucoup de services étaient attaqués directement par leur port alors qu'il aurait mieux fallu passer par le reverse proxy. Mais bon je n'y suis pas arrivé pour tous les services et cela fonctionnait donc voilà :)

Mise en place de la Box 4G, du VPN hébergé sur le serveur (à gauche ma maison avec le serveur qui fonctionnait jusque là; à droite la maison d'un tiers chez qui j'ai installé le serveur temporaire avec OpenVPN (également dans un conteneur LXC unprivilegied) (ce qui est entouré en vert est nouveau):
002_Hebergement avec solution secours 4G et tiers

J'arrive à établir la connexion entre mon routeur OpenWRT (à gauche) ou un PC en 192.168.11.4 (à gauche) et le serveur OpenVPN (à droite):
003_OpenVPN connecte
Lorsque c'est fait, je peux me connecter en ssh aux différents conteneurs en 10.0.4.x de droite à travers le VPN. Par contre, je perds l'accès internet à gauche.

Voilà il me reste à configurer tout ça, ajouter les règles pour le client extérieur attaquant l'IP publique de droite atteigne son service sur le serveur de gauche en passant par le VPN:
Reseau14_004_Comment arriver a faire ca

J'ai déjà sollicité l'aide précieuse du salon matrix auto-hébergement ce qui a notamment permis d'avoir le subnet du serveur temporaire de droite différent de celui gauche (10.0.4.0 vs 10.0.3.0)
Il m'a été conseillé de faire les choses suivantes :
Sens Entrée:
- Une redirection vers le serveur Temporaire de chacun des port => Je pense que c'est fait (voir règles décrites sur le croquis 004)
- X Nat sur l'ip 10.0.3.11/32, sur l'ip 10.0.3.12/32 , sur l'ip 10.0.3.13/32 etc… ou voir pour faire du /31 / 30 etc… => C'était avant d'arriver à changer le subnet de lxcbr0 sur le serveur temporaire (de droite). Du coup il doit être possible de faire cela d'un coup pour l'ensemble du subnet? Je n'ai aucune idée de comment faire
- Routage du serveur temporaire de 10.0.3.11/32, 10.0.3.12/32, 10.0.3.13/32 etc…. via le serveur OpenVPN => Idem
- Vérifier l'ip forward sur le serveur OpenVPN et mettre le routage de 10.0.3.11/32, 10.0.3.12/32, 10.0.3.13/32 etc… vers le client OpenVPN => Idem
- Vérifier l'ip forward sur le client OpenVPN => Je suppose qu'il s'agit de ce que j'ai mis dans la config du client OpenVPN, je vais décrire ci-dessous mais je ne maîtrise pas

Sens Sortie:
- Router sur les serveur 10.0.3.11/32, 10.0.3.12/32, 10.0.3.13/32 l'ip du serveur temporaire en /32 via le client OpenVPN => C'était avant d'arriver à changer le subnet de lxcbr0 sur le serveur temporaire (de droite). Du coup il doit être possible de faire cela d'un coup pour l'ensemble du subnet? Je n'ai aucune idée de comment faire
- Sur le client OpenVPN faire le routage l'ip du serveur temporaire en /32 => Idem

La config du serveur OpenVPN propre au réseau:

port 1194
proto udp
dev tun
topology subnet
client-config-dir ccd
push "redirect-gateway def1 bypass-dhcp"
client-to-client
keepalive 5 60
cipher AES-256-GCM
max-clients 5
max-routes-per-client 50
stale-routes-check 300
verify-client-cert require
auth SHA512
tls-server
tls-version-min 1.3
remote-cert-tls client
crl-verify crl.pem
push "block-outside-dns"
user openvpn
group openvpn
mute 10
explicit-exit-notify 1

La config du client OpenVPN propre au réseau:

client
dev tun
remote IPPubliquedutiers(droite) 1194 udp
auth SHA512
cipher AES-256-GCM
tls-client
tls-version-min 1.3
remote-cert-tls server
connect-retry 5 600
resolv-retry infinite
nobind
verb 3
mute 10
explicit-exit-notify 1

Voilà j'aimerais mettre en place tout ce qu'il faut pour que:
- Le serveur derrière la Box 4G en CGNAT soit accessible de l'extérieur au travers du VPN
- Avoir accès internet sur le réseau de gauche lorsque le VPN est connecté (via la Box 4G ou via la connexion du tiers, peu importe.)
- Ne rien rater sur la sécurité du bouzin
- Comprendre ce que je fais (oui parce que pour la mise en place du VPN j'ai suivi au moins 6 tutos avec certains points restés obscurs)

En tout cas, déjà, merci beaucoup d'avoir lu jusque là ^

  • # le plus simple

    Posté par  . Évalué à 5 (+2/-0). Dernière modification le 12 mai 2025 à 11:51.

    Chez TOI :
    1°) chez toi, definir le client VPN comme la gatewway par defaut de tes machines, le plus simple donne lui simplement la meme IP que ta box internet (celle qui ne fonctionne plus, et debranche celle-ci)
    seul le client VPN aura comme passerelle la box 4G

    => bon c'est deja le cas, tu as un routeur openWRT en coupure entre ton ADSL/4G et ton LAN
    => OK

    Chez ton voisin
    1°) masquer tous tes trafics derrieres ton serveur openvpn, ainsi toutes tes machines sortantes seront vu comme etant le "serveur VPN", le retour se fera alors par la box du voisin, qui renverra vers le serveur VPN, qui renverra au client

    2°) Pour les services Externes qui vont rentrés par la box du voisin, redirection de port sur la box ou DMZ vers le serveur VPN, puis routage classique

    2.1°) ajouter une route vers le reseau LAN de gauche (chez toi derriere la 4G) via le tunnel VPN du server VPN

    ip r a 10.0.x.y/24 via ipclientVPN

    2.2°) faire des regles de nat prerouting (redirection de port sur le serveur VPN) pour que le port XXXX coté LAN du server VPN, soit renvoyé vers l'IP YYYY de ton lan sur le port XXXX

    • [^] # Re: le plus simple

      Posté par  . Évalué à 1 (+0/-0).

      Bonjour,

      Merci beaucoup pour ces réponses. Ne travaillant pas dans l'informatique, j'essaye de traduire cela en faisant des recherches.. Est-ce qu'il est possible d'avoir un peu de détail/confirmation ci-après ?

      Chez le voisin:
      1°)
      Sur le conteneur serveur OpenVPN j'avais fait cela:
      sudo nano /etc/sysctl.conf

      avec ajout de:
      net.ipv4.ip_forward=1

      Puis cette règle iptable:
      sudo iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -j MASQUERADE

      Est-ce qu'il faut faire quelque chose de plus?

      2°)
      Sur dernier croquis j'avais indiqué tous les ports routés, j'espère qu'il y a tout.

      En résumé c'était : Sur box fibre du voisin : ports routés vers IP du serveur temporaire
      Sur serveur temporaire : port routés vers conteneur du serveur OpenVPN

      Et là je ne sais pas comment faire le reste du routage. Je suppose qu'il y a des règles à mettre dans le conteneur serveur OpenVPN

      2.1°)
      Donc c'est une commande en dehors d'iptables pour ajouter une route?
      Du coup si j'ai bien compris de l'ip du conteneur serveur OpenVPN (côté voisin) vers le routeur OpenWRT client OpenVPN (côté chez moi)? du coup cela? :
      ip r a 192.168.11.1/24 via 10.0.4.17 dev eth0

      2.2°)
      Donc là je mets simplement en place dans le conteneur serveur OpenVPN le routage des ports vers le routeur OpenWRT de l'autre côté?
      Comme ceci?:
      iptables -t nat -A PREROUTING -p tcp --dport 3001 -j DNAT --to-destination 192.168.11.1
      iptables -t nat -A PREROUTING -p tcp --dport 3002 -j DNAT --to-destination 192.168.11.1
      iptables -t nat -A PREROUTING -p tcp --dport 3xxx -j DNAT --to-destination 192.168.11.1

      Est-ce que grâce au VPN il aura bien accès au réseau 192.168.11.x de chez moi?

      Ensuite°)
      Comment faire pour que le côté chez moi (gauche) utilise le VPN pour accéder à l'internet? Le point 1°) suffit?

      • [^] # Re: le plus simple

        Posté par  . Évalué à 3 (+0/-0).

        udo iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -j MASQUERADE

        qui est ce reseau 10.8.0.0/24 c'est ton reseau VPN ?

        dans ton 1), precise le sens de ton flux pour etre sur
        ici pour masquer ce qui vient des clients VPN derriere l'ip du serveur VPN, cela evite de devoir modifier les routeurs 192.168.1.6 et la box de ton voisin pour qu'il connaissent tes reseaux 10.0.4.0, 10.8.0.0, 192.168.11.0 …

        iptables -t nat -A POSTROUTING -i tun0 -o ethLAN -s 10.8.0.0/24 -j MASQUERADE

        j'imagine que tu as deja aussi un MASQUERADE pour que ton 10.0.4.17 puissent aller sur internet via lxcbr0, derriere l'IP 192.168.1.6

        dans ton 2)
        2.1) pour faire un routage sous linux :

        ip r a DESTINATION via ROUTEUR

        coté serveur VPN pour acceder au 192.168.11.0/24 via le client VPN

        ip r a 192.168.11.0/24 via 10.8.0.x (IPClientVPN)

        coté client VPN pour lui préciser comment acceder à 10.0.4.x/24, c'est un openWRT, cherche dans les menus le routage static pour lui dire que pour joindre 10.0.4.0/24 il faut passer par l'IP du serveur VPN (mais en principe ton client VPN doit deja avoir une route par defaut qui envoie tout dans le VPN)

        2.2) sur ton serveur openvpn,
        IP_FORWARD=1 evidemment pour que ca circule entre les interfaces (lan <-> tun0)
        ROUTAGE comme indiqué

        • [^] # Re: le plus simple

          Posté par  . Évalué à 1 (+0/-0).

          Bonjour,

          Merci pour le suivi :)

          qui est ce réseau 10.8.0.0/24 c'est ton réseau VPN ?

          Oui c'est le tunnel VPN si j'ai bien compris (10.8.0.1 pour l'ip de tun0 côté serveur openVPN).

          dans ton 1), précise le sens de ton flux pour être sur

          Pour cette règle iptable mise en place sur le serveur openVPN en 10.0.4.17 ?

          sudo iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -j MASQUERADE
          Je l'enlève et je la remets avec soit 10.8.0.1 soit 10.8.0.2 (ou 3 selon le client VPN) c'est ça?

          j'imagine que tu as déjà aussi un MASQUERADE pour que ton 10.0.4.17 puisse aller sur internet via lxcbr0, derrière l'IP 192.168.1.6

          Absolument pas XD. Par contre je pense que c'est automatique tel qu'est créé le conteneur. (Je vois que le conteneur serveur openVPN a en route par défaut l'hôte du serveur temporaire: 10.0.4.1). Et il a bien déjà accès internet.

          Par forcément en lien, mais après réflexion cela ne me gêne pas que le côté CGNAT / gauche continue d’accéder à internet directement par la box 4G CGNAT. Ce sera plus rapide que de passer par le tunnel VPN.
          j'ai donc retiré cette ligne de la configuration du serveur openVPN :

          push "redirect-gateway def1 bypass-dhcp"
          > coté serveur VPN pour accéder au 192.168.11.0/24 via le client VPN
          ip r a 192.168.11.0/24 via 10.8.0.x (IPClientVPN)

          Alors curieusement si je mets seulement cette route côté serveur VPN cela ne suffit pas pour pouvoir 'pinguer' le client VPN depuis le serveur openVPN. Il faut que j'ajoute une

          iroute subnetducient 255.255.255.0
          dans /etc/openvpn/ccd/nomduclient sur le serveur VPN.

          coté client VPN pour lui préciser comment accéder à 10.0.4.x/24, c'est un openWRT, cherche dans les menus le routage static pour lui dire que pour joindre 10.0.4.0/24 il faut passer par l'IP du serveur VPN (mais en principe ton client VPN doit déjà avoir une route par défaut qui envoie tout dans le VPN)

          Dans la conf du serveur openVPN j'ai ajouté un

          push "route 10.0.4.0 255.255.255.0"
          Pour que la route soit automatiquement créée sur le client. Cela à l'air de fonctionner parce que depuis le client VPN je peux pinguer le conteneur serveur openVPN en 10.0.4.17 et même le serveur temporaire en 10.0.4.1.

          Sur le salon matrix auto-hébergement certains m'ont conseillés de mettre le client VPN plutôt sur un conteneur du serveur initial (celui qui a tous les services et que j'aimerais faire fonctionner derrière la 4G/CGNAT). Cela change un peut l'orientation mais le principe reste le même je pense.
          J'ai refais les croquis, je passerais de ça:

          004_Comment arriver a faire ca

          à ca:

          005_Nouvel essai

          Est ce que ce sera plus simple ou il vaut mieux rester avec le routeur en client VPN?

          Une fois que j'arrive à pinguer dans les deux sens comment est-ce que je fais pour que les requêtes des clients qui arrivent par internet côté fibre/droit arrivent bien jusqu'aux conteneurs des serveurs de services côté 4G/CGNAT/gauche?

          J'ai tenté de faire une redirection de port entre le serveur OpenVPN et le client VNP puis entre le client VPN et l'hôte du serveur (côté gauche 4G/CGNAT).
          J'ai tenté de faire une redirection de port entre le serveur OpenVPN et le l'hôte du serveur (côté gauche 4G/CGNAT) directement.
          J'ai tenté de faire une redirection de port entre le serveur OpenVPN et les conteneurs des serveurs de services côté 4G/CGNAT/gauche encore plus directement.

          Mais jusque là si j'arrive à voir certains trafics passer jusqu'au client VPN avec tcpdump, je n'arrive pas à obtenir la page du service depuis l'extérieur.

          • [^] # Re: le plus simple

            Posté par  . Évalué à 3 (+0/-0).

            Est ce que ce sera plus simple ou il vaut mieux rester avec le routeur en client VPN?

            techniquement y a pas de "mieux", c'est toi qui vois en fonction de ton besoin.

            si tu as besoin que des machines de gauche accedent aux machines de droites (ou au conteneur de droite) alors il faut que le VPN soit sur ton routeur internet (openwrt)

            si c'est uniquement pour les conteneurs de gauche, alors oui ce serait pertinent que le client soit dans un conteneur, et que les autres passent par lui pour aller sur internet

            • [^] # Re: le plus simple

              Posté par  . Évalué à 1 (+0/-0).

              Je pense que je vais rester sur le routeur en client openVPN, si j'ai bien compris comme ça côté gauche je n'aurai pas à toucher à la config des conteneurs ou du serveur?

              Je pourrai activer / désactiver la solution de secours sur le routeur de façon transparente.

              J'ai fait une page de synthèse des configs réseau, est-ce qu'il y a quelque-chose qui m'échappe ou que je ne fais pas comme il faut?

              Config réseau VPN client routeur

              • [^] # Re: le plus simple

                Posté par  . Évalué à 3 (+0/-0).

                J'ai fait une page de synthèse des configs réseau, est-ce qu'il y a quelque-chose qui m'échappe ou que je ne fais pas comme il faut?

                bah là maintenant la question c'est : que te manque-t-il ?
                tu as testé sur chacun des equipements en cours de trajet voir si tu vois tes flux ?

                une commande magique à connaitre :

                tcpdump -vnni any host XX.YY.ZZ.TT

                pour voir tout ce qui entre et sort de cette machine et qui a comme IP XX.YY.ZZ.TT

                Ctrl+C pour interrompre le dump

                • [^] # Re: le plus simple

                  Posté par  . Évalué à 1 (+0/-0).

                  Merci pour la commande magique ;)
                  Alors je peux voir qu'un utilisateur venant d'internet qui se connecte sur l'IP publique de la Box Fibre (B) sur le port 3000 arrive bien dans le conteneur du serveur souhaité (A112) puisque dans ce conteneur le port en question s'active bien sur tcpdump.
                  Le problème c'est qu'il se heurte à un beau "Le délais d'attente a été dépassé"

                  Depuis les conteneurs côté 4G/CGNAT (A112) je vois que l'accès internet ne se fait pas au travers du VPN, et je demande s'il est possible d'avoir l'entrée qui arrive de la fibre (B) et la sortie qui passe par le CGNAT (A). L'utilisateur extérieur ne doit sûrement pas faire le lien entre les 2.

                  Je n'arrive pas non plus à utiliser l'internet Fibre (B) depuis le côté CGNAT (A1, A11 et A112) quand le tunnel VPN est établi.
                  Si j'active le push "redirect-gateway def1" sur la configuration du serveur VPN je n'ai d'ailleurs plus du tout d'internet côté CGNAT.

                  Je suppose qu'il me manque encore des choses dans ma configuration et veut bien un peu d'aide ou des pistes à creuser.
                  J'ai essayé pas mal de chose mais pour beaucoup je ne sais pas exactement ce que je fais et il me reste beaucoup de questions:

                  1. Est qu'il faut que je fasse un MASQUERADE ailleurs que sur le serveur openVPN (B11)? (Les hôtes LXC des serveurs ont apparemment déjà un "MASQUERADE" sur tout ce qui n'est pas respectivement en 10.0.3.0 et 10.0.4.0)

                  2. Est -ce qu'il faut que je passe net.ipv4.ip_forward=1 ailleurs que sur le conteneur serveur openVPN (B11) ? (Apparemment déjà le cas par défaut sur le routeur A1)

                  3. Est-ce que sur le conteneur serveur openVPN (B11) il faut que le DNAT du port 3000 soit vers le routeur (A1) ou directement vers l'hôte serveur (A11) ou le conteneur (A112)? (Cela semble fonctionner avec l'hôte serveur (A11))

                  4. Sur la configuration du serveur openVPN (B11):

                    • Faut il activer le push "redirect-gateway def1"? Si oui comment faire pour ne pas perdre l'accès internet côté client?
                    • Faut il activer le push "block-outside-dns"?
                  5. J'ai essayé de suivre cette page https://openwrt.org/docs/guide-user/services/vpn/openvpn/client-luci pour la config de du routeur (A1) en client openVPN. Est-ce qu'il y a d'autres choses à faire sur ce routeur (A1) comme:

                    • Autoriser le "FORWARD"?
                    • un "MASQUERADE"?
                    • Autre?
                  6. Est-ce qu'il est possible de faire des chemins différents entre l'entrée et la sortie? Du genre l'usager extérieur se connecte par la box fibre (B) mais le serveur répond par la box 4G CGNAT (A)? (Pour gagner en rapidité si cela ne complique pas)

                  7. Est-ce que j'ai besoin de créer manuellement les routes (avec ip route ccc.ccc.ccc.0/24 via ddd.ddd.ddd.ddd dev xxx) lorsque la config réseau (fichier interfaces ou eth0.network) défini déjà une passerelle par défaut avec ce réseau ddd.ddd.ddd.ddd?

                  8. Comment faire pour que la sortie vers internet côté CGNAT (A1, A11 et A112) passe par la box côté fibre (B)?

                  Synthèse configs réseaux VPN

                  • [^] # Re: le plus simple

                    Posté par  . Évalué à 1 (+0/-0). Dernière modification le 22 mai 2025 à 11:45.

                    .9. Est-ce que le fait que les deux box (A) et (B) soient toutes deux en 192.168.1.0 peut poser problème?

                  • [^] # Re: le plus simple

                    Posté par  . Évalué à 3 (+0/-0). Dernière modification le 22 mai 2025 à 11:46.

                    si tu le vois bien traverser en entrée (client -> IP box -> serveur VPN -> machine finale)
                    mais que le client n'a pas de retour (timeout) alors oui il te faut investiguer la partie "sortie internet"

                    car comme tu l'evoques il est possible que la machine finale, pour repondre au client sortent directement sur internet.

                    c'est ce que l'on appelle du routage assymetrique ca rentre d'un coté, ca sort de l'autre.

                    Deux possibilités

                    • la plus rapide, SNAT/MASQUERADE tes clients derriere l'IP VPn du serveur VPN
                      ainsi la machine finale verra une demande provenant du serveur VPN via son IP vpn, repondra à son routeur par defaut, qui lui sait qu'il faut repondre par le VPN

                    • la plus complete activer :

                      • ip forward sur le routeur client VPN
                      • laisser le redirect default pour que le client change sa passerelle par defaut par le serveur VPN
                      • sur le serveur VPN : ipforward evidemment + MASQUERADE de ce qui sort de ton reseau VPN derriere l'IP LAN du serveur VPN

Envoyer un commentaire

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.