[gelöst] Bridging zwischen zwei Netzwerkkarten

Alles rund um Netzwerktechnik und Protokolle
Anonymous

[gelöst] Bridging zwischen zwei Netzwerkkarten

Post by Anonymous »

Hi zusammen,

momentan experimentiere ich mit einer Bridge über zwei Netzwerkkarten (als Vorbereitung zu Tests mit KVM). Nur will leider nichts so richtig funktionieren.

Fall 1:
24er-Subnetz, eth0 ist die 240.
eth0: xxx.xxx.xxx.240
Dann lege ich br0 an und füge eth1 hinzu und gebe ihr die 241.
br0: xxx.xxx.xxx.241

Das läuft so ganz gut, nur bricht nach gewisser Zeit (25 Minuten, 1 Stunde, ...) alles zusammen. Erst wenn ich die Bridge herunterfahre, tut eth0 wieder. Leider habe ich keine Ahnung, wie ich das debuggen soll. Das ist aber noch nicht mein eigentliches Problem.

Code: Select all

auto eth0 
iface eth0 inet static
        address xxx.xxx.xxx.240
        netmask 255.255.255.0
        network xxx.xxx.xxx.0
        broadcast xxx.xxx.xxx.255
        gateway xxx.xxx.xxx.1
        # dns-* options are implemented by the resolvconf package, if installed
        dns-nameservers yyy.yyy.yyy.126 yyy.yyy.yyy.127
        dns-search aa.bbb.de

auto br0
iface br0 inet static
        address xxx.xxx.xxx.241
        netmask 255.255.255.0
        network xxx.xxx.xxx.0
        broadcast xxx.xxx.xxx.255
        gateway xxx.xxx.xxx.1
        # dns-* options are implemented by the resolvconf package, if installed
        dns-nameservers yyy.yyy.yyy.126 yyy.yyy.yyy.127
        dns-search aa.bbb.de
        bridge_ports eth1
        bridge_stp off
        bridge_maxwait 5
Fall 2:
Jetzt werden eth0 und eth1 zu br0 zusammengefasst, dann bekommt br0 die 240 (das ist genau das, was ich will). Jetzt gehen die Probleme erst richtig los. Die Bridge scheint zu funktionieren, nur ist dann das gesamte Subnetz hinüber. Nichts geht mehr. Fährt man die Bridge herunter, ist alles wieder gut.

Code: Select all

auto br0
iface br0 inet static
        address xxx.xxx.xxx.240
        netmask 255.255.255.0
        network xxx.xxx.xxx.0
        broadcast xxx.xxx.xxx.255
        gateway xxx.xxx.xxx.1
        # dns-* options are implemented by the resolvconf package, if installed
        dns-nameservers yyy.yyy.yyy.126 yyy.yyy.yyy.127
        dns-search aa.bbb.de
        bridge_ports eth0 eth1
        bridge_stp off
        bridge_maxwait 5
Diese tollen Meldungen kommen während dieser Zeit vom Kernel. Zuerst viele für eth0, dann viele für eth1.

Code: Select all

Jan 29 09:30:56 xxx kernel: eth0: received packet with  own address as source address
...
Jan 29 09:37:56 xxx kernel: eth1: received packet with  own address as source address
Alle Veränderungen an /proc/sys/net/ipv4/ usw. habe ich aus dem Firewall-Skript entfernt. Da stört also nichts.

Der Kernel ist ein 2.6.28.2er mit allen nötigen Treibern. Unter Networking support -> Networking options -> Netfilter habe ich Advanced netfilter configuration -> Bridged IP/ARP packets filtering aktiviert. Sorgt das vielleicht für Probleme? Support für ebtables ist nicht einkompiliert. Der Kernel ist monolithisch, also müssen keine Module nachgeladen werden.

Kann mir jemand bei diesem Problem weiterhelfen? Iptables usw. sind kein Problem, nur weiß ich hier einfach nicht mehr weiter. Wie kann ich das debuggen?
:google: habe ich in den letzten Tagen bereits zum Glühen gebracht.

insopitus

EDIT (2 Stunden später):

Langsam dämmert mir, was ich da verbrochen habe. Da ich nicht zwei Netzwerke über die Bridge verbunden habe, sondern beide Netzwerkkarten an ein Netz gehängt habe, habe ich die Pakete in einen Loop geschickt. Daher ist alles zum Erliegen gekommen. ](*,)

Die Lösung wäre wohl, STP zu aktivieren, dann sollten die Pakete wieder flutschen. Wenn man in gefühlten 50 Howtos aber liest, dass man das erst mit mehreren Bridges benötigt, kommt man leider zu spät darauf. Eine Alternative wäre natürlich Bonding.

Merke: Nicht tagelang alle möglichen Howtos durchkämmen, sondern öfters mal selbst denken.

Und jetzt alle: :lol: :lol: :lol:

EDIT2:

Meine Annahmen waren richtig. Jetzt habe ich mich für Bonding entschieden, weil diese Lösung einfach optimal läuft. Das anlegen einer Bridge für KVM schließt das ja nicht aus.

hier meine e/n/i:

Code: Select all

auto bond0
iface bond0 inet static
        address xxx.xxx.xxx.240
        netmask 255.255.255.0
        network xxx.xxx.xxx.0
        broadcast xxx.xxx.xxx.255
        gateway xxx.xxx.xxx.1
        # dns-* options are implemented by the resolvconf package, if installed
        dns-nameservers yyy.yyy.yyy.126 yyy.yyy.yyy.127
        dns-search aa.bbb.de
        pre-up modprobe -q bonding; echo -n
        slaves eth0 eth1
        bond_mode balance-rr
        bond_miimon 100
        bond_updelay 4000
        bond_downdelay 4000
Da ich einen monolithischen Kernel fahre, wollte ich – falls einmal doch ein Debian-Kernel gebootet wird – dafür sorgen, dass auch das dazugehörige Modul geladen wird. Also lasse ich per "pre-up" das Modul laden, falls es noch nicht geladen ist. Nun bin ich aber zu einem etwas hässlichen Hack gezwungen, damit eine '0' zurückgegeben wird, sonst startet das Interface nicht.

Code: Select all

pre-up modprobe -q bonding; echo -n
Natürlich könnte ich die /etc/modules bemühen. Dennoch: Kennt jemand eine schönere Lösung?

Marcus