Friedemann Stoyan schrieb:

Ich frage mich gerade, welchen esoterischen Algorithmus die glibc
verwendet, um die Reihenfolge IPv6/IPv4 zu bestimmen. Konkret geht es um

[...]

$ telnet news.lab.swapon.de 120
Trying 192.168.17.119...
Trying 2001:6f8:12ec:10::119...
telnet: Unable to connect to remote host: Connection refused

vs.

$ telnet news.ipv46.swapon.de 120
Trying 2001:6f8:12ec::3...
Trying 81.169.139.143...
telnet: Unable to connect to remote host: Connection refused

Ich kann mich an ähnliches Verhalten von Ubuntu Edgy erinnern, dessen getaddrinfo() zu Hause auch dauernd meinen dualstacked Heimserver über IPv4 erreichen wollte. Wenn ich mich recht entsinne bin ich beim Debuggen drauf gekommen, dass die Kiste zwar im Normalfall konsequent IPv6 vor IPv4 präferiert (wie das Normalverhalten von glibc 2.3 ist), aber anscheinend unter bestimmten Umständen direct-connected Routen präferenziert.

Ich habe die meisten Kisten schon auf Ubuntu Feisty oder Debian testing aktualisiert, aber mein Heimrouter zeigt das gleiche Verhalten (aelteres Debian testing, libc6 2.3.6.ds1-13). Zum interaktiven Testen nutze ich ganz gerne Python.

test1.iks4.birkenwald.de has address 172.16.2.1
test1.iks4.birkenwald.de has IPv6 address 2001:a60:f00c::1

test2.iks4.birkenwald.de has address 192.168.100.1
test2.iks4.birkenwald.de has IPv6 address 2001:a60:f00c::1

test3.iks4.birkenwald.de has address 141.1.1.1
test3.iks4.birkenwald.de has IPv6 address 2001:a60:f00c::1

>>> socket.getaddrinfo('test1.iks4.birkenwald.de', 0, 0, socket.SOCK_STREAM) [(2, 1, 6, '', ('172.16.2.1', 0)), (10, 1, 6, '', ('2001:a60:f00c::1', 0, 0, 0))] >>> socket.getaddrinfo('test2.iks4.birkenwald.de', 0, 0, socket.SOCK_STREAM) [(10, 1, 6, '', ('2001:a60:f00c::1', 0, 0, 0)), (2, 1, 6, '', ('192.168.100.1', 0))] >>> socket.getaddrinfo('test3.iks4.birkenwald.de', 0, 0, socket.SOCK_STREAM) [(10, 1, 6, '', ('2001:a60:f00c::1', 0, 0, 0)), (2, 1, 6, '', ('141.1.1.1', 0))]

Die RFC1918-Adresse von test1 wird vor IPv6 präferenziert, die von test2 nach IPv6. Der einzige Unterschied ist, dass zu der IPv4-Adresse von test1 eine more-specific Route existiert, zu der von test2 nicht

172.16.1.254 dev iks4  proto kernel  scope link  src 172.16.1.253
172.16.2.0/24 via 172.16.1.254 dev iks4

(VPN-Tunnel zu einer anderen Location). Und Tatsache, führe ich

ip route add 192.168.100.1/32 via 172.16.1.254 dev iks4

aus wird auch test2 präferenziert

>>> socket.getaddrinfo('test2.iks4.birkenwald.de', 0, 0, socket.SOCK_STREAM) [(2, 1, 6, '', ('192.168.100.1', 0)), (10, 1, 6, '', ('2001:a60:f00c::1', 0, 0, 0))]

Das ganze funktioniert aber _nicht_ für non-RFC1918-Adressen, mache ich das gleiche mit 141.1.1.1/32 hat das keinerlei Effekt auf test3.

So ganz hab ich das Verhalten noch nicht verstanden, es ist anscheinend unabhängig davon wie "gross" die More-specific Route ist

ip route add 192.0.0.0/8 via 172.16.1.254 dev iks4

hat also den gleichen Effekt auf test2, nicht aber

ip route add 192.0.0.0/8 dev ppp0

was der Default-Route entsprechen würde.

Bernhard
-- 
ipv6 mailing list
[email protected]
http://listserv.uni-muenster.de/mailman/listinfo/ipv6

Antwort per Email an