tc u32 —如何在最近的内核中匹配L2协议?


12

我有一个很好的成型器,带有哈希过滤,是在linux桥上构建的。简而言之,对于br0连接接口externalinternal物理接口,VLAN标记的数据包是“透明”桥接的(我的意思是,那里没有VLAN接口)。

现在,不同的内核执行不同的操作。我可能对确切的内核版本范围有误,请原谅。谢谢。

2.6.26

因此,在debian中,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

同样,在debian(我还没有构建香草内核)中,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

在这里,“内核”与协议匹配,但是从该协议头的开头算起偏移量---我必须向偏移量添加4个字节(dst地址为20,而不是16)。没关系,对我来说似乎更合乎逻辑。

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 0at -2at -4at -6或类似的。我的命中计数为零的主要问题---根本没有检查此过滤器,即“协议错误”。

请任何人帮助我:-)

谢谢!

Answers:


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内核3.2.0中对我有用。我添加了另一个具有完整详细信息的答案。
Nick Craig-Wood

3

我必须做到这一点。我发现@Thusitha建议的答案是针对新内核的正确方法。

使用Debian Wheezy内核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给我香草内核一个错误。我应该检查更多。谢谢。
Brownian

1

我建议使用wireshark捕获在用户空间中可见的接口所经过的内容,并使用其编写过滤器。我想知道接口是否由于某种原因(尽管配置为透明桥接)正在剥离VLAN标记。也许它正在添加额外的标签或什么?


不,绝对不是在剥离VLAN标记-一切正常(流量通过硬件交换机上的中继线进行交换),但整形器中的过滤器除外。但是,我会仔细看。我研究了VLAN标签卸载功能,但是那些驱动程序无法执行vid卸载。
Brownian

tcpdump显示所有接口bridge及其端口上的VLAN ID 。
布朗

现在,我不错的成型器可以在Linux内核3.3.4上运行,除了8021q标签过滤(我可以不用它),其他所有东西都可以正常工作。问题仍然没有解决。还是要谢谢你。
Brownian

1

您可以用ebtables标记vlan packtes 。

# 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

@brownian您认为在iproute2中进行完全相同的过滤会提高性能吗?它是相同的内核,相同的代码路径,相同的算法。只要您不会意外地执行诸如打开连接跟踪之类的操作,就不会感到有所不同。*表影响性能,因为它可以处理很多复杂的事情。但这并不意味着
tylerl

@tylerl由于我实际上必须使用iproute2 进行过滤(同一VLAN中有数百个客户,因此产生大量的过滤器哈希)- 我相信每个数据包的其他检查都影响性能。
Brownian

0

尝试关闭reorder_hdrVLAN接口上的选项。如果启用了“重新排序标题”选项,则将删除框架中的标签。通过命令检查ip -d link list dev vlan_iface


1
请问一下,何时将其删除以及何时将其重新插入?我的意思是,一个标记的帧进入linux桥,然后从另一个接口离开它-这些标记操作何时/何地发生,何时/何处tc调用过滤器?您是否有指向地图的链接?谢谢!
布朗

请换个思路:您是指哪个 VLAN接口?该网桥没有一个vlan接口(我在第一段中写道:“我的意思是,那里没有VLAN接口”)。
布朗
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.