18.12.2. 过滤链
过滤规则以过滤链的形式组织。这些链可以看作树结构,并将数据包过滤规则作为单个链中的条目(branches)。
数据包在根链中启动其过滤器评估,然后在其他链中继续评估,从这些链返回,或被其中一个遍历链的过滤规则中丢弃或接受。
libvirt 的网络过滤系统会自动为每个虚拟机的网络接口创建单独的 root 链,供用户选择来激活流量过滤。用户可以编写在根链中直接实例化的过滤规则,也可以创建特定于协议的过滤链,以有效地评估特定于协议的规则。
存在以下链:
- root
- mac
- STP(跨度树协议)
- vlan
- ARP 和 rarp
- ipv4
- ipv6
可以使用协议名称创建评估 mac、stp、vlan、rp、ipv4 或 ipv6 协议的多个链。
例 18.3. ARP 流量过滤
此示例允许指定名称 arp-xyz 或 arp-test 链,并在这些链中评估其 ARP 协议数据包。
以下过滤器 XML 显示了在 arp 链中过滤 ARP 流量的示例。
<filter name='no-arp-spoofing' chain='arp' priority='-500'> <uuid>f88f1932-debf-4aa1-9fbe-f10d3aa4bc95</uuid> <rule action='drop' direction='out' priority='300'> <mac match='no' srcmacaddr='$MAC'/> </rule> <rule action='drop' direction='out' priority='350'> <arp match='no' arpsrcmacaddr='$MAC'/> </rule> <rule action='drop' direction='out' priority='400'> <arp match='no' arpsrcipaddr='$IP'/> </rule> <rule action='drop' direction='in' priority='450'> <arp opcode='Reply'/> <arp match='no' arpdstmacaddr='$MAC'/> </rule> <rule action='drop' direction='in' priority='500'> <arp match='no' arpdstipaddr='$IP'/> </rule> <rule action='accept' direction='inout' priority='600'> <arp opcode='Request'/> </rule> <rule action='accept' direction='inout' priority='650'> <arp opcode='Reply'/> </rule> <rule action='drop' direction='inout' priority='1000'/> </filter>
在rp 链中放置特定于 ARP 的规则(而非在根链中),即 ARP 以外的数据包协议不需要由 ARP 协议特定的规则进行评估。这提高了流量过滤的效率。但是,必须注意,只有给定协议的过滤规则放入链中,因为不会评估其他规则。例如,IPv4 规则不会在 ARP 链中评估,因为 IPv4 协议数据包不会遍历 ARP 链。