« FreeBSD IPv6 Tunnel Broker » : différence entre les versions

De Memento
Aller à la navigation Aller à la recherche
mAucun résumé des modifications
Aucun résumé des modifications
 
(30 versions intermédiaires par 2 utilisateurs non affichées)
Ligne 2 : Ligne 2 :
Je dispose depuis quelques temps d'un serveur dédié [http://www.kimsufi.com/ Kimsufi] chez [http://www.ovh.com/fr/ OVH]. Ce serveur
Je dispose depuis quelques temps d'un serveur dédié [http://www.kimsufi.com/ Kimsufi] chez [http://www.ovh.com/fr/ OVH]. Ce serveur
dispose d'une plage d'adresses IPv6 de type <tt>2001:41D0:2:2D29::/64</tt> avec une interface réseau ayant une/plusieurs adresse(s) dans
dispose d'une plage d'adresses IPv6 de type <tt>2001:41D0:2:2D29::/64</tt> avec une interface réseau ayant une/plusieurs adresse(s) dans
cette plage mais avec un ''prefixe'' de 56 bits. Le gateway par défaut étant dans mon cas: <tt>2001:41d0:2:2dff:ff:ff:ff:ff</tt>.
cette plage mais avec un ''préfixe'' ''physique'' de 56 bits. Le gateway par défaut étant dans mon cas: <tt>2001:41d0:2:2dff:ff:ff:ff:ff</tt>.


J'avais déjà réalisé, à partir de mon réseau à domicile, des tests IPv6 en utilisant [http://www.sixxs.net/main/ SIxXS] comme '''''IPv6 Tunnel Broker'''''. Comme je dispose maintenant d'un serveur ayant une connectivité IPv6, pourquoi ne pas m'en servir pour devenir
J'avais déjà réalisé, à partir de mon réseau à domicile, des tests IPv6 en utilisant [http://www.sixxs.net/main/ SIxXS] comme '''''IPv6 Tunnel Broker'''''. Comme je dispose maintenant d'un serveur ayant une connectivité IPv6, pourquoi ne pas m'en servir pour devenir
Ligne 9 : Ligne 9 :
Quelques recherches ne donnèrent rien... Ma question sur la liste de distribution <tt>freebsd-net@freebsd.org</tt>
Quelques recherches ne donnèrent rien... Ma question sur la liste de distribution <tt>freebsd-net@freebsd.org</tt>
<ref>
<ref>
[http://docs.freebsd.org/cgi/getmsg.cgi?fetch=60986+0+archive/2007/freebsd-net/20070624.freebsd-net ipv6 ndp proxy - advice needed...]
[http://docs.freebsd.org/cgi/getmsg.cgi?fetch=60986+0+archive/2007/freebsd-net/20070624.freebsd-net ipv6 ndp proxy - advice needed...] - (Les adresses IPv6 ont changé depuis le passage à un nouveau serveur)
</ref>
</ref>
restant sans réponse, il fallait donc que je me démerde tout seul!
restant sans réponse, il fallait donc que je me démerde tout seul!
Ligne 55 : Ligne 55 :
  3 packets transmitted, 3 packets received, 0.0% packet loss
  3 packets transmitted, 3 packets received, 0.0% packet loss
  round-trip min/avg/max/std-dev = 190.249/190.714/191.213/0.394 ms
  round-trip min/avg/max/std-dev = 190.249/190.714/191.213/0.394 ms
  [root@tignes ~]#  
  [root@tignes ~]#  


Ligne 98 : Ligne 99 :
Création du ''tunnel'' en mode commande, pour un premier test:
Création du ''tunnel'' en mode commande, pour un premier test:


Sur le serveur dédié (<tt>tignes</tt>:
Sur le serveur dédié (<tt>tignes</tt>):


  [root@tignes ~]# ifconfig gif0 create
  [root@tignes ~]# ifconfig gif0 create
Ligne 108 : Ligne 109 :
         inet6 fe80::222:15ff:feb4:4257%gif0 prefixlen 64 scopeid 0x4  
         inet6 fe80::222:15ff:feb4:4257%gif0 prefixlen 64 scopeid 0x4  
         inet6 2001:41d0:2:2d29:0:ffff:: --> 2001:41d0:2:2d29:1:ffff:: prefixlen 128  
         inet6 2001:41d0:2:2d29:0:ffff:: --> 2001:41d0:2:2d29:1:ffff:: prefixlen 128  
  [root@tignes ~]# sysctl net.inet6.ip6.forwarding=1
[root@tignes ~]# sysctl net.inet6.ip6.forwarding=1
  net.inet6.ip6.forwarding: 0 -> 1
  net.inet6.ip6.forwarding: 0 -> 1
  [root@tignes ~]#  
  [root@tignes ~]#  


Sur la passerelle de la maison (<tt>aviriaz</tt>):
Sur la passerelle de la maison (<tt>avoriaz</tt>):


  [root@avoriaz ~]# ifconfig gif0 create
  [root@avoriaz ~]# ifconfig gif0 create
Ligne 154 : Ligne 155 :
  [root@avoriaz ~]#  
  [root@avoriaz ~]#  


Bien sûr, ce dernier test ne pouvais pas fonctionner car la passerelle OVH n'a pas une route statique vers <tt>tignes</tt> pour
Bien sûr, ce dernier test ne pouvait pas fonctionner car la passerelle OVH n'a pas une route statique vers <tt>tignes</tt> pour
toutes les adresses 2001:41d0:2:2d29::/64.
toutes les adresses 2001:41d0:2:2d29::/64. Durant le test, on peut observer sur <tt>tignes</tt> les requètes ''neighbor solicitation''
restant sans réponse:
 
[root@tignes ~]# tcpdump -n icmp6
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on nfe0, link-type EN10MB (Ethernet), capture size 96 bytes
14:10:18.435194 IP6 2001:41d0:2:2d29:1:ffff:: > 2001:4f8:fff6::21: ICMP6, echo request, seq 0, length 16
14:10:18.596523 IP6 fe80::21e:79ff:fe1e:f000 > ff02::1:ff00:0: ICMP6, neighbor solicitation, who has 2001:41d0:2:2d29:1:ffff::, length 32
-----------<Pas de réponse de tignes>----------
14:10:19.436418 IP6 2001:41d0:2:2d29:1:ffff:: > 2001:4f8:fff6::21: ICMP6, echo request, seq 1, length 16
^C
3 packets captured
46 packets received by filter
0 packets dropped by kernel
[root@tignes ~]#
 
Avant de résoudre le problème des réponses aux ''ICMP6 - neighbor solicitations'', configurons le réseau local du domicile.
 
==Configuration IPv6 entre <tt>morzine</tt> et <tt>avoriaz</tt>==
En anticipant les problèmes de routage entre <tt>tignes</tt> et le réseau de la maison, nous configurerons ce dernier avec des
adresses <tt>2001:41d0:2:2d29:1::/80</tt>. Au passage, il faut noter que toutes les adresses utilisées par <tt>tignes</tt> sont
dans la plage d'adresses <tt>2001:41d0:2:2d29:0::/80</tt> afin de pouvoir ultérieurement garnir facilement la table de routage
de <tt>tignes</tt>.
 
Sur <tt>avoriaz</tt> tout d'abord:
 
[root@avoriaz ~]# ifconfig em0 inet6 2001:41d0:2:2d29:1:1:: prefixlen 80
[root@avoriaz ~]# ifconfig em0
em0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        options=19b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,TSO4>
        ether 00:1d:60:ad:2a:ce
        inet6 fe80::21d:60ff:fead:2ace%em0 prefixlen 64 scopeid 0x1
        inet 192.168.24.1 netmask 0xffffff00 broadcast 192.168.24.255
        inet6 2001:41d0:2:2d29:1:1:: prefixlen 80
        media: Ethernet 100baseTX (100baseTX <half-duplex>)
        status: active
[root@avoriaz ~]# sysctl net.inet6.ip6.forwarding=1
net.inet6.ip6.forwarding: 0 -> 1
[root@avoriaz ~]#
 
Sur <tt>morzine</tt> ensuite:
 
[root@morzine ~]# ifconfig em0 inet6 2001:41d0:2:2d29:1:2:: prefixlen 80
[root@morzine ~]# ifconfig em0
em0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        options=19b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,TSO4>
        ether 00:e0:81:70:6b:68
        inet6 fe80::2e0:81ff:fe70:6b68%em0 prefixlen 64 scopeid 0x1
        inet 192.168.24.2 netmask 0xffffff00 broadcast 192.168.24.255
        inet6 2001:41d0:2:2d29:1:2:: prefixlen 80
        media: Ethernet 100baseTX (100baseTX <half-duplex>)
        status: active
[root@morzine ~]# route add -inet6 default 2001:41d0:2:2d29:1:1::
add net default: gateway 2001:41d0:2:2d29:1:1::
[root@morzine ~]# netstat -rn -f inet6
Routing tables
Internet6:
Destination                      Gateway                      Flags      Netif Expire
::/96                            ::1                          UGRS        lo0 =>
default                          2001:41d0:2:2d29:1:1::        UGS        em0
::1                              ::1                          UHL        lo0
::ffff:0.0.0.0/96                ::1                          UGRS        lo0
2001:41d0:2:2d29:1::/80          link#1                        UC          em0
2001:41d0:2:2d29:1:1::            00:1d:60:ad:2a:ce            UHLW        em0
2001:41d0:2:2d29:1:2::            00:e0:81:70:6b:68            UHL        lo0
fe80::/10                        ::1                          UGRS        lo0
fe80::%em0/64                    link#1                        UC          em0
fe80::2e0:81ff:fe70:6b68%em0      00:e0:81:70:6b:68            UHL        lo0
fe80::%lo0/64                    fe80::1%lo0                  U          lo0
fe80::1%lo0                      link#2                        UHL        lo0
ff01:1::/32                      link#1                        UC          em0
ff01:2::/32                      ::1                          UC          lo0
ff02::/16                        ::1                          UGRS        lo0
ff02::%em0/32                    link#1                        UC          em0
ff02::%lo0/32                    ::1                   
[root@morzine ~]#
 
Le fichier <tt>/etc/rc.conf.local</tt> sur <tt>avoriaz</tt> doit être complété pour le prochain boot:
 
gif_interfaces="gif0"                  # Tunnel to tignes.restart.be for ipv6
gifconfig_gif0="192.168.24.1 94.23.44.41"
...
ipv6_enable="YES"                      # Set to YES to set up for IPv6.
ipv6_network_interfaces="em0 gif0"      # List of network interfaces (or "auto").
ipv6_ifconfig_em0="2001:41d0:2:2d29:1:1:: prefixlen 80"
ipv6_ifconfig_gif0="2001:41d0:2:2d29:1:ffff:: 2001:41d0:2:2d29:0:ffff:: prefixlen 128"
ipv6_defaultrouter="2001:41d0:2:2d29:0:ffff::"
ipv6_gateway_enable="YES"              # Set to YES if this host will be a gateway.
 
A noter que l'adresse IPv4 réelle d'<tt>avoriaz</tt> sera configurée dynamiquement par <tt>mpd5</tt>.
 
Le fichier <tt>/etc/rc.conf.local</tt> sur <tt>morzine</tt> doit également être complété pour le prochain boot:
 
ipv6_enable="YES"                      # Set to YES to set up for IPv6.
ipv6_network_interfaces="em0"          # List of network interfaces (or "auto").
ipv6_ifconfig_em0="2001:41d0:2:2d29:1:2:: prefixlen 80"
ipv6_defaultrouter="2001:41d0:2:2d29:1:1::"
 
==Le serveur dédié <tt>tignes</tt> doit répondre aux ''neighbor solicitations'' de la passerelle OVH==
 
Après avoir lu et relu le manuel utilisateur de la commande <tt>route</tt>, la solution semblait être d'utiliser l'option
<tt>-proxy</tt>:
 
[root@tignes ~]# route add -inet6 2001:41d0:2:2d29:1::/80 -interface gif0 -proxy
add net 2001:41d0:2:2d29:1::/80: gateway gif0
[root@tignes ~]# netstat -rn -f inet6
Routing tables
Internet6:
Destination                      Gateway                      Flags      Netif Expire
::/96                            ::1                          UGRS        lo0 =>
default                          2001:41d0:2:2d29:0:ffff::    UGS        gif0
::1                              ::1                          UHL        lo0
::ffff:0.0.0.0/96                ::1                          UGRS        lo0
2001:41d0:2:100::/80              gif0                          ULS2      gif0
...
[root@tignes ~]# netstat -rn -f inet6
Routing tables
Internet6:
Destination                      Gateway                      Flags      Netif Expire
::/96                            ::1                          UGRS        lo0 =>
default                          2001:41d0:2:2dff:ff:ff:ff:ff  UGS        nfe0
::1                              ::1                          UHL        lo0
::ffff:0.0.0.0/96                ::1                          UGRS        lo0
2001:41d0:2:2d00::/56            link#1                        UC        nfe0
2001:41d0:2:2d29:0:1::            00:22:15:b4:42:57            UHL        lo0
2001:41d0:2:2d29:0:ffff::        link#4                        UHL        lo0
2001:41d0:2:100::/80              gif0                          ULS2      gif0
...
 
La dernière ligne affichée semble surprenante et les tests montre que les ''neighbor solicitations'' restent sans réponse.
Il reste donc une belle scéance de debugging pour traquer le problème. Finalement, je localise l'erreur dans le source de la
commande <tt>route</tt> et trouve une ''astuce'' pour éviter l'erreur: [http://www.freebsd.org/cgi/query-pr.cgi?pr=123465 route(8): route add -inet6 <ipv6_addr> -interface gif0 -proxy mangle ipv6 address]. Le <tt>patch</tt> suivant fonctionne au moins
jusqu'à la version <tt>7.2-STABLE r193696</tt>:
 
--- sbin/route/route.c.orig 2005-09-28 14:12:15.000000000 +0200
+++ sbin/route/route.c 2008-05-03 14:42:02.000000000 +0200
@@ -731,7 +731,9 @@
  if (iflag == 0)
  flags |= RTF_GATEWAY;
  if (proxy) {
+ /*--- RestartSoft ---
  so_dst.sinarp.sin_other = SIN_PROXY;
+ ---*/
  flags |= RTF_ANNOUNCE;
  }
  for (attempts = 1; ; attempts++) {
 
Après cette modification, un test n'est hélas pas plus concluant. Passons donc au debugging de <tt>/usr/src/sys/netinet6/nd6_nbr.c</tt>...
Quelques joyeux tests à l'aide d'une configuration de machines virtuelles <tt>qemu</tt> ([http://www.freebsd.org/cgi/ports.cgi?query=qemu-0.1&stype=all&sektion=emulators emulators/qemu]) permettrons de localiser le dernier problème et d'appliquer le patch suivant:
 
--- sys/netinet6/nd6_nbr.c.orig 2007-07-05 18:29:40.000000000 +0200
+++ sys/netinet6/nd6_nbr.c 2008-05-03 14:46:53.000000000 +0200
@@ -245,7 +245,9 @@
  IN6_IFF_NOTREADY|IN6_IFF_ANYCAST);
  if (ifa) {
  proxy = 1;
+ /*--- RestartSoft ---
  proxydl = SDL(rt->rt_gateway);
+ ---*/
  }
  }
  }
@@ -328,7 +330,8 @@
      ND_NEIGHBOR_SOLICIT, 0);
 
  nd6_na_output(ifp, &saddr6, &taddr6,
-     ((anycast || proxy || !tlladdr) ? 0 : ND_NA_FLAG_OVERRIDE) |
+ /*---RestartSoft--- ((anycast || proxy || !tlladdr) ? 0 : ND_NA_FLAG_OVERRIDE) | ---*/
+ ((anycast || !tlladdr) ? 0 : ND_NA_FLAG_OVERRIDE) |            /*--- RestartSoft ---*/
      (ip6_forwarding ? ND_NA_FLAG_ROUTER : 0) | ND_NA_FLAG_SOLICITED,
      tlladdr, (struct sockaddr *)proxydl);
  freeit:
 
Miracle, tout fonctionne après avoir compléter <tt>/etc/rc.conf.local</tt> sur <tt>tignes</tt>:
 
gif_interfaces="gif0"          # List of GIF tunnels (or "NO").
gifconfig_gif0="94.23.44.41 192.168.24.1"      # Updated later by avoriaz
...
ipv6_enable="YES"                      # Set to YES to set up for IPv6.
ipv6_network_interfaces="nfe0 gif0"    # List of network interfaces (or "auto").
ipv6_ifconfig_nfe0="2001:41d0:2:2d29:0:1:: prefixlen 56"
ipv6_ifconfig_gif0="2001:41d0:2:2d29:0:ffff:: 2001:41D0:2:2D29:1:ffff:: prefixlen 128"
ipv6_defaultrouter="2001:41d0:2:2dff:ff:ff:ff:ff" # Set to IPv6 default gateway (or NO).
ipv6_static_routes="avoriaz home"      # List of static routes
ipv6_route_avoriaz="2001:41d0:2:2d29:1:ffff:: -interface gif0 -proxy"
ipv6_route_home="2001:41d0:2:2d29:1::/80 -interface gif0 -proxy"
ipv6_gateway_enable="YES"              # Set to YES if this host will be a gateway.
 
Sur <tt>tignes</tt>:
 
[root@tignes ~]# tcpdump -n icmp6
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on nfe0, link-type EN10MB (Ethernet), capture size 96 bytes
17:13:42.240587 IP6 2001:41d0:2:2d29:1:2:: > 2001:4f8:fff6::21: ICMP6, echo request, seq 0, length 16
17:13:42.402779 IP6 fe80::21e:79ff:fe1e:f000 > ff02::1:ff00:0: ICMP6, neighbor solicitation, who has 2001:41d0:2:2d29:1:2::, length 32
17:13:42.403098 IP6 fe80::222:15ff:feb4:4257 > fe80::21e:79ff:fe1e:f000: ICMP6, neighbor advertisement, tgt is 2001:41d0:2:2d29:1:2::, length 32
17:13:42.406509 IP6 2001:4f8:fff6::21 > 2001:41d0:2:2d29:1:2::: ICMP6, echo reply, seq 0, length 16
17:13:43.240987 IP6 2001:41d0:2:2d29:1:2:: > 2001:4f8:fff6::21: ICMP6, echo request, seq 1, length 16
17:13:43.401280 IP6 2001:4f8:fff6::21 > 2001:41d0:2:2d29:1:2::: ICMP6, echo reply, seq 1, length 16
17:13:44.238972 IP6 2001:41d0:2:2d29:1:2:: > 2001:4f8:fff6::21: ICMP6, echo request, seq 2, length 16
17:13:44.399157 IP6 2001:4f8:fff6::21 > 2001:41d0:2:2d29:1:2::: ICMP6, echo reply, seq 2, length 16
^C
8 packets captured
60 packets received by filter
0 packets dropped by kernel
[root@tignes ~]#
 
Pendant que sur <tt>morzine</tt>:
 
[root@morzine ~]# ping6 www.freebsd.org
PING6(56=40+8+8 bytes) 2001:41d0:2:2d29:1:2:: --> 2001:4f8:fff6::21
16 bytes from 2001:4f8:fff6::21, icmp_seq=0 hlim=52 time=178.485 ms
16 bytes from 2001:4f8:fff6::21, icmp_seq=1 hlim=52 time=171.677 ms
16 bytes from 2001:4f8:fff6::21, icmp_seq=2 hlim=52 time=171.798 ms
^C
--- www.freebsd.org ping6 statistics ---
3 packets transmitted, 3 packets received, 0.0% packet loss
round-trip min/avg/max/std-dev = 171.677/173.987/178.485/3.181 ms
[root@morzine ~]#
 
Il ne reste plus qu'à ajouter deux ''scripts'' au répertoire <tt>/usr/local/etc/mpd5</tt>:
 
[root@avoriaz ~]# cd /usr/local/etc/mpd5
[root@avoriaz mpd5]# cat adsl.linkup
#!/bin/sh
MYADDR=$3
/sbin/pfctl -F all -f /etc/pf.conf
/usr/local/etc/mpd5/adsl.up ${MYADDR} &
exit 0
[root@avoriaz mpd5]# cat adsl.up
#!/bin/sh
MYADDR=$1
MYADDR=`echo $MYADDR | sed 's/\/32//'`
TIGNES="94.23.44.41"
sleep 10
usr/bin/killall -KILL ntpd
/etc/rc.d/ntpd start
#--- tignes ---{
#--- IPV6 tunnel
/sbin/ifconfig gif0 tunnel ${MYADDR} ${TIGNES}
/usr/bin/ssh -4 ${TIGNES} /sbin/ifconfig gif0 tunnel ${TIGNES} ${MYADDR}
#--- DNS update
sleep 5 #--- wait for the IPv6 connection with tignes
/usr/local/bin/dnsupdate -u avoriaz.restart.be=${MYADDR}
#--- tignes ---}
exit 0
[root@avoriaz mpd5]#
 
{| style="background-color:#ffc0c0;" cellpadding="10" cellspacing="0" border="1"
|'''Une remarque finale s'impose''': Pour que le '''''IPv6 Tunnel Broker''''' puisse recevoir un ''neighbor solicitation'' concernant une adresse du réseau du domicile, ce message ''ICMP6'' ne doit pas être filtré par le pilote de la carte réseau (''multicast filtering''). Pour ce faire, toutes les adresses doivent avoir, pour les 3 derniers octets, une valeur identique à celle attribuée à la carte réseau du serveur dédié. Dans cette exemple j'ai opté pour les 4 derniers octets à zéro - les 3 derniers auraient suffis mais l'extension à 4 me semblait plus simple à manipuler.
|}
 
==Actualisation des patches pour la version FreeBSD-9.0-RC1==
 
Pour la commande <tt>route</tt>:
 
Index: sbin/route/route.c
===================================================================
--- sbin/route/route.c (revision 226460)
+++ sbin/route/route.c (working copy)
@@ -746,7 +746,7 @@
  if (iflag == 0)
  flags |= RTF_GATEWAY;
  if (proxy) {
- so_dst.sinarp.sin_other = SIN_PROXY;
+/*--- so_dst.sinarp.sin_other = SIN_PROXY; --- RestartSoft ---*/
  flags |= RTF_ANNOUNCE;
  }
  for (attempts = 1; ; attempts++) {
 
Dans le noyau:
 
Index: sys/netinet6/nd6_nbr.c
===================================================================
--- sys/netinet6/nd6_nbr.c (revision 226460)
+++ sys/netinet6/nd6_nbr.c (working copy)
@@ -350,6 +350,8 @@
  nd6_cache_lladdr(ifp, &saddr6, lladdr, lladdrlen,
      ND_NEIGHBOR_SOLICIT, 0);
 
+ tlladdr = 1; /*--- RestartSoft --- see RFC 4861 - 4.4 */
+ proxy = 0; /*--- RestartSoft --- gif0 has no mac address */
  nd6_na_output(ifp, &saddr6, &taddr6,
      ((anycast || proxy || !tlladdr) ? 0 : ND_NA_FLAG_OVERRIDE) |
      rflag | ND_NA_FLAG_SOLICITED, tlladdr,
 
==Actualisation des patches pour la version FreeBSD-9.2-RC3==
 
Pour la commande <tt>route</tt>:
 
Index: sbin/route/route.c
===================================================================
--- sbin/route/route.c (revision 254050)
+++ sbin/route/route.c (working copy)
@@ -971,7 +971,7 @@
if ((nrflags & F_INTERFACE) == 0)
flags |= RTF_GATEWAY;
if (nrflags & F_PROXY) {
- so_dst.sinarp.sin_other = SIN_PROXY;
+/*--- so_dst.sinarp.sin_other = SIN_PROXY; --- RestartSoft ---*/
flags |= RTF_ANNOUNCE;
}
if (dest == NULL)
 
 
 
Dans le noyau:
 
Index: sys/netinet6/nd6_nbr.c
===================================================================
--- sys/netinet6/nd6_nbr.c (revision 254050)
+++ sys/netinet6/nd6_nbr.c (working copy)
@@ -356,6 +356,8 @@
nd6_cache_lladdr(ifp, &saddr6, lladdr, lladdrlen,
    ND_NEIGHBOR_SOLICIT, 0);
+ tlladdr = 1; /*--- RestartSoft --- see RFC 4861 - 4.4 */
+ proxy = 0; /*--- RestartSoft --- gif0 has no mac address */
nd6_na_output_fib(ifp, &saddr6, &taddr6,
    ((anycast || proxy || !tlladdr) ? 0 : ND_NA_FLAG_OVERRIDE) |
    rflag | ND_NA_FLAG_SOLICITED, tlladdr,
 
Il reste un dernier problème, l'adresse <tt>2001:41d0:2:2d29:0:ffff::</tt> d'<tt>avoriaz</tt> n'est plus acceptée dans
la table de routage de <tt>tignes</tt> avec l'option <tt>proxy</tt>. Toute connexion ipv6 à partir d'<tt>avoriaz</tt> utilise
par défaut cette adresse et donc l'accès en ipv6 à partir d'<tt>avoriaz</tt> est compromis. La solution est cependant assez
simple, il suffit d'ajouter l'option <tt>no_prefer_iface</tt> pour l'interface <tt>gif0</tt> d'<tt>avoriaz</tt>. Cette option
est également ajoutée à l'interface <tt>gif0</tt> sur <tt>tignes</tt> par pure symétrie.
 
Le fichier <tt>/etc/rc.conf.local</tt> sur <tt>avoriaz</tt> doit être adapté:


gif_interfaces="gif0"                  # Tunnel to tignes.restart.be for ipv6
gifconfig_gif0="192.168.24.1 94.23.44.41"
...
ipv6_enable="YES"                      # Set to YES to set up for IPv6.
ipv6_network_interfaces="em0 gif0"      # List of network interfaces (or "auto").
ipv6_ifconfig_em0="2001:41d0:2:2d29:1:1:: prefixlen 80"
ipv6_ifconfig_gif0="2001:41d0:2:2d29:1:ffff:: 2001:41d0:2:2d29:0:ffff:: prefixlen 128 no_prefer_iface"
ipv6_defaultrouter="2001:41d0:2:2d29:0:ffff::"
ipv6_gateway_enable="YES"              # Set to YES if this host will be a gateway.
Le fichier <tt>/etc/rc.conf.local</tt> sur <tt>tignes</tt> est également modifié:
gif_interfaces="gif0"          # List of GIF tunnels (or "NO").
gifconfig_gif0="94.23.44.41 192.168.24.1"      # Updated later by avoriaz
...
ipv6_enable="YES"                      # Set to YES to set up for IPv6.
ipv6_network_interfaces="nfe0 gif0"    # List of network interfaces (or "auto").
ipv6_ifconfig_nfe0="2001:41d0:2:2d29:0:1:: prefixlen 56"
ipv6_ifconfig_gif0="2001:41d0:2:2d29:0:ffff:: 2001:41D0:2:2D29:1:ffff:: prefixlen 128 no_prefer_iface"
ipv6_defaultrouter="2001:41d0:2:2dff:ff:ff:ff:ff" # Set to IPv6 default gateway (or NO).
ipv6_static_routes="home"              # List of static routes
ipv6_route_home="2001:41d0:2:2d29:1::/80 -interface gif0 -proxy"
ipv6_gateway_enable="YES"              # Set to YES if this host will be a gateway.
==Actualisation des patches pour la version FreeBSD-11.0-RC1==
Dans le noyau:
Index: sys/netinet6/nd6_nbr.c
===================================================================
--- sys/netinet6/nd6_nbr.c      (revision 304222)
+++ sys/netinet6/nd6_nbr.c      (working copy)
@@ -265,8 +265,11 @@
                /* Always use the default FIB. */
                if (rib_lookup_info(RT_DEFAULT_FIB, (struct sockaddr *)&dst6,
                    0, 0, &info) == 0) {
+                      /*--- RestartSoft --- rt_gateway.sdl_family == 0
                        if ((info.rti_flags & RTF_ANNOUNCE) != 0 &&
                            rt_gateway.sdl_family == AF_LINK) {
+                  --- RestartSoft ---*/
+                      if ((info.rti_flags & RTF_ANNOUNCE) != 0) {
 
                                /*
                                * proxy NDP for single entry
@@ -357,6 +360,8 @@
        nd6_cache_lladdr(ifp, &saddr6, lladdr, lladdrlen,
            ND_NEIGHBOR_SOLICIT, 0);
 
+      tlladdr = 1;    /*--- RestartSoft --- see RFC 4861 - 4.4 */
+      proxy = 0;              /*--- RestartSoft --- gif0 has no mac address */
        nd6_na_output_fib(ifp, &saddr6, &taddr6,
            ((anycast || proxy || !tlladdr) ? 0 : ND_NA_FLAG_OVERRIDE) |
            rflag | ND_NA_FLAG_SOLICITED, tlladdr,
==Actualisation des patches pour la version FreeBSD-12.1-RC2==
Dans le noyau:
Index: sys/netinet6/nd6_nbr.c
===================================================================
--- sys/netinet6/nd6_nbr.c (revision 353428)
+++ sys/netinet6/nd6_nbr.c (working copy)
@@ -270,8 +270,11 @@
 
  if (rib_lookup_info(ifp->if_fib, (struct sockaddr *)&dst6,
      0, 0, &info) == 0) {
+ /*--- RestartSoft --- rt_gateway.sdl_family == 0
  if ((info.rti_flags & RTF_ANNOUNCE) != 0 &&
      rt_gateway.sdl_family == AF_LINK) {
+ --- RestartSoft ---*/
+ if ((info.rti_flags & RTF_ANNOUNCE) != 0) {
 
  /*
  * proxy NDP for single entry
@@ -362,6 +365,8 @@
  nd6_cache_lladdr(ifp, &saddr6, lladdr, lladdrlen,
      ND_NEIGHBOR_SOLICIT, 0);
 
+ tlladdr = 1; /*--- RestartSoft --- see RFC 4861 - 4.4 */
+ proxy = 0; /*--- RestartSoft --- gif0 has no mac address */
  nd6_na_output_fib(ifp, &saddr6, &taddr6,
      ((anycast || proxy || !tlladdr) ? 0 : ND_NA_FLAG_OVERRIDE) |
      rflag | ND_NA_FLAG_SOLICITED, tlladdr,
==References==
==References==
<references />
<references />

Dernière version du 30 octobre 2019 à 17:00

Introduction

Je dispose depuis quelques temps d'un serveur dédié Kimsufi chez OVH. Ce serveur dispose d'une plage d'adresses IPv6 de type 2001:41D0:2:2D29::/64 avec une interface réseau ayant une/plusieurs adresse(s) dans cette plage mais avec un préfixe physique de 56 bits. Le gateway par défaut étant dans mon cas: 2001:41d0:2:2dff:ff:ff:ff:ff.

J'avais déjà réalisé, à partir de mon réseau à domicile, des tests IPv6 en utilisant SIxXS comme IPv6 Tunnel Broker. Comme je dispose maintenant d'un serveur ayant une connectivité IPv6, pourquoi ne pas m'en servir pour devenir mon propre IPv6 Tunnel Broker?

Quelques recherches ne donnèrent rien... Ma question sur la liste de distribution freebsd-net@freebsd.org [1] restant sans réponse, il fallait donc que je me démerde tout seul!

Voici donc les résultats de mes tribulations...

Connexion du serveur dédié au réseau IPv6

En adaptant les instructions fournies par OVH tout en n'utilisant pas le Router Advertisement, la connexion du serveur dédié (tignes) au réseau IPv6 est simple:

En mode commande, pour un premier test:

[root@tignes ~]# ifconfig nfe0 inet6 2001:41d0:2:2d29:0:1:: prefixlen 56
[root@tignes ~]# ifconfig nfe0
nfe0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        options=10b<RXCSUM,TXCSUM,VLAN_MTU,TSO4>
        ether 00:22:15:b4:42:57
        inet6 fe80::222:15ff:feb4:4257%nfe0 prefixlen 64 scopeid 0x1 
        inet 94.23.44.41 netmask 0xffffff00 broadcast 94.23.44.255
        inet 87.98.252.136 netmask 0xffffffff broadcast 87.98.252.136
        inet6 2001:41d0:2:2d29:0:1:: prefixlen 56 
        media: Ethernet autoselect (100baseTX <full-duplex>)
        status: active
[root@tignes ~]# route add -inet6 default 2001:41d0:2:2dff:ff:ff:ff:ff
add net default: gateway 2001:41d0:2:2dff:ff:ff:ff:ff
[root@tignes ~]# netstat -rn -f inet6
Routing tables

Internet6:
Destination                       Gateway                       Flags      Netif Expire
::/96                             ::1                           UGRS        lo0 =>
default                           2001:41d0:2:2dff:ff:ff:ff:ff  UGS        nfe0
::1                               ::1                           UHL         lo0
::ffff:0.0.0.0/96                 ::1                           UGRS        lo0
2001:41d0:2:2d00::/56             link#1                        UC         nfe0
2001:41d0:2:2d29:0:1::            00:22:15:b4:42:57             UHL         lo0
....

[root@tignes ~]# ping6 www.freebsd.org
PING6(56=40+8+8 bytes) 2001:41d0:2:2d29:0:1:: --> 2001:4f8:fff6::21
16 bytes from 2001:4f8:fff6::21, icmp_seq=0 hlim=54 time=190.249 ms
16 bytes from 2001:4f8:fff6::21, icmp_seq=1 hlim=54 time=190.681 ms
16 bytes from 2001:4f8:fff6::21, icmp_seq=2 hlim=54 time=191.213 ms
^C
--- www.freebsd.org ping6 statistics ---
3 packets transmitted, 3 packets received, 0.0% packet loss
round-trip min/avg/max/std-dev = 190.249/190.714/191.213/0.394 ms

[root@tignes ~]# 

En modifiant le fichier /etc/rc.conf.local pour le prochain boot:

ipv6_enable="YES"                       # Set to YES to set up for IPv6.
ipv6_network_interfaces="nfe0"          # List of network interfaces (or "auto").
ipv6_ifconfig_nfe0="2001:41d0:2:2d29:0:1:: prefixlen 56"
ipv6_defaultrouter="2001:41d0:2:2dff:ff:ff:ff:ff" # Set to IPv6 default gateway (or NO).

Le tunnel vers la maison

Il faut encore établir un tunnel entre le réseau de mon domicile et le serveur dédié (tignes). Le schema suivant donne la disposition des machines et les adresses IPv6 utilisées:

                   +-------------+
Serveur dedié      |   tignes    |
                   +-------------+
                          | 
                          +--------- [2001:41d0:2:2d29:0:1::/56] --- passerelle OVH --- IPv6 backbone
                          |
                          |-[2001:41d0:2:2d29:0:ffff::/128]
                          |
                    (gif IPv6 tunnel)
                          |
                          |
                          |-[2001:41d0:2:2d29:1:ffff::/128]
                   +-------------+
passerelle         |   avoriaz   |
                   +-------------+
                          |-[2001:41d0:2:2d29:1:1:/80]
                          |
                          |-[2001:41d0:2:2d29:1:2:/80]
                   +-------------+
station de travail |   morzine   |
                   +-------------+

La liaison entre le serveur dédié (tignes) et la passerelle de mon domicile (avoriaz) se fait par une connexion ADSL gérée par mpd5 (net/mpd5). Notons donc dès à présent que ma passerelle ADSL change d'adresse IPv4 lors de toute reconnexion à mon fournisseur d'accès; un script devra donc actualiser la configuration du tunnel tant sur avoriaz que sur tignes.

Création du tunnel en mode commande, pour un premier test:

Sur le serveur dédié (tignes):

[root@tignes ~]# ifconfig gif0 create
[root@tignes ~]# ifconfig gif0 tunnel 94.23.44.41 212.239.166.16
[root@tignes ~]# ifconfig gif0 2001:41d0:2:2d29:0:ffff:: 2001:41D0:2:2D29:1:ffff:: prefixlen 128
[root@tignes ~]# ifconfig gif0
gif0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> metric 0 mtu 1280
        tunnel inet 94.23.44.41 --> 212.239.166.16
        inet6 fe80::222:15ff:feb4:4257%gif0 prefixlen 64 scopeid 0x4 
        inet6 2001:41d0:2:2d29:0:ffff:: --> 2001:41d0:2:2d29:1:ffff:: prefixlen 128 
[root@tignes ~]# sysctl net.inet6.ip6.forwarding=1
net.inet6.ip6.forwarding: 0 -> 1
[root@tignes ~]# 

Sur la passerelle de la maison (avoriaz):

[root@avoriaz ~]# ifconfig gif0 create
[root@avoriaz ~]# ifconfig gif0 tunnel 212.239.166.16 94.23.44.41
[root@avoriaz ~]# ifconfig gif0 2001:41D0:2:2D29:1:ffff:: 2001:41d0:2:2d29:0:ffff:: prefixlen 128
[root@avoriaz ~]# ifconfig gif0
gif0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> metric 0 mtu 1280
        tunnel inet 212.239.166.16 --> 94.23.44.41
        inet6 fe80::21d:60ff:fead:2ace%gif0 prefixlen 64 scopeid 0x4 
        inet6 2001:41d0:2:2d29:1:ffff:: --> 2001:41d0:2:2d29:0:ffff:: prefixlen 128 
[root@avoriaz ~]# route add -inet6 default 2001:41d0:2:2d29:0:ffff::
add net default: gateway 2001:41d0:2:2d29:0:ffff::
[root@avoriaz ~]# netstat -rn -f inet6
Routing tables

Internet6:
Destination                       Gateway                       Flags      Netif Expire
::/96                             ::1                           UGRS        lo0 =>
default                           2001:41d0:2:2d29:0:ffff::     UGS        gif0
::1                               ::1                           UHL         lo0
::ffff:0.0.0.0/96                 ::1                           UGRS        lo0
2001:41d0:2:2d29:0:ffff::         link#4                        UHL        gif0
2001:41d0:2:2d29:1:ffff::         link#4                        UHL         lo0
...
[root@avoriaz ~]# ping6 2001:41d0:2:2d29:0:ffff::
PING6(56=40+8+8 bytes) 2001:41d0:2:2d29:1:ffff:: --> 2001:41d0:2:2d29:0:ffff::
16 bytes from 2001:41d0:2:2d29:0:ffff::, icmp_seq=0 hlim=64 time=12.895 ms
16 bytes from 2001:41d0:2:2d29:0:ffff::, icmp_seq=1 hlim=64 time=10.742 ms
16 bytes from 2001:41d0:2:2d29:0:ffff::, icmp_seq=2 hlim=64 time=19.643 ms
^C
--- 2001:41d0:2:2d29:0:ffff:: ping6 statistics ---
3 packets transmitted, 3 packets received, 0.0% packet loss
round-trip min/avg/max/std-dev = 10.742/14.427/19.643/3.792 ms

[root@avoriaz ~]# ping6 www.freebsd.org
PING6(56=40+8+8 bytes) 2001:41d0:2:2d29:1:ffff:: --> 2001:4f8:fff6::21
^C
--- www.freebsd.org ping6 statistics ---
6 packets transmitted, 0 packets received, 100.0% packet loss

[root@avoriaz ~]# 

Bien sûr, ce dernier test ne pouvait pas fonctionner car la passerelle OVH n'a pas une route statique vers tignes pour toutes les adresses 2001:41d0:2:2d29::/64. Durant le test, on peut observer sur tignes les requètes neighbor solicitation restant sans réponse:

[root@tignes ~]# tcpdump -n icmp6
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on nfe0, link-type EN10MB (Ethernet), capture size 96 bytes
14:10:18.435194 IP6 2001:41d0:2:2d29:1:ffff:: > 2001:4f8:fff6::21: ICMP6, echo request, seq 0, length 16
14:10:18.596523 IP6 fe80::21e:79ff:fe1e:f000 > ff02::1:ff00:0: ICMP6, neighbor solicitation, who has 2001:41d0:2:2d29:1:ffff::, length 32
-----------<Pas de réponse de tignes>----------
14:10:19.436418 IP6 2001:41d0:2:2d29:1:ffff:: > 2001:4f8:fff6::21: ICMP6, echo request, seq 1, length 16
^C
3 packets captured
46 packets received by filter
0 packets dropped by kernel
[root@tignes ~]# 

Avant de résoudre le problème des réponses aux ICMP6 - neighbor solicitations, configurons le réseau local du domicile.

Configuration IPv6 entre morzine et avoriaz

En anticipant les problèmes de routage entre tignes et le réseau de la maison, nous configurerons ce dernier avec des adresses 2001:41d0:2:2d29:1::/80. Au passage, il faut noter que toutes les adresses utilisées par tignes sont dans la plage d'adresses 2001:41d0:2:2d29:0::/80 afin de pouvoir ultérieurement garnir facilement la table de routage de tignes.

Sur avoriaz tout d'abord:

[root@avoriaz ~]# ifconfig em0 inet6 2001:41d0:2:2d29:1:1:: prefixlen 80
[root@avoriaz ~]# ifconfig em0
em0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
       options=19b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,TSO4>
       ether 00:1d:60:ad:2a:ce
       inet6 fe80::21d:60ff:fead:2ace%em0 prefixlen 64 scopeid 0x1 
       inet 192.168.24.1 netmask 0xffffff00 broadcast 192.168.24.255
       inet6 2001:41d0:2:2d29:1:1:: prefixlen 80 
       media: Ethernet 100baseTX (100baseTX <half-duplex>)
       status: active
[root@avoriaz ~]# sysctl net.inet6.ip6.forwarding=1
net.inet6.ip6.forwarding: 0 -> 1
[root@avoriaz ~]# 

Sur morzine ensuite:

[root@morzine ~]# ifconfig em0 inet6 2001:41d0:2:2d29:1:2:: prefixlen 80
[root@morzine ~]# ifconfig em0
em0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
       options=19b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,TSO4>
       ether 00:e0:81:70:6b:68
       inet6 fe80::2e0:81ff:fe70:6b68%em0 prefixlen 64 scopeid 0x1 
       inet 192.168.24.2 netmask 0xffffff00 broadcast 192.168.24.255
       inet6 2001:41d0:2:2d29:1:2:: prefixlen 80 
       media: Ethernet 100baseTX (100baseTX <half-duplex>)
       status: active
[root@morzine ~]# route add -inet6 default 2001:41d0:2:2d29:1:1::
add net default: gateway 2001:41d0:2:2d29:1:1::
[root@morzine ~]# netstat -rn -f inet6
Routing tables

Internet6:
Destination                       Gateway                       Flags      Netif Expire
::/96                             ::1                           UGRS        lo0 =>
default                           2001:41d0:2:2d29:1:1::        UGS         em0
::1                               ::1                           UHL         lo0
::ffff:0.0.0.0/96                 ::1                           UGRS        lo0
2001:41d0:2:2d29:1::/80           link#1                        UC          em0
2001:41d0:2:2d29:1:1::            00:1d:60:ad:2a:ce             UHLW        em0
2001:41d0:2:2d29:1:2::            00:e0:81:70:6b:68             UHL         lo0
fe80::/10                         ::1                           UGRS        lo0
fe80::%em0/64                     link#1                        UC          em0
fe80::2e0:81ff:fe70:6b68%em0      00:e0:81:70:6b:68             UHL         lo0
fe80::%lo0/64                     fe80::1%lo0                   U           lo0
fe80::1%lo0                       link#2                        UHL         lo0
ff01:1::/32                       link#1                        UC          em0
ff01:2::/32                       ::1                           UC          lo0
ff02::/16                         ::1                           UGRS        lo0
ff02::%em0/32                     link#1                        UC          em0
ff02::%lo0/32                     ::1                    
[root@morzine ~]#

Le fichier /etc/rc.conf.local sur avoriaz doit être complété pour le prochain boot:

gif_interfaces="gif0"                   # Tunnel to tignes.restart.be for ipv6
gifconfig_gif0="192.168.24.1 94.23.44.41"
...
ipv6_enable="YES"                       # Set to YES to set up for IPv6.
ipv6_network_interfaces="em0 gif0"      # List of network interfaces (or "auto").
ipv6_ifconfig_em0="2001:41d0:2:2d29:1:1:: prefixlen 80"
ipv6_ifconfig_gif0="2001:41d0:2:2d29:1:ffff:: 2001:41d0:2:2d29:0:ffff:: prefixlen 128"
ipv6_defaultrouter="2001:41d0:2:2d29:0:ffff::"
ipv6_gateway_enable="YES"               # Set to YES if this host will be a gateway.

A noter que l'adresse IPv4 réelle d'avoriaz sera configurée dynamiquement par mpd5.

Le fichier /etc/rc.conf.local sur morzine doit également être complété pour le prochain boot:

ipv6_enable="YES"                       # Set to YES to set up for IPv6.
ipv6_network_interfaces="em0"           # List of network interfaces (or "auto").
ipv6_ifconfig_em0="2001:41d0:2:2d29:1:2:: prefixlen 80"
ipv6_defaultrouter="2001:41d0:2:2d29:1:1::"

Le serveur dédié tignes doit répondre aux neighbor solicitations de la passerelle OVH

Après avoir lu et relu le manuel utilisateur de la commande route, la solution semblait être d'utiliser l'option -proxy:

[root@tignes ~]# route add -inet6 2001:41d0:2:2d29:1::/80 -interface gif0 -proxy
add net 2001:41d0:2:2d29:1::/80: gateway gif0
[root@tignes ~]# netstat -rn -f inet6
Routing tables

Internet6:
Destination                       Gateway                       Flags      Netif Expire
::/96                             ::1                           UGRS        lo0 =>
default                           2001:41d0:2:2d29:0:ffff::     UGS        gif0
::1                               ::1                           UHL         lo0
::ffff:0.0.0.0/96                 ::1                           UGRS        lo0
2001:41d0:2:100::/80              gif0                          ULS2       gif0
...
[root@tignes ~]# netstat -rn -f inet6
Routing tables

Internet6:
Destination                       Gateway                       Flags      Netif Expire
::/96                             ::1                           UGRS        lo0 =>
default                           2001:41d0:2:2dff:ff:ff:ff:ff  UGS        nfe0
::1                               ::1                           UHL         lo0
::ffff:0.0.0.0/96                 ::1                           UGRS        lo0
2001:41d0:2:2d00::/56             link#1                        UC         nfe0
2001:41d0:2:2d29:0:1::            00:22:15:b4:42:57             UHL         lo0
2001:41d0:2:2d29:0:ffff::         link#4                        UHL         lo0
2001:41d0:2:100::/80              gif0                          ULS2       gif0
...

La dernière ligne affichée semble surprenante et les tests montre que les neighbor solicitations restent sans réponse. Il reste donc une belle scéance de debugging pour traquer le problème. Finalement, je localise l'erreur dans le source de la commande route et trouve une astuce pour éviter l'erreur: route(8): route add -inet6 <ipv6_addr> -interface gif0 -proxy mangle ipv6 address. Le patch suivant fonctionne au moins jusqu'à la version 7.2-STABLE r193696:

--- sbin/route/route.c.orig	2005-09-28 14:12:15.000000000 +0200
+++ sbin/route/route.c	2008-05-03 14:42:02.000000000 +0200
@@ -731,7 +731,9 @@
 	if (iflag == 0)
 		flags |= RTF_GATEWAY;
 	if (proxy) {
+		/*--- RestartSoft ---
 		so_dst.sinarp.sin_other = SIN_PROXY;
+		---*/
 		flags |= RTF_ANNOUNCE;
 	}
 	for (attempts = 1; ; attempts++) {

Après cette modification, un test n'est hélas pas plus concluant. Passons donc au debugging de /usr/src/sys/netinet6/nd6_nbr.c... Quelques joyeux tests à l'aide d'une configuration de machines virtuelles qemu (emulators/qemu) permettrons de localiser le dernier problème et d'appliquer le patch suivant:

--- sys/netinet6/nd6_nbr.c.orig	2007-07-05 18:29:40.000000000 +0200
+++ sys/netinet6/nd6_nbr.c	2008-05-03 14:46:53.000000000 +0200
@@ -245,7 +245,9 @@
 				IN6_IFF_NOTREADY|IN6_IFF_ANYCAST);
 			if (ifa) {
 				proxy = 1;
+				/*--- RestartSoft --- 
 				proxydl = SDL(rt->rt_gateway);
+				---*/
 			}
 		}
 	}
@@ -328,7 +330,8 @@
 	    ND_NEIGHBOR_SOLICIT, 0);
 
 	nd6_na_output(ifp, &saddr6, &taddr6,
-	    ((anycast || proxy || !tlladdr) ? 0 : ND_NA_FLAG_OVERRIDE) |
+		/*---RestartSoft--- ((anycast || proxy || !tlladdr) ? 0 : ND_NA_FLAG_OVERRIDE) | ---*/
+		((anycast || !tlladdr) ? 0 : ND_NA_FLAG_OVERRIDE) |            /*--- RestartSoft ---*/
 	    (ip6_forwarding ? ND_NA_FLAG_ROUTER : 0) | ND_NA_FLAG_SOLICITED,
 	    tlladdr, (struct sockaddr *)proxydl);
  freeit:

Miracle, tout fonctionne après avoir compléter /etc/rc.conf.local sur tignes:

gif_interfaces="gif0"           # List of GIF tunnels (or "NO").
gifconfig_gif0="94.23.44.41 192.168.24.1"       # Updated later by avoriaz
...
ipv6_enable="YES"                       # Set to YES to set up for IPv6.
ipv6_network_interfaces="nfe0 gif0"     # List of network interfaces (or "auto").
ipv6_ifconfig_nfe0="2001:41d0:2:2d29:0:1:: prefixlen 56"
ipv6_ifconfig_gif0="2001:41d0:2:2d29:0:ffff:: 2001:41D0:2:2D29:1:ffff:: prefixlen 128"
ipv6_defaultrouter="2001:41d0:2:2dff:ff:ff:ff:ff" # Set to IPv6 default gateway (or NO).
ipv6_static_routes="avoriaz home"       # List of static routes
ipv6_route_avoriaz="2001:41d0:2:2d29:1:ffff:: -interface gif0 -proxy"
ipv6_route_home="2001:41d0:2:2d29:1::/80 -interface gif0 -proxy"
ipv6_gateway_enable="YES"               # Set to YES if this host will be a gateway.

Sur tignes:

[root@tignes ~]# tcpdump -n icmp6
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on nfe0, link-type EN10MB (Ethernet), capture size 96 bytes
17:13:42.240587 IP6 2001:41d0:2:2d29:1:2:: > 2001:4f8:fff6::21: ICMP6, echo request, seq 0, length 16
17:13:42.402779 IP6 fe80::21e:79ff:fe1e:f000 > ff02::1:ff00:0: ICMP6, neighbor solicitation, who has 2001:41d0:2:2d29:1:2::, length 32
17:13:42.403098 IP6 fe80::222:15ff:feb4:4257 > fe80::21e:79ff:fe1e:f000: ICMP6, neighbor advertisement, tgt is 2001:41d0:2:2d29:1:2::, length 32
17:13:42.406509 IP6 2001:4f8:fff6::21 > 2001:41d0:2:2d29:1:2::: ICMP6, echo reply, seq 0, length 16
17:13:43.240987 IP6 2001:41d0:2:2d29:1:2:: > 2001:4f8:fff6::21: ICMP6, echo request, seq 1, length 16
17:13:43.401280 IP6 2001:4f8:fff6::21 > 2001:41d0:2:2d29:1:2::: ICMP6, echo reply, seq 1, length 16
17:13:44.238972 IP6 2001:41d0:2:2d29:1:2:: > 2001:4f8:fff6::21: ICMP6, echo request, seq 2, length 16
17:13:44.399157 IP6 2001:4f8:fff6::21 > 2001:41d0:2:2d29:1:2::: ICMP6, echo reply, seq 2, length 16
^C
8 packets captured
60 packets received by filter
0 packets dropped by kernel
[root@tignes ~]# 

Pendant que sur morzine:

[root@morzine ~]# ping6 www.freebsd.org
PING6(56=40+8+8 bytes) 2001:41d0:2:2d29:1:2:: --> 2001:4f8:fff6::21
16 bytes from 2001:4f8:fff6::21, icmp_seq=0 hlim=52 time=178.485 ms
16 bytes from 2001:4f8:fff6::21, icmp_seq=1 hlim=52 time=171.677 ms
16 bytes from 2001:4f8:fff6::21, icmp_seq=2 hlim=52 time=171.798 ms
^C
--- www.freebsd.org ping6 statistics ---
3 packets transmitted, 3 packets received, 0.0% packet loss
round-trip min/avg/max/std-dev = 171.677/173.987/178.485/3.181 ms 

[root@morzine ~]#

Il ne reste plus qu'à ajouter deux scripts au répertoire /usr/local/etc/mpd5:

[root@avoriaz ~]# cd /usr/local/etc/mpd5
[root@avoriaz mpd5]# cat adsl.linkup 
#!/bin/sh
MYADDR=$3
/sbin/pfctl -F all -f /etc/pf.conf
/usr/local/etc/mpd5/adsl.up ${MYADDR} &
exit 0
[root@avoriaz mpd5]# cat adsl.up
#!/bin/sh
MYADDR=$1
MYADDR=`echo $MYADDR | sed 's/\/32//'`
TIGNES="94.23.44.41"
sleep 10
usr/bin/killall -KILL ntpd
/etc/rc.d/ntpd start
#--- tignes ---{
#--- IPV6 tunnel
/sbin/ifconfig gif0 tunnel ${MYADDR} ${TIGNES}
/usr/bin/ssh -4 ${TIGNES} /sbin/ifconfig gif0 tunnel ${TIGNES} ${MYADDR}
#--- DNS update
sleep 5		#--- wait for the IPv6 connection with tignes
/usr/local/bin/dnsupdate -u avoriaz.restart.be=${MYADDR}
#--- tignes ---}
exit 0
[root@avoriaz mpd5]# 
Une remarque finale s'impose: Pour que le IPv6 Tunnel Broker puisse recevoir un neighbor solicitation concernant une adresse du réseau du domicile, ce message ICMP6 ne doit pas être filtré par le pilote de la carte réseau (multicast filtering). Pour ce faire, toutes les adresses doivent avoir, pour les 3 derniers octets, une valeur identique à celle attribuée à la carte réseau du serveur dédié. Dans cette exemple j'ai opté pour les 4 derniers octets à zéro - les 3 derniers auraient suffis mais l'extension à 4 me semblait plus simple à manipuler.

Actualisation des patches pour la version FreeBSD-9.0-RC1

Pour la commande route:

Index: sbin/route/route.c
===================================================================
--- sbin/route/route.c	(revision 226460)
+++ sbin/route/route.c	(working copy)
@@ -746,7 +746,7 @@
 	if (iflag == 0)
 		flags |= RTF_GATEWAY;
 	if (proxy) {
-		so_dst.sinarp.sin_other = SIN_PROXY;
+/*---	so_dst.sinarp.sin_other = SIN_PROXY; --- RestartSoft ---*/
 		flags |= RTF_ANNOUNCE;
  	}
 	for (attempts = 1; ; attempts++) {

Dans le noyau:

Index: sys/netinet6/nd6_nbr.c
===================================================================
--- sys/netinet6/nd6_nbr.c	(revision 226460)
+++ sys/netinet6/nd6_nbr.c	(working copy)
@@ -350,6 +350,8 @@
 	nd6_cache_lladdr(ifp, &saddr6, lladdr, lladdrlen,
 	    ND_NEIGHBOR_SOLICIT, 0);
 
+	tlladdr = 1;	/*--- RestartSoft --- see RFC 4861 - 4.4 */
+	proxy = 0;		/*--- RestartSoft --- gif0 has no mac address */
 	nd6_na_output(ifp, &saddr6, &taddr6,
 	    ((anycast || proxy || !tlladdr) ? 0 : ND_NA_FLAG_OVERRIDE) |
 	    rflag | ND_NA_FLAG_SOLICITED, tlladdr,

Actualisation des patches pour la version FreeBSD-9.2-RC3

Pour la commande route:

Index: sbin/route/route.c
===================================================================
--- sbin/route/route.c	(revision 254050)
+++ sbin/route/route.c	(working copy)
@@ -971,7 +971,7 @@
	if ((nrflags & F_INTERFACE) == 0)
		flags |= RTF_GATEWAY;
	if (nrflags & F_PROXY) {
-		so_dst.sinarp.sin_other = SIN_PROXY;
+/*---	so_dst.sinarp.sin_other = SIN_PROXY; --- RestartSoft ---*/
		flags |= RTF_ANNOUNCE;
	}
	if (dest == NULL)


Dans le noyau:

Index: sys/netinet6/nd6_nbr.c
===================================================================
--- sys/netinet6/nd6_nbr.c	(revision 254050)
+++ sys/netinet6/nd6_nbr.c	(working copy)
@@ -356,6 +356,8 @@
	nd6_cache_lladdr(ifp, &saddr6, lladdr, lladdrlen,
	    ND_NEIGHBOR_SOLICIT, 0);

+	tlladdr = 1;	/*--- RestartSoft --- see RFC 4861 - 4.4 */
+	proxy = 0;		/*--- RestartSoft --- gif0 has no mac address */
	nd6_na_output_fib(ifp, &saddr6, &taddr6,
	    ((anycast || proxy || !tlladdr) ? 0 : ND_NA_FLAG_OVERRIDE) |
	    rflag | ND_NA_FLAG_SOLICITED, tlladdr,

Il reste un dernier problème, l'adresse 2001:41d0:2:2d29:0:ffff:: d'avoriaz n'est plus acceptée dans la table de routage de tignes avec l'option proxy. Toute connexion ipv6 à partir d'avoriaz utilise par défaut cette adresse et donc l'accès en ipv6 à partir d'avoriaz est compromis. La solution est cependant assez simple, il suffit d'ajouter l'option no_prefer_iface pour l'interface gif0 d'avoriaz. Cette option est également ajoutée à l'interface gif0 sur tignes par pure symétrie.

Le fichier /etc/rc.conf.local sur avoriaz doit être adapté:

gif_interfaces="gif0"                   # Tunnel to tignes.restart.be for ipv6
gifconfig_gif0="192.168.24.1 94.23.44.41"
...
ipv6_enable="YES"                       # Set to YES to set up for IPv6.
ipv6_network_interfaces="em0 gif0"      # List of network interfaces (or "auto").
ipv6_ifconfig_em0="2001:41d0:2:2d29:1:1:: prefixlen 80"
ipv6_ifconfig_gif0="2001:41d0:2:2d29:1:ffff:: 2001:41d0:2:2d29:0:ffff:: prefixlen 128 no_prefer_iface"
ipv6_defaultrouter="2001:41d0:2:2d29:0:ffff::"
ipv6_gateway_enable="YES"               # Set to YES if this host will be a gateway.

Le fichier /etc/rc.conf.local sur tignes est également modifié:

gif_interfaces="gif0"           # List of GIF tunnels (or "NO").
gifconfig_gif0="94.23.44.41 192.168.24.1"       # Updated later by avoriaz
...
ipv6_enable="YES"                       # Set to YES to set up for IPv6.
ipv6_network_interfaces="nfe0 gif0"     # List of network interfaces (or "auto").
ipv6_ifconfig_nfe0="2001:41d0:2:2d29:0:1:: prefixlen 56"
ipv6_ifconfig_gif0="2001:41d0:2:2d29:0:ffff:: 2001:41D0:2:2D29:1:ffff:: prefixlen 128 no_prefer_iface"
ipv6_defaultrouter="2001:41d0:2:2dff:ff:ff:ff:ff" # Set to IPv6 default gateway (or NO).
ipv6_static_routes="home"               # List of static routes
ipv6_route_home="2001:41d0:2:2d29:1::/80 -interface gif0 -proxy"
ipv6_gateway_enable="YES"               # Set to YES if this host will be a gateway.

Actualisation des patches pour la version FreeBSD-11.0-RC1

Dans le noyau:

Index: sys/netinet6/nd6_nbr.c
===================================================================
--- sys/netinet6/nd6_nbr.c      (revision 304222)
+++ sys/netinet6/nd6_nbr.c      (working copy)
@@ -265,8 +265,11 @@
                /* Always use the default FIB. */
                if (rib_lookup_info(RT_DEFAULT_FIB, (struct sockaddr *)&dst6,
                    0, 0, &info) == 0) {
+                       /*--- RestartSoft --- rt_gateway.sdl_family == 0 
                        if ((info.rti_flags & RTF_ANNOUNCE) != 0 &&
                            rt_gateway.sdl_family == AF_LINK) {
+                   --- RestartSoft ---*/
+                       if ((info.rti_flags & RTF_ANNOUNCE) != 0) {
 
                                /*
                                * proxy NDP for single entry
@@ -357,6 +360,8 @@
        nd6_cache_lladdr(ifp, &saddr6, lladdr, lladdrlen,
            ND_NEIGHBOR_SOLICIT, 0);
 
+       tlladdr = 1;    /*--- RestartSoft --- see RFC 4861 - 4.4 */
+       proxy = 0;              /*--- RestartSoft --- gif0 has no mac address */
        nd6_na_output_fib(ifp, &saddr6, &taddr6,
            ((anycast || proxy || !tlladdr) ? 0 : ND_NA_FLAG_OVERRIDE) |
            rflag | ND_NA_FLAG_SOLICITED, tlladdr,

Actualisation des patches pour la version FreeBSD-12.1-RC2

Dans le noyau:

Index: sys/netinet6/nd6_nbr.c
===================================================================
--- sys/netinet6/nd6_nbr.c	(revision 353428)
+++ sys/netinet6/nd6_nbr.c	(working copy)
@@ -270,8 +270,11 @@
 
 		if (rib_lookup_info(ifp->if_fib, (struct sockaddr *)&dst6,
 		    0, 0, &info) == 0) {
+			/*--- RestartSoft --- rt_gateway.sdl_family == 0
 			if ((info.rti_flags & RTF_ANNOUNCE) != 0 &&
 			    rt_gateway.sdl_family == AF_LINK) {
+			--- RestartSoft ---*/
+			if ((info.rti_flags & RTF_ANNOUNCE) != 0) {
 
 				/*
 				 * proxy NDP for single entry
@@ -362,6 +365,8 @@
 	nd6_cache_lladdr(ifp, &saddr6, lladdr, lladdrlen,
  	    ND_NEIGHBOR_SOLICIT, 0);
 
+	tlladdr = 1;	/*--- RestartSoft --- see RFC 4861 - 4.4 */
+	proxy = 0;		/*--- RestartSoft --- gif0 has no mac address */
 	nd6_na_output_fib(ifp, &saddr6, &taddr6,
 	    ((anycast || proxy || !tlladdr) ? 0 : ND_NA_FLAG_OVERRIDE) |
 	    rflag | ND_NA_FLAG_SOLICITED, tlladdr,

References

  1. ipv6 ndp proxy - advice needed... - (Les adresses IPv6 ont changé depuis le passage à un nouveau serveur)