Bridge(switch) zieht automatisch(NDP/RA) ipv6 Adresse obwohl sie im manual modus ohne ip konfiguriert ist

Apr 16, 2024
7
0
1
Hallo,

ich bin irritiert.
Wenn ich in Proxmox über die GUI eine Bridge anlege und dieser keine IPs zuweise, dann gehe ich davon aus das diese keine IPs hat und auch nicht von "alleine" eine bekommen kann. Eine Bridge ohne IP und ohne weitere Konfiguration sollte äquivalent zu einem unmanaged switch sein.

Das ist auch im ersten Moment so. Aber nach einiger Zeit sieht man dann auf der Konsole, das diese Bridge sich IPv6 Adressen setzt(NDP/RA) und zwar gültige. In der GUI sieht es weiterhin so aus als wenn keine Adresse zugewiesen ist. Das täuscht ungemein.

Da Proxmox sein Webinterface und die anderen Schnittstellen auf IPv6 ::: Port hostet sind die dann dort gleich mit verfügbar.
Das ist dann noch dazu ein Sicherheitsproblem.

Wie ist das im Sinne von SDN vereinbar?

Wie legt man bei Proxmox einen richtigen "unmanaged switch" an?

Besten Dank für Tipps und Feedback
 
Das ist das default Verhalten von Linux bridges (und network interfaces generell) - die IP die man im Web UI setzt ist üblicherweise zusätzlich zur link-local Adresse. Man sollte das durch das Setzen vom addrgenmode verhindern können:

Code:
ip link set dev <bridge> addrgenmode none
 
Der Default ist auch etwas das konfiguriert ist.
Wahrscheinlich wurde die Settings von Debian übernommen. Für ein Hypervisor der SDN anbietet finde ich das aber problematisch.

Ich meine auch nicht nur die Link-Local. Es wird ja zusätzlich eine extern verfügbare Adresse gesetzt und ein routing dafür eingetragen.
Vergleichbar mit DHCPv4, nur eben mit v6.

Bei Proxmox ist aktiviert:
sysctl -a | grep "net\.ipv6\.conf"
..
net.ipv6.conf.default.autoconf = 1
net.ipv6.conf.all.autoconf = 1
net.ipv6.conf.default.accept_ra = 1
net.ipv6.conf.all.accept_ra = 1
..
Ich habe erstmal vermutet das es daran liegt.

Wenn eine Bridge erstellt wird, dann wird diese mit diesen konfigurierten defaults erstellt. z.b.
/etc/network/interfaces
...
auto vmbr0
iface vmbr0 inet manual
bridge-ports xxx
bridge-stp off
bridge-fd 0
...

sysctl -a | grep "net\.ipv6\.conf" | grep "vmbr0"
...
net.ipv6.conf.vmbr0.autoconf = 1
net.ipv6.conf.vmbr0.accept_ra = 1
...

Ich habe versucht es per /etc/network/interfaces zu deaktivieren, das hatte bisher aber keinen Erfolg:
auto vmbr0
iface vmbr0 inet manual
bridge-ports xxx
bridge-stp off
bridge-fd 0

iface vmbr0 inet6 manual
autoconf 0
accept_ra 0

Es bleibt weiterhin konfiguriert:
net.ipv6.conf.vmbr0.autoconf = 1
net.ipv6.conf.vmbr0.accept_ra = 1

Ich bin mir nicht sicher ob es an net.ipv6.conf.all.autoconf = 1 und net.ipv6.conf.all.accept_ra = 1 liegt.



Den addrgenmode kann ich auch gerne probieren. Weißt du wie man das in den /etc/network/interfaces schreibt?
 
Es wird ja zusätzlich eine extern verfügbare Adresse gesetzt und ein routing dafür eingetragen.
Vergleichbar mit DHCPv4, nur eben mit v6.

Was wird denn für eine Adresse eingetragen? Das klingt so als ob hier via SLAAC [1] zusätzliche Präfixe konfiguriert werden. Per default werden nur link-local Adressen (fe80::/64) generiert um im lokalen Netzwerk kommunizieren zu können. Da muss es irgendetwas anderes im Netzwerk geben woher die Infos bzgl den Präfixen kommen (sehr wahrscheinlich der Router). Hier muss man dann den Router konfigurieren, dass er nicht automatisch in dem Netzwerk die Präfixe announced, wenn man das nicht möchte.

[1] https://de.wikipedia.org/wiki/IPv6#Autokonfiguration
 
Follow up:
Addr gen mode scheint per default deaktiviert zu sein,
sysctl -a | grep "net\.ipv6\.conf" | grep "vmbr0"
...
net.ipv6.conf.vmbr0.addr_gen_mode = 0
...
 
Follow up:
Addr gen mode scheint per default deaktiviert zu sein,
sysctl -a | grep "net\.ipv6\.conf" | grep "vmbr0"
...
net.ipv6.conf.vmbr0.addr_gen_mode = 0
...

Das ist kein Boolean, sondern ein integer der den modus bestimmt, siehe [1]

Code:
addr_gen_mode - INTEGER
    Defines how link-local and autoconf addresses are generated.

    0: generate address based on EUI64 (default)
    1: do no generate a link-local address, use EUI64 for addresses generated
       from autoconf
    2: generate stable privacy addresses, using the secret from
       stable_secret (RFC7217)
    3: generate stable privacy addresses, using a random secret if unset

[1] https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt
 
Was wird denn für eine Adresse eingetragen? Das klingt so als ob hier via SLAAC [1] zusätzliche Präfixe konfiguriert werden. Per default werden nur link-local Adressen (fe80::/64) generiert um im lokalen Netzwerk kommunizieren zu können. Da muss es irgendetwas anderes im Netzwerk geben woher die Infos bzgl den Präfixen kommen (sehr wahrscheinlich der Router). Hier muss man dann den Router konfigurieren, dass er nicht automatisch in dem Netzwerk die Präfixe announced, wenn man das nicht möchte.

[1] https://de.wikipedia.org/wiki/IPv6#Autokonfiguration
Das kommt vom Router, korrekt.
Aber ich möchte das die Bridge solche Sachen ignoriert wie ein unmanaged Switch (Layer 2 only).
Ähnlich wie bei IPv4. Da setzt sie sich ja auch nicht ohne Konfiguration eine Adresse nur weil irgendwo ein DHCP Server läuft. Da müsste ich mit Absicht die Konfiguration auf dhcp setzen.
 
Das ist kein Boolean, sondern ein integer der den modus bestimmt, siehe [1]

Code:
addr_gen_mode - INTEGER
    Defines how link-local and autoconf addresses are generated.

    0: generate address based on EUI64 (default)
    1: do no generate a link-local address, use EUI64 for addresses generated
       from autoconf
    2: generate stable privacy addresses, using the secret from
       stable_secret (RFC7217)
    3: generate stable privacy addresses, using a random secret if unset

[1] https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt
ok klingt gut, wie setze ich das in der /etc/network/interfaces auf 1 ?
 
In der interfaces-Datei geht autoconf und accept_ra nur wenn man von manual auf static stellt, siehe [1] für eine genaue Erklärung der Semantik der unterschiedlichen Methoden. Da muss man dann allerdings statisch eine IP setzen.

Alternativ kann man autoconf und accept_ra von dem gebridgeten Port auf 0 setzen, via sysctl:

Code:
$ sysctl net.ipv6.conf.<ifname|all|default>.autoconf=0
$ sysctl net.ipv6.conf.<ifname|all|default>.accept_ra=0

Generell ist es aber in IPv6 so, dass jedes Device automatisch eine IP in seinem Prefix bekommt - das ist ein grundlegender Unterschied zu IPv4 und grundlegender Bestandteil von IPv6. Es sollte auch nicht notwendig sein SLAAC abzudrehen um Zugriff von außen zu unterbinden. Viel eher sollte man eine Firewall auf dem Router / GW verwenden.

[1] https://manpages.debian.org/unstable/ifupdown/interfaces.5.en.html#INET6_ADDRESS_FAMILY
 
Last edited:
In der interfaces-Datei geht autoconf und accept_ra nur wenn man von manual auf static stellt, siehe [1] für eine genaue Erklärung der Semantik der unterschiedlichen Methoden. Da muss man dann allerdings statisch eine IP setzen.

Alternativ kann man autoconf und accept_ra von dem gebridgeten Port auf 0 setzen, via sysctl:

Code:
$ sysctl net.ipv6.conf.<ifname|all|default>.autoconf=0
$ sysctl net.ipv6.conf.<ifname|all|default>.accept_ra=0

Generell ist es aber in IPv6 so, dass jedes Device automatisch eine IP in seinem Prefix bekommt - das ist ein grundlegender Unterschied zu IPv4 und grundlegender Bestandteil von IPv6. Es sollte auch nicht notwendig sein SLAAC abzudrehen um Zugriff von außen zu unterbinden. Viel eher sollte man eine Firewall auf dem Router / GW verwenden.

[1] https://manpages.debian.org/unstable/ifupdown/interfaces.5.en.html#INET6_ADDRESS_FAMILY
Dann könnte ich das nur /etc/sysctl.conf persistieren. Die Firewall gibt es zwar auch, aber mir widerspricht der Gedanke das immer aktiv unterbinden zu müssen. Besser finde ich, default off und nur aktiv einschalten wie bei v4.

Ich vergleiche die SDN Netzwerkkomponenten gern mit den physischen Exemplaren. Dort muss ich auch Bridges konfigurieren, heute läuft ja nicht viel ohne Konfiguration. Aber dort muss ich eher Konfiguration schreiben damit es Funktioniert und nicht andersrum. ;)

Vielleicht ist es dann besser IPv6 in /etc/sysctl.conf als default einzuschränken und nur bei Bedarf / mit Absicht in /etc/network/interfaces mit einem static Eintrag zu aktivieren.

Wenn ich in /etc/sysctl.conf folgendes setze und reboote.

net.ipv6.conf.default.autoconf = 0
net.ipv6.conf.default.accept_ra = 0

Dann müsste man in in /etc/network/interfaces diese optionen im static eintrag der interface jedes mal aktivieren wenn man eine ipv6 Adresse automatisch beziehen wollte, richtig?

Und ein manual Eintrag wäre wirklich manual und nicht mehr ipv4 manual und ipv6 auto?

Würde Proxmox mir das übel nehmen oder ist das ok? Immerhin läuft die Weboberfläche auf ipv6 :::8006 . Funktioniert die dann noch? Gäbe es weitere dienste die IPv6 only in Proxmox umgesetzt sind?
 
Last edited:
Dann könnte ich das nur /etc/sysctl.conf persistieren. Die Firewall gibt es zwar auch, aber mir widerspricht der Gedanke das immer aktiv unterbinden zu müssen. Besser finde ich, default off und nur aktiv einschalten wie bei v4.
Ja, dies muss dann explizit via sysctl gemacht werden. Allerdings ist es bei IPv6 nun mal prinzipiell so dass jedes Device defaultmäßig eine globally unique adresse bekommt. Das out of the box zu unterbinden wäre auch komisch weil IPv6 nun mal grundlegend anders als IPv4 ist in der Hinsicht und viele Leute, die IPv6 verwenden, dieses Verhalten erwarten. Es ist etwas ungewohnt wenn man von IPv4 kommt (war es für mich anfangs auch). Es steht einem frei das Verhalten zu ändern via sysctl.


Dann müsste man in in /etc/network/interfaces diese optionen im static eintrag der interface jedes mal aktivieren wenn man eine ipv6 Adresse automatisch beziehen wollte, richtig?
Ja, allerdings ist static dazu da um fixe IPs zu vergeben, nicht um gar keine zu vergeben. Am saubersten wäre es wohl das Interface einfach auf auto zu lassen und dort accept_ra / DHCP (je nachdem ob ihr netzwerk NDP und/oder DHCPv6 verwendet) zu deaktivieren. auto ist hier vielleicht auf den ersten Blick etwas komisch, weil man ja eigent nicht will dass IPs automatisch vergeben werden, aber hier muss man zwischen der link-local Adresse (die man schon automatisch möchte) und der globally-unique Adresse (die man nicht möchte und daher via accept_ra / dhcp ausschaltet) unterscheiden.

Caveat: Ich habe das jetzt nicht ausprobiert auf meinem Testsystem, aber ich denke das sollte funktionieren.

Alternativ eben den Router so konfigurieren, dass er die Präfixe nicht announced wenn man das nicht möchte (und den Router kontrolliert).


Und ein manual Eintrag wäre wirklich manual und nicht mehr ipv4 manual und ipv6 auto?
Man muss hier 2 Einträge machen, einen für IPv4 und einen für IPv6.


Würde Proxmox mir das übel nehmen oder ist das ok? Immerhin läuft die Weboberfläche auf ipv6 :::8006 . Funktioniert die dann noch? Gäbe es weitere dienste die IPv6 only in Proxmox umgesetzt sind?
Die Weboberfläche bindet sowohl auf ipv4 als auch ipv6 (je nach verfügbarkeit), es gibt keine Dienst die IPv4 oder IPv6 only sind.
 

About

The Proxmox community has been around for many years and offers help and support for Proxmox VE, Proxmox Backup Server, and Proxmox Mail Gateway.
We think our community is one of the best thanks to people like you!

Get your subscription!

The Proxmox team works very hard to make sure you are running the best software and getting stable updates and security enhancements, as well as quick enterprise support. Tens of thousands of happy customers have a Proxmox subscription. Get yours easily in our online shop.

Buy now!