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 地址集合。该规则使用两个独立它器访问其元素,生成变量 DSTPORTSSRCIPADDRESSES 的所有元素组合。
  <rule action='accept' direction='in' priority='500'>
    <ip srcipaddr='$SRCIPADDRESSES[@1]' dstportstart='$DSTPORTS[@2]'/>
  </rule>
将具体值分配给 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] 的缩写。前面的表示法始终假设使用 iterator id="0" 的角色,如本节顶部的"打开段落"中所述。
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.