tc u32 - วิธีจับคู่โปรโตคอล L2 ในเมล็ดล่าสุดได้อย่างไร


12

ฉันมีรูปที่ดีพร้อมตัวกรองที่ถูกแฮชสร้างขึ้นที่สะพานลินุกซ์ ในระยะสั้นbr0เชื่อมต่อexternalและinternalอินเตอร์เฟซทางกายภาพแพ็คเก็ตที่ติดแท็ก VLAN จะเชื่อมโยง "โปร่งใส" (ฉันหมายถึงไม่มีการเชื่อมต่อ VLAN อยู่ที่นั่น)

ตอนนี้เมล็ดที่แตกต่างกันทำแตกต่างกัน ฉันอาจผิดกับช่วง verions เคอร์เนลที่แน่นอนโปรดยกโทษให้ฉัน ขอบคุณ

2.6.26

ดังนั้นในเดเบียน 2.6.26 และสูงกว่า (มากถึง 2.6.32 ฉันเชื่อ) --- งานนี้:

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

ที่นี่ "เคอร์เนล" ตรงกับสองไบต์ในฟิลด์ "โพรโทคอล" กับ 0x8100 แต่นับจุดเริ่มต้นของแพ็กเก็ต ip เป็น "ตำแหน่งศูนย์" (ขออภัยสำหรับภาษาอังกฤษของฉันถ้าฉันยังไม่ชัดเจน)

2.6.32

อีกครั้งในเดเบียน (ฉันไม่ได้สร้างเคอร์เนลวานิลลา), 2.6.32-5 --- งานนี้:

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

ที่นี่ "เคอร์เนล" ตรงกับที่เหมือนกันสำหรับโปรโตคอล แต่นับ offset จากจุดเริ่มต้นของส่วนหัวของโปรโตคอลนี้ฉันต้องเพิ่ม 4 ไบต์เพื่อชดเชย (20 ไม่ใช่ 16 สำหรับที่อยู่ dst) มันโอเคดูเหมือนว่าจะมีเหตุผลมากกว่าสำหรับฉัน

3.2.11 ล่าสุดที่มีเสถียรภาพในขณะนี้

ใช้งานได้ --- ราวกับว่าไม่มีแท็ก 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

ปัญหาคือฉันไม่สามารถหาวิธีจับคู่แท็ก 802.1q ได้

การจับคู่แท็ก 802.1q ที่ผ่านมา

ฉันสามารถทำสิ่งนี้มาก่อนดังนี้

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

ตอนนี้ฉันไม่สามารถจับคู่ 802.1q แท็กat 0, at -2, at -4, at -6หรือชอบว่า ปัญหาหลักที่ฉันมีนับเป็นศูนย์ฮิต --- ตัวกรองนี้ไม่ได้ถูกตรวจสอบเลย "โปรโตคอลผิด" ในคำอื่น ๆ

ได้โปรดใครก็ได้ช่วยฉันด้วย :-)

ขอบคุณ!

คำตอบ:


4

แท็ก VLAN ถูกถอดออกจาก skb ในเมล็ดที่ผ่านมา ลองใช้วิธีนี้เพื่อจับคู่เมตาใน skb:

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

ความพยายามในการเพิ่มตัวกรองรูทสำหรับprotocol allให้ฉันRTNETLINK answers: Invalid argument(เคอร์เนล 3.3.4 ที่นี่) ฉันจะทดสอบสิ่งนี้ด้วยเมล็ดใหม่ ขอบคุณ.
Brownian

สิ่งนี้ใช้ได้กับฉันด้วย debian wheezy kernel 3.2.0 ฉันได้เพิ่มคำตอบเพิ่มเติมพร้อมรายละเอียดทั้งหมดแล้ว
Nick Craig-Wood

3

ฉันต้องทำอย่างนี้ ฉันพบว่าคำตอบที่ @Thusitha แนะนำนั้นเป็นวิธีที่ถูกต้องสำหรับเมล็ดใหม่

ทดสอบกับ Debian wheezy kernel 3.2.0-4 และ iproute (จากตำแหน่งที่คำสั่ง tc มา) เวอร์ชั่น 20120521-3 + b3

นี่คือสคริปต์ที่สมบูรณ์tc filterบรรทัดที่เกือบจะเหมือนกับที่ระบุโดย @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

แปลกprotocol allให้ฉันข้อผิดพลาดในเคอร์เนลวานิลลา ฉันควรตรวจสอบเพิ่มเติม ขอบคุณ.
บราวน์

1

ฉันอยากจะแนะนำให้ใช้ wireshark เพื่อจับภาพสิ่งที่เกิดขึ้นผ่านส่วนต่อประสานที่ปรากฏใน userspace และใช้สิ่งนั้นเพื่อเขียนตัวกรอง ฉันสงสัยว่าบางทีอินเทอร์เฟซกำลังทำการลอกแท็ก VLAN ด้วยเหตุผลบางอย่าง (แม้ว่าจะถูกกำหนดค่าให้เชื่อมแบบโปร่งใส) บางทีมันอาจเพิ่มแท็กพิเศษหรืออะไรบางอย่าง?


ไม่มันไม่ลอกแท็ก VLAN แน่นอน - ทุกอย่างทำงานได้ (การรับส่งข้อมูลจะเปลี่ยนผ่านลำต้นบนสวิตช์ฮาร์ดแวร์) ยกเว้นตัวกรองในรูป อย่างไรก็ตามฉันจะมองใกล้ ๆ ฉันดูที่ความสามารถในการถ่ายแท็ก VLAN แต่โปรแกรมควบคุมเหล่านั้นไม่สามารถทำการถ่ายวิดีโอได้
บราวน์

tcpdumpแสดง vlan ID ที่ทุกอินเตอร์เฟสbridgeและพอร์ต
Brownian

ตอนนี้ผู้ที่ดีของฉันใช้งานเคอร์เนล un linux 3.3.4 ทุกอย่างใช้งานได้ดียกเว้นการกรองแท็ก 8021q (ฉันสามารถอยู่ได้โดยปราศจากมัน) ปัญหายังไม่ได้รับการแก้ไข ขอบคุณอยู่ดี
brownian

1

คุณสามารถทำเครื่องหมาย packtes VLAN กับ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

จากนั้นใช้การปรับรูปร่างตามเครื่องหมาย ebtables และ iptables แบ่งปันเครื่องหมายเดียวกัน

ยังไม่ได้ทำสิ่งนี้เอง ดังนั้นมันค่อนข้างลางสังหรณ์


ฉันสงสัยว่ามันจะทำงานได้อย่างราบรื่นบนลิงค์ 10Gb ... ฉันต้องการหลีกเลี่ยงตาราง * ใด ๆ ขอบคุณสำหรับข้อเสนอแนะ
บราวน์

@brownian คุณคิดว่าการกรองเดียวกันใน iproute2 จะมีประสิทธิภาพสูงขึ้นหรือไม่ มันเป็นเคอร์เนลเดียวกัน, โค้ดพา ธ เดียวกัน, อัลกอริทึมเดียวกัน ตราบใดที่คุณไม่ได้ตั้งใจทำบางอย่างเช่นเปิดการติดตามการเชื่อมต่อคุณจะไม่เห็นความแตกต่าง ตาราง * สามารถส่งผลกระทบต่อประสิทธิภาพการทำงานเนื่องจากสามารถทำสิ่งที่ซับซ้อนได้มากมาย แต่นั่นไม่ได้หมายความว่ามันจะ
tylerl

@tylerl เนื่องจากจริง ๆ แล้วฉันต้องกรองด้วย iproute2 (ลูกค้าหลายร้อยรายใน vlan เดียวกันกลุ่มของตัวกรองแฮช) - การตรวจสอบพิเศษอื่น ๆ สำหรับทุกแพ็คเก็ตจะส่งผลกระทบต่อประสิทธิภาพฉันเชื่อว่า
Brownian

0

ลองปิดreorder_hdrตัวเลือกในอินเตอร์เฟส vlan หากเปิดใช้งานตัวเลือกส่วนหัวใหม่แล้วแท็กจากเฟรมจะถูกลบออก ip -d link list dev vlan_ifaceตรวจสอบด้วยคำสั่ง


1
กรุณาคุณช่วยอธิบายได้ไหมเมื่อมันถูกลบและเมื่อมันถูกแทรกกลับมา? ฉันหมายถึงเฟรมที่ติดแท็กจะเข้าสู่สะพานลินุกซ์แล้วปล่อยมันจากอินเทอร์เฟซอื่น - เมื่อใด / ที่ไหนที่การจัดการแท็กเหล่านี้เกิดขึ้นและเมื่อใด / ที่tcตัวกรองเรียกว่าอะไร คุณมีลิงค์ไปยังแผนที่หรือแบบนั้น? ขอบคุณ!
Brownian

โปรดคิดอื่น: ซึ่งอินเตอร์เฟซ vlan คุณหมายถึงอะไร บริดจ์นั้นไม่มีอินเตอร์เฟส vlan เดียว (ฉันเขียนว่า "ฉันหมายถึงไม่มีอินเตอร์เฟส VLAN อยู่ที่นั่น" ในย่อหน้าแรก)
Brownian
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.