Hinzufügen eines ganzen IPv6 / 64-Blocks zu einer Netzwerkschnittstelle unter Debian

15

Ich habe versucht, mithilfe von einen ganzen IPv6 (/ 64) -Block zu einer Schnittstelle hinzuzufügen

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

wie hier auf meinem Debian-Server beschrieben, aber mir scheint etwas zu fehlen.

Wenn ich zum Beispiel 2001:41d0:2:ad64::felokal pinge, funktioniert alles einwandfrei, aber wenn ich es von einem entfernten Rechner aus versuche, funktioniert es nicht. Ich habe dann versucht, die Route auf eth0 hinzuzufügen:

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

Jetzt konnte ich nicht einmal eine Beispieladresse lokal anpingen!

Ich bin ein bisschen verloren, seit ich etwas vermisse, aber ich kann die Antwort hier nicht finden.

Kurz: Ich möchte 2001:41d0:2:ad64::/64an eth0 gebunden sein, damit jede IP, die dieser Block enthält, auf meinem Computer über das Internet erreichbar ist.

Ich hoffe jemand da draußen kann mir den richtigen Weg zeigen. Danke im Voraus.

In der vom Internetdienstanbieter bereitgestellten Anleitung muss ich jedes IPv6 explizit zur Schnittstelle hinzufügen. Ich möchte, dass es impliziert wird.

Arbeitskonfiguration mit expliziter IP-Adressbindung

/ 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

Lösungsversuch # 1

Ich habe versucht, die lokale Route wieder zu aktivieren, wie von @kasperd vorgeschlagen.

Inhalt meiner / 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

Lokale Routing-Tabelle:

# 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

Ausgabe von traceroute(meinem lokalen Heim-PC):

  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 auf dem 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 auf dem 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 Ausgabe (beim Pingen und Tracerouting auf dem Remote-Server):

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

tracert zum 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 zum 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

Es funktioniert also immer noch lokal (Server), aber nicht von einem entfernten Standort (meinem PC).

Hikaru-Shindo
quelle
Haben Sie also eine Traceroute von einem Remote-Computer aus versucht? Wo schlägt der Trace fehl?
Zoredache
Wenn sich alle Hosts im selben Netzwerk befinden, sollten Sie keine Route haben.
Spack
Ihr zweiter ip routeBefehl enthält einen Tippfehler in der IPv6-Adresse.
Michael Hampton
@Spack Ich möchte, dass eth0 ein ganzes IPv6 / 64-Präfix (eingehenden Datenverkehr) abhört. @ Michael-hampton behoben. Es war nur beim Eingeben dieser Frage 2001:41d0:2:adff:ff:ff:ff:ff.
Hikaru-Shindo
Nach Recherchen, die ich in der Vergangenheit durchgeführt habe, ist dies nicht möglich. Der Grund dafür ist, dass Ihre Routing-Tabelle weiß, wohin Pakete weitergeleitet werden sollen. Wenn Sie dieses Präfix als statische Route in Ihrem Edge-Router hinzugefügt haben, können LAN-Clients eine Verbindung herstellen.
Nathan C

Antworten:

13

Ich habe in der Vergangenheit etwas Ähnliches gebraucht. Ich stellte fest, dass drei Schritte erforderlich sind, um dies zum Laufen zu bringen:

  • Sie müssen ein Präfix an den Host weiterleiten
  • Sie benötigen eine lokale Route auf dem Host
  • Anwendungen müssen die Option IP_FREEBINDoder IP_TRANSPARENTfür Sockets festlegen

Der richtige Weg, um ein Präfix an den Host weiterzuleiten, besteht darin, sich an Ihren Provider zu wenden, falls dieser Ihnen noch kein Präfix zur Verfügung stellt. Sie verfügen möglicherweise über einen DHCPv6-Server, der ein Präfix an Sie delegieren kann, wenn Sie nur die richtige DHCPv6-Anforderung an ihn senden.

Wenn ein echtes Routing-Präfix aus irgendeinem Grund nicht abgerufen werden kann, Sie jedoch über ein auf einer Ihrer Netzwerkschnittstellen verfügbares Link-Präfix Zugriff auf beliebig viele Adressen haben, können Sie einen Teil davon in ein Routing-Präfix umwandeln Ein Dämon antwortet auf Anforderungen der Nachbarerkennung für jede IPv6-Adresse in diesem Bereich.

Die Verwendung eines solchen Daemons wird nur als letzter Ausweg empfohlen, da er unnötigerweise Speicherplatz von allen Ihren Nachbarn beansprucht. Es gibt einige Implementierungen eines solchen Daemons, eine, die vielversprechend aussieht, ist ndppd . (Ich habe keine besonderen Erfahrungen damit, da ich erst davon erfahren habe, nachdem ich mein eigenes mit meinem fest codierten Link-Präfix geschrieben hatte.)

Es sieht so aus, als hätten Sie die lokale Route bereits eingerichtet. Wie Sie bemerkt haben, muss es der loSchnittstelle zugewiesen werden, damit es funktioniert.

Schließlich benötigen die Anwendungen, die Adressen aus diesem Bereich verwenden, eine IP-Option, um sich an Adressen binden zu können, die nicht explizit einer bestimmten Netzwerkschnittstelle auf dem Host zugewiesen sind. Hier ist ein Codefragment, das verwendet werden kann:

const int one = 1;
setsockopt(fd, SOL_IP, IP_FREEBIND, &one, sizeof(one));
Kasperd
quelle
Ich habe ein statisches Präfix, das vom ISP an meinen Server weitergeleitet wird (sie stellen kein DHCP zur Verfügung. Weder für IPv4 noch für IPv6). Ich möchte, dass alle IPv6-Dateien in diesem / 64-Block von außen erreichbar sind (die meisten meiner Anwendungen sind an :: gebunden, das sollten alle verfügbaren Adressen sein, wenn ich mich nicht irre). Jetzt möchte ich, dass alle diese IPs auf eth0 verfügbar sind. Wenn ich also versuche, eine Verbindung zu einem IPv6-Server in diesem Block herzustellen, kann jede Anwendung, die auf den angegebenen Port hört, antworten (zum Beispiel sollte jede IP korrekt auf Ping antworten).
Hikaru-Shindo
Wenn Sie an :: binden, wird die Option IP_TRANSPARENT nicht benötigt. Mit einem Präfix, das an meinen Server weitergeleitet wird, und der vorhandenen lokalen Route kann ich mich an :: binden und Verbindungen zu beliebigen IPv6-Adressen in diesem Bereich erhalten. ping6 funktioniert auch. Ich teste dies auf Ubuntu 12.04, aber ich würde erwarten, dass es auf jedem neueren Kernel auch auf anderen Distributionen funktioniert. Wenn es bei Ihnen nicht funktioniert, empfehlen wir Ihnen, den Netzwerkverkehr mittcpdump -pni eth0 'host 2001:41d0:2:ad65::fe'
kasperd 26.04.14
Es funktioniert immer noch nicht. Ich habe in meiner Frage ein paar weitere Informationen zur Konfiguration angegeben, vielleicht hilft das.
Hikaru-Shindo
Sie sagen, dass Sie eine / 64 auf den Server geroutet haben. Die Beispiele im Handbuch des Hosting-Providers haben jedoch nur ein Link-Präfix und kein geroutetes Präfix. Und die Ausgabe von tcpdump und traceroute6 sieht so aus, als würden die Adressen nicht an den Server weitergeleitet. Haben Sie es geschafft, mithilfe der Dokumentation des Anbieters eine einzelne IPv6-Adresse zum Laufen zu bringen?
Kasperd
1
@Arya Als ich so etwas brauchte, gab ich den Befehl ein/etc/rc.local
kasperd
2

Es ist jetzt 2019 Jahre. Ein Wort: ip_nonlocal_bind (seit 4.3 Kernel, wie ich vielleicht weiß).

Verwenden Sie ndppd + sysctl net.ipv6.ip_nonlocal_bind = 1. Mit der letzten Option können Sie eine Bindung an eine beliebige IPv6-Adresse herstellen (in diesem Fall ist keine IP_FREEBIND erforderlich).

Vermutlich haben Sie Folgendes getan:

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 sieht so aus:

route-ttl 30000

proxy eth0 {

   router no

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

Führen Sie ndppd aus, und Sie können jetzt eine Bindung an eine beliebige Adresse (des hinzugefügten Blocks) herstellen und sie so verwenden, wie sie sich selbst hinzugefügt hat.

Alexander Gnatyna
quelle