Server haben üblicherweise mehr als eine IPv6 Adresse. Diese Adressen sind meist gleichwertig. Daher ist es nicht immer offensichtlich welche IPv6 Adresse für ausgehenden Verbindungen verwendet wird. In diesem Artikel geht es um statisch hinzugefügte IPv6 Adressen. Bei Desktop Systemen ist es anders, dort gibt es diese Art von IPv6  Adressen normalerweise nicht.

Linux verwendet zur Auswahl einer IPv6 Adresse die Regeln in RFC 3484. Doch leider helfen die Regeln bei sehr ähnlichen Adressen nicht. Daher wird in letzer Instanz die zuletzt hinzugefügt IPv6 Adresse verwendet. Das kann dazu führen, dass die Ausgangs Adresse sich nach jedem Neustart ändert und manchmal auch zwischen durch.

Es gibt eine einfache Möglichkeit die default IPv6 Adresse für ausgehenden Verbindungen zu definieren. Dazu wird bei allen nicht default IPv6 Adressen die bevorzugte Lebensdauer (Preferred Lifetime) auf 0 gesetzt. Es sollte dann nur noch eine IPv6 Adresse mit einer unendlichen Lebensdauer geben. Die übrigen Adressen sind dann für den Kernel veraltet (deprecated) und werden nicht für ausgehende Verbindungen verwendet.

Der Kernel wird eingehende Verbindung auf diesen veralteten IP Adressen trotzdem noch bearbeiten. Auch können Programme diese Adressen noch für ausgehende Verbindungen nutzen. Nur es muss explizit konfiguriert werden. Viele Programme (Nginx, Postfix, Dovecot, …) haben Optionen dafür. Zum Beispiel bei Postfix die „smtp_bind_address6“ Option. Oder curl kann mit der Option --interface 'IPv6_Adresse' gestartet werden. So sind die weiteren Adressen noch zu verwenden, aber es ist eine default IPv6 Adresse für ausgehenden Verbindungen definiert auf die man sich verlassen kann.

Auf neueren Systemen wird oft systemd-networkd verwendet. Eine Beispiel Konfigurationen mit einer IPv4 und 3 gleichwertigen IPv6 Adressen

[Match]
Name=eno1

[Network]
Address=198.51.100.5/24
Address=2001:db8::5/32
Address=2001:db8::6/32
Address=2001:db8::7/32

Gateway=198.51.100.1
Gateway=2001:db8::1
DNS=198.51.100.3
DNS=2001:db8::4

Bei den Adressen 2001:db8::6 und 2001:db8::7 soll nun eine bevorzugte Lebensdauer von 0 eingestellt werden. 2001:db8::5 soll die default IPv6 Adresse sein. Die Konfiguration müsste so angepasst werden.

[Match]
Name=eno1

[Network]
Address=198.51.100.5/24
Address=2001:db8::5/32

Gateway=198.51.100.1
Gateway=2001:db8::1
DNS=198.51.100.3
DNS=2001:db8::3

[Address]
Address=2001:db8::6/32
PreferredLifetime=0

[Address]
Address=2001:db8::7/32
PreferredLifetime=0

Zu beachten ist, dass in einem [Address] Bereich immer nur eine Address= definiert werden kann. Es kann aber beliebig viele [Address] Bereiche geben. Es kann auch Sinn machen die IPv6 Router Advertisement auszuschalten um eine Autokonfiguration zu vermeiden.

Wer noch ältere Debian Systeme verwendet, muss die Konfiguration in /etc/network/interfaces oder in /etc/network/interfaces.d vornehmen.  Dort ist die Idee den up Befehl zu verwenden. Eine Konfiguration würde so aussehen.

iface eno1 inet6 static
   address 2001:db8::5
   netmask 32
   gateway 2001:db8::1
   accept_ra 0
   autoconf 0
   privext 0
   up ip -6 addr add 2001:db8::6/32 dev eno1 preferred_lft 0
   up ip -6 addr add 2001:db8::7/32 dev eno1 preferred_lft 0
IPv6 Adresse für ausgehenden Verbindungen definieren