tc u32 - làm thế nào để khớp các giao thức L2 trong các nhân gần đây?


12

Tôi có một máy ép đẹp, với bộ lọc băm, được xây dựng tại một cây cầu linux. Nói tóm lại, các br0kết nối externalinternalgiao diện vật lý, các gói được gắn thẻ Vlan được bắc cầu "trong suốt" (ý tôi là, không có giao diện Vlan nào ở đó).

Bây giờ, các hạt nhân khác nhau làm điều đó khác nhau. Tôi có thể sai với phạm vi hạt nhân chính xác, xin vui lòng tha thứ cho tôi. Cảm ơn.

2.6,26

Vì vậy, trong debian, 2.6,26 trở lên (lên tới 2,6,32, tôi tin) --- điều này hoạt động:

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

Ở đây, "kernel" khớp hai byte trong trường "giao thức" với 0x8100, nhưng tính phần đầu của gói ip là "vị trí 0" (xin lỗi cho tiếng Anh của tôi, nếu tôi không rõ ràng một chút).

2.6.32

Một lần nữa, trong debian (Tôi chưa xây dựng nhân vanilla), 2.6.32-5 --- điều này hoạt động:

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

Ở đây, "kernel" khớp với cùng một giao thức, nhưng tính bù từ đầu tiêu đề của giao thức này --- Tôi phải thêm 4 byte để bù (20, không phải 16 cho địa chỉ dst). Nó ổn, có vẻ hợp lý hơn, đối với tôi.

3.2.11, ổn định mới nhất hiện nay

Điều này hoạt động --- như thể không có thẻ 802.1q nào cả:

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

Vấn đề là cho đến nay tôi không thể tìm ra cách nào khớp với thẻ 802.1q.

Phù hợp với thẻ 802.1q trước đây

Tôi có thể làm điều này trước đây như sau:

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

Bây giờ tôi không thể để phù hợp với 802.1q tag với at 0, at -2, at -4, at -6hoặc như thế. Vấn đề chính mà tôi có zero hit đếm --- bộ lọc này không được kiểm tra ở tất cả, "sai giao thức", nói cách khác.

Xin mọi người, hãy giúp tôi :-)

Cảm ơn!

Câu trả lời:


4

Thẻ Vlan bị tước khỏi skb trong các nhân gần đây. Hãy thử một cái gì đó như thế này để thực hiện một trận đấu meta trong skb:

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

Một nỗ lực để thêm bộ lọc gốc protocol allcho tôi RTNETLINK answers: Invalid argument(kernel 3.3.4 ở đây). Tôi sẽ kiểm tra điều này với các hạt nhân mới hơn. Cảm ơn bạn.
Brown

Điều này làm việc cho tôi với kernel wheezy whianzy 3.2.0. Tôi đã thêm một câu trả lời với đầy đủ chi tiết.
Nick Craig-Wood

3

Tôi đã phải làm chính xác điều này. Tôi thấy rằng câu trả lời được đề xuất bởi @Thusitha là cách chính xác để làm điều đó cho hạt nhân mới.

Đã thử nghiệm với kernel wheezy Debian 3.2.0-4 và iproute (từ đó lệnh tc đến từ đâu) phiên bản 20120521-3 + b3

Đây là kịch bản hoàn chỉnh, các tc filterdòng gần như chính xác theo quy định của @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

Lạ thật, protocol allđã cho tôi một lỗi trong hạt nhân vani. Tôi nên kiểm tra nó nhiều hơn. Cảm ơn bạn.
Brown

1

Tôi sẽ khuyên bạn nên sử dụng wireshark để nắm bắt những gì đang diễn ra trên giao diện như hiển thị trong không gian người dùng và sử dụng điều đó để viết bộ lọc. Tôi tự hỏi liệu có lẽ giao diện đang tước các thẻ Vlan vì một số lý do (mặc dù được cấu hình để cầu nối trong suốt). Có lẽ nó đang thêm thẻ hoặc cái gì đó?


Không, đó không phải là tước thẻ Vlan, chắc chắn - mọi thứ đều hoạt động (lưu lượng được chuyển qua các thân trên các công tắc phần cứng), ngoại trừ các bộ lọc trong máy ép. Tôi sẽ nhìn gần hơn, tuy nhiên. Tôi đã xem xét khả năng giảm tải thẻ Vlan, nhưng những trình điều khiển đó không có khả năng thực hiện giảm tải vid.
brownian

tcpdumphiển thị ID vlan ở tất cả các giao diện bridgevà cổng.
Brown

Bây giờ máy tạo mẫu đẹp của tôi hoạt động với kernel linux 3.3.4, mọi thứ đều hoạt động tốt ngoại trừ lọc thẻ 8021q (tôi có thể sống mà không cần nó). Vấn đề vẫn chưa được giải quyết. Dù sao cũng cảm ơn bạn.
Brown

1

Bạn có thể đánh dấu gói vlan với 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

Sau đó, áp dụng định hình dựa trên đánh dấu. ebtables và iptables chia sẻ cùng một dấu hiệu.

Chưa làm điều này bản thân mình. Vì vậy, nó là một linh cảm.


Tôi nghi ngờ nó sẽ hoạt động trơn tru trên liên kết 10Gb ... Tôi muốn tránh bất kỳ bảng * nào. Cảm ơn vì lời đề nghị nào.
Brownian

@brownian bạn nghĩ làm chính xác cùng một bộ lọc trong iproute2 sẽ có hiệu suất cao hơn? Đó là cùng một kernel, cùng một đường dẫn mã, cùng một thuật toán. Miễn là bạn không vô tình làm điều gì đó như bật theo dõi kết nối, bạn sẽ không thấy sự khác biệt. * bảng có thể ảnh hưởng đến hiệu suất vì nó có thể làm nhiều thứ phức tạp. Nhưng điều đó không có nghĩa là nó sẽ .
tylerl

@tylerl Vì tôi thực sự phải lọc bằng iproute2 (hàng trăm khách hàng trong cùng một vlan, một loạt các bộ lọc băm) - bất kỳ kiểm tra bổ sung nào khác cho mỗi gói sẽ ảnh hưởng đến hiệu suất, tôi tin rằng.
Brown

0

Cố gắng tắt reorder_hdrtùy chọn trên giao diện vlan. Nếu tùy chọn sắp xếp lại thứ tự được bật, thì các thẻ từ khung sẽ bị xóa. Kiểm tra nó bằng lệnhip -d link list dev vlan_iface .


1
Xin vui lòng, bạn có thể làm rõ, khi nó được gỡ bỏ, và khi nó được chèn trở lại? Ý tôi là, một khung được gắn thẻ đi vào cầu linux và sau đó rời khỏi giao diện khác - khi nào / nơi các thao tác thẻ này xảy ra và khi nào / nơi tccác bộ lọc được gọi? Bạn có một liên kết đến một bản đồ hoặc như thế? Cảm ơn!
Brown

Xin vui lòng, một ý nghĩ: đó vlan giao diện làm bạn nghĩa là gì? Cây cầu đó không có giao diện vlan (tôi đã viết "Ý tôi là, không có giao diện Vlan nào ở đó" trong đoạn đầu tiên).
Brown
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.