Héberger son serveur avec pfSense

Héberger son serveur (web ou autre) sur son réseau local derrière un pare-feu pfSense

Problématique

Nous sommes dans le cas simple d'une personne hébergeant son domaine sur son réseau local avec juste un pare-feu PfSense faisant l'interface et le filtrage entre Internet (réseau public) et le réseau local. Sur ce réseau local il y a un serveur délivrant un service (par exemple un serveur web).

Héberger son serveur sur son réseau local
Héberger son serveur sur son réseau local

Nous considérerons dans notre exemple que le pare-feu est configuré de base, c'est-à-dire par défaut, un réseau local relié à Internet.

Le but est de rendre accessible à tous (public et local) l'accès au service du serveur de façon unique par l'intermédiaire du nom de domaine public votredomaine.tld.

Accès public

Changer le port de connexion au pare-feu

Par défaut, le port de connexion au pare-feu est 80, le même que celui de votre serveur. Il y a donc un problème d'accès concurrent.

Il faut donc changer le port d'administration du pare-feu dans System > Advanced > Admin Access et choisir, par exemple, 8080 (ou tout autre port non utilisé).

Fixer l’adresse du serveur

pfSense ne peut pas réserver d’adresse fixe dans la plage d’adresses définie au niveau du serveur DHCP.

Il faut donc créer deux zones dans votre définition DHCP.

Par exemple, si vous gérez la plage a.b.c.*/24, cela signifie que vous pouvez au maximum disposer des adresses allant de 1 à 255.

En général, on réserve 1 pour le serveur DHCP lui-même.

Vous disposez donc d’une plage complète d’adresses de 2 à 254.

Adresses réservées

Les adresses 0 et 255 sont réservées par le réseau pour des opérations spéciales. Vous ne pouvez donc pas les utiliser.

Si vous utilisez toute la plage pour le DHCP, vous ne pourrez plus définir d’adresse fixe.

Réservez donc, par exemple 19 adresses pour les serveurs en définissant le plage DHCP de a.b.c.21 à a.b.c.254 .

Vous pourrez utiliser vos 19 adresses fixes sur les adresses libres a.b.c.2 à a.b.c.20 , depuis la section Services > DHCP server > DHCP Static Mappings for this interface.

Dans cette zone, vous fixerez l’adresse de votre serveur depuis son adresse MAC.

Considérons pour la suite que l’adresse de notre serveur web est fixé à a.b.c.10 .

Créer une règle de redirection

Depuis l’extérieur, un paquet IP ne connaît que l’adresse publique de votre réseau. Mais une fois sur le routeur, il ne sait pas où aller car il peut y avoir plusieurs machines.

Il faut donc lui baliser le trajet en redirigeant tout le trafic (par exemple HTTP pour un serveur web) vers le serveur.

Pour cela, créez une règle NAT dans Firewall > NAT > Port Forward :

  • source addresses : any

  • source ports : any

  • destination addresses : WAN address (ce qui était destiné à votre interface publique)

  • destination ports : 80 (HTTP)

  • NAT IP : a.b.c.10 (l’adresse fixe de votre serveur interne)

  • NAT ports : 80 (HTTP)

Accès local

À partir de là, votre serveur est visible depuis l’extérieur. Mais toute personne sur le réseau local ne peut pas accéder au serveur par son adresse publique ou son nom de domaine.

Depuis une machine locale, faites le test :

ping votredomaine.tld

et vous devriez obtenir :

unknown host votredomaine.tld

Créer une redirection interne

Normalement, pour le web, vous devriez y accéder avec www.votredomaine.tld.

Dans Services > DNS forwarder > Host Overrides, créez un nouvel hôte :

  • host : www

  • domain : votredomaine.tld

  • IP : a.b.c.10

Validez puis activez l’otion Services > DNS forwarder > General DNS Forwarder Options : Register DHCP static mappings in DNS forwarder .

Mettre à jour son fichier /etc/resolv.conf

Dans certain cas, malgré tous vos efforts, la résolution locale ne s'effectue pas ou seulement partiellement (sur ou depuis certaines machines du réseau local). Ceci est probablement dû au fait que sur certaines machines le fichier /etc/resolv.conf n'est pas à jour avec votre pare-feu comme DNS par défaut. Dans ce cas, il faut l'ajouter. Sous Linux, par exemple, il faut passer par resolconf :

echo "nameserver 192.168.0.1" | sudo resolvconf -a eth1.inet

eth1 est l'interface réseau de votre machine reliée au pare-feu et inet le protocole (ici IPv4, sinon inet6 pour IPv6).