Avoir une IP fixe grâce à un VPN
Si votre FAI ne vous fournit pas d'adresse IP fixe, alors vous pouvez mettre en place un tunnel VPN comme décrit dans cette partie. Votre serveur sera alors accessible au public via l'IP du VPN, l'IP de votre serveur étant "cachée" derrirère.
Cela s'avère particulièrement utile si :
- Vous n'avez pas d'IP fixe fournie par votre FAI. Vous hébergerez alors votre VPN chez un intermédiaire. Ce dernier fera le relai vers votre serveur personnel.
- Votre fournisseur d'accès vous propose une IP qui a mauvaise réputation, vos mails atterissent toujours dans les spams.
- Vous ne faîtes pas confiance à votre FAI, vous souhaitez cacher le traffic proposé par votre serveur dans un tunnel.
- ...
Voici schématiquement ce que l'on cherche à faire:
+-----------+ +---------------------+ +--------------+ | Serveur +<------>+ Serveur avec une +<-----+ | | Personnel | VPN | IP fixe | | Visiteur | | | | (un VPS par exemple)| | | +-----------+ +---------------------+ +--------------+ IP cachée IP Publique
Peu importe votre IP, pour accéder à votre serveur, il suffira d'utiliser l'IP publique du serveur intermédiaire.
Pour mieux se comprendre ensuite, j'appelerai "sniper" le serveur caché derrière le VPN et "tank" le serveur dont on veut utiliser l'IP publique.
Avertissement sur le parefeu
Pour votre serveur personnel, vous devrez peut-être modifier votre parefeu. Désormais, le traffic parviendra à votre serveur par l'interface du VPN, c'est à dire "wg0" si vous l'avez configuré avec Wireguard ou bien "enc0" si c'est avec Iked.
WireguardIked
⚠ Pensez donc à adapter la configuration de votre parefeu.
Mise en place
On suppose par la suite que sniper et tank sont reliés par un VPN Wireguard.
Wireguard- "sniper" a pour IP 10.0.0.2 dans le VPN.
- "tank" a pour IP 10.0.0.1 dans le VPN (on s'en moque ici) et son IP publique est 192.0.2.2.
Vous n'aurez qu'à éditer le parefeu de tank pour ajouter une règle "binat-to" :
binat-toserv_int = "10.0.0.2" serv_ext = "192.0.2.2" [...] pass quick on egress from $serv_int to any binat-to $serv_ext [...] # ligne déjà présente: match out on egress from (wg0:network) to any nat-to (egress:0) [...] pass on wg0
Prenez bien soin de modifier les IP dans les variables "serv_*".
Rechargez le parefeu. Et voilà, c'est terminé 😊
Certains voudront peut-être plus finement parématrer leur parefeu. C'est possible avec les règles rdr-to :
serv_int = "10.0.0.5" ports_tcp = "{ ssh www https smtp submission imaps domain }" ports_udp = "{ domain spamd-sync }" pass in on egress proto tcp from any to egress port $ports_tcp rdr-to $serv_int pass in on egress proto udp from any to egress port $ports_udp rdr-to $serv_int
Modification des interfaces d'écoute
Les services hébergés sur sniper n'écoutent plus sur la même interface. Pensez à modifier leur interface d'écoute pour "wg0". Normalement, si vous avez modifié les routes par défaut, alors "wg0" appartient au groupe "egress", mais vérifiez au moins deux fois votre configuration.
À titre d'exemple, la configuration d'httpd ressemblera à ça :
server "chezmoi.tld" { listen on wg0 port 80 root "htdocs" }
Modification des DNS
Désormais, dans votre zone DNS, votre nom de domaine doit pointer vers l'IP de tank.