18.12.4. 在过滤器中使用变量
网络流量过滤子系统(MAC 和 IP)保留给使用的两个变量。
MAC
为网络接口的 MAC 地址指定。引用此变量的过滤规则将自动替换为接口的 MAC 地址。这在没有用户必须显式提供 MAC 参数的情况下可以正常工作。虽然可以指定与上述 IP 参数类似的 MAC 参数,但不建议这样做,因为 libvirt 知道将要使用的 MAC 地址。
参数
IP
代表虚拟机内部操作系统的 IP 地址应在给定接口上使用。目前为止,IP 参数是特殊的,因为 libvirt 守护进程将尝试确定在接口中使用的 IP 地址(因此,如果未明确提供该参数但引用)。有关 IP 地址检测的当前限制,请参考有关如何使用这个功能的限制 第 18.12.12 节 “限制” 部分。第 18.12.2 节 “过滤链” 中显示的 XML 文件包含过滤器 no-arp-spoofing
,它是一个使用网络过滤器 XML 来引用 MAC 和 IP 变量的示例。
请注意,引用的变量始终使用字符
$
作为前缀。变量值的格式必须是 XML 中标识的 filter 属性所预期的类型。在上例中,IP
参数必须以标准格式保存法律 IP 地址。如果未提供正确的结构,则过滤器变量将不会替换为值,并且阻止虚拟机启动或防止在使用热插拔时连接接口。各个 XML 属性预期的一些类型显示在 例 18.4 “变量类型示例” 示例中。
例 18.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>
例 18.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>
将 concrete 值分配给 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] 的速记。前者表示法总是使用迭代器 id="0" 假定其 角色(如本节顶部的"打开段落所示)。