17.14.2. 过滤链
过滤规则在过滤链中进行组织。这些链可以看作具有树结构,并将规则过滤为单个链(branches)中的条目。
数据包在根链中启动过滤评估,然后在其它链中继续评估,从这些链返回回根链,或者由其中一个遍历链的过滤规则丢弃或接受。
libvirt 的网络过滤系统会自动为每个虚拟机的网络接口创建独立 root 链,用户选择激活流量过滤。用户可以编写过滤规则,这些规则直接以根链中实例化,或者创建特定于协议的过滤链,以便有效地评估协议特定规则。
存在以下链:
- root
- mac
- STP(跨树协议)
- VLAN
- ARP 和 rarp
- ipv4
- ipv6
评估 mac、stp、vlan、arp、rarp、ipv4 或 ipv6 协议的多个链只能使用链名称中的协议名称创建为前缀。
例 17.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>
在 arp 链中将 ARP 特定规则放在一个rp 链中,而不是根链中的特定规则,即 ARP 以外的数据包协议不需要由 ARP 协议的特定规则评估。这提高了流量过滤的效率。但是,必须注意,必须只注意给定协议的过滤规则到链中,因为不会评估其他规则。例如,没有在 ARP 链中评估 IPv4 规则,因为 IPv4 协议数据包不会遍历 ARP 链。