10.80. VLAN 关键词

10.80.1. vlan.id

Suricata 提供 vlan.id 关键词,可用于在签名中基于虚拟局域网ID(VLAN ID)识别和过滤网络数据包。默认情况下,若数据包包含多层VLAN标签,该关键词会匹配所有层级。但如果指定了特定层级,则仅匹配该层级。

语法:

vlan.id: [op]id[,layer];

可通过精确匹配或 op 运算符比较ID值:

vlan.id:300    # 精确匹配300
vlan.id:<300,0   # 第0层小于300
vlan.id:>=200,1  # 第1层大于等于200

vlan.id 使用 16位无符号整型

有效VLAN ID范围为 0 - 4095

该关键词的 layer 参数支持 allany 值。all 要求所有VLAN层都匹配,any 则任意层匹配即可。

以下示意图展示vlan.id的索引机制:

[以太网头]
[VLAN标签666 (索引0或-2)]
[VLAN标签123 (索引1或-1)]
[IPv4头]
[UDP头]

10.80.1.1. 示例

匹配任意层级VLAN ID等于300的规则:

alert ip any any -> any any (msg:"VLAN ID等于300"; vlan.id:300; sid:1;)

匹配第1层VLAN ID等于300的规则:

alert ip any any -> any any (msg:"第1层VLAN ID等于300"; vlan.id:300,1; sid:1;)

匹配最内层VLAN ID等于400的规则:

alert ip any any -> any any (msg:"最内层VLAN ID等于400"; vlan.id:400,-1; sid:1;)

要求所有VLAN ID都大于100的规则:

alert ip any any -> any any (msg:"所有VLAN ID均大于100"; vlan.id:>100,all; sid:1;)

可通过 prefilter 关键词将vlan.id内容设为快速匹配模式,如下例所示。

alert ip any any -> any any (msg:"第1层VLAN ID等于200"; vlan.id:200,1; prefilter; sid:1;)

10.80.2. vlan.layers

基于VLAN标签层数进行匹配。

语法:

vlan.layers: [op]number;

支持精确匹配或运算符比较:

vlan.layers:3    # 精确匹配3层
vlan.layers:<3   # 少于3层
vlan.layers:>=2  # 大于等于2层

vlan.layers 使用 8位无符号整型

有效取值范围为 03

10.80.2.1. 示例

匹配不含VLAN标签的规则:

alert ip any any -> any any (msg:"数据包不含VLAN标签"; vlan.layers:0; sid:1;)

匹配VLAN标签多于1层的规则:

alert ip any any -> any any (msg:"数据包含多层VLAN标签"; vlan.layers:>1; sid:1;)

可通过 prefilter 关键词将vlan.layers内容设为快速匹配模式,如下例所示。

alert ip any any -> any any (msg:"数据包含双层VLAN标签"; vlan.layers:2; prefilter; sid:1;)