Dies ist keine vollständige Antwort, da ich noch einige der Probleme durcharbeite, aber hier ist, was ich bisher habe, um ein nahezu identisches Setup bereitzustellen (allerdings aus etwas anderen Gründen).
Die gute Nachricht ist: Es kann innerhalb der Spezifikationen durchgeführt werden. Tatsächlich wurden die Spezifikationen explizit entwickelt, um diese Art der Subdelegation von Präfixen zu fördern, um die Notwendigkeit schmerzhafter Mehrfach-NAT-Schichten weitgehend zu vermeiden und gleichzeitig Flexibilität bei der Strukturierung von Netzwerken zu ermöglichen.
Die schlechte Nachricht ist: Es gibt keine "Out-of-the-Box" -Software, die ein Präfix von einem Upstream anfordert, Adressen und Routen lokal konfiguriert und Unterpräfixe an Downstream-Netzwerke verteilt. Zur Hölle, es scheint nicht einmal möglich zu sein, bereits vorhandene Software unter Linux (ohne Patches) zu verkabeln, um das zu tun, was getan werden muss. Am schlimmsten ist, dass es niemanden wirklich interessiert.
Was ich bisher eingerichtet und funktioniert habe, sieht folgendermaßen aus:
Ich verwende den WIDE DHCPv6-Client ( dhcp6c
), um ein Präfix vom "Upstream" -Netzwerk anzufordern. Ich habe diesen Client gegenüber dem DHCP-Client von ISC ausgewählt, da er zum Zeitpunkt der Einrichtung der einzige DHCPv6-Client war, der anderen Schnittstellen automatisch Adressen aus dem empfangenen Präfix zuweist. Ich würde gerne glauben, dass sich andere DHCP-Clients seitdem verbessert haben, aber ich konnte mich an dieser Stelle nicht darum kümmern, dies zu überprüfen.
Leider ist es nicht die delegierten Präfix Details zu seinen externen Hook - Skript aussetzen, was bedeutet , dass man nicht (leicht) Ihre „downstream“ dhcpd Config neu schreiben.
ISC-DHCP-Server (im v6-Modus) zum Zuweisen von Präfixen zum "Downstream" -Netzwerk. Ich habe mich dafür entschieden, weil der DHCP-Server von WIDE, soweit ich das beurteilen kann, Präfixe nur statisch und nicht dynamisch delegieren kann. Es ist überraschenderweise relativ einfach, den ISC-DHCP-Server für die dynamische Präfixdelegierung zu konfigurieren. etwas so Einfaches wie dieses wird den Trick tun:
subnet6 2001:db8:1234:ffff::/64 {
prefix6 2001:db8:1234:a000:: 2001:db8:c0f:aff0:: /60;
}
Dies überwacht die Schnittstelle, an der eine Adresse eingegeben wurde, 2001:db8:1234:ffff::/64
und gibt / 60s aus dem angegebenen Bereich aus. Solange Sie die dhcp6c
Aktualisierung der obigen Konfiguration erzwingen können (nächste!), Können Sie die dhcpd-Konfiguration automatisch aktualisieren, wenn sich Ihr delegiertes Superpräfix ändert.
dhcp6c
nimmt, wie bereits erwähnt, einen script
Parameter in seine Konfigurationsdatei, um ausgeführt zu werden, wenn eine DHCPv6-Antwort empfangen wird. Leider werden nur Parameter wie der SIP-Server und DNS-Resolver angezeigt, keine nützlichen Informationen wie das delegierte Präfix. Ich habe also das folgende Skript, um das für mich zu erledigen:
#!/bin/sh
(sleep 3;
base_prefix="$(ip -6 ad sh eth0 | grep 'scope global' | cut -d ' ' -f 6 | cut -d : -f 1-4 | sed 's/00$//')"
if [ "$base_prefix" = "" ]; then
exit 0
fi
cat <<-EOF >/etc/dhcp/dhcpd6.conf
default-lease-time 1800;
max-lease-time 7200;
subnet6 ${base_prefix}00::/64 {
prefix6 ${base_prefix}a0:: ${base_prefix}f0:: /60;
}
EOF
svc -t /etc/service/dhcp6d) &
exit 0
Wenn ich die ganze Arbeit in einer Sub-Shell erledige, kann ich eine Weile warten, sleep 3
bis der DHCP-Client die Schnittstelle tatsächlich konfiguriert hat (anscheinend wird das Skript ausgeführt, bevor die Schnittstelle konfiguriert wird). Es funktioniert zuverlässig genug. Beachten Sie, dass mein ISP mir a delegiert /56
, weshalb ich nur die zwei Nullen vom empfangenen Präfix entferne. Wenn Sie das Glück haben, ein Ganzes zu erhalten /48
, ist die zuzuweisende Pipeline base_prefix
viel einfacher.
Was noch nicht existiert und ich bin mir ziemlich sicher, dass das Patchen des Quellcodes erforderlich ist, ist das Einrichten von Routen, wenn ein Präfix delegiert wird. Soweit ich sehen kann, kann kein DHCP-Server die Route automatisch hinzufügen (ich habe WIDE sorgfältig geprüft dhcp6s
, es kann es sicherlich nicht und ich kann auf den Röhren nichts finden, was ich vorschlagen könnte dass ISC DHCP es tut). Es gibt nicht einmal die Möglichkeit, einen externen Befehl auszuführen, der das zu delegierende Präfix und die verbindungslokale Adresse des Clients verwendet (ISC DHCP hat dies on commit { execute(...) }
, aber es gibt keine Möglichkeit, die verbindungslokale Adresse des Clients ohnmächtig zu machen).
Das Problem ist, dass der Router, der die Delegierung erstellt, ohne diese entscheidende Funktionalität nicht wissen kann, wohin der Datenverkehr für das Präfix danach geleitet werden soll. Das ist eine ziemlich grundlegende Einschränkung, und ich bin ziemlich verblüfft, dass sich anscheinend noch niemand mit diesem Problem befasst hat - oder wenn ja, schweigen sie wirklich darüber.
Ich habe gerade einen Patch für ISC DHCP entwickelt, um der Eval-Funktionalität einen zusätzlichen "Datenausdruck" zu verleihen. Auf diese Weise kann ich ein externes Programm aufrufen, das dann Routen zur Präfixzuweisung und zum Freigeben / Ablaufen hinzufügen / entfernen kann. Der Patch ist unter https://github.com/mpalmer/isc-dhcp/commit/4c8ae763bcf83c9068d57a5d9f570690a581b6d6 verfügbar (gegen ISC DHCP 4.3.1). Ich habe (noch) kein Skript zum Hinzufügen der Route, aber ich werde es wahrscheinlich contrib
in diesem Zweig hinzufügen , sobald ich es geschrieben habe.
ADDENDUM: Es stellt sich heraus, dass weitere Änderungen erforderlich waren, damit Routen wieder entfernt werden können. Das wurde jetzt dem client-address-data-expression
Zweig hinzugefügt , zusammen mit einem kleinen Ruby-Skript, das zeigt, wie alles miteinander kombiniert werden kann.
script
Anweisung zum Einrichten von Hooks. Dieser Mechanismus eignet sich zum Erstellen von Routen auf dem Server, wenn das Präfix delegiert wird (siehe Abschnitt 4.8).script
) wird automatisch eine Route für das delegierte Präfix auf der Downstream-Schnittstelle konfiguriert. Es wird auch ein generiertradvd.conf
, mit dem einradvd
auf der Downstream-Schnittstelle gestartet werden kann. Wenn Sie ein externes Skript Konfiguration kann das Skript einige zusätzliche Setup - Schritte tun - verfügbar Umgebungsvariablen zB sindPREFIX*
,SRV_OPTION*
(zB DNS - Server),DOWNLINK_*
...Das Programm, das die Präfixdelegierung durchführt, ist
radvd
(Router Advertisement Daemon). Andere IPv6-Hosts auf dem Link sollten automatisch eine global routbare Adresse aus dem angekündigten Präfix konfigurieren.IPv6 erfordert kein NAT, da von Hosts, die einen Internetzugang benötigen, global routbare Adressen erwartet werden. Sie müssen in Ihren Firewall-Regeln vorsichtig sein, um eine Infiltration aus dem Internet zu verhindern.
Von ISPs wird erwartet, dass sie ihren Kunden einen / 48- oder / 56-Netzwerkblock geben. Dies erfordert ein wenig Intelligenz auf der ISP-Seite, um sicherzustellen, dass jeder Router einen eindeutigen Block erhält. Ein / 64-Block wird wahrscheinlich als Uplink zum IPS-Netzwerk verwendet. Der Router kann dann beliebig viele / 64s aus dem Rest des Blocks ankündigen. In diesem Szenario wird wahrscheinlich nur eine verwendet.
Es gibt auch eine IPv6-DHCP-Implementierung.
Eine schnelle Einrichtung besteht darin, den Router für die Verwendung von 6to4-Tunneling zu konfigurieren. radvd wird für dieses Setup automatisch konfiguriert, erfordert jedoch eine öffentlich routbare IPv4-Adresse.
BEARBEITEN:
radvd
Präfixe können zwar nicht unterdelegiert werden, es kann jedoch automatisch ein / 64-Präfix basierend auf verfügbaren verfügbaren routbaren Adressen angekündigt werden. Es hat auch Base6to4, um das 6to4-Präfix des Routers automatisch anzukündigen. Die Subdelegation erfordert einige Planung und geht über das hinaus, was von einer Plug-and-Play-Konfiguration zu erwarten ist.EDIT2: Wie IPv4 verfügt IPv6 nicht über eine Methode, um anhand der der eth0-Schnittstelle zugewiesenen Adresse zu bestimmen, welches Netzwerk zu den mit eth1 oder eth2 verbundenen Netzwerken gehört. Sobald Sie mehrere Netzwerksegmente haben, müssen Sie mit der Verwaltung der jedem Segment zugewiesenen Adressen beginnen. Die gute Nachricht ist, dass dies normalerweise einmal gemacht werden kann.
IPv6 macht es einfacher, da 5 und 8 leicht / 49- oder / 50-Subnetze der an 3 delegierten / 48 erhalten können. Ein alternativer Ansatz wäre, 3, 5 und 8 als Bridges im selben / 64-Subnetz zu konfigurieren. In einer solchen Konfiguration würden sie als Schalter funktionieren. Die Risikorouter 5 und 8 für die automatische Subnetzgenerierung delegieren beide dasselbe Subnetz.
Plug-and-Pray-Router für den Heimgebrauch verwenden einfach einen privaten Standardadressblock. Sie brechen schnell zusammen, wenn sie wie in Ihrem Diagramm gezeigt konfiguriert werden. Das Mischen von Routern mit unterschiedlichen Standardadressblöcken funktioniert möglicherweise. Andernfalls müssen Sie sicherstellen, dass jeder Router einen anderen Adressblock hat.
quelle
Ich fand heraus, dass der Dibbler DHCPV6-Server die erforderlichen Informationen für seine Datei AddrMgr.xml bereitstellt. Es enthält die verbindungslokale Adresse des anfordernden Routers und das delegierte Präfix. Ich werde später damit experimentieren.
BEARBEITEN:
Ich habe eine kleine PHP-Datei geschrieben, die alle Routen erstellen kann, indem sie einfach die XML-Datei liest. Wie benutzt man:
sudo apt install php php-xml
Important: You need to have radvd and dibbler-server configured to do this, but I think there are enough resources for radvd on the internet and dibbler-server comes with a standard configuration.
sudo su
und geben Sie Folgendes ein:root@machine:~# echo "YOURLANINTERFACENAME" > /var/www/html/lanif.txt
sudo chmod 777 /var/www/html/lanif.txt
sudo runuser -l root -c 'crontab -e'
Fügen Sie die folgende Zeile hinzu:* * * * * php /var/www/html/routen.php
Speichern Sie dann die Datei. Erledigt! Wenn Sie einen anderen Router anschließen, dauert es einige Sekunden bis zu einer Minute, bis die Routing-Tabelle aktualisiert ist, aber dann funktioniert es!quelle
Sieht so aus, als ob Sie ein Routing-Protokoll wie RIPng benötigen. Sie können quagga auf diesen Boxen installieren, die Schnittstellen konfigurieren, die das Routing-Protokoll benötigen (einmal) und los geht's.
quelle