Zusätzliche Informationen sind hier zu finden
Karl Auer's Blog: Controlling IPv6 source address selection , IPv6 Source Address Selection - what, why, how
Die Auflösung von Namen zu einer IPv4- bzw. IPv6-Adresse wird üblicherweise durch die Benutzung einer libc resolver Bibliothek durchgeführt. Dazu wird normalerweise die Funktion getaddrinfo benutzt. Im Fall, dass mehr als eine IPv6-Adresse zurückgegeben wird, soll nach RFC 3484 / Default Address Selection for Internet Protocol version 6 eine Sortierung angewandt werden, die optional auch konfiguriert werden kann.
Die ”Magie” ist durch die Datei /etc/gai.conf konfigurierbar (welche fehlt oder leer ist, solange Standardwerte gelten sollen). Die vorgegebene Sortierung ist üblicherweise in der Dokumentation (z.B. /usr/share/doc/glibc-common/gai.conf) oder im Manual ”man gai.conf” zu sehen.
Für die Kontrolle der Sortierung via benutzerdefinierter Konfiguration ist für Tests folgendes notwendig:
Ein Hostname im DNS, der mehr als eine IPv6-Adresse zurückgibt, z.B.
$ dig +short aaaa st1.bieringer.de 2001:4dd0:ff00:834::2 2a01:238:423d:8800:85b3:9e6b:3019:8909 |
Lookup via DNS (mit /etc/hosts klappt es nicht)
/etc/gai.conf mit einer passenden Konfiguration, e.g.
precedence ::1/128 50 # default precedence ::/0 40 # default precedence 2002::/16 30 # default precedence ::/96 20 # default precedence ::ffff:0:0/96 10 # default precedence 2001:4dd0:ff00:834::/64 80 # dst-A precedence 2a01:238:423d:8800::/64 90 # dst-B |
Für Tests kann dann ein Telnet-Client benutzt werden:
$ telnet st1.bieringer.de Trying 2a01:238:423d:8800:85b3:9e6b:3019:8909... (dst-B) ... Trying 2001:4dd0:ff00:834::2... (dst-A) ... |
Wenn nun die precedence geändert wird in der Konfiguration:
precedence 2001:4dd0:ff00:834::/64 90 # dst-A ex 80 precedence 2a01:238:423d:8800::/64 80 # dst-B ex 90 |
Dann ändert sich die Reihenfolge entsprechend
$ telnet st1.bieringer.de Trying 2001:4dd0:ff00:834::2... (dst-A) ... Trying 2a01:238:423d:8800:85b3:9e6b:3019:8909... (dst-B) ... |
Source address selection in Linux wird automatisch vom Kernel vorgenommen, üblicherweise abhängig von den Routing-Tabellen und unter der Vorgabe, den Scope einer Adresse beizubehalten.
Mit einer Erweiterung der internen ”ip addrlabel” Tabelle kann eine Quell-Adresse zu einer Ziel-Adresse gebunden werden. Bindung wird hier durch die Angabe des gleichen Labels (einer Nummer) konfiguriert.
Standard von ”ip addrlabel” (hier von CentOS 6):
# ip addrlabel prefix ::1/128 label 0 prefix ::/96 label 3 prefix ::ffff:0.0.0.0/96 label 4 prefix 2001::/32 label 6 prefix 2001:10::/28 label 7 prefix 2002::/16 label 2 prefix fc00::/7 label 5 prefix ::/0 label 1 |
Das System ist multihomed (hier an einem Interface), der Router verteilt 2 Präfixe mit Hilfe von radvd:
# ip -6 addr show dev eth1 | grep -w inet6 |grep -w global inet6 2001:6f8:12d8:2:5054:ff:fefb:6582/64 scope global dynamic (src-A) inet6 2001:6f8:900:8cbc:5054:ff:fefb:6582/64 scope global dynamic (src-B) |
Eine Verbindung zum Server zeigt nun:
$ telnet st1.bieringer.de Trying 2001:4dd0:ff00:834::2... (dst-A) ... Trying 2a01:238:423d:8800:85b3:9e6b:3019:8909... (dst-B) ... |
Ein tcpdump mit filter ”tcp and dst port 23” zeigt nur die Benutzung der oberen lokalen Quell-IPv6-Adresse
IP6 2001:6f8:12d8:2:5054:ff:fefb:6582.37762 > 2001:4dd0:ff00:834::2.telnet: (src-A -> dst-A) IP6 2001:6f8:12d8:2:5054:ff:fefb:6582.45754 > 2a01:238:423d:8800:85b3:9e6b:3019:8909.telnet: (src-A -> dst-B) |
Wenn nun Quelle und Ziel mit Hilfe von ”ip addrlabel” zusammengebunden werden:
# ip addrlabel add prefix 2001:6f8:12d8:2::/64 label 200 # ip addrlabel add prefix 2001:6f8:900:8cbc::/64 label 300 # ip addrlabel add prefix 2001:4dd0:ff00:834::/64 label 200 # ip addrlabel add prefix 2a01:238:423d:8800::/64 label 300 |
Was in folgender ”ip addrlabel”resultiert:
# ip addrlabel prefix ::1/128 label 0 prefix ::/96 label 3 prefix ::ffff:0.0.0.0/96 label 4 prefix 2a01:238:423d:8800::/64 label 300 # dst-B prefix 2001:4dd0:ff00:834::/64 label 200 # dst-A prefix 2001:6f8:900:8cbc::/64 label 300 # src-B prefix 2001:6f8:12d8:2::/64 label 200 # src-A prefix 2001::/32 label 6 prefix 2001:10::/28 label 7 prefix 2002::/16 label 2 prefix fc00::/7 label 5 prefix ::/0 label 1 |
Und dann nochmal eine Verbindung zum Server versucht wird
$ telnet st1.bieringer.de Trying 2001:4dd0:ff00:834::2... (dst-A) ... Trying 2a01:238:423d:8800:85b3:9e6b:3019:8909... (dst-B) ... |
tcpdump mit filter ”tcp and dst port 23” zeigt nun die Benutzung beider Quell-IPv6-Adressen wie konfiguriert
IP6 2001:6f8:12d8:2:5054:ff:fefb:6582.37765 > 2001:4dd0:ff00:834::2.telnet: (src-A -> dst-A) IP6 2001:6f8:900:8cbc:5054:ff:fefb:6582.39632 > 2a01:238:423d:8800:85b3:9e6b:3019:8909.telnet: (src-B -> dst-B) |
Persistente Konfiguration von ”ip addrtable” ist wahrscheinlich in aktuellen Linux-Distributionen nicht unterstützt, somit wäre eine Erweiterung der Netzwerk-Init-Scripts oder rc.local notwendig. Ein Skript, welches Informationen aus /etc/gai.conf in entsprechendes ”ip addrtable” umwandelt, gibt es hier: /etc/gai.conf - it ain't what you think it is
Zurück | Zum Anfang | Weiter |
Netlink-Interface zum Kernel | Netzwerk-Fehlersuche |