IPv6 Default Gateway und Routing

ed1949

Well-Known Member
Hallo,

ich versuche gerade IPv6 (FBSD 9.1rc3) auf einem neuen Root-Server einzurichten, aber bisher bin ich mit dem Ergebnis nicht besonders zufrieden.

Hier der Ausschnitt aus der rc.conf:
Code:
...
ipv6_network_interfaces="bge0"
ifconfig_bge0_ipv6="inet6 2001:X:X:X::1 prefixlen 64"
ifconfig_bge0_alias10="inet6 2001:X:X:X::90 prefixlen 64"
ifconfig_bge0_alias11="inet6 2001:X:X:X::91 prefixlen 64"
ipv6_defaultrouter="2001:X:X:Y:Z::1"
...

Das funktioniert natürlich erst mal nicht, da FBSD sich weigert einen Router einzutragen, der nicht in meinem /64 Netz liegt.

Eine halb funktionieredne Änderung wäre:
Code:
...
ifconfig_bge0_ipv6="inet6 2001:X:X:X::1 prefixlen 48"
...

Das ist natürlich unsinn, ausserdem funktionieren damit die Alias Adressen nicht.

Nächster Versuch war, folgendes einzufügen (mit Googles-Hilfe):
Code:
ipv6_static_routes="ipv6gw"
ipv6_route_ipv6gw="-host 2001:X:X:Y:Z::1 -prefixlen 48 -iface bge0"

Ergebnis:
Code:
ping6: sendmsg: Operation not permitted
ping6: wrote 2001:X:X:Y:Z::1 16 chars, ret=-1

Als letztes wusste ich mir nicht mehr anders zu helfen als die Static Route raus zu nehmen und folgendes einzufügen:
Code:
ifconfig_bge0_alias20="inet6 2001:X:X:Y:Z::2 prefixlen 64"

Damit funktioniert die IPv6 und auch die Aliases sind erreichbar. Der Haken ist nur, dass es vermutlich dem Provider nicht gefällt, wenn ich eine nicht zugeteilte Adresse (::2) nutze. Solange die Packet Filter an ist, geht die Adresse zwar nicht raus, aber eine Lösung ist das nicht. Ach ja, IPv6 Autoconfig wird vom Provider nicht unterstützt.

Kennt jemand eine Möglichkeit, bei FreeBSD ein Default Gateway sauber und funktionsfähig zu konfigurieren, welches nicht im eigenen Prefix-Bereich liegt (Ähnlich wie bei Linux mit 'route via')?
 
Ich habe die pf mit 'pfctl -d' ausgeschalten. Damit sollte hier nicht mehr gefiltert werden!?

Ist ausser der pf - die ich explizit in der rc.conf einschalten muss - noch ein Packetfilter implizit in einer 9.1rc3 Basisinstallation (base+kernel) aktiv?
 
Ich habe die pf mit 'pfctl -d' ausgeschalten. Damit sollte hier nicht mehr gefiltert werden!?

Ist ausser der pf - die ich explizit in der rc.conf einschalten muss - noch ein Packetfilter implizit in einer 9.1rc3 Basisinstallation (base+kernel) aktiv?

Satz 1 - Ja, bzw. ist normalerweise sowieso deaktiviert, da geht nix zu deaktivieren. ;)
Satz 2 - Nein. Siehe oben. Alle Packetfilter sind aus.

Du erwähnst aber etwas früher .... "Solange die Packet Filter an ist, geht die Adresse ..." .

Mal abgesehen davon, hast du den ipv6_defaultrouter Eintrag schon mal versucht komplett wegzulassen ?
 
Du erwähnst aber etwas früher .... "Solange die Packet Filter an ist, geht die Adresse ..." .

Ich hatte das auf den Fall bezogen, dass ich mir selber eine Adresse gebe, die mir nicht zugewiesen wurde (die ::2). Wenn ich nun ein Packet sende, wird eben diese Adresse als Source genutzt, d.h. sie taucht im Netzwerksegment auf. Die Packetfilter kann das verhindern, sodass der Provider keine Packete von mir sieht, die eine nicht zugewiesene Source Adresse enthalten.

Mal abgesehen davon, hast du den ipv6_defaultrouter Eintrag schon mal versucht komplett wegzulassen ?

Ja. Dann komme ich genausowenig wie mit dem Eintrag raus.

Die am besten funktionierende Lösung ist bisher, eine Alias Adresse (::2) zu konfigurieren, die im Prefix Bereich des Routers liegt. Danach aktzeptiert FBSD den default Eintrag in der Routing Tabelle und komme von allen IPv6 Adressen raus und es kommen auch externe Zugriffe für alle Adressen an. Schönheitsfehler ist, dass ohne weitere Massnahmen (Packetfilter) auch Packete mit der Alias Adresse (::2) rausgehen, welche mir gar nicht zugewiesen ist! Das nicht schön und dem Provider wird es auch nicht gefallen, wenn ich mir einfach selber Adressen zuweise.
 
Hoi,
test mal was ganz oifaches:

ipv6_network_interfaces="bge0"
ifconfig_bge0_ipv6="inet6 accept_rtadv"

und schau mal ob Du was sinnvolles erhälst. Falls nicht, setze per sysctl mal bge0 als default ipv6 interface und teste es mit einer statischen Config nochmal.

Gruß Bummibär
 
Versuch mal den 56'ger Teil abzutrennen und den Rest mit 0xff aufzufüllen. Also in etwa so:
Wenn Adresse des Routers:
2001:dead:dead:deed:f00f:1 ;
Das /64 Subnet
2001:dead:dead:dead::
dann setze vesuchsweise:
2001:dead:dead:deff:ff:ff:ff:ff
als ipv6_defaultrouter.
So wurde das mal bei einem Provider mit ähnlich miserabler ipv6 Routine gelöst und seht auch in deren Hilfe so drin.
Mehr fällt mir jetzt nicht ein.

hth
 
@Bummibaer: Ich hatte accept_rtadv=1 schon per sysctl gesetzt - ohne Erfolg.

@metro: Das hört sich stark nach OVH an. Das habe ich jetzt noch nicht getestet. Allerdings läuft zumindest bei meinem OVH Server diese Config nicht ohne NDP, welches hier nicht verfügbar ist. Werde ich aber trotzdem mal versuchen.

Komischerweise kann man einer Linux-Installatuion einfach sagen route default via interface und es funktioniert. FBSD ist hier ziemlich zickig.
 
Du kannst eine Route auf ein Interface setzen:
Code:
route add default -interface $interface
 
Kommandozeile:

Code:
route add -inet6 default -iface bge0

oder alternativ auch in der rc.conf:

Code:
ipv6_defaultrouter="-interface bge0"

Das wird aktzeptiert und führt zu einer default Route mit der Mac Adresse der bge0 Schnittstelle. Das Ergebnis (mit oder ohne pf) ist aber:

Code:
ping6: sendmsg: Operation not permitted
ping6: wrote tdxchg.insc.de 16 chars, ret=-1

Versuchsweise habe ich mal forwarding=1 und accept_rtadv=1 gesetzt. War ein verzweifelter Versuch, der aber auch nicht funktioniert hat.

Das auffüllen mit ff hat übrigens auch nicht funktioniert. Folgende verfeinerte rc.conf Zeilen funktionieren dann teilweise wieder. Teilweise heisst, ohne pf.

Code:
ifconfig_bge0_ipv6="inet6 2001:X:X:X::1 prefixlen 64"
...
ifconfig_bge0_alias20="inet6 2001:X:X:Y:Z::2 prefixlen 126"
ipv6_defaultrouter="2001:X:X:Y:Z::1"
 
Es könnte sein, dass du den IPv6-Stack noch mit ndp(8) treten musst. Das ist zum Beispiel bei Hetzner notwendig, da FreeBSD sich sonst hartnäckig weigert die Gegenseite (das Default-Gateway) trotz bekannter IPv6-Adresse zu finden. Das ginge dann so:
Code:
ndp -s $ipv6-adresse-der-gegenseite $mac-adresse-der-gegenseite
Simpel gesagt schaltest du damit aus, dass er selbst versucht die der IPv6-Adresse zugehörige Mac-Adresse aufzulösen. Du erzwingst stattdessen eine Mac-Adresse, von der du weißt, dass sie korrekt ist.
 
Ha, ich habe eine Lösung. NDP ist dabei nicht explizit notwendig. Die eine Zeile in der rc.conf löst das Problem. Ohne extra sysctl und ohne Zusatzbefehle. Das ganze funktioniert auch mit aktivierter pf.

Code:
ipv6_defaultrouter="fe80::%bge0"

Die Frage ist nur noch, ist das eine echte Lösung oder kann das irgend wann zu Problemen führen?

Nachtrag: Den dokumentierten Router (2001:X:X:Y:Z::1) kann ich dabei vom Server aus nicht mehr erreichen, von extern aber schon - sehr lustig. Hoffentlich sitzen nicht auch noch ein paar wichtige Rechner in dem Segment.
 
Zuletzt bearbeitet:
Es könnte sein, dass du den IPv6-Stack noch mit ndp(8) treten musst. Das ist zum Beispiel bei Hetzner notwendig, da FreeBSD sich sonst hartnäckig weigert die Gegenseite (das Default-Gateway) trotz bekannter IPv6-Adresse zu finden. Das ginge dann so:
Code:
ndp -s $ipv6-adresse-der-gegenseite $mac-adresse-der-gegenseite
Simpel gesagt schaltest du damit aus, dass er selbst versucht die der IPv6-Adresse zugehörige Mac-Adresse aufzulösen. Du erzwingst stattdessen eine Mac-Adresse, von der du weißt, dass sie korrekt ist.

Solche Hacks sind nicht mehr nötig seit Hetzner die IPv6 Gateways immer auf fe80::1%$INTERFACE packt.
 
In meinem Fall ist es nicht fe80::1%IF sondern fe80::%IF welches ich als Router angegeben habe.

Da es sich bei fe80:: nach RFC4291 um die Subnet-Router Anycast Adresse handelt, müsste die Lösung eigentlich universell einsetzbar sein, um einen Router im Netz zu finden (Zitat aus dem RFC: "All routers are required to support the Subnet-Router anycast addresses for the subnets to which they have interfaces.").
 
Ich stelle mir gerade die Frage, ob ich dann nicht auch mit der Adresse 2001:X:X:X:: (meine /64 Adresse mit allen Bits des Interface Identifier Teil auf 0) einen zuständigen Router erreichen könnte?
 
Bei den Link-Local Adressen (fe80::/10) ist die Angabe des Interface notwendig, da diese Adressen nicht eindeutig sind. D.h. es kann (und wird, z.B. fe80:: ) auf unterschiedlichen Netzwerksegment Knoten mit der gleichen Adresse geben.

Woher jetzt die %-Notation kommt und ob das ein Standard ist, weiss ich auch nicht. BSD und Linux machen das jedenfalls so.
 
Ich stelle mir gerade die Frage, ob ich dann nicht auch mit der Adresse 2001:X:X:X:: (meine /64 Adresse mit allen Bits des Interface Identifier Teil auf 0) einen zuständigen Router erreichen könnte?

mit ipv6 kann man noch so schön spielen ...

ifconfig bge0 2001:X:X:X:: anycast
oder
ifconfig bge0 2001:X:X:X:: prefixlen 64 anycast

ist einen Versuch wert ?!
 
Das muss dann jemand auf dem Router machen. Ich möchte die anycast Adresse nur benutzen um den Router zu finden. Also in der rc.conf:

Code:
ipv6_defaultrouter="2001:X:X:X::"
 
Zurück
Oben