Agregar un bloque completo de IPv6 / 64 a una interfaz de red en Debian

15

Intenté agregar un bloque completo de IPv6 (/ 64) a una interfaz usando

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

como se describe aquí en mi servidor Debian, pero parece que me falta algo.

Si hago ping, por ejemplo, 2001:41d0:2:ad64::felocalmente, todo funciona bien, pero si lo intento desde una máquina remota, no funciona. Luego intenté agregar la ruta en eth0:

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

¡Ahora ni siquiera podía hacer ping a ninguna dirección de ejemplo localmente!

Estoy un poco perdido ya que parece que me falta algo, pero no puedo encontrar la respuesta aquí.

Para abreviar: quiero 2001:41d0:2:ad64::/64estar vinculado a eth0 para que cada IP que contenga este bloque sea accesible desde Internet en mi máquina.

Espero que alguien pueda señalarme el camino correcto. Gracias por adelantado.

La guía proporcionada por el ISP requiere que agregue cada IPv6 a la interfaz explícitamente. Quiero que sea implícito.

Configuración de trabajo con enlace explícito de direcciones 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

Prueba de solución # 1

Intenté volver a habilitar la ruta local como sugirió @kasperd.

Contenido de mi / 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

Tabla de enrutamiento local:

# 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

Salida de traceroute(mi PC 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 en el servidor:

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 en el servidor:

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 salida (al hacer ping y tracerouting en el servidor remoto):

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

tracert a la puerta de entrada:

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 a la puerta de entrada:

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

Entonces todavía funciona localmente (servidor) pero no desde remoto (mi PC).

Hikaru-Shindo
fuente
Entonces, ¿has probado un traceroute desde una máquina remota? ¿Dónde falla el rastro?
Zoredache
Si todos los hosts están en la misma red, no debería tener ninguna ruta.
Spack
Su segundo ip routecomando tiene un error tipográfico en la dirección IPv6.
Michael Hampton
@Spack Quiero que eth0 escuche todo el prefijo ipv6 / 64 (tráfico entrante), @ michael-hampton arreglado, fue solo mientras escribía esta pregunta, @Zoredache Falla en el ISPs Gateway 2001:41d0:2:adff:ff:ff:ff:ffdespués de eso, solo se agota el tiempo de espera.
Hikaru-Shindo
De la investigación que hice en el pasado, esto no es posible. La razón por la que funciona localmente es porque su tabla de enrutamiento sabe a dónde enrutar los paquetes. Si agregó este prefijo como una ruta estática en su enrutador perimetral, verá que los clientes LAN pueden conectarse.
Nathan C

Respuestas:

13

He necesitado algo similar en el pasado. Descubrí que hay tres pasos necesarios para que esto funcione:

  • Necesita enrutar un prefijo al host
  • Necesita una ruta local en el host
  • Las aplicaciones deben establecer la opción IP_FREEBINDo IP_TRANSPARENTen los sockets

La forma correcta de enrutar un prefijo al host implica contactar a su proveedor, si aún no le proporciona uno. Pueden tener un servidor DHCPv6, que puede delegarle un prefijo, si solo le envía la solicitud correcta de DHCPv6.

Si por alguna razón le es imposible obtener un prefijo enrutado real, pero tiene acceso para usar tantas direcciones como desee de un prefijo de enlace disponible en una de sus interfaces de red, puede convertir parte de eso en un prefijo enrutado hacer que un demonio responda a las solicitudes de descubrimiento de vecinos para cada dirección IPv6 en ese rango.

Usar un demonio así no se recomienda como último recurso, ya que consumirá innecesariamente la memoria de todos sus vecinos. Hay algunas implementaciones de tal demonio, una que parece prometedora es ndppd . (No tengo experiencia específica con él, ya que solo aprendí sobre esto después de haber escrito el mío con mi prefijo de enlace codificado).

Parece que ya tienes la ruta local funcionando. Como notó, tiene que asignarse a la lointerfaz para que funcione.

Finalmente, las aplicaciones que usan direcciones de este rango necesitan una opción de IP para poder unirse a direcciones, que no están asignadas explícitamente a una interfaz de red específica en el host. Aquí hay un fragmento de código que se puede usar:

const int one = 1;
setsockopt(fd, SOL_IP, IP_FREEBIND, &one, sizeof(one));
kasperd
fuente
Tengo un prefijo estático enrutado a mi servidor por el ISP (no proporcionan DHCP. Ni para IPv4 ni IPv6). Quiero que todo IPv6 en este bloque / 64 sea accesible desde el exterior (la mayoría de mis aplicaciones se unen a :: que deberían ser todas las direcciones disponibles si no me equivoco). Ahora quiero que todas estas IP estén disponibles en eth0, así que si intento conectarme a cualquier IPv6 en ese bloque, cualquier aplicación que escuche el puerto especificado podrá responder (por ejemplo, cada IP debería responder correctamente al ping).
Hikaru-Shindo
Si se une a :: la opción IP_TRANSPARENT no es necesaria. Con un prefijo enrutado a mi servidor y la ruta local en su lugar, puedo vincularme a :: y recibir conexiones realizadas a direcciones IPv6 arbitrarias en ese rango. ping6 también funciona. Estoy probando esto en Ubuntu 12.04, pero espero que funcione en cualquier kernel reciente en otras distribuciones también. Si no funciona para usted, le sugiero que eche un vistazo al tráfico de la red usandotcpdump -pni eth0 'host 2001:41d0:2:ad65::fe'
kasperd
Aún no funciona. Proporcioné un poco más de información sobre la configuración en mi pregunta, tal vez esto ayude.
Hikaru-Shindo
Dices que tienes un / 64 enrutado al servidor. Pero los ejemplos en la guía del proveedor de alojamiento solo tienen un prefijo de enlace y ningún prefijo enrutado. Y la salida tcpdump y traceroute6 parece que las direcciones no se enrutan al servidor. ¿Ha logrado que funcione una sola dirección IPv6 utilizando la documentación del proveedor?
kasperd
1
@Arya Cuando necesitaba una cosa así que puse en el comando/etc/rc.local
kasperd
2

Es el año 2019 ahora. Una palabra: ip_nonlocal_bind (desde 4,3 kernel como puedo saber).

Use ndppd + sysctl net.ipv6.ip_nonlocal_bind = 1, el último le permite enlazar a cualquier dirección IPv6 (no se necesita IP_FREEBIND en este caso).

Supongo que lo hiciste:

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 se verá así:

route-ttl 30000

proxy eth0 {

   router no

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

ejecute ndppd y ahora puede enlazar a cualquier dirección (del bloque agregado) y usarla como se agregó.

Alexander Gnatyna
fuente