tc u32 - son çekirdeklerde L2 protokolleri nasıl eşleştirilir?


12

Linux köprüsünde yapılmış karma filtreli güzel bir şekillendiricim var. Kısacası, br0bağlar externalve internalfiziksel arayüzler, VLAN etiketli paketler "şeffaf" olarak köprülenir (yani, VLAN arayüzleri yoktur).

Şimdi, farklı çekirdekler bunu farklı yapıyor. Kesin çekirdek çeşitlerinde yanlış olabilirim, lütfen beni affet. Teşekkürler.

2.6.26

Yani, debian'da, 2.6.26 ve üstü (2.6.32'ye kadar, inanıyorum) --- bu işe yarıyor:

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

Burada, "çekirdek" 0x8100 ile "protokol" alanında iki baytla eşleşir, ancak ip paketinin başlangıcını "sıfır konumu" olarak sayar (eğer biraz net değilsem İngilizcem için özür dilerim).

2.6.32

Yine, debian'da (vanilya çekirdeği inşa etmedim), 2.6.32-5 --- bu işe yarıyor:

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

Burada, "çekirdek" protokol için aynı eşleşir, ancak bu protokol başlığının başından itibaren ofset sayar --- Ben ofset için 4 bayt eklemek zorunda (20, dst adresi için 16 değil). Sorun değil, bana göre daha mantıklı görünüyor.

3.2.11, şimdi en son kararlı

Bu --- hiçbir 802.1q etiketi yokmuş gibi çalışır:

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

Sorun şu ana kadar 802.1q etiketi eşleştirmek için bir yol bulamadı olmasıdır.

Geçmişte 802.1q etiketi eşleniyor

Bunu daha önce aşağıdaki gibi yapabilirdim:

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

Şimdi birlikte 802.1q etiketi eşleştiremediğimiz değilim at 0, at -2, at -4, at -6veya benzeri söyledi. Ben sıfır hit sayısı ana sorun --- bu filtre hiç kontrol edilmiyor, başka bir deyişle, "yanlış protokol".

Lütfen, kimse, yardım et :-)

Teşekkürler!

Yanıtlar:


4

Son çekirdeklerde VLAN etiketi skb'den çıkarılır. Skb'de bir meta eşleşme yapmak için böyle bir şey deneyin:

tc filter add dev internal protocol all parent 1:0 prio 100 basic match 'meta(vlan mask 0xfff eq 0x0ed8)' flowid 1:300

Kök filtresi ekleme girişimi protocol allbana veriyor RTNETLINK answers: Invalid argument(burada 3.3.4 çekirdek). Bunu daha yeni çekirdeklerle test edeceğim. Teşekkür ederim.
brownian

Bu benim için debian wheezy kernel 3.2.0 ile çalıştı. Tüm detayları içeren başka bir cevap ekledim.
Nick Craig-Wood

3

Tam olarak bunu yapmak zorundaydım. @Thusitha tarafından önerilen cevabın yeni çekirdekler için doğru yol olduğunu buldum.

Debian wheezy çekirdek 3.2.0-4 ve iproute (tc komutunun geldiği yerden) sürüm 20120521-3 + b3 ile test edildi

İşte tam komut dosyası, tc filtersatırlar neredeyse tam olarak @Thusitha tarafından belirtildiği gibi

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

Garip, protocol allvanilya çekirdeğinde bana bir hata verdi. Daha fazla kontrol etmeliyim. Teşekkür ederim.
brownian

1

Kullanıcı alanında görülebildiği gibi arayüzde neler olduğunu yakalamak için wireshark kullanmanızı ve filtreyi yazmak için bunu kullanmanızı tavsiye ederim. Belki de arabirimin VLAN etiketlerini bir nedenden ötürü (şeffaf bir şekilde köprülenecek şekilde yapılandırılmasına rağmen) soyup soymadığını merak ediyorum. Belki ekstra etiketler falan ekliyor?


Hayır, kesinlikle VLAN etiketini soymuyor - şekillendiricideki filtreler hariç, her şey çalışıyor (trafik donanım anahtarlarındaki gövdeler aracılığıyla trafik değişiyor). Ancak daha yakından bakacağım. VLAN etiketi boşaltma yeteneğine baktım, ancak bu sürücüler vid boşaltma yapamaz.
brownian

tcpdumptüm arabirimlerdeki vlan kimliklerini bridgeve bağlantı noktalarını gösterir.
brownian

Şimdi güzel şekillendiricim linux çekirdeği 3.3.4 çalışıyor, 8021q etiket filtreleme hariç her şey harika çalışıyor (onsuz yaşayabilirim). Sorun hala çözülmedi. Yine de teşekkürler.
brownian

1

Vlan paketlerini ebtables ile işaretleyebilirsiniz .

# 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

Sonra işaretlere göre şekillendirme uygulayın. ebtables ve iptables aynı işareti paylaşır.

Bunu henüz kendim yapmadım. Yani bu oldukça bir önsezi.


10Gb bağlantıda sorunsuz çalışacağından şüpheliyim ... Herhangi bir * tablodan kaçınmak istiyorum. Yine de öneri için teşekkürler.
brownian

@brownian sizce aynı filtreyi iproute2'de yapmak daha yüksek bir performans mı olacak? Aynı çekirdek, aynı kod yolu, aynı algoritmalar. Yanlışlıkla bağlantı izlemeyi açma gibi bir şey yapmadığınız sürece, bir fark görmemelisiniz. * tablolar olabilir çünkü performansını etkileyebilir olabilir karmaşık bir sürü şey yok. Ancak bu, olacağı anlamına gelmez .
tylerl

@tylerl Aslında bu yana filtreye sahip iproute2 (aynı vlan müşteriler yüzlerce, filtreler sağlamalarının bir demet) ile - her paket için başka ekstra kontrol edecek performansını etkileyebilir, ben inanıyorum.
brownian

0

reorder_hdrVlan arabirimindeki seçeneği kapatmayı deneyin . Üstbilgiyi yeniden sırala seçeneği etkinleştirilirse, çerçevelerden etiketler kaldırılır. Komut ile kontrol edin ip -d link list dev vlan_iface.


1
, Sen netleştirebilirsiniz Lütfen zaman o kaldırılır ve ne zaman geri takıldığında? Yani, etiketli bir çerçeve linux köprüsüne girer ve daha sonra başka bir arayüzden bırakır - ne zaman / nerede bu etiket manipülasyonları meydana gelir ve ne zaman / nerede tcfiltreler çağrılır? Bir haritaya veya buna benzer bir bağlantınız var mı? Teşekkürler!
brownian

Lütfen, başka bir düşünce: hangi vlan arayüzünü kastediyorsunuz? Bu köprünün tek bir vlan arayüzü yok (ilk paragrafta "Yani, hiç VLAN arayüzü yok" yazdım).
brownian
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.