Hallo Liste,
ich habe bei Hetzner mehrere Server mit einem vSwitch verbunden und dort ein öffentliches /64-Netz angebunden. Das Gateway ist dabei ein Juniper-Router bei Hetzner innerhalb des /64-Netzes ($Prefix::1). vSwitch bedeutet in dem Falle, daß auf der vorhandenen NIC ein zusätzliches VLAN konfiguriert wird, welches mit dem vSwitch verbunden ist.
Das sieht auf dem Server etwa so aus: auto vlan4000 iface vlan4000 inet manual vlan-raw-device enp195s0
auto vswitch0 iface vswitch0 inet6 static address $Prefix:1001::1/64 bridge_ports vlan4000 bridge_stp on bridge_maxwait 10 up ip link set $IFACE mtu 1400 up ip -6 rule add from $Prefix:1001::1/64 lookup vswitch0 up ip -6 rule add to $Prefix:1001::1/64 lookup vswitch0 up ip -6 route add default via $Prefix::1 dev $IFACE table vswitch0 down ip -6 route del default via $Prefix::1 dev $IFACE table vswitch0 down ip -6 rule del from $Prefix:1001::1/64 lookup vswitch0 down ip -6 rule del to $Prefix:1001::1/64 lookup vswitch0
Damit VMs darüber angebunden werden können ist das hier als Bridge konfiguriert. Die zusätzlichen Routen/Rules sind nur für die Kommunikation außerhalb des Netzes relevant, innerhalb würde es auch ohne auskommen.
In der VM ist das Netzwerk, abgesehen von der geänderten MTU, ohne besondere Einstellungen mit einer statischen IP konfiguriert:
allow-hotplug enp3s0 iface enp3s0 inet6 static address $Prefix:1101::1/64 gateway $Prefix::1 up ip link set $IFACE mtu 1400
Grundsätzlich funktioniert das so, alle Verbindungen in allen Richtungen sind möglich. Allerdings bricht an einzelnen VMs irgendwann die Verbindung ab, anscheinend hauptsächlich an VMs, an denen kein ständiger Traffic verursacht wird. Zuerst ist das Problem hauptsächlich bei Verbindungen von/nach außen aufgefallen, während intern scheinbar alles funktionierte. Hetzner bestätigte mir, daß die zugehörigen Mac/IPv6-Adressen währenddessen nicht im Router gelistet sind, weshalb ich das Problem zuerst auch dort verortet hatte. Der Support konnte mir dabei aber auch nicht weiterhelfen.
Bei einem ausgiebigen Ping-Test ist dann aber aufgefallen, daß teilweise auch interne Verbindungen aussteigen, sodaß ich den Fehler jetzt eher auf dem Host oder den VMs suchen würde.
Folgendes Test-Szenario (alles Debian 11): 2 Server (Hosts) mit jeweils 2 VMs, Einzelpings aller 5s Pings laufen in beiden Richtungen zwischen allen Beteiligten. Nach einiger Zeit bricht ausschließlich 1 Verbindung ab, manchmal sogar nur eine Richtung davon. Mal ist es die Verbindung von und/oder zum Host, während sich die VMs untereinander als auch mit dem 2. Server weiterhin erreichen, manchmal ist es auch eine VM-Verbindung innerhalb des Servers, während die Verbindung vom/zum Host noch steht.
Das Problem tritt aber auch älteren Hostsystemen (Debian 9/10) auf.
Die Firewall kann ebenso ausgeschlossen werden, da das Problem auch bei deaktivierter Firewall auftritt. Allerdings zeigt ein icmp log/count auch, daß keine Pakete nach der allow-ndp-Regel mehr übrig bleiben.
chain inbound_ipv6 { icmpv6 type echo-request accept icmpv6 type { nd-router-advert, nd-neighbor-solicit, nd-neighbor-advert } accept ip6 nexthdr ipv6-icmp log prefix "[nftables] ICMPv6 Accept: " counter packets 0 bytes 0 limit rate 20/second accept }
Parallel dazu ist ein 2. vSwitch mit einer ähnlichen IPv4-Konfiguration und eine 2. NIC in den VMs konfiguriert, wo das Problem nicht auftaucht. Hier fehlt lediglich die IP-Adresse und die zusätzlichen Routen auf dem Host. Darüber wurden die VMs auch während des Tests beobachtet.
Mit gerouteten IPv6-Verbindungen über das zum Server gehörige IPv6-Netz treten auch keine Probleme auf. Ein allgemeines IPv6- oder Bridge-Problem sollte damit auch ausgeschlossen sein.
Es wurde auch ohne zusätzliche IPv6-Regeln auf dem Host getestet, um das als Fehlerquelle auszuschalten.
Das einzige erkennbare Muster sind Zeitspannen. Der Ausfall erfolgt nach ca. 20-30 min und in den meisten Fällen führte zusätzlicher Traffic auf noch bestehenden Verbindungen nach kurzer Zeit (20-30s) dazu, daß die Verbindung wieder funktionierte.
Aufgrund dieses Fehlerbildes vermute ich das Problem im NDP-Bereich, kenne mich aber damit zu wenig aus, um es weiter zu lokalisieren.
Sind dafür zusätzliche Kerneleinstellungen (sysctl) nötig? Oder ein zusätzlicher Daemon?
Gruß Rico
Hallo Rico,
On Wed, Feb 02, 2022 at 02:12:17PM +0100, Rico Koerner wrote:
Aufgrund dieses Fehlerbildes vermute ich das Problem im NDP-Bereich, kenne mich aber damit zu wenig aus, um es weiter zu lokalisieren.
Hmm... ohne da jetzt konkret irgendwas erkennen zu können. Aber zum Eingrenzen wäre ein Blick in "bridge fdb" sowie den Neigbor Cache aka "ip -6 n" interessant (letzteres in den Gästen und auf dem Host) zu dem Zeitpunkt wo es ausfällt interessant.
Und dann vll mal nen tcpdump um zu sehen ob da irgendwer zu diesem Zeitpunkt IPv6 Neighbor Solicitations schickt auf die keiner antwortet.
Da bei Dir alle Adressen statisch konfiguriert sind sollten die alle ne lifetime von "permanent" haben. Aber es würde sicherlich mal nicht schaden sich auf den Interfaces davon zu überzeugen, dass da wirklich nur die statisch konfigurierten + die fe80 Dinger drauf sind. Nicht das da RAs reinkommen und die Teile mit den Adressen arbeiten die sie sich per SLAAC aus nem RA konfigurieren... die sind ja raus gebridged "sehen" also die Aussenwelt.
Prinzipiell ist für sonnen Betrieb kein zusätzlicher daemon oder sysctl erforderlich, die ganze Automagie is im Linux Kernel und per default an.
Grüsse Andreas
Hallo Andreas,
Am 02.02.22 um 19:34 schrieb Andreas Fett:
Hallo Rico,
On Wed, Feb 02, 2022 at 02:12:17PM +0100, Rico Koerner wrote:
Aufgrund dieses Fehlerbildes vermute ich das Problem im NDP-Bereich, kenne mich aber damit zu wenig aus, um es weiter zu lokalisieren.
Hmm... ohne da jetzt konkret irgendwas erkennen zu können. Aber zum Eingrenzen wäre ein Blick in "bridge fdb" sowie den Neigbor Cache aka "ip -6 n" interessant (letzteres in den Gästen und auf dem Host) zu dem Zeitpunkt wo es ausfällt interessant.
Momantan funktionieren wieder mal alle, aber zumindest hab ich jetzt einen Ansatz, wo ich weitersuchen kann. Was erwartest du darin zu finden bzw. zu vermissen? Beide Ausgaben sehen im korrekten Zustand auf dem Host schon sehr umfangreich auch. Im Gast ist es noch übersichtlich. Ich hab mir die Ausgaben jetzt schon mal in Dateien gespeichert, vielleicht bringt ein diff im Fehlerfall schneller Erkenntnisse, als alles manuell zu kontrollieren. Zwischenzeitlich werd ich mal versuchen, die Einträge den zugehörigen NICs zuzuordnen.
Inzwischen hab ich eine VM erwischt, die kurz nachdem ich ip -6 n abgefragt hab, wieder online war:
~# diff ip6n-20220203-1427 ip6n-20220203-1429 3c3 < $Prefix:1003::1 dev ens9 lladdr 0c:c4:7a:45:38:1e router REACHABLE ---
$Prefix:1003::1 dev ens9 lladdr 0c:c4:7a:45:38:1e router STALE
9c9 < $Prefix::1 dev ens9 lladdr f2:0b:a4:d1:20:01 router REACHABLE ---
$Prefix::1 dev ens9 lladdr f2:0b:a4:d1:20:01 router DELAY
Für den Host blieb keine Zeit. Der Fehler ist hier bei einem Ping von einem externen System aufgefallen. Welche Verbindungen netzintern gestört waren, konnte ich so schnell auch noch nicht rausfinden, aber vielleicht hilft das schon mal weiter.
Und dann vll mal nen tcpdump um zu sehen ob da irgendwer zu diesem Zeitpunkt IPv6 Neighbor Solicitations schickt auf die keiner antwortet.
Wenn du mir dazu noch ein Beispiel schicken kannst, wie ich das am besten rausfiltere, spart mir das viel Zeit.
Da bei Dir alle Adressen statisch konfiguriert sind sollten die alle ne lifetime von "permanent" haben. Aber es würde sicherlich mal nicht schaden sich auf den Interfaces davon zu überzeugen, dass da wirklich nur die statisch konfigurierten + die fe80 Dinger drauf sind. Nicht das da RAs reinkommen und die Teile mit den Adressen arbeiten die sie sich per SLAAC aus nem RA konfigurieren... die sind ja raus gebridged "sehen" also die Aussenwelt.
Weitere IP-Adressen kann ich schon mal ausschließen: Host: 5: vswitch0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1400 qdisc noqueue state UP group default qlen 1000 link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff inet6 $Prefix:1001::1/64 scope global valid_lft forever preferred_lft forever inet6 fe80::xxxx:xxxx:xxxx:xxxx/64 scope link valid_lft forever preferred_lft forever
Gast: 2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1400 qdisc pfifo_fast state UP group default qlen 1000 link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff altname enp0s3 inet6 $Prefix:1101::1/64 scope global valid_lft forever preferred_lft forever inet6 fe80::xxxx:xxxx:xxxx:xxxx/64 scope link valid_lft forever preferred_lft forever
Prinzipiell ist für sonnen Betrieb kein zusätzlicher daemon oder sysctl erforderlich, die ganze Automagie is im Linux Kernel und per default an.
Die Erkenntnis ist auch schon was wert.
Grüsse Andreas
Gruß Rico
~# diff ip6n-20220203-1427 ip6n-20220203-1429 3c3
< $Prefix:1003::1 dev ens9 lladdr 0c:c4:7a:45:38:1e router REACHABLE
$Prefix:1003::1 dev ens9 lladdr 0c:c4:7a:45:38:1e router STALE
9c9
< $Prefix::1 dev ens9 lladdr f2:0b:a4:d1:20:01 router REACHABLE
$Prefix::1 dev ens9 lladdr f2:0b:a4:d1:20:01 router DELAY
Ich hatte vergessen zu erwähnen, daß die 1. IP der DNS-Server und die 2. das Gateway ist.
Gruß Rico
lug-dd@mailman.schlittermann.de