tc u32 - bagaimana cara mencocokkan protokol L2 di kernel terbaru?

12

Saya memiliki pembentuk yang bagus, dengan filter hash, dibangun di jembatan linux. Singkatnya, br0koneksi externaldan internalantarmuka fisik, paket yang ditandai VLAN dijembatani "secara transparan" (maksud saya, tidak ada antarmuka VLAN di sana).

Sekarang, kernel yang berbeda melakukannya secara berbeda. Saya bisa salah dengan rentang kernel yang tepat, maafkan saya. Terima kasih.

2.6.26

Jadi, dalam debian, 2.6.26 dan lebih tinggi (hingga 2.6.32, saya percaya) --- ini berfungsi:

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

Di sini, "kernel" cocok dengan dua byte dalam bidang "protokol" dengan 0x8100, tetapi menghitung awal paket ip sebagai "posisi nol" (maaf untuk bahasa Inggris saya, jika saya agak tidak jelas).

2.6.32

Sekali lagi, di debian (saya tidak membangun kernel vanilla), 2.6.32-5 --- ini berfungsi:

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

Di sini, "kernel" cocok dengan protokol yang sama, tetapi menghitung offset dari awal header protokol ini --- saya harus menambahkan 4 byte ke offset (20, bukan 16 untuk alamat dst). Tidak apa-apa, sepertinya lebih logis, bagi saya.

3.2.11, stabil terbaru sekarang

Ini berfungsi --- seolah-olah tidak ada tag 802.1q sama sekali:

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

Masalahnya adalah bahwa saya tidak dapat menemukan cara untuk mencocokkan tag 802.1q sejauh ini.

Mencocokkan tag 802.1q di masa lalu

Saya bisa melakukan ini sebelumnya sebagai berikut:

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

Sekarang aku tidak dapat mencocokkan 802.1q tag dengan at 0, at -2, at -4, at -6atau seperti itu. Masalah utama yang saya miliki nol hit count --- filter ini tidak sedang diperiksa sama sekali, "protokol yang salah", dengan kata lain.

Tolong, siapa saja, bantu saya :-)

Terima kasih!

coklat
sumber

Jawaban:

4

Tag VLAN dilepaskan dari skb di kernel terbaru. Coba sesuatu seperti ini untuk melakukan pertandingan meta di skb:

tc filter add dev internal protocol all parent 1:0 prio 100 basic match 'meta(vlan mask 0xfff eq 0x0ed8)' flowid 1:300
Demikian juga
sumber
Upaya untuk menambahkan filter root untuk protocol allmemberi saya RTNETLINK answers: Invalid argument(kernel 3.3.4 di sini). Saya akan menguji ini dengan kernel yang lebih baru. Terima kasih.
coklat
Ini bekerja untuk saya dengan kernel debian wheezy 3.2.0. Saya telah menambahkan jawaban lain dengan detail lengkap.
Nick Craig-Wood
3

Saya harus melakukan ini. Saya menemukan bahwa jawaban yang disarankan oleh @Thusitha adalah cara yang benar untuk melakukannya untuk kernel baru.

Diuji dengan kernel Wheezy Debian 3.2.0-4 dan iproute (dari mana perintah tc berasal) versi 20120521-3 + b3

Inilah skrip lengkapnya, tc filtergaris - garisnya hampir persis seperti yang ditentukan oleh @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
sumber
Aneh, protocol allmemberi saya kesalahan dalam vanilla kernel. Saya harus memeriksanya lebih lanjut. Terima kasih.
coklat
1

Saya akan merekomendasikan menggunakan wireshark untuk menangkap apa yang melalui antarmuka seperti yang terlihat di userspace, dan menggunakannya untuk menulis filter. Saya bertanya-tanya apakah mungkin antarmuka mencabut tag VLAN untuk beberapa alasan (meskipun dikonfigurasi untuk menjembatani secara transparan). Mungkin itu menambahkan tag tambahan atau sesuatu?

Falcon Momot
sumber
Tidak, ini bukan pengupasan tag VLAN, tentu saja - semuanya berfungsi (lalu lintas dialihkan melalui trunk pada sakelar perangkat keras), kecuali filter di pembentuknya. Namun saya akan melihat lebih dekat. Saya melihat kemampuan tag offload VLAN, tetapi driver tersebut tidak dapat melakukan vid offload.
coklat
tcpdumpmenunjukkan ID vlan di semua antarmuka bridgedan port.
coklat
Sekarang pembentuk saya yang bagus bekerja di kernel linux 3.3.4, semuanya berfungsi dengan baik kecuali filtering tag 8021q (saya bisa hidup tanpanya). Masalahnya tetap belum terpecahkan. Terima kasih.
coklat
1

Anda dapat menandai paket vlan dengan 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

Kemudian menerapkan pembentukan berdasarkan tanda. Etables dan iptables memiliki penandaan yang sama.

Belum melakukan ini sendiri. Jadi itu agak firasat.

rhasti
sumber
Saya ragu ini akan berfungsi dengan baik pada tautan 10Gb ... Saya ingin menghindari tabel * apa pun. Terima kasih atas sarannya.
brown
@brownian Anda pikir melakukan penyaringan yang sama persis di iproute2 akan menjadi kinerja yang lebih tinggi? Ini kernel yang sama, jalur kode yang sama, algoritma yang sama. Selama Anda tidak sengaja melakukan sesuatu seperti menyalakan pelacakan koneksi, Anda tidak akan melihat perbedaan. * Tabel dapat memengaruhi kinerja karena dapat melakukan banyak hal kompleks. Tetapi itu tidak berarti bahwa itu akan terjadi .
tylerl
@tylerl Karena saya benar - benar harus memfilter dengan iproute2 (ratusan pelanggan di vlan yang sama, banyak filter hash) - setiap pemeriksaan tambahan lain untuk setiap paket akan berdampak pada kinerja, saya percaya.
brownian
0

Cobalah untuk mematikan reorder_hdropsi pada antarmuka vlan. Jika opsi susun ulang tajuk diaktifkan, maka tag dari bingkai dihapus. Periksa dengan perintah ip -d link list dev vlan_iface.

Manusia Jahat
sumber
1
Tolong, bisakah Anda menjelaskan, kapan itu dihapus, dan kapan itu dimasukkan kembali? Maksudku, bingkai yang ditandai masuk ke jembatan linux dan kemudian meninggalkannya dari antarmuka lain - kapan / di mana manipulasi tag ini terjadi, dan kapan / di mana tcfilter dipanggil? Apakah Anda memiliki tautan ke peta atau seperti itu? Terima kasih!
coklat
Silakan, pikiran lain: yang antarmuka vlan yang Anda maksud? Jembatan itu tidak memiliki satu antarmuka vlan (saya menulis "Maksud saya, tidak ada antarmuka VLAN" di paragraf pertama).
coklat