tc u32 - Wie werden L2-Protokolle in den letzten Kerneln abgeglichen?

12

Ich habe einen netten Shaper mit Hash-Filter, der auf einer Linux-Bridge gebaut wurde. Kurz gesagt, br0Verbindungen externalund internalphysische Schnittstellen, VLAN-gekennzeichnete Pakete werden "transparent" überbrückt (ich meine, es gibt keine VLAN-Schnittstellen).

Jetzt machen es verschiedene Kernel anders. Ich kann mit genauen Kernel-Versionsbereichen falsch liegen, bitte verzeihen Sie mir. Vielen Dank.

2.6.26

Also, in debian 2.6.26 und höher (bis 2.6.32, glaube ich) --- das funktioniert:

tc filter add dev internal protocol 802.1q parent 1:0 prio 100 \
    u32 ht 1:64 match ip dst 192.168.1.100 flowid 1:200

Hier stimmt "Kernel" mit zwei Bytes im Feld "Protokoll" mit 0x8100 überein, zählt aber den Anfang des IP-Pakets als "Null-Position" (Entschuldigung für mein Englisch, wenn ich etwas unklar bin).

2.6.32

Wieder in Debian (ich habe keinen Vanille-Kernel erstellt), 2.6.32-5 --- das funktioniert:

tc filter add dev internal protocol 802.1q parent 1:0 prio 100 \
    u32 ht 1:64 match ip dst 192.168.1.100 at 20 flowid 1:200

Hier stimmt "Kernel" mit dem Protokoll überein, zählt jedoch ab dem Anfang des Protokoll-Headers versetzt --- Ich muss 4 Bytes zum Versatz addieren (20, nicht 16 für dst-Adresse). Es ist in Ordnung, scheint logischer, was mich betrifft.

3.2.11, der neueste Stall jetzt

Dies funktioniert --- als gäbe es überhaupt kein 802.1q-Tag:

tc filter add dev internal protocol ip parent 1:0 prio 100 \
    u32 ht 1:64 match ip dst 192.168.1.100 flowid 1:200

Das Problem ist, dass ich bisher keine Möglichkeit gefunden habe, mit dem 802.1q-Tag übereinzustimmen.

Übereinstimmendes 802.1q-Tag in der Vergangenheit

Ich könnte das vorher so machen:

tc filter add dev internal protocol 802.1q parent 1:0 prio 100 \
    u32 match u16 0x0ed8 0x0fff at -4 flowid 1:300

Jetzt bin ich nicht in der Lage 802.1Q - Tag mit übereinstimmen at 0, at -2, at -4, at -6oder so. Das Hauptproblem, dass ich null Treffer habe, zählt --- dieser Filter wird überhaupt nicht überprüft, "falsches Protokoll", mit anderen Worten.

Bitte, irgendjemand, hilf mir :-)

Vielen Dank!

Brownian
quelle

Antworten:

4

Das VLAN-Tag wird in den letzten Kerneln von skb entfernt. Versuchen Sie etwas wie dieses, um ein Meta-Match in skb durchzuführen:

tc filter add dev internal protocol all parent 1:0 prio 100 basic match 'meta(vlan mask 0xfff eq 0x0ed8)' flowid 1:300
Thusitha
quelle
Ein Versuch, einen Root-Filter für hinzuzufügen, protocol allgibt mir RTNETLINK answers: Invalid argument(3.3.4 Kernel hier). Ich werde dies mit neueren Kerneln testen. Vielen Dank.
Brownian
Dies funktionierte für mich mit Debian Wheezy Kernel 3.2.0. Ich habe eine weitere Antwort mit allen Details hinzugefügt.
Nick Craig-Wood
3

Ich musste genau das tun. Ich fand, dass die von @Thusitha vorgeschlagene Antwort der richtige Weg war, dies für neue Kernel zu tun.

Getestet mit dem Debian Wheezy-Kernel 3.2.0-4 und der iproute-Version (von der der Befehl tc stammt) 20120521-3 + b3

Hier ist das komplette Skript, wobei die tc filterZeilen fast genau den Angaben von @Thusitha entsprechen

function qos() {
    if="$1"
    vlan1="$2"
    vlan2="$3"

    # delete previous
    tc qdisc del dev $if root >/dev/null 2>&1
    tc qdisc del dev $if ingress >/dev/null 2>&1

    # Root HTB for $if
    tc qdisc add dev $if root handle 1: htb r2q 1 default 1

    # Root class to borrow from
    tc class add dev $if parent 1: classid 1:1 htb quantum 1000000 rate 500mbit ceil 500mbit burst 64k prio 2
    tc qdisc add dev $if parent 1:1 handle 101 sfq perturb 10

    # class for vlan1
    tc class add dev $if parent 1:1 classid 1:106 htb quantum 1000000 rate 1.00mbit ceil 1.00mbit burst 6k
    tc qdisc add dev $if parent 1:106 handle 107 sfq perturb 10
    tc filter add dev $if protocol all parent 1: prio 100 basic match "meta(vlan mask 0xfff eq ${vlan1})" flowid 1:106

    # class for vlan2
    tc class add dev $if parent 1:1 classid 1:108 htb quantum 1000000 rate 1.00mbit ceil 10.00mbit burst 6k
    tc qdisc add dev $if parent 1:108 handle 108 sfq perturb 10
    tc filter add dev $if protocol all parent 1: prio 100 basic match "meta(vlan mask 0xfff eq ${vlan2})" flowid 1:108

}

qos eth1 1234 1235
qos eth2 2345 2346
Nick Craig-Wood
quelle
Seltsam, protocol allgab mir einen Fehler im Vanillekern. Ich sollte es mehr überprüfen. Vielen Dank.
Brownian
1

Ich würde empfehlen, wireshark zu verwenden, um zu erfassen, was über die Benutzeroberfläche als im Benutzerbereich sichtbar angezeigt wird, und dies zum Schreiben des Filters zu verwenden. Ich frage mich, ob die Schnittstelle möglicherweise aus irgendeinem Grund die VLAN-Tags entfernt (obwohl sie so konfiguriert ist, dass sie transparent überbrückt). Vielleicht werden zusätzliche Tags hinzugefügt oder so?

Falcon Momot
quelle
Nein, es werden definitiv keine VLAN-Tags entfernt - alles funktioniert (der Datenverkehr wird über Amtsleitungen auf Hardware-Switches vermittelt), mit Ausnahme von Filtern im Shaper. Ich werde jedoch genauer hinsehen. Ich habe mir die VLAN-Tag-Offload-Funktion angeschaut, aber diese Treiber sind nicht in der Lage, VID-Offloads durchzuführen.
Brownian
tcpdumpZeigt VLAN-IDs an allen Schnittstellen bridgeund an den IT- Ports an.
Brownian
Jetzt läuft mein netter Shaper unter Linux-Kernel 3.3.4, alles funktioniert super, außer 8021q-Tag-Filterung (ich kann ohne leben). Das Problem bleibt ungelöst. Trotzdem danke.
Brownian
1

Sie können vlan packtes mit ebtables markieren .

# mark packets according to the vlan id
ebtables -i br0 -A PREROUTING -p 802_1Q --vlan-id 1 -j mark --mark-set 1
ebtables -i br0 -A PREROUTING -p 802_1Q --vlan-id 5 -j mark --mark-set 2

Wenden Sie dann die Formgebung auf der Grundlage von Markierungen an. ebtables und iptables haben die gleiche Kennzeichnung.

Hab ich selbst noch nicht gemacht. Es ist also eher eine Vermutung.

Rhasti
quelle
Ich bezweifle, dass es mit 10-Gbit-Links reibungslos funktionieren wird ... Ich möchte keine * -Tabellen verwenden. Trotzdem danke für den Vorschlag.
Brownian
@brownian Glaubst du, dass genau das gleiche Filtern in iproute2 eine höhere Leistung bringt? Es ist der gleiche Kernel, der gleiche Codepfad, die gleichen Algorithmen. Solange Sie die Verbindungsverfolgung nicht versehentlich aktivieren, sollten Sie keinen Unterschied feststellen. * Tabellen können die Leistung auswirken , weil es kann viel komplexer Dinge tun. Das heißt aber nicht, dass es so sein wird .
Tyler
@tylerl Da ich eigentlich müssen Filter mit iproute2 (Hunderte von Kunden in der gleichen vlan, ein Bündel von Filter - Hashes) - jede andere zusätzliche Überprüfung für jedes Paket wird die Leistung auswirken, ich glaube.
Brownian
0

Versuchen Sie, die reorder_hdrOption für die VLAN-Schnittstelle zu deaktivieren. Wenn die Option Header neu anordnen aktiviert ist, werden Tags aus Frames entfernt. Überprüfen Sie es per Befehl ip -d link list dev vlan_iface.

Böser Mann
quelle
1
Können Sie bitte klären, wann es entfernt und wann es wieder eingesetzt wird? Ich meine, ein getaggter Frame gelangt in die Linux-Bridge und verlässt diese dann von einer anderen Schnittstelle - wann / wo diese Tag-Manipulationen stattfinden und wann / wo tcFilter aufgerufen werden? Hast du einen Link zu einer Karte oder so? Vielen Dank!
Brownian
Bitte, ein anderer Gedanke: welche vlan Schnittstelle meinen Sie das ? Diese Brücke hat keine einzige VLAN-Schnittstelle (ich schrieb im ersten Absatz "Ich meine, es gibt keine VLAN-Schnittstellen").
Brownsche