OBSD4* : wiki

Version de traduction basée sur la 6.2 officielle


PF - Construire un routeur

Contexte

Ce guide vous montrera comment faire fonctionner OpenBSD en tant que routeur. En premier, nous allons définir ce qu'un routeur (appelé aussi une “passerelle”) fait actuellement, puisque vos besoins peuvent varier.

  • Assumer la traduction d'adresses réseaux (NAT)
  • Donner à un ordinateur portable et un serveur une adresse IP statique basée sur leur adresse MAC
  • Distribuer des adresses IP à d'autres clients via DHCP
  • Permettre les connexions entrantes au serveur web local
  • Faire de la mise en cache DNS pour le LAN
  • Fournir une connectivité sans fil (requiert une carte supportée)

Cet exemple utilisera deux NIC em(4) et une carte sans fil athn(4). Remplacez comme approprié par les noms d'interfaces em0, em1, et athn0. Des exemples de fichiers de configuration sont fournis, mais vous êtes encouragés à lire les pages de manuels pour comprendre toutes leurs capacités.

Mise en réseau

Nous commencerons avec une certaine configuration réseau initiale, utilisant un sous-réseau 192.168.1.0/24 pour les clients filaires et 192.168.2.0/24 pour les sans-fils.

  # echo 'net.inet.ip.forwarding=1' >> /etc/sysctl.conf
  # echo 'dhcp' > /etc/hostname.em0 # if you have a static IP, use that instead
  # echo 'inet 192.168.1.1 255.255.255.0 192.168.1.255' > /etc/hostname.em1
  # vi /etc/hostname.athn0

Ajoutez ce qui suit, en changeant le mode et le canal si besoin :

  media autoselect mode 11n mediaopt hostap chan 1
  nwid AccessPointName
  wpakey VeryLongPassword
  inet 192.168.2.1 255.255.255.0

OpenBSD permet par défaut seulement les connexions WPA2-CCMP dans le mode HostAP. Si vous avez besoin du support de vieux protocoles (non sécurisés), ils doivent être explicitement activés.

DHCP

Les clients ont besoin d'adresses IP, ce que fera dhcpd(8) lors de leur démarrage. La configuration est faite via le fichier dhcpd.conf(5).

  # rcctl enable dhcpd
  # rcctl set dhcpd flags em1 athn0
  # vi /etc/dhcpd.conf

Prenez cet exemple et adaptez-le à vos besoins :

  subnet 192.168.1.0 netmask 255.255.255.0 {
  	option routers 192.168.1.1;
  	option domain-name-servers 192.168.1.1;
  	range 192.168.1.4 192.168.1.254;
  	host myserver {
  		fixed-address 192.168.1.2;
  		hardware ethernet 00:00:00:00:00:00;
  	}
  	host mylaptop {
  		fixed-address 192.168.1.3;
  		hardware ethernet 11:11:11:11:11:11;
  	}
  }
  subnet 192.168.2.0 netmask 255.255.255.0 {
  	option routers 192.168.2.1;
  	option domain-name-servers 192.168.2.1;
  	range 192.168.2.2 192.168.2.254;
  }

Vous pouvez spécifier un autre espace d'adresses RFC 1918 si vous préférez, ou même un bloc IP publique si vous en avez un. En utilisant cet exemple, les clients interrogeront le serveur DNS local, détaillé plus bas. Si vous ne planifiez pas d'utiliser un serveur DNS local, remplacez les IPs dans les lignes domain-name-servers avec l'adresse de votre résolveur préféré en amont.

Pare-feu

La pièce centrale de ce guide est le fichier pf.conf(5). Il est hautement recommandé de vous familiariser avec, et celui de PF en général, avant de copier cet exemple. Chaque section sera expliquée plus en détails.

  # vi /etc/pf.conf

Une configuration pour une passerelle peut ressembler à cela :

  wired = "em1"
  wifi  = "athn0"
  table <martians> { 0.0.0.0/8 10.0.0.0/8 127.0.0.0/8 169.254.0.0/16     \
  	 	   172.16.0.0/12 192.0.0.0/24 192.0.2.0/24 224.0.0.0/3 \
  	 	   192.168.0.0/16 198.18.0.0/15 198.51.100.0/24        \
  	 	   203.0.113.0/24 }
  set block-policy drop
  set loginterface egress
  set skip on lo0
  match in all scrub (no-df random-id max-mss 1440)
  match out on egress inet from !(egress:network) to any nat-to (egress:0)
  antispoof quick for { egress $wired $wifi }
  block in quick on egress from <martians> to any
  block return out quick on egress from any to <martians>
  block all
  pass out quick inet
  pass in on { $wired $wifi } inet
  pass in on egress inet proto tcp from any to (egress) port { 80 443 } rdr-to 192.168.1.2

Maintenant, arrêtons nous sur ce jeu de règles et expliquons ce que fait chacune de ces lignes.

  wired = "em1"
  wifi  = "athn0"

Ce sont des macros, utilisées pour faciliter la maintenance ultérieure. Les macros peuvent être référencées par une jeu de règles après avoir été définies.

  table <martians> { 0.0.0.0/8 10.0.0.0/8 127.0.0.0/8 169.254.0.0/16     \
  	 	   172.16.0.0/12 192.0.0.0/24 192.0.2.0/24 224.0.0.0/3 \
  	 	   192.168.0.0/16 198.18.0.0/15 198.51.100.0/24        \
  	 	   203.0.113.0/24 }

Ceci est une table d'adresses privées non routables qui sera utilisée plus tard.

  set block-policy drop
  set loginterface egress
  set skip on lo0

PF permet à certaines options d'être paramétrées dès le démarrage. L'option block-policy décide quels paquets rejetés devront retourner un TCP RST ou être silencieusement détruits. L'option loginterface est exactement ce qu'elle semble être : avec quelle interface sera activée la collection de statistiques des paquets et du nombre d'octets. Ces statistiques peuvent être vues avec la commande pfctl -si. Dans ce cas, nous utilisons le groupe egress plutôt qu'une interface spécifique. Le mot-clé egress choisit automatiquement l'interface qui capture la route par défaut, ou l'interface WAN em0 dans notre exemple. Finalement, l'option skip vous permet de ne pas suivre les paquets pour une interface donnée. Le pare-feu ignorera le trafic loopback sur l'interface lo(4).

  match in all scrub (no-df random-id max-mss 1440)
  match out on egress inet from !(egress:network) to any nat-to (egress:0)

Les règles match utilisées ici accomplissent deux choses : normaliser l'entrée des paquets et exécuter la traduction d'adresses réseaux, avec l'interface egress entre le LAN et internet. Pour une explication plus détaillée sur les règles match et leurs différentes options, référez-vous au manuel pf.conf(5).

  antispoof quick for { egress $wired $wifi }
  block in quick on egress from <martians> to any
  block return out quick on egress from any to <martians>

Le mot clé antispoof fournit certaines protections des paquets ayant des adresses sources usurpées. Les paquets entrant sur l'interface egress devront être détruits s'il apparaît qu'ils font partie de la liste des adresses non routables que nous avons définies. De tels paquets ont probablement été envoyés en raison d'une mauvaise configuration, ou probablement en tant que partie d'une attaque de spoofing. De la même manière, nos clients ne devraient pas essayer de se connecter à de telles adresses. Nous spécifierons l'action “return” pour éviter les timeouts gênants pour les utilisateurs. Notez que cela peut causer des problèmes si vous faites de la double NAT.

  block all

Le pare-feu aura une politique “default deny” pour tout le trafic. Cela signifie que nous permettrons seulement les connexions entrantes et sortantes que nous aurons explicitement posées dans notre jeu de règles.

  pass out quick inet

Permettre le trafic IPv4 sortant depuis la passerelle elle-même et les clients du LAN.

  pass in on { $wired $wifi } inet

Permettre tout le trafic LAN à passer.

  pass in on egress inet proto tcp from any to (egress) port { 80 443 } rdr-to 192.168.1.2

Transférer les connexions entrantes (sur les ports TCP 80 et 443, pour un serveur web) vers notre machine à 192.168.1.2. Ceci n'est qu'un exemple de redirection de ports.

DNS

À ce point, les clients devraient avoir une adresse IP assignée et accéder à internet, bien que protégés par le pare-feu. Si c'est tout ce dont vous avez besoin, vous avez terminé et pouvez maintenant redémarrer. Ceci étant dit, un DNS cache est un ajout courant à un système passerelle.

Quand les clients font une requête DNS, ils interrogent en premier le cache unbound(8). S'il n'a pas la réponse, la requête sortira vers le résolveur en amont que vous avez configuré. Les résultats seront alors envoyés au client et mis en cache pendant une période de temps, rendant les futures consultations pour la même adresse plus rapide.

  # rcctl enable unbound
  # vi /var/unbound/etc/unbound.conf

Quelque chose comme ça devrait fonctionner pour la plupart des configurations :

  server:
  	interface: 192.168.1.1
  	interface: 192.168.2.1
  	interface: 127.0.0.1
  	access-control: 192.168.1.0/24 allow
  	access-control: 192.168.2.0/24 allow
  	do-not-query-localhost: no
  	hide-identity: yes
  	hide-version: yes
  
  forward-zone:
          name: "."
          forward-addr: 1.2.3.4  # IP of the upstream resolver

D'autres options de configuration peuvent être trouvées dans unbound.conf(5). Les interrogations DNS sortantes peuvent aussi être chiffrées avec le package dnscrypt-proxy – voir le fichier README inclus pour plus de détails.

Si vous voulez que la passerelle utilise le résolveur cache pour ses interrogations elle aussi, n'oubliez pas de changer le fichier /etc/resolv.conf vers 127.0.0.1. Puisque la majorité des routeurs ne font pas beaucoup de requêtes DNS, cela ne sera probablement pas nécessaire. Notez aussi que vous devrez le modifier vers un résolveur réel lors de l'usage de bsd.rd pour une mise à niveau basée sur le réseau, si vous le faites ainsi.


Cette page est la traduction officieuse de la page “Building a router de la FAQ officielle d'OpenBSD.
En cas de doute, merci de vous y référer !

Si vous voulez participer à l'effort de traduction, merci de lire ce topic.