Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

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 值分配给 SRCIPADDRESSESDSTPORTS,如下所示:
  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" 假定其 角色(如本节顶部的"打开段落所示)。