So konfigurieren Sie Radvd für einen Linux-IPv6-Router in Richtung Upstream-DSL-Gateway

So konfigurieren Sie Radvd für einen Linux-IPv6-Router in Richtung Upstream-DSL-Gateway

Ich versuche, meinen Linux-Heimrouter dazu zu bringen, auch IPv6 im Heimnetzwerk zu unterstützen.

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

Heimnetzwerk <----eth0-----> LinuxRouter <------eth1------>DSLRouter -->>>>>

Der DSL-Router ist von meinem ISP mit einem /64-Netzwerkpräfix konfiguriert (nehmen wir an, 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 für eth0 gegenüber dem Heim-LAN bekannt gibt, und tatsächlich sehe ich, dass die Hosts im LAN ihre IP-Adressen automatisch konfigurieren können. Die Bekanntgabe listet den Linux-Router auch als Standardrouter für ::/0 auf, und die Weiterleitung ist so eingerichtet, dass die Pakete an den DSL-Router gesendet werden.

Mein Problem ist, dass der DSL-Router Neighbor Solicitation-Pakete an eth1 sendet, wenn er eingehende Pakete aus dem Internet empfängt, und diese Neighbor Solicitation-Pakete werden nicht von eth1 -> eth0 an den Linux-Router weitergeleitet. Ich denke, das liegt daran, dass der DSL-Router denkt, er sei direkt mit dem Heimnetzwerk verbunden (was normalerweise in 99 % der Heimnetzwerke ohne einen Linux-Router dazwischen der Fall ist).

Nachdem ich 2 Tage damit verbracht habe, es herauszufinden, ist mir die Antwort bisher entgangen. Ich hoffe, dass es eine Möglichkeit gibt, mit radvd eine Router-Werbung an den DSL-Router zu senden, um ihn anzuweisen, alle Pakete für das Präfix /64 über den Linux-Router zu routen. Derzeit ist die vom Linux-Router gesendete Router-Werbung so konfiguriert, dass das Präfix /64 an den DSL-Router gesendet wird mit:

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

};

Ich würde meinen, dass dies ausreichen sollte, damit der DSL-Router alle Pakete an das Netzwerk weiterleitet, aber ich sehe immer noch die Nachbaranfragen.

Ich sehe, dass der DSL-Router IP-Passthrough-Einstellungen mit der Möglichkeit hat, einen „Standardserver“ festzulegen, aber diese scheinen nur für IPv4 zu gelten. Vorausgesetzt, der DSL-Router berücksichtigt meine RA nicht, könnte ich vermutlich IPv6-Multicast-Weiterleitung mit „xorb“ auf meinem Linux-Router einrichten, frage mich aber, ob es andere Optionen gibt.

Antwort1

Mein Problem besteht darin, dass der DSL-Router Neighbor Solicitation-Pakete an eth1 sendet, wenn er eingehende Pakete aus dem Internet empfängt, und diese Neighbor Solicitation-Pakete werden an den Linux-Router nicht von eth1 -> eth0 weitergeleitet.

Das ist normal. Neighbor Solicitations funktionieren genau wie ARP-Anfragen – sie übersetzen eine IP-Adresse in eine MAC-Adresse und sind daher nur innerhalb derselben Broadcast-Domäne sinnvoll. Das machtkeinen Sinnfür einen Router, der sie weiterleitet.

(In manchen Situationen kann ein RouterProxysie, wie am Ende beschrieben, aber ... das überlassen Sie Plan C.)

Ich vermute, dass dies daran liegt, dass der DSL-Router denkt, er sei direkt mit dem Heimnetzwerk verbunden (was in 99 % aller Heimnetzwerke ohne dazwischengeschalteten Linux-Router der Fall ist).

Ja, und du nieerzähltes anders.

Ihre derzeitige Situation ist also, dass dieDasselbeDas IP-Subnetz wird von zwei verschiedenen Netzwerken verwendet und Sie erwarten, dass der Linux-Router als Brücke fungiert … was fast das genaue Gegenteil eines Routers ist.

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


Am besten gehen Sie folgendermaßen vor:erhalten einzweite/64,und VerwendungDasfür das eth1-Netzwerk Ihres Linux-Routers. (Wenn der DSL-Router sein Präfix über DHCPv6-PD erhält, kann man ihn möglicherweise dazu bringen, ein zweites anzufordern.) Der Unterschied besteht jedoch darin, dass das zweite /64 nicht direkt auf einer Schnittstelle verwendet wird, sondernweitergeleitetzur Adresse des Linux-Routers.

Zum Beispiel:

  • Der DSL-Router hat 2001:db8:0:0:a:b:c:d auf der WAN-Schnittstelle.
  • Der DSL-Router erhält 2001:db8:10:0::/64 vom ISP, weist sich selbst 2001:db8:10:0::1/64 auf der LAN-Schnittstelle zu und sendet Router-Anzeigen dafür.
  • Der Linux-Router konfiguriert 2001:db8:10:0:x:y:z:t auf eth1 automatisch basierend auf RAs.
  • Der Linux-Router erhält 2001:db8:10:1::/64 vom ISP (irgendwie), weist sich selbst 2001:db8:10:1::1/64 auf der eth0-Schnittstelle zu und radvd sendet Router-Anzeigen dafür –nichtfü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 an den Linux-Router weitergeleitet wird.

(Entschuldigen Sie das nicht ganz klare Beispiel.)

Manchmal delegiert der ISP ein ganzes /60 oder sogar /56 an Sie und leitet es vollständig an den DSL-Router weiter. In diesem Fall könnten Sie das 2. Subnetz einfach ohne DHCPV6-PD-Magie einrichten. Allerdings kann ich hier wirklich keine gute „generelle“ Antwort geben, da dies sowohl vom ISP als auch vom CPE abhängt.


Wenn es nicht möglich ist, ein zweites /64-Präfix zu erhalten, sind folgende Optionen möglich:

  • Machen Sie aus dem Linux-System eine reine Bridge ohne Routing-Funktionalität.

  • Verwenden Sie andere Quellen, um zusätzliche /64-Server zu erhalten, z. B. einen Tunnelanbieter (oder 6to4). Die vorhandenen Tunneldienste funktionieren (bis auf eine gewisse zusätzliche Latenz) viel zuverlässiger als die unten beschriebenen Hacks.

  • Sorgen Sie dafür, dass der DSL-Router nur /64 bezieht, aber nicht für LAN konfiguriert. (Hängt davon ab, wie flexibel der Router ist.) Richten Sie stattdessen erneut eine Route für /64 über die Link-Local-Adresse eth0 Ihres Linux-Systems ein und richten Sie auf dem Linux-System ebenso eine Route für ::/0 über die Link-Local-Adresse des LAN des DSL-Routers ein. Dadurch wird /64 nur im 2. Subnetz verwendet und das 1. hat überhaupt kein öffentliches Präfix.

  • Fahren Sie mit Ihrer aktuellen Konfiguration fort, installieren Sie jedoch „ndppd“, um Neighbour Discovery-Proxying durchzuführen. (Nein, Multicast-Weiterleitung funktioniert nicht, da ND-Pakete häufig linklokale Quelladressen haben.) Gehen Sie dabei vorsichtig vor, da dies zu erheblicher Verwirrung führen kann.

  • Verwenden Sie private (ULA) Adressen für das 2. LAN und aktivieren Sie 1-zu-viele-NAT (Masquerading) auf dem Linux-Router. Dabei geht der größte Teil der Nützlichkeit von IPv6 verloren. (Ja, offiziell existiert NAT in IPv6 nicht, aber das hat Linux Netfilter/iptables nicht davon abgehalten, nachzugeben und es zu implementieren.)

verwandte Informationen