IP-Version bevorzugen

Aus Foxwiki
IPv4 gegenüber IPv6 in Dual-Stack-Umgebung bevorzugen (und Probleme verhindern, wenn nur IPv4 existiert)

Unter Linux gibt es eine Funktion des IPv6-Stacks, die es erlaubt, IPv4 als IPv6-Adresse mit einer IPv6-gemappten IPv4-Adresse (::ffff/96) zu verwenden. Dadurch können IPv6-fähige Anwendungen nur einen einzigen Socket verwenden, um sowohl IPv4 als auch IPv6 zu akzeptieren oder zu verbinden.

Standardmäßig, wenn Sie sowohl IPv4 als auch natives IPv6 haben. Die Linux-Systemanwendung (glibc) wird standardmäßig IPv6 verwenden, wenn es vorhanden ist, da getaddrinfo() zuerst IPv6 zurückgibt. Dies wird durch die IPv6-Adressauswahlpräferenz der glibc für getaddrinfo() in /etc/gai.conf gesteuert. (Hinweis: einige Anwendungen können einen Mechanismus haben, um zu entscheiden, welche Adresse zu verwenden ist, der nicht von getaddrinfo() bereitgestellt wird).

/etc/gai.conf steuert die Adressauswahl nach Label und Einstellungen. Dies ist ein Teil davon in Gentoo Linux

# Configuration for getaddrinfo(3).
#
# So far only configuration for the destination address sorting is needed.
# RFC 3484 governs the sorting. But the RFC also says that system
# administrators should be able to overwrite the defaults. This can be
# achieved here.
#
# All lines have an initial identifier specifying the option followed by
# up to two values. Information specified in this file replaces the
# default information. Complete absence of data of one kind causes the
# appropriate default information to be used. The supported commands include:
#
# reload
# If set to yes, each getaddrinfo(3) call will check whether this file
# changed and if necessary reload. This option should not really be
# used. There are possible runtime problems. The default is no.
#
# label
# Add another rule to the RFC 3484 label table. See section 2.1 in
# RFC 3484. The default is:
#
#label ::1/128 0
#label ::/0 1
#label 2002::/16 2
#label ::/96 3
#label ::ffff:0:0/96 4
#label fec0::/10 5
#label fc00::/7 6
#label 2001:0::/32 7
#
# This default differs from the tables given in RFC 3484 by handling
# (now obsolete) site-local IPv6 addresses and Unique Local Addresses.
# The reason for this difference is that these addresses are never
# NATed while IPv4 site-local addresses most probably are. Given
# the precedence of IPv6 over IPv4 (see below) on machines having only
# site-local IPv4 and IPv6 addresses a lookup for a global address would
# see the IPv6 be preferred. The result is a long delay because the
# site-local IPv6 addresses cannot be used while the IPv4 address is
# (at least for the foreseeable future) NATed. We also treat Teredo
# tunnels special.
#
# precedence
# Add another rule to the RFC 3484 precedence table. See section 2.1
# and 10.3 in RFC 3484. The default is:
#
#precedence ::1/128 50
#precedence ::/0 40
#precedence 2002::/16 30
#precedence ::/96 20
#precedence ::ffff:0:0/96 10
#
# For sites which prefer IPv4 connections change the last line to
#
#precedence ::ffff:0:0/96 100
#
# scopev4
# Add another rule to the RFC 3484 scope table for IPv4 addresses.
# The definitions in RFC 3484 are equivalent to:
#
#scopev4 ::ffff:169.254.0.0/112 2
#scopev4 ::ffff:127.0.0.0/104 2
#scopev4 ::ffff:10.0.0.0/104 5
#scopev4 ::ffff:172.16.0.0/108 5
#scopev4 ::ffff:192.168.0.0/112 5
#scopev4 ::ffff:0.0.0.0/96 14
#
# For sites which use site-local IPv4 addresses behind NAT there is
# the problem that even if IPv4 addresses are preferred they do not
# have the same scope and are therefore not sorted first. To change
# this use only these rules:
#
scopev4 ::ffff:169.254.0.0/112 2
scopev4 ::ffff:127.0.0.0/104 2
scopev4 ::ffff:0.0.0.0/96 14


In einigen Netzwerken kann diese Annahme zu Problemen führen, da die meisten IPv6-Verbindungen derzeit nicht so gut sind wie IPv4 (höhere Latenzzeiten usw.). Manchmal kann es sogar zu ernsthaften Problemen kommen, da IPv6 link-local (Adressen, die mit ff80:: beginnen) als gültige IPv6-Adresse betrachtet werden. Da die aktuellen Linux-Distributionen mit aktiviertem IPv6 ausgeliefert werden (ipv6-Module geladen oder einkompiliert), funktionieren einige Anwendungen nicht, wenn Sie keine IPv6-Konnektivität haben oder zumindest nur langsam eine Verbindung herstellen können, weil IPv6 zuerst versucht wurde und die Zeit abgelaufen ist.

Wie Sie im Kommentar sehen Wenn Sie IPv4 gegenüber IPv6 bevorzugen wollen, ändern Sie einfach die Prioritätszeile von ::ffff:0:0/96 von 10 auf 100 (Wenn Sie keine /etc/gai.conf haben, erstellen Sie sie und fügen Sie nur diese Zeile ein, es sollte funktionieren).

Aber ... Einige andere Standardkonfigurationen der glibc auf einigen Distributionen haben immer noch Probleme mit /etc/hosts. Stellen Sie sicher, dass Sie diese Zeile in [b]/etc/host.conf[/b] haben, wenn Sie wollen, dass Dual Stack so funktioniert, wie es sollte.

multi on

Diese Zeile ist erforderlich, damit die Glibc bei der Verwendung von /etc/hosts mehrere Adressen zurückgeben kann, da sie sonst nur die erste Übereinstimmung zurückgibt. Anwendungen, die nur IPv4 oder IPv6 verwenden, werden Probleme haben. Nehmen wir an, Sie haben '::1 localhost' an erster Stelle und '127.0.0.1 localhost' an zweiter Stelle. ping localhost wird fehlschlagen, wenn Sie nicht 'multi on' in /etc/host.conf haben. (Dies wird zu Leistungsproblemen führen, wenn Sie große /etc/hosts haben, aber dies ist der einzige Weg, bis glibc Adress-Hinting auf /etc/hosts implementiert wird)

Außerdem sind sich viele Anwendungen nicht bewusst, dass sie, wenn sowohl IPv4 als auch IPv6 vorhanden sind, nicht mehrere Versuche (Fallback) unter Verwendung verschiedener Adressfamilien unternehmen (wenn die Glibc also mehrere Adressen zurückgibt). Manchmal tun sie es, aber Sie müssen es explizit konfigurieren, um das zu tun.

Eine Anwendung, bei der ich dieses Problem gefunden habe, ist [b]postfix[/b], das anscheinend nicht auf eine andere Adressfamilie zurückgreifen kann, wenn mehrere Adressfamilien existieren (IPv4 und IPv6). Sie müssen diese Zeile zur Postfix-Konfiguration (main.cf) hinzufügen, sonst kann es sein, dass Ihre Mails in der Bounce-Warteschlange stecken bleiben, weil sie sich nicht mit einem anderen Server über IPv6 verbinden können.

smtp_address_preference=any
  1. http://sf-alpha.bjgang.org/wordpress/2012/08/linux-prefer-ipv4-over-ipv6-in-dual-stack-environment-and-prevent-problems-when-only-ipv4-exists/