Adicionando um bloco IPv6 / 64 inteiro a uma interface de rede no debian

15

Tentei adicionar um bloco IPv6 (/ 64) inteiro a uma interface usando

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

como descrito aqui no meu servidor Debian, mas parece que estou perdendo alguma coisa.

Se eu executar ping por exemplo 2001:41d0:2:ad64::felocalmente, tudo funcionará bem, mas se eu tentar em uma máquina remota, não funcionará. Tentei adicionar a rota no eth0:

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

Agora eu não conseguia nem pingar qualquer endereço de exemplo localmente!

Estou um pouco perdido, pois parece que estou perdendo alguma coisa, mas não consigo encontrar a resposta aqui.

Resumindo: quero 2001:41d0:2:ad64::/64vincular-me a eth0 para que todos os IPs contidos neste bloco sejam acessíveis pela Internet na minha máquina.

Espero que alguém lá fora possa me indicar o caminho certo. Desde já, obrigado.

O guia fornecido pelo ISP exige que eu adicione cada IPv6 à interface explicitamente. Eu quero que seja implícito.

Configuração de trabalho com ligação explícita de endereço 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

Solução # 1

Tentei reativar a rota local como sugerido por @kasperd.

Conteúdo do meu / 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

Tabela de roteamento 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

Saída de traceroute(meu PC local em 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 no 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 no 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 saída (durante o ping e o rastreamento no 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 para o 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 para o 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

Por isso, ainda está apenas trabalhando localmente (servidor), mas não do controle remoto (meu pc).

Hikaru-Shindo
fonte
Então você já tentou um traceroute de uma máquina remota? Onde o rastreamento falha?
precisa
Se todos os hosts estiverem na mesma rede, você não deverá ter nenhuma rota.
Spack
Seu segundo ip routecomando possui um erro de digitação no endereço IPv6.
Michael Hampton
@ Pack Eu quero que eth0 ouça todo um prefixo ipv6 / 64 (tráfego de entrada), @ michael-hampton corrigido, foi apenas enquanto digitava esta pergunta, @ Zoredache Falha no ISPs Gateway 2001:41d0:2:adff:ff:ff:ff:ffapós o tempo limite.
Hikaru-Shindo
De pesquisas que fiz no passado, isso não é possível. O motivo pelo qual ele funciona localmente é porque sua tabela de roteamento sabe para onde rotear pacotes. Se você adicionou esse prefixo como uma rota estática no seu roteador de borda, verá os clientes da LAN capazes de se conectar.
C #, # C # de Nathan C

Respostas:

13

Eu precisava de algo semelhante no passado. Eu descobri que existem três etapas necessárias para fazer isso funcionar:

  • Você precisa rotear um prefixo para o host
  • Você precisa de uma rota local no host
  • Os aplicativos precisam definir a opção IP_FREEBINDou IP_TRANSPARENTnos soquetes

A maneira correta de obter um prefixo roteado para o host envolve entrar em contato com seu provedor, se ele ainda não fornecer um. Eles podem ter um servidor DHCPv6, que pode delegar um prefixo para você, se você enviar a solicitação DHCPv6 correta.

Se, por algum motivo, não for possível obter um prefixo roteado real, mas você tiver acesso a quantos endereços desejar em um prefixo de link disponível em uma de suas interfaces de rede, poderá transformar parte dele em um prefixo roteado por ter um daemon responder a solicitações de descoberta de vizinhos para cada endereço IPv6 nesse intervalo.

O uso desse daemon não é recomendado como último recurso, pois consumirá desnecessariamente memória de todos os seus vizinhos. Existem algumas implementações desse daemon, uma que parece promissora é o ndppd . (Não tenho experiência específica com ele, pois só o aprendi depois que escrevi o meu com o prefixo do link codificado.)

Parece que você já conseguiu a rota local funcionando. Como você notou, ele deve ser atribuído à lointerface para funcionar.

Finalmente, os aplicativos que usam endereços desse intervalo precisam de uma opção IP para poderem se conectar a endereços que não são explicitamente atribuídos a uma interface de rede específica no host. Aqui está um fragmento de código, que pode ser usado:

const int one = 1;
setsockopt(fd, SOL_IP, IP_FREEBIND, &one, sizeof(one));
Kasperd
fonte
Eu tenho um prefixo estático roteado para o meu servidor pelo ISP (eles não fornecem DHCP. Nem para IPv4 nem IPv6). Quero que todo IPv6 neste bloco / 64 seja acessível externamente (a maioria dos meus aplicativos se liga a :: que devem ser todos os endereços disponíveis se não me engano). Agora eu quero que todos esses IPs estejam disponíveis no eth0, portanto, se eu tentar conectar-me a qualquer IPv6 nesse bloco, qualquer aplicativo que esteja ouvindo a porta especificada poderá responder (por exemplo, cada IP deve responder ao ping corretamente).
Hikaru-Shindo
Se você ligar para :: a opção IP_TRANSPARENT não será necessária. Com um prefixo roteado para o meu servidor e a rota local, posso vincular a :: e receber conexões feitas com endereços IPv6 arbitrários nesse intervalo. O ping6 também funciona. Estou testando isso no Ubuntu 12.04, mas espero que funcione em qualquer kernel recente em outras distribuições também. Se ele não está funcionando para você, eu sugiro que você dê uma olhada no tráfego de rede usandotcpdump -pni eth0 'host 2001:41d0:2:ad65::fe'
kasperd
Ainda não está funcionando. Forneci mais algumas informações sobre a configuração na minha pergunta, talvez isso ajude.
Hikaru-Shindo
Você diz que possui um / 64 roteado para o servidor. Mas os exemplos no guia do provedor de hospedagem possuem apenas um prefixo de link e nenhum prefixo roteado. E a saída tcpdump e traceroute6 parece que os endereços não são roteados para o servidor. Você conseguiu que um único endereço IPv6 funcionasse usando a documentação do provedor?
precisa saber é o seguinte
1
@Arya Quando eu precisava de uma coisa eu colocar o comando no/etc/rc.local
kasperd
2

É 2019 ano agora. Uma palavra: ip_nonlocal_bind (desde o kernel 4.3 como eu sei).

Use ndppd + sysctl net.ipv6.ip_nonlocal_bind = 1, o último permite ligar a qualquer endereço IPv6 (neste caso, não é necessário IP_FREEBIND).

Acho que você fez isso:

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

O ndppd.conf se parecerá com:

route-ttl 30000

proxy eth0 {

   router no

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

execute o ndppd e agora você pode vincular a qualquer endereço (do bloco adicionado) e usá-lo como ele próprio se adicionou.

Alexander Gnatyna
fonte