Aggiunta di un intero blocco IPv6 / 64 a un'interfaccia di rete su debian


15

Ho provato ad aggiungere un intero blocco IPv6 (/ 64) a un'interfaccia usando

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

come descritto qui sul mio server Debian, ma mi sembra che manchi qualcosa.

Se eseguo il ping, ad esempio, 2001:41d0:2:ad64::felocalmente, tutto funziona perfettamente, ma se provo da una macchina remota non funziona. Ho quindi provato ad aggiungere il percorso su eth0:

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

Ora non potevo nemmeno fare il ping di un indirizzo di esempio a livello locale!

Mi sono perso un po 'poiché mi sembra che manchi qualcosa, ma non riesco a trovare la risposta qui.

In breve: voglio 2001:41d0:2:ad64::/64essere legato a eth0 in modo che ogni IP che questo blocco contiene sia raggiungibile da Internet sul mio computer.

Spero che qualcuno là fuori possa indicarmi la strada giusta. Grazie in anticipo.

La guida fornita dall'ISP mi richiede di aggiungere esplicitamente ogni IPv6 all'interfaccia. Voglio che sia implicito.

Configurazione funzionante con associazione dell'indirizzo IP esplicito

/ 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

Soluzione provare n. 1

Ho provato a riattivare il percorso locale come suggerito da @kasperd.

Contenuto della mia / 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

Tabella di routing 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

Uscita di traceroute(il mio PC di casa):

  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 sul server:

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 sul server:

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 output (durante il ping e il tracerouting sul server 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 al gateway:

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 al gateway:

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

Quindi funziona ancora solo localmente (server) ma non da remoto (il mio pc).


Quindi hai provato un traceroute da una macchina remota? Dove fallisce la traccia?
Zoredache,

Se tutti gli host si trovano nella stessa rete, non dovresti avere alcun percorso.
Spacca il

Il tuo secondo ip routecomando ha un refuso nell'indirizzo IPv6.
Michael Hampton

@Spack Voglio che eth0 ascolti un intero prefisso ipv6 / 64 (traffico in entrata), @ michael-hampton riparato, è stato solo durante la digitazione di questa domanda, @Zoredache Non riesce al gateway ISPs 2001:41d0:2:adff:ff:ff:ff:ffdopo che si è appena verificato il timeout.
Hikaru-Shindo,

Dalla ricerca che ho fatto in passato, questo non è possibile. Il motivo per cui funziona localmente è perché la tabella di routing sa dove instradare i pacchetti. Se si aggiungesse questo prefisso come route statica nel router perimetrale, si vedrebbero i client LAN in grado di connettersi.
Nathan C,

Risposte:


13

Ho avuto bisogno di qualcosa di simile in passato. Ho scoperto che ci sono tre passaggi necessari per farlo funzionare:

  • È necessario instradare un prefisso all'host
  • È necessario un percorso locale sull'host
  • Le applicazioni devono impostare l' opzione IP_FREEBINDo IP_TRANSPARENTsui socket

Il modo corretto per ottenere un prefisso indirizzato all'host consiste nel contattare il proprio provider, se non ne è già fornito uno. Possono avere un server DHCPv6, che può delegarti un prefisso, se ti invii semplicemente la richiesta DHCPv6 corretta.

Se per qualche motivo è impossibile ottenere un prefisso con routing reale, ma hai accesso a utilizzare tutti gli indirizzi che desideri da un prefisso di collegamento disponibile su una delle tue interfacce di rete, puoi trasformare parte di esso in un prefisso indirizzato da fare in modo che un demone risponda alle richieste di rilevamento dei vicini per ogni indirizzo IPv6 in quell'intervallo.

L'uso di un tale demone non è consigliato se non come ultima risorsa, poiché consumerà inutilmente memoria da tutti i tuoi vicini. Ci sono alcune implementazioni di un tale demone, uno che sembra promettente è ndppd . (Non ho esperienza specifica con esso, poiché l'ho imparato solo dopo aver scritto il mio con il mio prefisso di collegamento hardcoded.)

Sembra che tu abbia già funzionato il percorso locale. Come hai notato, per funzionare, deve essere assegnato loall'interfaccia.

Infine, le applicazioni che utilizzano indirizzi di questo intervallo necessitano di un'opzione IP per poter essere associate a indirizzi che non sono esplicitamente assegnati a una specifica interfaccia di rete sull'host. Ecco un frammento di codice che può essere utilizzato:

const int one = 1;
setsockopt(fd, SOL_IP, IP_FREEBIND, &one, sizeof(one));

Ho un prefisso statico indirizzato al mio server dall'ISP (non forniscono DHCP. Né per IPv4 né IPv6). Voglio che tutti gli IPv6 in questo blocco / 64 siano raggiungibili dall'esterno (la maggior parte delle mie applicazioni si legano a: che dovrebbero essere tutti gli indirizzi disponibili se non sbaglio). Ora voglio che tutti questi IP siano disponibili su eth0, quindi se provo a connettermi a qualsiasi IPv6 in quel blocco qualsiasi applicazione che ascolta la porta specificata sarà in grado di rispondere (ad esempio ogni IP dovrebbe rispondere correttamente al ping).
Hikaru-Shindo,

Se si associa a :: l'opzione IP_TRANSPARENT non è necessaria. Con un prefisso indirizzato al mio server e il percorso locale in atto, posso collegarmi a :: e ricevere connessioni effettuate a indirizzi IPv6 arbitrari in quell'intervallo. funziona anche ping6. Sto testando questo su Ubuntu 12.04, ma mi aspetto che funzioni su qualsiasi kernel recente anche su altre distribuzioni. Se non funziona per te, ti suggerisco di dare un'occhiata al traffico di rete usandotcpdump -pni eth0 'host 2001:41d0:2:ad65::fe'
kasperd,

Non funziona ancora. Ho fornito qualche informazione in più sulla configurazione nella mia domanda, forse questo aiuta.
Hikaru-Shindo,

Dici di avere un / 64 indirizzato al server. Ma gli esempi nella guida del provider di hosting hanno solo un prefisso di collegamento e nessun prefisso indirizzato. E l'output di tcpdump e traceroute6 sembra che gli indirizzi non vengano indirizzati al server. Sei riuscito a far funzionare un singolo indirizzo IPv6 utilizzando la documentazione del provider?
Kasperd,

1
@Arya Quando ho avuto bisogno di una cosa del genere ho inserito il comando/etc/rc.local
kasperd

2

È il 2019 anno ormai. Una sola parola: ip_nonlocal_bind (dal 4.3 kernel come potrei sapere).

Usa ndppd + sysctl net.ipv6.ip_nonlocal_bind = 1, l'ultimo ti consente di associare qualsiasi indirizzo IPv6 (in questo caso non è necessario IP_FREEBIND).

Immagino di averlo fatto:

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 sarà simile a:

route-ttl 30000

proxy eth0 {

   router no

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

esegui ndppd e ora puoi collegarti a qualsiasi indirizzo (di blocco aggiunto) e usarlo come si è aggiunto da solo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.