Ajouter un bloc IPv6 / 64 entier à une interface réseau sur Debian

15

J'ai essayé d'ajouter un bloc IPv6 (/ 64) entier à une interface en utilisant

ip route add local 2001:41d0:2:ad64::/64 dev lo

comme décrit ici sur mon serveur Debian, mais il me semble manquer quelque chose.

Si je ping par exemple 2001:41d0:2:ad64::felocalement, tout fonctionne très bien, mais si j'essaie depuis une machine distante, cela ne fonctionne pas. J'ai ensuite essayé d'ajouter la route sur eth0:

ip route add local 2001::41d0:2:ad64::/64 dev eth0

Maintenant, je ne pouvais même pas cingler un exemple d'adresse localement!

Je suis un peu perdu car il me semble manquer quelque chose mais je ne trouve pas la réponse ici.

Pour faire court: je veux 2001:41d0:2:ad64::/64être lié à eth0 pour que chaque IP que contient ce bloc soit accessible depuis Internet sur ma machine.

J'espère que quelqu'un là-bas pourra me montrer le bon chemin. Merci d'avance.

Le guide fourni par le FAI m'oblige à ajouter explicitement chaque IPv6 à l'interface. Je veux que ce soit implicite.

Configuration de travail avec explication de la liaison d'adresse IP

/ etc / network / interfaces:

auto eth0
iface eth0 inet static
        address my.ip.v4
        netmask 255.255.255.0
        network my.network.address.ip
        broadcast my.broadcast.address.ip
        gateway my.gateway.ip

iface eth0 inet6 static
        address 2001:41d0:2:ad64::fe
        netmask 64
        gateway 2001:41d0:2:adff:ff:ff:ff:ff
        up ip addr add 2001:41d0:2:ad64::1/64 dev eth0
        down ip addr del 2001:41d0:2:ad64::1/64 dev eth0
        up ip addr add 2001:41d0:2:ad64::2/64 dev eth0
        down ip addr del 2001:41d0:2:ad64::2/64 dev eth0
        up ip addr add 2001:41d0:2:ad64::3/64 dev eth0
        down ip addr del 2001:41d0:2:ad64::3/64 dev eth0
        up ip addr add 2001:41d0:2:ad64::4/64 dev eth0
        down ip addr del 2001:41d0:2:ad64::4/64 dev eth0
        up ip addr add 2001:41d0:2:ad64::5/64 dev eth0
        down ip addr del 2001:41d0:2:ad64::5/64 dev eth0
        up ip addr add 2001:41d0:2:ad64::6/64 dev eth0
        down ip addr del 2001:41d0:2:ad64::6/64 dev eth0
        up ip addr add 2001:41d0:2:ad64::7/64 dev eth0
        down ip addr del 2001:41d0:2:ad64::7/64 dev eth0
        up ip addr add 2001:41d0:2:ad64::8/64 dev eth0
        down ip addr del 2001:41d0:2:ad64::8/64 dev eth0
        up ip addr add 2001:41d0:2:ad64::9/64 dev eth0
        down ip addr del 2001:41d0:2:ad64::9/64 dev eth0
        up ip addr add 2001:41d0:2:ad64::a/64 dev eth0
        down ip addr del 2001:41d0:2:ad64::a/64 dev eth0

Solution essayer # 1

J'ai essayé de réactiver la route locale comme l'a suggéré @kasperd.

Contenu de mon / etc / network / interfaces

auto lo
iface lo inet loopback
    post-up ip route add local 2001:41d0:2:ad64::/64 dev lo
    pre-down ip route del local 2001:41d0:2:ad64::/64 dev lo

auto eth0
iface eth0 inet static
        # <snip of ipv4 config>

iface eth0 inet6 static
        address 2001:41d0:2:ad64::fe
        netmask 64
        gateway 2001:41d0:2:adff:ff:ff:ff:ff

Table de routage locale:

# ip -6 route show table local
local ::1 dev lo  proto none  metric 0
local 2001:41d0:2:ad64::fe dev lo  proto none  metric 0
local 2001:41d0:2:ad64::/64 dev lo  metric 1024
local fe80::225:90ff:fe06:6bbe dev lo  proto none  metric 0
ff00::/8 dev eth0  metric 256

Sortie de traceroute(mon PC domestique local):

  1    <1 ms    <1 ms    <1 ms  fritz.box [xxx]

  2    20 ms    21 ms    24 ms  2002:c058:6301::1
  3    21 ms    22 ms    24 ms  10gigabitethernet6.switch2.fra1.he.net [2001:470
:0:150::1]
  4    44 ms    31 ms    40 ms  100ge3-1.core1.ams1.he.net [2001:470:0:2d4::1]
  5     *        *        *     Zeitüberschreitung der Anforderung.
  6     *        *       35 ms  ams-5-6k.nl.eu [2001:41d0::8d1]
  7    37 ms    39 ms    36 ms  rbx-g2-a9.fr.eu [2001:41d0::ab1]
  8    37 ms    70 ms    36 ms  chi-3-4m.il.us [2001:41d0::176]
  9  Zielhost nicht erreichbar.

Ablaufverfolgung beendet.

traceroute6 sur le serveur:

traceroute to 2001:41d0:2:ad64::23 (2001:41d0:2:ad64::23), 30 hops max, 80 byte packets
 1  2001:41d0:2:ad64::a (2001:41d0:2:ad64::a)  0.028 ms  0.009 ms  0.008 ms

ping6 sur le serveur:

PING 2001:41d0:2:ad64::23(2001:41d0:2:ad64::23) 56 data bytes
64 bytes from 2001:41d0:2:ad64::23: icmp_seq=1 ttl=64 time=0.029 ms
64 bytes from 2001:41d0:2:ad64::23: icmp_seq=2 ttl=64 time=0.057 ms
^C
--- 2001:41d0:2:ad64:23 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.029/0.043/0.057/0.014 ms

tcpdump sortie (lors du ping et du tracerouting sur le serveur distant):

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes

tracert à la passerelle:

Routenverfolgung zu vss-3-6k.fr.eu [2001:41d0:2:adff:ff:ff:ff:ff] über maximal 3
0 Abschnitte:

  1    <1 ms    <1 ms    <1 ms  fritz.box [2002:5476:1b4c:0:c225:6ff:fe40:b2b0]

  2    23 ms    22 ms    26 ms  2002:c058:6301::1
  3    24 ms    40 ms    23 ms  10gigabitethernet6.switch2.fra1.he.net [2001:470
:0:150::1]
  4    28 ms    37 ms    39 ms  100ge3-1.core1.ams1.he.net [2001:470:0:2d4::1]
  5     *        *        *     Zeitüberschreitung der Anforderung.
  6    38 ms    33 ms     *     ams-5-6k.nl.eu [2001:41d0::8d1]
  7    36 ms    39 ms    38 ms  rbx-g2-a9.fr.eu [2001:41d0::ab1]
  8    36 ms    35 ms    35 ms  vss-3-6k.fr.eu [2001:41d0:2:adff:ff:ff:ff:ff]

Ablaufverfolgung beendet.

ping à la passerelle:

Ping wird ausgeführt für 2001:41d0:2:adff:ff:ff:ff:ff mit 32 Bytes Daten:
Antwort von 2001:41d0:2:adff:ff:ff:ff:ff: Zeit=36ms
Antwort von 2001:41d0:2:adff:ff:ff:ff:ff: Zeit=34ms
Antwort von 2001:41d0:2:adff:ff:ff:ff:ff: Zeit=38ms
Antwort von 2001:41d0:2:adff:ff:ff:ff:ff: Zeit=57ms

Ping-Statistik für 2001:41d0:2:adff:ff:ff:ff:ff:
    Pakete: Gesendet = 4, Empfangen = 4, Verloren = 0
    (0% Verlust),
Ca. Zeitangaben in Millisek.:
    Minimum = 34ms, Maximum = 57ms, Mittelwert = 41ms

Donc, cela fonctionne toujours localement (serveur) mais pas à distance (mon PC).

Hikaru-Shindo
la source
Avez-vous donc essayé un traceroute depuis une machine distante? Où la trace échoue-t-elle?
Zoredache
Si tous les hôtes sont sur le même réseau, vous ne devriez avoir aucun itinéraire.
Spack
Votre deuxième ip routecommande a une faute de frappe dans l'adresse IPv6.
Michael Hampton
@Spack Je veux que eth0 écoute tout un préfixe ipv6 / 64 (trafic entrant), @ michael-hampton corrigé, c'était juste en tapant cette question, @Zoredache Il échoue à la passerelle des FAI 2001:41d0:2:adff:ff:ff:ff:ffaprès cela, il va juste expirer.
Hikaru-Shindo
D'après les recherches que j'ai faites dans le passé, ce n'est pas possible. La raison pour laquelle cela fonctionne localement est que votre table de routage sait où router les paquets. Si vous avez ajouté ce préfixe en tant que route statique dans votre routeur périphérique, vous verrez des clients LAN capables de se connecter.
Nathan C

Réponses:

13

J'ai eu besoin de quelque chose de similaire dans le passé. J'ai trouvé qu'il y a trois étapes nécessaires pour que cela fonctionne:

  • Vous devez acheminer un préfixe vers l'hôte
  • Vous avez besoin d'un itinéraire local sur l'hôte
  • Les applications doivent définir l' option IP_FREEBINDou IP_TRANSPARENTsur les sockets

La bonne façon d'obtenir un préfixe acheminé vers l'hôte consiste à contacter votre fournisseur, s'il ne vous en fournit pas déjà un. Ils peuvent avoir un serveur DHCPv6, qui peut vous déléguer un préfixe, si vous lui envoyez simplement la bonne requête DHCPv6.

Si un vrai préfixe routé vous est impossible pour une raison quelconque, mais que vous avez accès à autant d'adresses que vous le souhaitez à partir d'un préfixe de lien disponible sur l'une de vos interfaces réseau, vous pouvez en transformer une partie en préfixe routé en demander à un démon de répondre aux demandes de découverte de voisins pour chaque adresse IPv6 de cette plage.

L'utilisation d'un tel démon n'est pas recommandée autrement qu'en dernier recours, car il consommera inutilement de la mémoire de tous vos voisins. Il existe quelques implémentations d'un tel démon, celle qui semble prometteuse est ndppd . (Je n'ai aucune expérience spécifique avec cela, car je ne l'ai appris qu'après avoir écrit le mien avec mon préfixe de lien codé en dur.)

Il semble que vous ayez déjà fait fonctionner la route locale. Comme vous l'avez remarqué, il doit être affecté à l' lointerface pour fonctionner.

Enfin, les applications utilisant des adresses de cette plage ont besoin d'une option IP pour pouvoir se lier à des adresses qui ne sont pas explicitement affectées à une interface réseau spécifique sur l'hôte. Voici un fragment de code qui peut être utilisé:

const int one = 1;
setsockopt(fd, SOL_IP, IP_FREEBIND, &one, sizeof(one));
kasperd
la source
J'ai un préfixe statique acheminé vers mon serveur par le FAI (ils ne fournissent pas DHCP. Ni pour IPv4 ni IPv6). Je veux que tous les IPv6 dans ce bloc / 64 soient accessibles de l'extérieur (la plupart de mes applications se lient à :: qui devrait être toutes les adresses disponibles si je ne me trompe pas). Maintenant, je veux que toutes ces adresses IP soient disponibles sur eth0, donc si j'essaye de me connecter à n'importe quel IPv6 dans ce bloc, n'importe quelle application écoutant le port spécifié pourra répondre (par exemple, chaque IP devrait répondre correctement au ping).
Hikaru-Shindo
Si vous vous liez à :: l'option IP_TRANSPARENT n'est pas nécessaire. Avec un préfixe routé vers mon serveur et la route locale en place, je peux me lier à :: et recevoir des connexions établies à des adresses IPv6 arbitraires dans cette plage. ping6 fonctionne également. Je teste cela sur Ubuntu 12.04, mais je m'attendrais à ce qu'il fonctionne sur n'importe quel noyau récent sur d'autres distributions. Si cela ne fonctionne pas pour vous, je vous suggère de jeter un œil au trafic réseau en utilisanttcpdump -pni eth0 'host 2001:41d0:2:ad65::fe'
kasperd
Ça ne marche toujours pas. J'ai fourni quelques informations supplémentaires sur la configuration dans ma question, peut-être que cela aide.
Hikaru-Shindo
Vous dites que vous avez un / 64 routé vers le serveur. Mais les exemples dans le guide du fournisseur d'hébergement n'ont qu'un préfixe de lien et aucun préfixe routé. Et la sortie tcpdump et traceroute6 semble que les adresses ne sont pas routées vers le serveur. Avez-vous réussi à faire fonctionner une seule adresse IPv6 à l'aide de la documentation du fournisseur?
kasperd
1
@Arya Quand j'ai eu besoin d'une telle chose, j'ai mis la commande/etc/rc.local
kasperd
2

C'est l'année 2019 maintenant. Un mot: ip_nonlocal_bind (depuis le noyau 4.3 comme je le sais peut-être).

Utilisez ndppd + sysctl net.ipv6.ip_nonlocal_bind = 1, le dernier vous permet de vous lier à n'importe quelle adresse IPv6 (aucun IP_FREEBIND n'est nécessaire dans ce cas).

Je suppose que vous l'avez fait:

ip add add local 2001::41d0:2:ad64::/64 dev lo
ip route add local 2001::41d0:2:ad64::/64 dev eth0
sysctl  net.ipv6.ip_nonlocal_bind = 1

ndppd.conf ressemblera à:

route-ttl 30000

proxy eth0 {

   router no

   timeout 500
   ttl 30000
   rule 2001::41d0:2:ad64::/64{
       static
   }
}

exécutez ndppd et vous pouvez maintenant vous lier à n'importe quelle adresse (du bloc ajouté) et l'utiliser comme il s'est ajouté.

Alexander Gnatyna
la source