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 permet de vérifier que le tunnel a bien été créé :
Utilisez ensuite la commande ping6 pour vérifier que le tunnel fonctionne :
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 :
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 :
Pour activer le routage entre le subnet "LAN" et le subnet "WAN", il convient d'activer le forwarding IP :
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 :
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
/etc/rtadvd.conf
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
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
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 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>
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
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
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
...
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"
rtadvd_interfaces="em0"
/etc/rtadvd.conf
em0:\
:addrs#1:addr="2001:44:55:1::": prefixlen#64:tc=ether:
: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
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