vendredi, avril 26, 2024
Nom d'utilisateur : Mot de passe :
Home > Dossiers > Réseaux et sécurité > Configurer un routeur IPv6 avec FreeBSD
[NEWS]
Envoyé par unreal
A l'heure où j'écris ces lignes, dans un peu plus de 400 jours les reserves de blocs IPv4 seront épuisés. Alors que beaucoup d'opérateurs disposent de réseaux IPv6 au niveau des backbones, la connectivité native tarde à arriver vers les extrêmités du réseau, c'est-à-dire chez les clients. Le déploiement limité d'IPv6 native n'encourage pas les fournisseurs de contenus à migrer leurs services en IPv6 du fait d'un intérêt limité. Le tunnelbroker apparaît alors comme une solution de transition peu coûteuse et facile à déployer.

Dans ce dossier, nous allons configurer une machine FreeBSD avec un tunnelbroker pour offrir une connectivité IPv6 sécurisée vers des machines d'un réseau local.

Typologie

Nous allons travailler avec une machine FreeBSD 8.0 ayant une seule carte réseau physique (em0), reliée sur le réseau local. La connectivité Internet IPv4 arrive par une interface virtuelle (vlan1), dont l'interface parent est em0.

Configuration d'un tunnel basique

Plusieurs sociétés offrent de la connectivité IPv6 tunnelisée. Nous allons utiliser le service Tunnelbroker de Hurricane Electric qui propose des options intéressantes comme la délégation RDNS ou l'allocation de plusieurs subnets.

Creez un compte sur le site de HE.

Séléctionnez ensuite "Create Regular Tunnel" et saisissez votre IPv4 publique (fixe de préférence). Vous allez pouvoir créer un /64 routé et générer la configuration pour divers systèmes d'exploitation, dont FreeBSD. Dans cet exemple nous allons supposer que votre IP publique est 85.1.2.3 et que votre /64 alloué est 2001:11:22:33::/64.

Cela nous donne :

ifconfig gif0 create
ifconfig gif0 tunnel 85.1.2.3 216.66.84.42
ifconfig gif0 inet6 2001:11:22:33::2 2001:11:22:33::1 prefixlen 128
route -n add -inet6 default 2001:11:22:33::1
ifconfig gif0 up


Ifconfig permet de vérifier que le tunnel a bien été créé :

# ifconfig gif0
gif0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> metric 0 mtu 1280
        tunnel inet 85.1.2.3 --> 216.66.84.42
        inet6 fe80::219:d1ff:fe7a:7437%gif0 prefixlen 64 scopeid 0x6
        inet6 2001:11:22:33::2 prefixlen 64
        options=1<ACCEPT_REV_ETHIP_VER>


Utilisez ensuite la commande ping6 pour vérifier que le tunnel fonctionne :

# ping6 -c 1 www.free.fr
PING6(56=40+8+8 bytes) 2001:11:22:33::2 --> 2a01:e0c:1:1599::1
16 bytes from 2a01:e0c:1:1599::1, icmp_seq=0 hlim=55 time=51.311 ms

--- http://www.free.fr ping6 statistics ---
1 packets transmitted, 1 packets received, 0.0% packet loss
round-trip min/avg/max/std-dev = 51.311/51.311/51.311/0.000 ms


Si cela ne fonctionne pas et que vous avez un firewall sur la passerelle, il se peut qu'il soit configuré pour bloquer le traffic tunnelé. Voici un exemple de configuration PF pour autoriser le traffic du tunnel :

# Tunnel IPv6
pass out on $nc_if inet proto 41 from any to 216.66.84.42 keep state
pass in on $nc_if inet proto 41 from 216.66.84.42 to any keep state


En supposant que cette partie fonctionne, nous allons maintenant voir comment étendre cette connectivité IPv6 au réseau local.

Routage d'un subnet

Retournez dans l'interface Tunnelbroker et demandez l'allocation du /48 routé ; nous allons utiliser un subnet /64 de ce /48 pour connecter notre réseau local. Dans cet exemple nous supposons que le /48 alloué est 2001:44:55::/48 et que le subnet /64 "LAN" est 2001:44:55:1::/64.

Vous allez configurer une IP du subnet LAN sur l'interface em0 :

ifconfig em0 inet6 2001:44:55:1::1 prefixlen 64


Pour activer le routage entre le subnet "LAN" et le subnet "WAN", il convient d'activer le forwarding IP :

sysctl -w net.inet6.ip6.forwarding=1


En configurant une machine du réseau local en IPv6 manuelle, 2001:44:55:1::2 par exemple, vous devriez pouvoir constater le bon fonctionnement de l'ensemble :

$ traceroute6 -n www.free.fr
traceroute6 to http://www.free.fr (2a01:e0c:1:1599::1) from 2001:44:55:1::2, 64 hops max, 12 byte packets
1 2001:44:55:1::1 0.366 ms 0.301 ms 0.285 ms
2 2001:11:22:33::1 33.619 ms 27.855 ms 29.953 ms
3 2001:470:0:7b::1 27.837 ms 29.885 ms 28.257 ms
...


Nous voyons ici l'IP de notre routeur (2001:44:55:1::1), puis l'IP de l'endpoint du tunnel (2001:11:22:33::1).

Filtrer le traffic IPv6 avec PF

A ce stade vous avez normalement un réseau IPv6 fonctionnel, mais non sécurisé dans la mesure où les IP sont publiques et le traffic n'est pas du tout filtré, juste routé. Nous allons utiliser PF pour filtrer le traffic directement au niveau du routeur. Ma configuration PF contient beaucoup de règles ; par soucis de lisibilité les règles ici ne concernent que le tunnel IPv6 :


ipv6_if = "gif0"
macmini_v6 = "2001:44:55:1::2"
macmini_web_ports = "{ 80, 443 }"
ext_server = "2a02:1:2:3::4"

# <IPv6>
# Block all by default
block on $ipv6_if all

# ICMP.
pass in on $ipv6_if proto icmp6 all keep state
pass out on $ipv6_if proto icmp6 all keep state

# Inward connections.
pass in on $ipv6_if proto tcp from any to $macmini_v6 \
                        port $macmini_web_ports flags S/SA keep state \
                        (max-src-conn-rate 100/5)
# SSH
pass in on $ipv6_if inet6 proto tcp from $ext_server to any port 22 keep state

# Outward connections.
pass out on $ipv6_if inet6 proto tcp all keep state
pass out on $ipv6_if inet6 proto udp all keep state
# </IPv6>


Cette configuration bloque tout le traffic entrant sauf ICMP, Web vers "macmini_v6" et ssh de "ext_server", et autorise ICMP, TCP et UDP sortant. Elle s'applique à toutes les machines en IPv6.

Autoconf

Une des fonctionnalités très pratiques de l'IPv6 est l'autoconf qui permet sans DHCP aux machines d'obtenir des IP statiques grâce à la MAC de la carte réseau. Sous FreeBSD, le router advertisement daemon ou rtadvd permet la fonctionnalité d'autoconf. Pour l'utiliser, il faut éditer rc.conf et rtadvd.conf :

/etc/rc.conf
rtadvd_enable="YES"
rtadvd_interfaces="em0"


/etc/rtadvd.conf
em0:\
    :addrs#1:addr="2001:44:55:1::": prefixlen#64:tc=ether:


Démarrez rtadvd pour profiter de l'autoconf IPv6.

Démarrage automatique des services

Pour finir, nous allons configurer l'auto démarrage des services dans rc.conf :

rc.conf
# Network
ifconfig_em0="inet 192.168.100.1 netmask 255.255.255.0"
cloned_interfaces="vlan0 vlan1"
ifconfig_vlan0="vlan 2 vlandev em0"
ifconfig_vlan1="DHCP vlan 4 vlandev em0"

# IPv6
ipv6_enable="YES"
ipv6_gateway_enable="YES"
ipv6_network_interfaces="lo0 em0 gif0"
gif_interfaces="gif0"
gifconfig_gif0="85.1.2.3 216.66.84.42"
ipv6_ifconfig_gif0="2001:11:22:33::2/64"
ipv6_ifconfig_em0="2001:44:55:1::1 prefixlen 64"
ipv6_defaultrouter="-interface gif0"
rtadvd_enable="YES"
rtadvd_interfaces="em0"

# PF
pf_enable="YES"                 # Enable PF (load module if required)
pf_rules="/etc/pf.conf"         # rules definition file for pf
pf_flags=""                     # additional flags for pfctl startup
pflog_enable="YES"             # start pflogd(8)
pflog_logfile="/var/log/pflog" # where pflogd should store the logfile
pflog_flags=""                 # additional flags for pflogd startup


Au prochain reboot de la machine, les services devraient monter automatiquement.

Conclusion

Avec un tunnelbroker, il est plutôt facile de déployer un réseau IPv6 de transition, en attendant un déploiement plus généralisé d'IPv6 native.

Historique

- 19 juin 2010 : version initiale

Posté le 19/06/10 à 12:37

Configurer un routeur IPv6 avec FreeBSD
Vous pourriez commenter si vous aviez un compte !