19.12.2. フィルターチェーン

フィルタールールはフィルターチェーンで整理します。各チェーン (ブランチ) 内にエントリーとして複数のパケットフィルタールールを持つツリー構造と考えることができます。
パケットはルートチェーンでフィルター評価を開始し、次に他のチェーンでの評価を継続していき、ルートチェーンに戻ってくるか、途中のチェーンでドロップされるか、または承認されます。
libvirt のネットワークフィルターシステムでは、ユーザーによってトラフィックフィルター機能のアクティブ化が選択された仮想マシンのネットワークインターフェースにはすべてルートチェーンが自動的に作成されます。ユーザーは、ルートチェーン内で直接インスタンス作成されるフィルタールールを記述したり、プロトコル固有のフィルターチェーンを作成しプロトコル固有のルールを効率的に評価したりすることができます。
次のようなチェーンがあります。
  • root
  • mac
  • stp (ツリープロトコル全体)
  • vlan
  • arp と rarp
  • ipv4
  • ipv6
チェーン名にプロトコル名をプレフィックスとして付けるだけで、mac、stp、vlan、arp、rarp、ipv4、ipv6 などそれぞれのプロトコルを評価するチェーンを複数作成することができます。

例19.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」チェーン内に置くことで、ARP プロトコル以外のパケットを ARP プロトコル固有のルールで評価する必要がなくなります。このためトラフィックフィルタリングの効率性が向上することになります。ただし、プロトコル用のフィルタールールは必ずそのプロトコル用のチェーンに置くよう注意してください。他のルールは評価されなくなります。たとえば、IPv4 プロトコルのパケットは ARP チェーンを通らないため、ARP チェーン内の IPv4 ルールは評価されません。