wie man radvd für linux ipv6 router in richtung upstream dsl gateway konfiguriert

2648
DavidG

Ich versuche, dass mein Linux-Heimrouter auch IPv6 im Heimnetzwerk unterstützt.

Ich habe einen NVG599 DSL-Router, der als GW für das öffentliche Internet fungiert, und dann meinen Linux-Router mit zwei Schnittstellen: eth0 in Richtung Heimnetzwerk und eth1 in Richtung DSL-Router.

HOME Netzwerk <---- eth0 -----> LinuxRouter <------ eth1 ------> DSLrouter - >>>>>

Der DSL-Router ist mit einem / 64-Netzwerkpräfix von meinem ISP konfiguriert (vorausgesetzt, es ist 2001: 0: 0: 1234 :: / 64) und der DSL-Router hat eine globale IPv6-Adresse von 2001: 0: 0: 1234 :: 1 . Ich habe den Linux-Router mit radvd so eingerichtet, dass er dasselbe / 64-Netzwerkpräfix auf eth0 in Richtung des Heim-LAN ankündigt, und tatsächlich sehe ich, dass die Hosts im LAN ihre IP-Adressen automatisch konfigurieren können. In der Ankündigung wird der Linux-Router auch als Standardrouter für :: / 0 aufgeführt. Die Weiterleitung ist so eingerichtet, dass er die Pakete an den DSL-Router sendet.

Das Problem, das ich habe, ist, dass der DSL-Router Nachbaranforderungspakete auf eth1 sendet, wenn er eingehende Pakete vom Internet erhält, und diese Nachbaranfragen nicht von eth1 -> eth0 auf dem Linux-Router weitergeleitet werden. Ich denke, dass dies der Fall ist, weil der DSL-Router der Meinung ist, dass er direkt mit dem Heimnetzwerk verbunden ist (was normalerweise in 99% der Heimnetzwerke ohne einen Linux-Router in der Mitte der Fall wäre).

Nachdem ich zwei Tage damit verbracht hatte, es herauszufinden, ist mir die Antwort bisher entgangen. Ich hoffe, dass es eine Möglichkeit gibt, eine Routerankündigung über radvd an den DSL-Router zu senden, um ihm zu sagen, dass er alle Pakete für das / 64-Präfix über den Linux-Router routen soll. Derzeit ist die vom Linux-Router gesendete Routerankündigung so konfiguriert, dass das / 64-Präfix an den DSL-Router gesendet wird:

interface eth1 { AdvSendAdvert on; MinRtrAdvInterval 3; MaxRtrAdvInterval 10; route 2001:0:0:1234::/64 { };  }; 

Ich denke, dies sollte ausreichen, um den DSL-Router dazu zu bringen, alle Pakete an das Netzwerk weiterzuleiten, aber ich sehe immer noch die Nachbarn.

Ich sehe, dass der DSL-Router IP-Pass-Through-Einstellungen mit der Möglichkeit hat, einen "Standard-Server" festzulegen, aber diese scheinen nur für IPv4 zu gelten. Vorausgesetzt, dass der DSL-Router meine RA nicht ehrt, könnte ich die ipv6-Multicast-Weiterleitung mit 'xorb' auf meinem Linux-Router einrichten, aber ich frage mich, ob es andere Optionen gibt.

2
Teredo-Adressen? Das wird nicht funktionieren. Verwenden Sie gültige IPv6-Adressen. Michael Hampton vor 7 Jahren 0
Teredo-Adressen sind perfekt, danke. Ich gehe davon aus, dass der Beitrag lediglich 2001: 0: ... als Beispiele verwendet. grawity vor 7 Jahren 0

1 Antwort auf die Frage

3
grawity

Das Problem, das ich habe, ist, dass der DSL-Router Nachbaranforderungspakete auf eth1 sendet, wenn er eingehende Pakete vom Internet erhält, und diese Nachbaranfragen nicht von eth1 -> eth0 auf dem Linux-Router weitergeleitet werden.

Das ist normal. Nachbaranfragen funktionieren genau wie ARP-Abfragen - sie übersetzen eine IP-Adresse in eine MAC-Adresse und sind daher nur in derselben Broadcast-Domäne sinnvoll. Es macht keinen Sinn, dass ein Router sie weiterleitet.

(In manchen Situationen kann ein Router sie jedoch als Proxy verwenden, wie am Ende beschrieben, aber ... belassen Sie dies für Plan C.)

Ich denke, dass dies der Fall ist, weil der DSL-Router der Meinung ist, dass er direkt mit dem Heimnetzwerk verbunden ist (was normalerweise in 99% der Heimnetzwerke ohne einen Linux-Router in der Mitte der Fall wäre).

Ja, und du hast es nie anders gesagt .

Ihre aktuelle Situation ist also, dass das gleiche IP-Subnetz von zwei verschiedenen Netzwerken verwendet wird und Sie erwarten, dass der Linux-Router als Bridge fungiert ... Was fast das genaue Gegenteil eines Routers ist.

(Wenn der verwirrende Teil IPv6 ist, denken Sie über das gesamte Setup nach IPv4 nach, da das Routing in beiden Fällen mehr oder weniger gleich ist und ND hauptsächlich ARP entspricht. Wenn Sie also nicht dasselbe Subnetz 192.168.1.0 in verwenden würden v4 ...)


Die beste Vorgehensweise ist , eine zweite / 64 zu erhalten und diese für das eth1-Netzwerk Ihres Linux-Routers zu verwenden. (Wenn der DSL - Router seinen Präfix über DHCPv6-PD erhält, könnte es möglich sein, sie dazu zu verleiten, einen zweiten anfordern.) Der Unterschied ist aber, dass die 2. / 64 nicht direkt an einer Schnittstelle verwendet werden, sondern geroutet auf dem Adresse des Linux-Routers

Zum Beispiel:

  • DSL-Router hat 2001: db8: 0: 0: a: b: c: d an der WAN-Schnittstelle.
  • DSL-Router erhält 2001: db8: 10: 0 :: / 64 vom ISP, weist selbst 2001: db8: 10: 0 :: 1/64 auf der LAN-Schnittstelle zu und sendet dafür Router Advertisements.
  • Linux-Router konfiguriert automatisch 2001: db8: 10: 0: x: y: z: t auf eth1 basierend auf RAs.
  • Linux-Router erhält 2001: db8: 10: 1 :: / 64 vom ISP (irgendwie), weist selbst 2001: db8: 10: 1 :: 1/64 auf der eth0-Schnittstelle zu, und radvd sendet dafür Router-Anzeigen - nicht für das erste Subnetz.
  • Der DSL-Router benötigt eine Route wie "2001: db8: 10: 1 :: / 64 via 2001: db8: 10: 0: x: y: z: t", damit der gesamte Verkehr für das 2. Subnetz in Richtung des Linux-Routers weitergeleitet wird .

(Entschuldigung für das nicht sehr klare Beispiel.)

Manchmal überträgt der ISP eine ganze / 60 oder sogar / 56 an Sie und leitet sie in Richtung des DSL-Routers weiter. In diesem Fall können Sie das zweite Teilnetz einfach ohne DHCPV6-PD-Magie einrichten. Wirklich, aber ich kann hier keine gute "generische" Antwort geben, da diese sowohl ISP-abhängig als auch CPE-abhängig ist.


Wenn kein zweiter / 64-Präfix erhalten werden kann, sind folgende Optionen möglich:

  • Verwandeln Sie das Linux-System in eine reine Bridge ohne Routing-Funktionalität.

  • Verwenden Sie andere Quellen, um zusätzliche / 64-Werte zu erhalten, z. B. einen Tunnelanbieter (oder 6to4). Die vorhandenen Tunneldienste werden (mit Ausnahme einiger zusätzlicher Latenzzeiten) viel zuverlässiger arbeiten als die unten beschriebenen Hacks.

  • Stellen Sie sicher, dass der DSL-Router nur die / 64 bezieht, aber nicht für LAN konfiguriert. (Abhängig von der Flexibilität des Routers.) Richten Sie stattdessen erneut eine Route für das / 64 über die eth0-Link-Local-Adresse Ihres Linux-Systems ein und richten Sie auf dem Linux-System ebenfalls eine Route für :: / 0 über den DSL-Router ein LAN-Link-lokale Adresse Daher wird / 64 nur im 2. Subnetz verwendet, und das 1. hat überhaupt keine öffentlichen Präfixe.

  • Fahren Sie mit Ihrem aktuellen Setup fort, installieren Sie jedoch 'ndppd', um das Neighbor Discovery-Proxying durchzuführen. (Nein, Multicast-Forwarding funktioniert nicht, da ND-Pakete häufig linklokale Quelladressen haben.) Seien Sie vorsichtig, dies kann zu Verwirrung führen.

  • Verwenden Sie private (ULA) Adressen für das 2. LAN und aktivieren Sie 1-zu-viele-NAT (Masquerading) auf dem Linux-Router. Dadurch verlieren Sie den größten Teil der Nutzbarkeit von IPv6. (Ja, NAT gibt es offiziell nicht in IPv6, aber das hat Linux netfilter / iptables nicht davon abgehalten, sich hinzugeben und zu implementieren.)

Dies ist etwas chaotisch, weil es auf einem Telefon nach Mitternacht geschrieben wurde ... grawity vor 7 Jahren 0
Danke für eine großartige Antwort. Die zwei Lösungen, die ich in Betracht ziehen werde, versuchen, eine zweite / 64 vom ISP zu beziehen, und wie der DSL-Router in eine Art Bridge-Modus versetzt wird, in dem er das Routing für IPv6 an den Linux-Router delegiert. Das größte Problem ist, dass IPv4 funktioniert und ich möchte das nicht brechen. DavidG vor 7 Jahren 0