tc u32 - jak dopasować protokoły L2 w najnowszych jądrach?

12

Mam ładny shaper z filtrowaniem hash, zbudowany na mostku linuksowym. W skrócie, br0połączenia externali internalfizyczne interfejsy, pakiety oznaczone VLAN są mostkowane „przezroczyście” (to znaczy, nie ma żadnych interfejsów VLAN).

Teraz różne jądra robią to inaczej. Mogę się mylić z dokładnymi zakresami wersji jądra, proszę wybacz mi. Dzięki.

2.6.26

Tak więc w Debianie, 2.6.26 i nowszych (do 2.6.32, jak sądzę) --- to działa:

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

Tutaj „jądro” dopasowuje dwa bajty w polu „protokół” z 0x8100, ale liczy początek pakietu ip jako „pozycję zerową” (przepraszam za mój angielski, jeśli jestem trochę niejasny).

2.6.32

Ponownie, w debianie (nie zbudowałem jądra wanilii), 2.6.32-5 --- to działa:

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

Tutaj „jądro” pasuje do protokołu tak samo, ale liczy przesunięcie od początku nagłówka tego protokołu --- muszę dodać 4 bajty do przesunięcia (20, a nie 16 dla adresu dst). Jest ok, wydaje się bardziej logiczne, jak dla mnie.

3.2.11, najnowsza stabilna teraz

Działa to tak, jakby w ogóle nie było znacznika 802.1q:

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

Problem polega na tym, że jak dotąd nie mogłem znaleźć sposobu na dopasowanie tagu 802.1q.

W przeszłości zgodny tag 802.1q

Mógłbym to zrobić wcześniej w następujący sposób:

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

Teraz jestem w stanie dopasować 802.1Q tag at 0, at -2, at -4, at -6lub tak. Główny problem polegający na tym, że mam zerową liczbę trafień - ten filtr wcale nie jest sprawdzany, „innymi słowy”.

Proszę, pomóżcie mi :-)

Dzięki!

Brownian
źródło

Odpowiedzi:

4

Tag VLAN jest usuwany z skb w najnowszych jądrach. Spróbuj czegoś takiego, aby wykonać meta dopasowanie w skb:

tc filter add dev internal protocol all parent 1:0 prio 100 basic match 'meta(vlan mask 0xfff eq 0x0ed8)' flowid 1:300
Soitha
źródło
Próba dodania filtru root dla protocol allmnie RTNETLINK answers: Invalid argument(jądro 3.3.4 tutaj). Przetestuję to na nowszych jądrach. Dziękuję Ci.
Brownian
Działa to dla mnie z jądrem debian wheezy 3.2.0. Dodałem kolejną odpowiedź z pełnymi szczegółami.
Nick Craig-Wood
3

Musiałem dokładnie to zrobić. Odkryłem, że odpowiedź sugerowana przez @Thusitha była poprawnym sposobem na to w przypadku nowych jąder.

Testowane z jądrem wheezy Debiana 3.2.0-4 i iproute (skąd pochodzi polecenie tc) wersja 20120521-3 + b3

Oto kompletny skrypt, tc filterwiersze są prawie dokładnie takie, jak określone przez @Thusitha

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
źródło
Dziwne, protocol alldało mi błąd w jądrze wanilii. Powinienem to sprawdzić bardziej. Dziękuję Ci.
brownian
1

Poleciłbym użyć wireshark do przechwycenia tego, co przechodzi przez interfejs jako widoczne w przestrzeni użytkownika, i użycie tego do napisania filtru. Zastanawiam się, czy być może interfejs z jakiegoś powodu usuwa tagi VLAN (pomimo skonfigurowania przezroczystego mostkowania). Być może dodaje dodatkowe tagi czy coś?

Falcon Momot
źródło
Nie, to zdecydowanie nie usuwa tagu VLAN - wszystko działa (ruch jest przełączany przez łącza na przełącznikach sprzętowych), z wyjątkiem filtrów w shaperze. Jednak przyjrzę się bliżej. Patrzyłem na możliwość odciążania tagów VLAN, ale te sterowniki nie są w stanie wykonać odciążania vid.
brownian
tcpdumppokazuje identyfikatory vlan na wszystkich interfejsach bridgei porty.
brownian
Teraz mój ładny shaper działa w jądrze Linuksa 3.3.4, wszystko działa świetnie oprócz filtrowania znaczników 8021q (mogę bez niego żyć). Problem pozostaje nierozwiązany. Mimo wszystko dziekuję.
brownian
1

Możesz oznaczyć pakiety vlan za pomocą ebtables .

# 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

Następnie zastosuj kształtowanie na podstawie oznaczeń. ebtables i iptables mają to samo oznaczenie.

Nie zrobiłem tego jeszcze sam. Więc to raczej przeczucie.

rhasti
źródło
Wątpię, czy będzie działać płynnie na łączu 10 Gb ... Chciałbym uniknąć * * tabel. W każdym razie dziękuję za sugestie.
brownian
@brownian myślisz, że wykonanie dokładnie tego samego filtrowania w iproute2 spowoduje wyższą wydajność? To to samo jądro, ta sama ścieżka kodu, te same algorytmy. Dopóki przypadkowo nie zrobisz czegoś takiego jak włączenie śledzenia połączeń, nie powinieneś widzieć różnicy. * tabele mogą mieć wpływ na wydajność, ponieważ mogą wykonywać wiele skomplikowanych czynności. Ale to nie znaczy, że tak będzie .
tylerl
@tylerl Odkąd rzeczywiście trzeba filtr z iproute2 (setek klientów w tej samej sieci VLAN, grono filtrów mieszań) - jakiejkolwiek innej dodatkowej odprawy dla każdego pakietu będzie wpływać wydajność, wierzę.
brownian
0

Spróbuj wyłączyć reorder_hdropcję interfejsu vlan. Jeśli włączona jest opcja zmiany kolejności nagłówków, tagi z ramek są usuwane. Sprawdź to za pomocą polecenia ip -d link list dev vlan_iface.

Zły człowiek
źródło
1
Czy możesz wyjaśnić, kiedy jest usuwany, a kiedy wkładany z powrotem? Mam na myśli, że otagowana ramka wchodzi do mostu linuksowego, a następnie opuszcza ją z innego interfejsu - kiedy / gdzie występują te manipulacje znacznikiem i kiedy / gdzie tcwywoływane są filtry? Czy masz link do mapy lub coś takiego? Dzięki!
brownian
Proszę inna myśl: który VLAN interfejs masz na myśli? Ten most nie ma jednego interfejsu Vlan (napisałem „Mam na myśli, że nie ma interfejsów VLAN” w pierwszym akapicie).
Brownian