17.14.4. 在过滤器中使用变量
网络流量过滤子系统保留了两个变量:MAC 和 IP.
MAC
指定为网络接口的 MAC 地址。引用此变量的过滤规则将自动替换为接口的 MAC 地址。无需明确提供 MAC 参数,即可执行此操作。尽管可以指定与上述 IP 参数类似的 MAC 参数,但最好不要这样做,因为 libvirt 知道要使用的接口 MAC 地址。
参数
IP
表示虚拟机内操作系统应该在给定接口上使用的 IP 地址。IP 参数在目前是特殊的,因为 libvirt 守护进程将尝试确定在接口上使用的 IP 地址(以及 IP 参数的值),如果未明确提供但引用该参数。对于 IP 地址检测的当前限制,请参阅有关如何使用此功能的限制 第 17.14.12 节 “限制” 以及使用功能的内容。第 17.14.2 节 “过滤链” 中显示的 XML 文件包含过滤器 no-arp-spoofing
,这是使用网络过滤器 XML 引用 MAC 和 IP 变量的示例。
请注意,引用的变量始终以字符
$
前缀。变量的值的格式必须是 XML 中标识的 filter 属性预期的类型。在上例中,IP
参数必须采用标准格式保存法律 IP 地址。如果未提供正确的结构,则会导致过滤器变量没有被一个值替换,并阻止虚拟机启动,或者在使用热插拔时阻止接口附加。每个 XML 属性预期的一些类型显示在示例 例 17.4 “变量类型示例” 中。
例 17.4. 变量类型示例
由于变量可以包含元素列表,变量 IP 可以包含多个在特定接口上有效的 IP 地址,例如:为 IP 变量提供多个元素的表示法:
<devices> <interface type='bridge'> <mac address='00:16:3e:5d:c7:9e'/> <filterref filter='clean-traffic'> <parameter name='IP' value='10.0.0.1'/> <parameter name='IP' value='10.0.0.2'/> <parameter name='IP' value='10.0.0.3'/> </filterref> </interface> </devices>
这个 XML 文件创建过滤器,为每个接口启用多个 IP 地址。每个 IP 地址将导致单独的过滤规则。因此,使用以上 XML 和以下规则,将创建三个单独的过滤规则(每个 IP 地址一个):
<rule action='accept' direction='in' priority='500'> <tcp srpipaddr='$IP'/> </rule>
由于可以访问含有元素列表的变量的各个元素,过滤规则(如下所示)访问 DSTPORTS 变量的第二代元素。
<rule action='accept' direction='in' priority='500'> <udp dstportstart='$DSTPORTS[1]'/> </rule>
例 17.5. 使用各种变量
因为可以使用标记 $VARIABLE[@<iterator id="x">] 创建过滤规则,它们代表来自不同列表中的所有允许规则。以下规则允许虚拟机在 DSTPORTS 中指定的一组端口上接收流量,来自于 SRCIPADDRESSES 中指定的源 IP 地址集合。该规则使用两个独立它器访问其元素,生成变量 DSTPORTS 与 SRCIPADDRESSES 的所有元素组合。
<rule action='accept' direction='in' priority='500'> <ip srcipaddr='$SRCIPADDRESSES[@1]' dstportstart='$DSTPORTS[@2]'/> </rule>
将具体值分配给 SRCIPADDRESSES 和 DSTPORTS,如下所示:
SRCIPADDRESSES = [ 10.0.0.1, 11.1.2.3 ] DSTPORTS = [ 80, 8080 ]
使用 $SRCIPADDRESSES[@1] 和 $DSTPORTS[@2] 为变量分配值会导致创建所有变体的地址和端口,如下所示:
- 10.0.0.1, 80
- 10.0.0.1, 8080
- 11.1.2.3, 80
- 11.1.2.3, 8080
使用单一迭代器访问同一变量,例如使用标记 $SRCIPADDRESSES[@1] 和 $DSTPORTS[@1],这会导致对这两个列表进行并行访问,并导致以下组合使用:
- 10.0.0.1, 80
- 11.1.2.3, 8080
注意
$VARIABLE 是 $VARIABLE[@0] 的缩写。前面的表示法始终假设使用 iterator id="0" 的角色,如本节顶部的"打开段落"中所述。