我正在研究最近Linux-TC的QOS工具,今天我在Linux上遇到了两个来自带宽限制脚本的陈述:
tc filter add dev eth0 parent 1: prio 1 protocol ip u32 \ match ip tos 0x68 0xff match ip protocol 0x11 0xff flowid 1:1 tc filter add dev eth0 parent 1: prio 1 protocol ip u32 \ match ip tos 0xb8 0xff match ip protocol 0x11 0xff flowid 1:1
这是什么意思,说“匹配ip tos 0x68 0xff匹配ip协议0x11 0xff”?
使用通用的u32select器,你可以定义一个模式来匹配IP数据包头和一个掩码,以便只在特定的偏移量处匹配特定的位。
u32 match ip PATTERN MASK at OFFSET
多个匹配在逻辑上“结合”,所以如果所有匹配成功,filter将成功。 让我们尝试“解码”你的filter和select器:
ip tos 0x68 0xff 这可以被看作是检查IP报头的TOS字段是否具有值0x68(掩码是0xff,因此0x68和0xff = 0x68)。 我会说这与DSCP有关( 更多关于值0x68 )。
ip protocol 0x11 0xff 这将检查协议字段的值是0x11,它是UDP协议。 您可以在/etc/protocolsfind协议号码(对于UDP,17 = 0x11)
ip tos和ip protocol是所谓的特定select器,但是你可以用一般forms重写它们
u8 0x68 0xff at 1 u8 0x11 0xff at 9 select器u8定义要匹配的模式的长度(其他的是u32,u16)。 然后,使用上面的相同的逻辑。 在TOS字段的IP头中匹配字节1的值0x68,在协议字段的字节9处匹配值0x11。
最后,我会再添加一个例子来说明如何将IP数据包与来自特定networking(192.168.123.0/24)的源IP地址进行匹配:
u32 u32 0xc0a87b00 0xffffff00 at 12 由于掩码值(0xc0与0xff = 0xc0,…,0xXX与0x00 = 0x00),所以在字节12处仅匹配字段12的前3个字节(0xc0 = 192,0xa8 = 168,0x7b = 123)。 这可以使用特定的select器来编写
ip src 192.168.123/24 如果你可以使用特定的select器,因为它们更容易理解。 最后。 如果你必须使用通用的偏移量,这张图片可以帮助你select正确的偏移量。
