Red Hat Training

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

17.14. ネットワークフィルタリングの適用

このセクションでは libvirt のネットワークフィルター、フィルターの目的、その概要と XML 形式などについて紹介します。

17.14.1. はじめに

ネットワークフィルタリングの目的は、仮想化システムの管理者が仮想マシンでネットワークトラフィックのフィルタリングルールを設定し、強制的に強制的に、仮想マシンが送受信できるネットワークトラフィックのパラメーターを管理することです。ネットワークトラフィックのフィルタリングルールは、仮想マシンの起動時にホストの物理マシンに適用されます。フィルタリングルールは仮想マシン内から発生しないため、仮想マシンユーザーの表示地点から必須になります。
ゲスト仮想マシンの観点からは、ネットワークフィルタリングのシステムでは、各仮想マシンのネットワークトラフィックのフィルタリングルールがインターフェースごとに個別に設定することができます。これらのルールは、仮想マシンの起動時にホストの物理マシンに適用され、仮想マシンの実行中に変更できます。ネットワークフィルターの XML 記述を変更することで、後者を実現できます。
複数の仮想マシンでは、同じ汎用ネットワークフィルターを使用できます。このようなフィルターが変更されると、このフィルターを参照する実行中すべての仮想マシンのルールをフィルターするネットワークトラフィックのルールが更新されます。実行されていないマシンは起動時に更新されます。
前述のように、ネットワークトラフィックのフィルタリングルールの適用は、特定のタイプのネットワーク設定用に設定された個別のネットワークインターフェースで実行できます。サポートされるネットワーク種別には以下が含まれます。
  • ネットワーク
  • Ethernet -- ブリッジモードで使用する必要があります
  • ブリッジ

例17.1 ネットワークフィルタリングの例

インターフェース XML は最上位のフィルターを参照するために使用されます。以下の例では、インターフェースの説明は filter clean-traffic を参照します。
   <devices>
    <interface type='bridge'>
      <mac address='00:16:3e:5d:c7:9e'/>
      <filterref filter='clean-traffic'/>
    </interface>
  </devices>
ネットワークフィルターは XML で書かれ、他のフィルターへの参照、トラフィックフィルタリングのルール、またはその両方の組み合わせを保持します。上記の参照された filter clean-traffic は、他のフィルターへの参照のみが含まれ、実際のフィルタリングルールがないフィルターです。他のフィルターへの参照を使用できるため、フィルターのツリーを構築できます。clean-traffic フィルターは、# virsh nwfilter-dumpxml clean-traffic を使用して表示できます。
前述のように、単一のネットワークフィルターを複数の仮想マシンで参照できます。インターフェースには、通常、それぞれのトラフィックフィルタリングルールに関連付けられている個々のパラメーターがあるため、フィルターの XML で説明されているルールは、変数を使用して一般化することができます。この場合、変数名はフィルター XML で使用され、フィルターが参照される場所に名前および値が提供されます。

例17.2 説明の拡張

以下の例では、インターフェースの説明がパラメーター 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'/>
      </filterref>
    </interface>
  </devices>
この例では、clean-traffic ネットワークトラフィックフィルターは IP アドレスパラメーター 10.0.0.1 で表され、ルールに従ってこのインターフェースからのすべてのトラフィックが、ソース IP アドレスとして常に 10.0.0.1 を使用していることを指定します。これは、このフィルターの目的の 1 つです。

17.14.2. チェーンのフィルタリング

フィルタリングルールは、フィルターチェーンで整理されています。このチェーンは、パケットフィルタリングルールを個別のチェーン(ブランチ)のエントリーとして、パケットフィルタリングルールを持つツリー構造を使用していると考えることができます。
パケットはルートチェーンでフィルター評価を開始し、他のチェーンにおいて評価を継続できます。このチェーンからルートチェーンに戻り、移動されたチェーンの 1 つのフィルタールールによりドロップまたは許可されます。
Libvirt のネットワークフィルタリングシステムは、ユーザーがトラフィックのフィルタリングをアクティブ化するために選択するすべての仮想マシンのネットワークインターフェースに対して、個別のルートチェーンを自動的に作成します。ユーザーは、ルートチェーンで直接インスタンス化されるフィルタールールを記述するか、プロトコル固有のルールを効率的に評価するためにプロトコル固有のフィルターチェーンが作成される場合があります。
以下のチェーンが存在します。
  • 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 固有のルールを配置する結果は、ARP プロトコル固有のルールで評価する必要がないものです。これにより、トラフィックフィルタリングの効率が向上します。ただし、他のルールは評価されないため、指定のプロトコルのフィルタールールをチェーンにのみ配置するには、細心の注意を払う必要があります。たとえば、IPv4 プロトコルパケットが ARP チェーンを通過しないため、IPv4 ルールは ARP チェーンで評価されません。

17.14.3. チェーンの優先順位のフィルタリング

前述のように、フィルタリングルールを作成すると、すべてのチェーンがルートチェーンに接続されます。これらのチェーンへのアクセス順序は、チェーンの優先度からの影響を受けます。以下の表は、優先順位とデフォルトの優先度を割り当て可能なチェーンを示しています。

表17.1 チェーンのデフォルト優先度の値のフィルタリング

チェーン (プレフィックス) デフォルトの優先度
stp -810
MAC -800
vlan -750
ipv4 -700
ipv6 -600
arp -500
rarp -400
注記
優先度の値が低いチェーンには、値の高いものよりも先にアクセスされます。
表17.1「チェーンのデフォルト優先度の値のフィルタリング」、フィルターノードの priority(XML)属性に [-1000 から 1000] の範囲に値を書き込むことで、カスタムの優先度を割り当てることもできます。「チェーンのフィルタリング」フィルターは、ARP チェーンのデフォルト優先度(例: -500)を表示します。

17.14.4. フィルターでの変数の使用

ネットワークトラフィックのフィルターサブシステムで使用用に確保された変数は、MAC と IP の 2 つです。
MAC ネットワークインターフェースの MAC アドレス用に指定されます。この変数を参照するフィルタリングルールは、自動的にインターフェースの MAC アドレスに置き換えられます。これは、ユーザーが MAC パラメーターを明示的に指定しなくても機能します。上記の IP パラメーターに似た MAC パラメーターを指定することは可能ですが、libvirt はインターフェースが使用する MAC アドレスを認識するため推奨されません。
パラメーター IP は、仮想マシン内のオペレーティングシステムが特定のインターフェースで使用することが予想されている IP アドレスを表します。IP パラメーターは、libvirt デーモンは、パラメーターが明示的に提供されるが参照されていない場合に、インターフェースで使用される IP アドレス(および IP パラメーターの値)を判別するため、特別なものです。IP 「制限」。に記載されている XML ファイルには no-arp-spoofing 「チェーンのフィルタリング」。これは、MAC 変数および IP 変数を参照するためにネットワークフィルター XML を使用する例です。
参照変数には、常に $ 文字が含まれることに注意してください。変数の値の形式は、XML で特定されたフィルター属性が想定されるタイプである必要があります。上記の例では、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 と以下のルールを使用すると、3 つの個別のフィルタールール(各 IP アドレスに 1 つずつ)が作成されます。
  <rule action='accept' direction='in' priority='500'>
    <tcp srpipaddr='$IP'/>
  </rule>
要素の一覧を保持する変数の個別の要素にアクセスできるため、以下のようなフィルタールールは、変数 DSTPORTS の 2 番目の要素にアクセスします。
  <rule action='accept' direction='in' priority='500'>
    <udp dstportstart='$DSTPORTS[1]'/>
  </rule>

例17.5 各種変数の使用

ここで、$VARIABLE[@<iterator id="x">] 表記を使用して、異なるリストから許容されるルールをすべて表現するフィルタールールを作成できます。以下のルールにより、仮想マシンは SRCIPADDRESSES で指定されるソース IP アドレスのセットから、DSTPORTS で指定されるポートのセット上のトラフィックを受信できます。ルールは、要素にアクセスするために 2 つの独立したイテレーターを使用して SRCIPADDRESSES のこれらを持つ変数 DSTPORTS のすべての要素の組み合わせを生成します。
  <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] の短縮形です。前書きの表記は、このセクションの最上部で示すように、イテレーター id="0" の役割を常に前提としています。

17.14.5. 自動 IP アドレスの検出および DHCP スヌーピング

本セクションでは、IP アドレスの自動検出および DHCP スヌーピングを説明します。

17.14.5.1. はじめに

仮想マシンのインターフェースで使用される IP アドレスの検出は、変数 IP が参照されても値が割り当てられていない場合、自動的にアクティベートされます。変数 CTRL_IP_LEARNING を使用すると、使用する IP アドレスの学習方法を指定できます。有効な値には、any、dhcp、 または none が含まれます。
value any は、libvirt がパケットを使用して、仮想マシンが使用するアドレスを決定するように指示します。これは、変数 CTRL_IP_LEARNING が設定されていない場合のデフォルト設定です。このメソッドは、インターフェースごとに 1 つの IP アドレスのみを検出します。ゲスト仮想マシンの IP アドレスが検出されると、その IP ネットワークトラフィックがそのアドレスまでロックされます。たとえば、IP アドレスのスプーフィングはフィルターのいずれかによって阻止されます。この場合、仮想マシンのユーザーは、ゲスト仮想マシン内のインターフェースの IP アドレスを変更できなくなります。これは IP アドレスのスプーフィングとみなされます。ゲスト仮想マシンが別のホストの物理マシンに移行されたり、サスペンド操作後に再開される場合、ゲスト仮想マシンによって送信される最初のパケットは、ゲスト仮想マシンが特定のインターフェースで使用できる IP アドレスを再度判別します。
dhcp の値は、libvirt に対し、有効なリースを持つ DHCP サーバー割り当てアドレスのみを有効にするよう指示します。この方法は、インターフェースごとに複数の IP アドレスの検出および使用をサポートします。サスペンド操作後にゲスト仮想マシンが再開されると、有効な IP アドレスのリースがフィルターに適用されます。それ以外の場合、ゲスト仮想マシンは DHCP を使用して新規 IP アドレスを取得することが想定されます。ゲスト仮想マシンが別の物理ホストの物理マシンに移行する場合には、DHCP プロトコルを再実行するためにゲスト仮想マシンが必要です。
CTRL_IP_LEARNING が none に設定されている場合、明示的な値を割り当てなくても IP アドレスの学習と参照を行わないでください。

17.14.5.2. DHCP スヌーピング

CTRL_IP_LEARNING=dhcp (DHCP スヌーピング)は、特に信頼された DHCP サーバーのみが IP アドレスを割り当てる場合に、アンチスヌーピングセキュリティーを提供します。これを有効にするには、変数 DHCPSERVER を有効な DHCP サーバーの IP アドレスに設定し、この変数を使用して受信 DHCP の応答をフィルターするフィルターを指定します。
DHCP スヌーピングが有効で、DHCP リースの期限が切れると、ゲスト仮想マシンは、DHCP サーバーから新しい有効なリースを取得するまで、IP アドレスを使用しなくなります。ゲスト仮想マシンが移行される場合、IP アドレスを使用するために、新規の有効な DHCP リースを取得する必要があります(例: 仮想マシンインターフェースをダウンし、再び起動)。
注記
DHCP の自動検出は、ゲスト仮想マシンのエクスチェンジをインフラストラクチャーの DHCP サーバーを使用して DHCP トラフィックをリッスンします。libvirt でサービス拒否攻撃を回避するために、それらのパケットの評価はレート制限されています。つまり、ゲスト仮想マシンがインターフェース上で過剰な数の DHCP パケットを送信するため、それらのパケットすべてが評価されないため、フィルターは適合しない可能性があります。通常の DHCP クライアントの動作は、1 秒ごとに少ない DHCP パケットを送信することが前提です。さらに、インフラストラクチャー内のすべてのゲスト仮想マシンに適切なフィルターを設定し、DHCP パケットを送信できなくなることが重要になります。したがって、ゲスト仮想マシンは UDP および TCP トラフィックをポート 67 からポート 68 に送信しないようにするか、または DHCPSERVER 変数をすべてのゲスト仮想マシンで使用し、DHCP サーバーメッセージを信頼できる DHCP サーバーから発信できるようにする必要があります。サブネット内のすべてのゲスト仮想マシンで、アンチスプーフィング防止機能を同時に有効にする必要があります。

例17.6 DHCP スヌーピングの IP のアクティブ化

以下の XML は、DHCP スヌーピング方法を使用した IP アドレスの学習のアクティブ化例です。
    <interface type='bridge'>
      <source bridge='virbr0'/>
      <filterref filter='clean-traffic'>
        <parameter name='CTRL_IP_LEARNING' value='dhcp'/>
      </filterref>
    </interface>

17.14.6. 予約変数

表17.2「予約変数」 は、予約済みとみなされ、libvirt で使用される変数を示しています。

表17.2 予約変数

変数名 定義
MAC インターフェースの MAC アドレス
IP インターフェースで使用中の IP アドレス一覧
IPV6 現在のところ実装されていません。インターフェースで使用中の IPV6 アドレスの一覧
DHCPSERVER 信頼できる DHCP サーバーの IP アドレス一覧
DHCPSERVERV6 現在のところ実装されていません。信頼できる DHCP サーバーの IPv6 アドレスの一覧
CTRL_IP_LEARNING IP アドレス検出モードの選択

17.14.7. 要素および属性の概要

すべてのネットワークフィルターに必要なルート要素は、2 つの属性を持つ <filter> という名前です。name 属性は、指定のフィルターの一意の名前を提供します。chain 属性はオプションですが、基礎となるホスト物理マシンの firewall サブシステムにより、特定のフィルターがより効果的に処理できるようにします。現在、システムは以下のチェーンのみをサポートします (root、ipv4、ipv6、arp、および rarp )。

17.14.8. 他のフィルターへの参照

フィルターは他のフィルターへの参照を保持する可能性があります。個々のフィルターはフィルターツリーで複数回参照できますが、フィルター間の参照はループを導入することはできません。

例17.7 クリーンなトラフィックフィルターの例

以下は、他のフィルターを参照する clean-traffic ネットワークフィルターの XML を示しています。
<filter name='clean-traffic'>
  <uuid>6ef53069-ba34-94a0-d33d-17751b9b8cb1</uuid>
  <filterref filter='no-mac-spoofing'/>
  <filterref filter='no-ip-spoofing'/>
  <filterref filter='allow-incoming-ipv4'/>
  <filterref filter='no-arp-spoofing'/>
  <filterref filter='no-other-l2-traffic'/>
  <filterref filter='qemu-announce-self'/>
</filter>
別のフィルターを参照するには、XML ノード <filterref> をフィルターノード内に指定する必要があります。このノードには、参照するフィルターの名前が含まれる属性フィルターが必要です。
新しいネットワークフィルターをいつでも定義でき、libvirt に既知のネットワークフィルターへの参照が含まれている可能性があります。ただし、仮想マシンが起動したり、フィルターを参照するネットワークインターフェースがホットプラグされると、フィルターツリー内のすべてのネットワークフィルターが利用できる状態でなければなりません。そうしないと、仮想マシンは起動せず、ネットワークインターフェースを割り当てることができません。

17.14.9. フィルタールール

以下の XML は、発信 IP パケット内の IP アドレス (変数 IP の値から取得される) が期待したアドレスではない場合に、トラフィックをドロップするルールを実施するネットワークトラフィックフィルターの簡単な例を示しています。これにより仮想マシンからの IP アドレスのなりすましを防ぎます。

例17.8 ネットワークトラフィックのフィルタリングの例

<filter name='no-ip-spoofing' chain='ipv4'>
  <uuid>fce8ae33-e69e-83bf-262e-30786c1f8072</uuid>
  <rule action='drop' direction='out' priority='500'>
    <ip match='no' srcipaddr='$IP'/>
  </rule>
</filter>
トラフィックのフィルタリングルールは、ルールノードで開始します。このノードには、以下の属性の 3 つまで使用できます。
  • アクションには必須の値を使用できます。
    • drop (ルールに一致すると、さらに分析することなくパケットを破棄し、メッセージは出力されません)
    • reject (ルールに一致すると、さらに分析することなく ICMP 拒否メッセージを生成します)
    • accept (ルールに一致すると、さらに分析することなくパケットを受け取ります)
    • return (ルールに一致すると、このフィルターを通過しますがさらに分析するため呼び出しフィルターに制御を戻します)
    • continue (ルールに一致すると、さらに分析するため次のルールに移動します)
  • direction を mandatory にすると、次の値を取ることができます。
    • in - 着信トラフィック
    • out - 発信トラフィック
    • 送受信トラフィックの InOut
  • 優先度はオプションです。ルールの優先度は、他のルールに対してルールがインスタンス化される順序を制御します。値が小さいルールは、値が高いルールよりも先にインスタンス化されます。有効な値は -1000 から 1000 の範囲にあります。この属性が指定されていない場合、デフォルトで優先順位 500 が割り当てられます。ルートチェーンのルールのフィルタリングは、優先順位に従ってルートチェーンに接続するフィルターでソートされることに注意してください。これにより、フィルターチェーンへのアクセスのあるフィルタールールをインターリーブにできます。「チェーンの優先順位のフィルタリング」
  • statematch はオプションです。使用できる値は '0' または 'false' で、基礎となる接続状態をオフに切り替えます。デフォルト設定は「true」または 1 です。
上記の例では、ip タイプのトラフィックがチェーン ipv4 に関連付けられ、ルールに priority=500 例17.7「クリーンなトラフィックフィルターの例」。たとえば、ip タイプのトラフィックがチェーン ipv4 に関連付けられている場合、そのフィルターのルールは、表示されるルールの priority=500 に対して順序付けられます。
ルールには、トラフィックのフィルタリングに単一のルールを含めることができます。上記の例では、ip タイプのトラフィックがフィルターされていることを示しています。

17.14.10. サポート対象プロトコル

以下のセクションでは、ネットワークフィルタリングサブシステムがサポートするプロトコルの一覧と、そのプロトコルの詳細を示します。このタイプのトラフィックルールは、ネストされたノードとしてルールノードで指定されます。トラフィックタイプに応じてルールがフィルタリングしているので、属性は異なります。上記の例は、IP トラフィックフィルタリングノードで有効な単一の属性 srcipaddr を示しています。以下のセクションでは、有効な属性と、予想されるデータの種類を説明します。以下のデータタイプを使用できます。
  • UINT8 : 8 ビット整数; 0 -255 の範囲
  • UINT16: 16 ビットの整数; 0-65535 の範囲
  • MAC_ADDR: ドット付き 10 進数形式の MAC アドレス (00:11:22:33:44:55 など)
  • MAC_MASK: MAC アドレス形式による MAC アドレスマスク (FF:FF:FF:FC:00:00 など)
  • IP_ADDR: ドット付き 10 進数形式の IP アドレス (10.1.2.3 など)
  • IP_MASK: ドット付き 10 進数形式 (255.255.248.0) または CIDR マスク (0-32) による IP アドレスマスク
  • IPV6_ADDR: 数値形式の IPv6 アドレス (FFFF::1)
  • IPV6_MASK: 数値形式 (FFFF:FFFF:FC00::) または CIDR マスク (0-128) による IPv6 マスク
  • STRING: 文字列
  • BOOLEAN: 'true'、'yes'、'1'、または 'false'、'no'、'0'
  • ipSETFLAGS: 最大 6 の 'src' または 'dst' 要素によって記述される ipset の送信元および宛先フラグは、パケットヘッダーのソースまたは宛先部分から機能を選択します(例: src,src,dst)。ここで提供する「selectors」数は、参照される ipset の種類によって異なります。
IP_MASK または IPV6_MASK 以外の属性以外の属性はすべて、値 no の match 属性を使用して無視できます。否定された属性は複数のグループ化が可能です。以下の XML フラグメントは、抽象属性を使用したこのような例を示しています。
[...]
  <rule action='drop' direction='in'>
    <protocol match='no' attribute1='value1' attribute2='value2'/>
    <protocol attribute3='value3'/>
  </rule>
[...]
ルールの動作や、指定のプロトコル属性の境界内において、ルールの評価を論理的に確認します。そのため、1 つの属性の値がルールで指定した値と一致しない場合には、評価プロセス中にルール全体がスキップされます。したがって、上記の例では、着信トラフィックはドロップされます。プロトコルプロパティー attribute1value1 とプロトコルプロパティー attribute2 の両方が一致しず、プロトコルプロパティー attribute3value3 に一致しません。value2

17.14.10.1. MAC(Ethernet)

プロトコル ID: mac
このタイプのルールはルートチェーンに入ります。

表17.3 MAC プロトコルタイプ

属性名 データタイプ 定義
srcmacaddr MAC_ADDR 送信側の MAC アドレス
srcmacmask MAC_MASK 送信側の MAC アドレスに適用されるマスク
dstmacaddr MAC_ADDR 宛先の MAC アドレス
dstmacmask MAC_MASK 宛先の MAC アドレスに適用されるマスク
protocolid UINT16(0x600-0xffff)、STRING レイヤー 3 プロトコル ID。有効な文字列には [arp、rarp、ipv4、ipv6] が含まれます。
コメント STRING 最長 256 文字のテキスト文字列
フィルターは以下のように記述できます。
[...]
<mac match='no' srcmacaddr='$MAC'/>
[...]

17.14.10.2. VLAN (802.1Q)

プロトコル ID: vlan
このタイプのルールはルートチェーンまたは vlan チェーンのいずれかに入ります。

表17.4 VLAN プロトコルタイプ

属性名 データタイプ 定義
srcmacaddr MAC_ADDR 送信側の MAC アドレス
srcmacmask MAC_MASK 送信側の MAC アドレスに適用されるマスク
dstmacaddr MAC_ADDR 宛先の MAC アドレス
dstmacmask MAC_MASK 宛先の MAC アドレスに適用されるマスク
vlan-id UINT16 (0x0-0xfff, 0 - 4095) VLAN ID
encap-protocol UINT16 (0x03c-0xfff), String encapsulated レイヤー 3 プロトコル ID、有効な文字列は arp、ipv4、ipv6 です。
コメント STRING 256 文字までのテキスト文字列

17.14.10.3. STP(ツリープロトコルパニング)

プロトコル ID: stp
このタイプのルールはルートチェーンまたは stp チェーンのいずれかに入ります。

表17.5 STP プロトコルタイプ

属性名 データタイプ 定義
srcmacaddr MAC_ADDR 送信側の MAC アドレス
srcmacmask MAC_MASK 送信者の MAC アドレスに適用されるマスク。
type UINT8 BPDU (Bridge Protocol Data Unit) タイプ
フラグ UINT8 BPDU flagdstmacmask
root-priority UINT16 ルート優先度範囲の始点
root-priority-hi UINT16 (0x0-0xfff, 0 - 4095) root 優先度の範囲終了
root-address MAC _ADDRESS ルートの MAC アドレス
root-address-mask MAC _MASK ルートの MAC アドレスマスク
roor-cost UINT32 ルートのパスコスト (範囲の始点)
root-cost-hi UINT32 ルートパスコストの範囲の終了
sender-priority-hi UINT16 送信側優先度の範囲終了
sender-address MAC_ADDRESS BPDU 送信側 MAC アドレス
sender-address-mask MAC_MASK BPDU 送信者の MAC アドレスマスク
port UINT16 ポート識別子(範囲起動)
port_hi UINT16 ポート識別子の範囲の終了
msg-age UINT16 メッセージ年齢タイマー(範囲開始)
msg-age-hi UINT16 メッセージ年齢タイマー範囲の終了
max-age-hi UINT16 最大エイジタイム範囲の終了
hello-time UINT16 Hello タイムタイマー(範囲開始)
hello-time-hi UINT16 Hello タイムタイマーの範囲の終了
forward-delay UINT16 フォワード遅延(範囲の開始)
forward-delay-hi UINT16 フォワード遅延範囲の終了
コメント STRING 256 文字までのテキスト文字列

17.14.10.4. ARP/RARP

プロトコル ID: arp または rarp
このタイプのルールはルートチェーンまたは arp/rarp チェーンのいずれかに入ります。

表17.6 ARP プロトコルおよび RARP プロトコルタイプ

属性名 データタイプ 定義
srcmacaddr MAC_ADDR 送信側の MAC アドレス
srcmacmask MAC_MASK 送信側の MAC アドレスに適用されるマスク
dstmacaddr MAC_ADDR 宛先の MAC アドレス
dstmacmask MAC_MASK 宛先の MAC アドレスに適用されるマスク
hwtype UINT16 ハードウェア種別
protocoltype UINT16 プロトコルタイプ
opcode UINT16, STRING Opcode の有効な文字列: Request、Reply、Request_Reverse、Reply_Reverse、DRARP_Request、DRARP_Reply、DRARP_Error、InARP_Request、ARP_NAK
arpsrcmacaddr MAC_ADDR ARP/RARP パケットのソース MAC アドレス
arpdstmacaddr MAC _ADDR ARP/RARP パケット内の宛先 MAC アドレス
arpsrcipaddr IP_ADDR ARP/RARP パケット内のソース IP アドレス
arpdstipaddr IP_ADDR ARP/RARP パケットの宛先 IP アドレス
gratuitous BOOLEAN 余計な ARP パケットを確認するかどうかを指定するブール値
コメント STRING 256 文字までのテキスト文字列

17.14.10.5. IPv4

プロトコル ID: ip
このタイプのルールはルートチェーンまたは ipv4 チェーンのいずれかに入ります。

表17.7 IPv4 プロトコルタイプ

属性名 データタイプ 定義
srcmacaddr MAC_ADDR 送信側の MAC アドレス
srcmacmask MAC_MASK 送信側の MAC アドレスに適用されるマスク
dstmacaddr MAC_ADDR 宛先の MAC アドレス
dstmacmask MAC_MASK 宛先の MAC アドレスに適用されるマスク
srcipaddr IP_ADDR ソース IP アドレス
srcipmask IP_MASK ソース IP アドレスに適用されるマスク
dstipaddr IP_ADDR 宛先 IP アドレス
dstipmask IP_MASK 宛先 IP アドレスに適用されるマスク
protocol UINT8、文字列 レイヤー 4 プロトコル識別子。プロトコルの有効な文字列は、tcp、udplite、esp、ah、icmp、igmp、sctp
srcportstart UINT16 有効なソースポートのうちの範囲が始まります。プロトコルが必要です。
srcportend UINT16 有効なソースポートの終了日。プロトコルが必要
dstportstart UNIT16 有効な宛先ポート範囲の開始点。プロトコルが必要。
dstportend UNIT16 有効な宛先ポートの範囲の最後。プロトコルが必要です。
コメント STRING 256 文字までのテキスト文字列

17.14.10.6. IPv6

プロトコル ID: ipv6
このタイプのルールはルートチェーンまたは ipv6 チェーンのいずれかに入ります。

表17.8 IPv6 プロトコルタイプ

属性名 データタイプ 定義
srcmacaddr MAC_ADDR 送信側の MAC アドレス
srcmacmask MAC_MASK 送信側の MAC アドレスに適用されるマスク
dstmacaddr MAC_ADDR 宛先の MAC アドレス
dstmacmask MAC_MASK 宛先の MAC アドレスに適用されるマスク
srcipaddr IP_ADDR ソース IP アドレス
srcipmask IP_MASK ソース IP アドレスに適用されるマスク
dstipaddr IP_ADDR 宛先 IP アドレス
dstipmask IP_MASK 宛先 IP アドレスに適用されるマスク
protocol UINT8、文字列 レイヤー 4 プロトコル識別子。プロトコルの有効な文字列は、tcp、udplite、esp、ah、icmpv6、sctp
scrportstart UNIT16 有効なソースポートのうちの範囲が始まります。プロトコルが必要です。
srcportend UINT16 有効なソースポートの終了日。プロトコルが必要
dstportstart UNIT16 有効な宛先ポート範囲の開始点。プロトコルが必要。
dstportend UNIT16 有効な宛先ポートの範囲の最後。プロトコルが必要です。
コメント STRING 256 文字までのテキスト文字列

17.14.10.7. TCP/UDP/SCTP

プロトコル ID: tcp、udp、sctp
このタイプのトラフィックについてはチェーンパラメーターは無視されるため、省略するかまたはルートに設定します。

表17.9 TCP/UDP/SCTP プロトコルタイプ

属性名 データタイプ 定義
srcmacaddr MAC_ADDR 送信者の MAC アドレス
srcipaddr IP_ADDR ソース IP アドレス
srcipmask IP_MASK ソース IP アドレスに適用されるマスク
dstipaddr IP_ADDR 宛先 IP アドレス
dstipmask IP_MASK 宛先 IP アドレスに適用されるマスク
scripto IP_ADDR ソース IP アドレスの範囲の開始
srcipfrom IP_ADDR ソース IP アドレスの範囲の終了
dstipfrom IP_ADDR 宛先 IP アドレスの範囲の開始点
dstipto IP_ADDR 宛先 IP アドレスの範囲の終了
scrportstart UNIT16 有効なソースポートのうちの範囲が始まります。プロトコルが必要です。
srcportend UINT16 有効なソースポートの終了日。プロトコルが必要
dstportstart UNIT16 有効な宛先ポート範囲の開始点。プロトコルが必要。
dstportend UNIT16 有効な宛先ポートの範囲の最後。プロトコルが必要です。
コメント STRING 256 文字までのテキスト文字列
状態 文字列 NEW、ESTABLISHED、RELATED、INVALID または NONE のコンマ区切りリスト
フラグ 文字列 tcp-only: マスクとフラグの形式。各マスクは SYN、ACK、URG、PSH、FIN、RST、NONE、または ALL です。
ipset 文字列 libvirt 外で管理される IPSet の名前
ipsetflags IPSETFLAGS IPSet のフラグ。ipset 属性が必要。

17.14.10.8. ICMP

プロトコル ID: icmp
注意: このタイプのトラフィックについてはチェーンパラメーターは無視されるため、省略するかまたはルートに設定します。

表17.10 ICMP プロトコルタイプ

属性名 データタイプ 定義
srcmacaddr MAC_ADDR 送信側の MAC アドレス
srcmacmask MAC_MASK 送信者の MAC アドレスに適用されるマスク
dstmacaddr MAD_ADDR 宛先の MAC アドレス
dstmacmask MAC_MASK 宛先の MAC アドレスに適用されるマスク
srcipaddr IP_ADDR ソース IP アドレス
srcipmask IP_MASK ソース IP アドレスに適用されるマスク
dstipaddr IP_ADDR 宛先 IP アドレス
dstipmask IP_MASK 宛先 IP アドレスに適用されるマスク
srcipfrom IP_ADDR ソース IP アドレスの範囲の開始
scripto IP_ADDR ソース IP アドレスの範囲の終了
dstipfrom IP_ADDR 宛先 IP アドレスの範囲の開始点
dstipto IP_ADDR 宛先 IP アドレスの範囲の終了
type UNIT16 ICMP タイプ
code UNIT16 ICMP コード
コメント STRING 256 文字までのテキスト文字列
状態 文字列 NEW、ESTABLISHED、RELATED、INVALID または NONE のコンマ区切りリスト
ipset 文字列 libvirt 外で管理される IPSet の名前
ipsetflags IPSETFLAGS IPSet のフラグ。ipset 属性が必要です

17.14.10.9. IGMP、ESP、AH、UDPLITE、'ALL'

Protocol ID: igmp、esp、ah、udplite、all
このトラフィックではチェーンのパラメーターは無視され、省略するか、root に設定する必要があります。

表17.11 IGMP、ESP、AH、UDPLITE、'ALL'

属性名 データタイプ 定義
srcmacaddr MAC_ADDR 送信側の MAC アドレス
srcmacmask MAC_MASK 送信者の MAC アドレスに適用されるマスク
dstmacaddr MAD_ADDR 宛先の MAC アドレス
dstmacmask MAC_MASK 宛先の MAC アドレスに適用されるマスク
srcipaddr IP_ADDR ソース IP アドレス
srcipmask IP_MASK ソース IP アドレスに適用されるマスク
dstipaddr IP_ADDR 宛先 IP アドレス
dstipmask IP_MASK 宛先 IP アドレスに適用されるマスク
srcipfrom IP_ADDR ソース IP アドレスの範囲の開始
scripto IP_ADDR ソース IP アドレスの範囲の終了
dstipfrom IP_ADDR 宛先 IP アドレスの範囲の開始点
dstipto IP_ADDR 宛先 IP アドレスの範囲の終了
コメント STRING 256 文字までのテキスト文字列
状態 文字列 NEW、ESTABLISHED、RELATED、INVALID または NONE のコンマ区切りリスト
ipset 文字列 libvirt 外で管理される IPSet の名前
ipsetflags IPSETFLAGS IPSet のフラグ。ipset 属性が必要です

17.14.10.10. TCP/UDP/SCTP over IPV6

Protocol ID: tcp-ipv6, udp-ipv6, sctp-ipv6
このトラフィックではチェーンのパラメーターは無視され、省略するか、root に設定する必要があります。

表17.12 TCP、UDP、IPv6 プロトコルタイプでの SCTP

属性名 データタイプ 定義
srcmacaddr MAC_ADDR 送信者の MAC アドレス
srcipaddr IP_ADDR ソース IP アドレス
srcipmask IP_MASK ソース IP アドレスに適用されるマスク
dstipaddr IP_ADDR 宛先 IP アドレス
dstipmask IP_MASK 宛先 IP アドレスに適用されるマスク
srcipfrom IP_ADDR ソース IP アドレスの範囲の開始
scripto IP_ADDR ソース IP アドレスの範囲の終了
dstipfrom IP_ADDR 宛先 IP アドレスの範囲の開始点
dstipto IP_ADDR 宛先 IP アドレスの範囲の終了
srcportstart UINT16 有効なソースポートの範囲の開始
srcportend UINT16 有効なソースポートの範囲の終了
dstportstart UINT16 有効な宛先ポートの範囲の開始
dstportend UINT16 有効な宛先ポートの範囲の終了
コメント STRING 256 文字までのテキスト文字列
状態 文字列 NEW、ESTABLISHED、RELATED、INVALID または NONE のコンマ区切りリスト
ipset 文字列 libvirt 外で管理される IPSet の名前
ipsetflags IPSETFLAGS IPSet のフラグ。ipset 属性が必要です

17.14.10.11. ICMPv6

Protocol ID: icmpv6
このトラフィックではチェーンのパラメーターは無視され、省略するか、root に設定する必要があります。

表17.13 ICMPv6 プロトコルタイプ

属性名 データタイプ 定義
srcmacaddr MAC_ADDR 送信者の MAC アドレス
srcipaddr IP_ADDR ソース IP アドレス
srcipmask IP_MASK ソース IP アドレスに適用されるマスク
dstipaddr IP_ADDR 宛先 IP アドレス
dstipmask IP_MASK 宛先 IP アドレスに適用されるマスク
srcipfrom IP_ADDR ソース IP アドレスの範囲の開始
scripto IP_ADDR ソース IP アドレスの範囲の終了
dstipfrom IP_ADDR 宛先 IP アドレスの範囲の開始点
dstipto IP_ADDR 宛先 IP アドレスの範囲の終了
type UINT16 ICMPv6 型
code UINT16 ICMPv6 コード
コメント STRING 256 文字までのテキスト文字列
状態 文字列 NEW、ESTABLISHED、RELATED、INVALID または NONE のコンマ区切りリスト
ipset 文字列 libvirt 外で管理される IPSet の名前
ipsetflags IPSETFLAGS IPSet のフラグ。ipset 属性が必要です

17.14.10.12. IPv6 経由の IGMP、ESP、AH、UDPLITE、および 'ALL'

Protocol ID: igmp-ipv6, esp-ipv6, ah-ipv6, udplite-ipv6, all-ipv6
このトラフィックではチェーンのパラメーターは無視され、省略するか、root に設定する必要があります。

表17.14 IPv6 プロトコルタイプにおける IGMP、ESP、AH、UDPLITE、および 'ALL'

属性名 データタイプ 定義
srcmacaddr MAC_ADDR 送信者の MAC アドレス
srcipaddr IP_ADDR ソース IP アドレス
srcipmask IP_MASK ソース IP アドレスに適用されるマスク
dstipaddr IP_ADDR 宛先 IP アドレス
dstipmask IP_MASK 宛先 IP アドレスに適用されるマスク
srcipfrom IP_ADDR ソース IP アドレスの範囲の開始
scripto IP_ADDR ソース IP アドレスの範囲の終了
dstipfrom IP_ADDR 宛先 IP アドレスの範囲の開始点
dstipto IP_ADDR 宛先 IP アドレスの範囲の終了
コメント STRING 256 文字までのテキスト文字列
状態 文字列 NEW、ESTABLISHED、RELATED、INVALID または NONE のコンマ区切りリスト
ipset 文字列 libvirt 外で管理される IPSet の名前
ipsetflags IPSETFLAGS IPSet のフラグ。ipset 属性が必要です

17.14.11. 高度なフィルター設定に関するトピック

次のセクションでは高度なフィルター設定について解説します。

17.14.11.1. 接続の追跡

ネットワークフィルタリングサブシステム(Linux 上)は、IP テーブルの接続追跡のサポートを利用します。これは、ネットワークトラフィックの方向(状態一致)の方向化や、ゲスト仮想マシンへの同時接続の数のカウントと制限に役立ちます。たとえば、ゲスト仮想マシンの TCP ポート 8080 がサーバーとして開いている場合、クライアントはポート 8080 のゲスト仮想マシンに接続できます。方向の接続追跡と実施後に、ゲスト仮想マシンが接続を開始できないように(TCP クライアント)ポート 8080 を、リモートホストの物理マシンに戻します。さらに重要なことは、追跡して、リモート攻撃者がゲスト仮想マシンへの接続を確立することを防ぐのに役立ちます。たとえば、ゲスト仮想マシンのユーザーが攻撃者が 80 のポート 80 への接続を確立した場合、攻撃者は TCP ポート 80 からゲスト仮想マシンまで接続を開始できなくなります。デフォルトでは、コネクションの追跡とトラフィックの方向の実施を有効にする接続の状態が一致します。

例17.9 TCP ポートへの接続をオフにする XML の例

以下は、TCP ポート 12345 への着信接続に対してこの機能をオフにした XML フラグメントの例です。
   [...]
    <rule direction='in' action='accept' statematch='false'>
      <cp dstportstart='12345'/>
    </rule>
   [...]
これにより、TCP ポート 12345 への受信トラフィックが許可されますが、仮想マシン内の TCP ポート 12345 から開始(クライアント)の TCP ポート 12345 も有効にしますが、望ましい場合もあります。

17.14.11.2. 接続数の制限

ゲスト仮想マシンが確立できる接続数を制限するには、特定タイプのトラフィックに対する接続制限を設定するルールを指定する必要があります。たとえば、仮想マシンは、一度に 1 つの IP アドレスだけに ping でき、アクティブな着信 ssh 接続が 1 つだけであることを想定しています。

例17.10 接続に制限を設定する XML サンプルファイル

以下の XML フラグメントを使用して接続を制限することができます。
  [...]
  <rule action='drop' direction='in' priority='400'>
    <tcp connlimit-above='1'/>
  </rule>
  <rule action='accept' direction='in' priority='500'>
    <tcp dstportstart='22'/>
  </rule>
  <rule action='drop' direction='out' priority='400'>
    <icmp connlimit-above='1'/>
  </rule>
  <rule action='accept' direction='out' priority='500'>
    <icmp/>
  </rule>
  <rule action='accept' direction='out' priority='500'>
    <udp dstportstart='53'/>
  </rule>
  <rule action='drop' direction='inout' priority='1000'>
    <all/>
  </rule>
  [...]
注記
制限ルールは、トラフィックを許可するルールの前に XML にリストする必要があります。の XML 例17.10「接続に制限を設定する XML サンプルファイル」、ポート 22 に送信される DNS トラフィックがゲスト仮想マシンを通過できるようにする追加のルールが追加され、ssh セッションは ssh デーモンによる DNS ルックアップの失敗に関連する理由で ssh セッションが確立されないようになりました。このルールを省略すると、接続を試みる際に ssh クライアントが予期せずにハングする可能性があります。トラフィックの追跡に関するタイムアウトの処理に関しては、追加の注意を払う必要があります。ゲスト仮想マシン内でユーザーが終了できる ICMP ping では、ホストの物理マシンの接続追跡システムには長時間タイムアウトがある可能性があるため、別の ICMP ping が通過できません。
最善の解決法として、ホスト物理マシンの sysfs でタイムアウトをチューニングして、次のコマンドを使用します。# echo 3 > /proc/sys/net/netfilter/nf_conntrack_icmp_timeoutこのコマンドは、ICMP 接続追跡のタイムアウトを 3 秒に設定します。これには、1 つの ping が終了し、別の ping が 3 秒後に開始されるという効果があります。
ゲスト仮想マシンが TCP 接続を適切に閉じられていない場合、特にホストの物理マシンの大きい時間に対して TCP タイムアウト値が設定されていた期間が長い期間保持されます。さらに、アイドル状態の接続は、パケットが交換されると再アクティブにできる接続追跡システムのタイムアウトが発生することがあります。
ただし、制限が低すぎると、新たに開始された接続は TCP バックオフに強制する可能性があります。そのため、接続の制限は、新しい TCP 接続での変動が高くなるように設定する必要があり、アイドル接続に関連してトラフィックの動作が突然発生しないようにします。

17.14.11.3. コマンドラインツール

virsh は、ネットワークフィルターのライフサイクルサポートで拡張されました。ネットワークフィルタリングサブシステムに関連するすべてのコマンドは、プレフィックス nwfilter で始まります。以下のコマンドが利用できます。
  • nwfilter-list : すべてのネットワークフィルターの UUID および名前を一覧表示
  • nwfilter-define : 新しいネットワークフィルターを定義するか、または既存のネットワークフィルターを更新します(名前を指定する必要があります)。
  • nwfilter-undefine : 指定のネットワークフィルターを削除します(名前を指定する必要があります)。現在使用中のネットワークフィルターを削除しないでください。
  • nwfilter-dumpxml : 指定したネットワークフィルターを表示します(名前を指定する必要があります)。
  • nwfilter-edit : 指定したネットワークフィルターを編集します(名前を指定する必要があります)

17.14.11.4. 既存のネットワークフィルター

以下は、libvirt を使用して自動的にインストールされるネットワークフィルターの例です。

表17.15 ICMPv6 プロトコルタイプ

プロトコル名 説明
allow-arp ゲスト仮想マシンへの着信および送信アドレス解決プロトコル(ARP)トラフィックをすべて受け入れます。
no-arp-spoofing、no-arp-mac-spoofing、および no-arp-ip-spoofingこれらのフィルターにより、ゲスト仮想マシンが ARP トラフィックのなりすましを防ぐことができます。さらに、ARP リクエストおよび応答メッセージのみを許可し、これらのパケットには以下が含まれます。
  • no-arp-spoofing - ゲストの MAC アドレスと IP アドレス
  • no-arp-mac-spoofing - ゲストの MAC アドレス
  • no-arp-ip-spoofing - ゲストの IP アドレス
low-dhcp ゲスト仮想マシンが(どの DHCP サーバーから)DHCP 経由で IP アドレスを要求できるようにします。
low-dhcp-server ゲスト仮想マシンが指定の DHCP サーバーから IP アドレスを要求できるようにします。このフィルターへの参照で、DHCP サーバーのドット付き 10 進数の IP アドレスを提供する必要があります。変数の名前は DHCPSERVER である必要があります。
low-ipv4 仮想マシンへの着信および送信 IPv4 トラフィックをすべて許可します。
low-incoming-ipv4 仮想マシンへの着信 IPv4 トラフィックのみを受け入れます。このフィルターは、clean-traffic フィルターの一部です。
no-ip-spoofing ゲスト仮想マシンがパケット内の IP アドレスとは異なる送信元の IP パケットを送信しないようにします。このフィルターは、clean-traffic フィルターの一部です。
no-ip-multicast ゲスト仮想マシンが IP マルチキャストパケット送信を防ぎます。
no-mac-broadcast 指定した MAC アドレスへの発信 IPv4 トラフィックを防ぎます。このフィルターは、clean-traffic フィルターの一部です。
no-other-l2-traffic ネットワークで使用される他のフィルターにより指定されたトラフィック以外のレイヤー 2 のネットワークトラフィックをすべて防ぎます。このフィルターは、clean-traffic フィルターの一部です。
no-other-rarp-traffic, qemu-announce-self, qemu-announce-self-rarp これらのフィルターにより、QEMU の自己アナウスアドレス解決プロトコル(RARP)パケットを許可し、その他の RARP トラフィックを防ぎます。これらはすべて clean-traffic フィルターに含まれます。
clean-traffic MAC、IP、および ARP スプーフィングを防ぎます。このフィルターは、他のいくつかのフィルターをビルディングブロックとして参照します。
このフィルターはビルディングブロックのみであり、便利なネットワークトラフィックフィルタリングを提供するために他のフィルターと組み合わせる必要があります。上記の一覧で最も使用されているのは clean-traffic フィルターです。このフィルター自体は、たとえば no-ip-multicast フィルターと組み合わせることで、仮想マシンがパケットのスプーフィングを防止する上で IP マルチキャストトラフィックを送信できなくなります。

17.14.11.5. 独自のフィルターの作成

libvirt はいくつかのネットワークフィルターの例のみを提供するため、独自のネットワークフィルターの作成を検討してください。これを行う計画時には、ネットワークフィルタリングサブシステムと内部での仕組みを理解しておく必要がある場合があります。また、プロトコルを理解して理解しておくことは、合格できるものよりもこれ以上トラフィックがなく、通過するトラフィックにそのプロトコルを認識して理解する必要があります。
ネットワークフィルタリングサブシステムは、現在 Linux ホストの物理マシンでのみ利用でき、QEMU および KVM タイプの仮想マシンでのみ使用できます。Linux では、ebtables、iptables および ip6tables のサポートを構築し、それらの機能を利用します。「サポート対象プロトコル」、ebtables を使用して実装できます。
  • MAC
  • stp(ツリープロトコルのスパン)
  • VLAN(802.1Q)
  • ARP、rarp
  • ipv4
  • ipv6
IPv4 で実行されるプロトコルは iptables を使用してサポートされます。これは、IPv6 上のこれらのプロトコルは ip6tables を使用して実装されます。
Linux ホストの物理マシンを使用すると、libvirt のネットワークフィルタリングサブシステムが作成したトラフィックフィルタリングルールはすべて最初に ebtables により実装されたフィルタリングサポートを通過し、iptables フィルターまたは ip6tables フィルターを使用したフィルターサポートのみを渡します。フィルターツリーに、mac、stp、vlan arp、rarp、ipv4、ipv6 などのプロトコルを持つルールがある場合は、ebtable ルールと値が自動的に使用されます。
同じプロトコルに複数のチェーンを作成できます。チェーンの名前には、以前に列挙されたプロトコルの 1 つの接頭辞が必要です。ARP トラフィックを処理する追加のチェーンを作成するには、arp-test という名前のチェーンを指定できます。
たとえば、ip プロトコルフィルターを使用して、送信元および宛先のポートを使用して UDP トラフィックで UDP トラフィックをフィルターし、プロトコル、送信元、宛先 IP アドレス、および UDP パケットのポートを指定できます。これにより、ebtables を使用した UDP トラフィックの初期フィルタリングが可能になります。ただし、UDP パケットなどの IP または IPv6 パケットが ebtables レイヤーに渡され、iptables または ip6tables ルールをインスタンス化するフィルターツリーに少なくとも 1 つのルールがある場合、UDP パケットにこのフィルター層を提供するルールも指定する必要があります。これは、適切な udp または udp-ipv6 のトラフィックのフィルタリングノードを含むルールで実行できます。

例17.11 カスタムフィルターの作成

以下の要件を満たすフィルターが必要であると仮定します。
  • 仮想マシンのインターフェースでの MAC、 IP、 ARP のなりすましを防ぐ
  • 仮想マシンのインターフェースの TCP ポート 22 と 80 のみを開く
  • 仮想マシンによるインターフェースからの ping トラフィック送信を許可する。ただしインターフェース上での仮想マシンに対する ping には応答させない
  • 仮想マシンが DNS ルックアップの実行を許可します(UDP からポート 53 まで)
スプーフィングを防ぐための要件は、既存の clean-traffic ネットワークフィルターにより満たされるため、これを行う方法はカスタムフィルターから参照することです。
TCP ポート 22 および 80 へのトラフィックを有効にするには、このタイプのトラフィックを有効にするために 2 つのルールが追加されます。ゲスト仮想マシンが ICMP トラフィックに対して ping トラフィックの送信できるようにするには、ルールが ICMP トラフィックに追加されます。分かりやすくするため、一般的な ICMP トラフィックはゲスト仮想マシンから開始でき、ICMP エコーリクエストおよび応答メッセージには指定されません。その他のトラフィックはすべて、ゲスト仮想マシンからアクセスしたり、開始したりできなくなります。これを行うには、他のすべてのトラフィックを破棄するルールが追加されます。ゲスト仮想マシンが test と呼ばれ、フィルターと関連付けられたインターフェースが eth0 である場合は、フィルターが test-eth0 という名前のフィルターが作成されます。
これらの考慮事項の結果は、以下のネットワークフィルター XML です。
<filter name='test-eth0'>
  <!- - This rule references the clean traffic filter to prevent MAC, IP and ARP spoofing. By not providing an IP address parameter, libvirt will detect the IP address the guest virtual machine is using. - ->
  <filterref filter='clean-traffic'/>

  <!- - This rule enables TCP ports 22 (ssh) and 80 (http) to be reachable - ->
  <rule action='accept' direction='in'>
    <tcp dstportstart='22'/>
  </rule>

  <rule action='accept' direction='in'>
    <tcp dstportstart='80'/>
  </rule>

  <!- - This rule enables general ICMP traffic to be initiated by the guest virtual machine including ping traffic - ->
  <rule action='accept' direction='out'>
    <icmp/>
  </rule>>

  <!- - This rule enables outgoing DNS lookups using UDP - ->
  <rule action='accept' direction='out'>
    <udp dstportstart='53'/>
  </rule>

  <!- - This rule drops all other traffic - ->
  <rule action='drop' direction='inout'>
    <all/>
  </rule>

</filter>

17.14.11.6. カスタムフィルターの例

上記の XML のルールの 1 つに、移行元または宛先アドレスとしてゲスト仮想マシンの IP アドレスが含まれていますが、トラフィックのフィルターは正常に機能します。理由は、ルールの評価はインターフェースごとに内部的に行われるため、送信元または宛先の IP アドレスのいずれかではなく、パケットの送受信(tap)インターフェースをもとに、ルールが追加で評価されます。

例17.12 ネットワークインターフェースの説明に関する XML の例

テストゲスト仮想マシンのドメイン XML 内で考えられるネットワークインターフェースの説明の XML フラグメントは、以下のようになります。
   [...]
    <interface type='bridge'>
      <source bridge='mybridge'/>
      <filterref filter='test-eth0'/>
    </interface>
   [...]
より厳密に ICMP トラフィックを制御し、ゲスト仮想マシンから ICMP エコーリクエストのみを送信し、ゲスト仮想マシンにより ICMP エコー応答のみを受け取るようにするには、上記の ICMP ルールを以下の 2 つのルールに置き換えることができます。
  <!- - enable outgoing ICMP echo requests- ->
  <rule action='accept' direction='out'>
    <icmp type='8'/>
  </rule>
  <!- - enable incoming ICMP echo replies- ->
  <rule action='accept' direction='in'>
    <icmp type='0'/>
  </rule>

例17.13 2 番目のカスタムフィルターの例

この例では、上記の例のようなフィルターを構築する方法を説明しますが、ゲスト仮想マシンにある ftp サーバーで要件の一覧を拡張する方法を説明します。このフィルターの要件は以下のとおりです。
  • ゲスト仮想マシンのインターフェースが MAC、IP、および ARP スプーフィングを防ぎます。
  • ゲスト仮想マシンのインターフェースの TCP ポート 22 と 80 のみを開く
  • ゲスト仮想マシンによるインターフェースからの ping トラフィック送信を許可するが、インターフェース上でのゲスト仮想マシンに対する ping には応答させない
  • ゲスト仮想マシンによる DNS ルックアップを許可する (ポート 53 への UDP)
  • ゲスト仮想マシン内で実行できるように ftp サーバー(アクティブモードで)を有効にします。
FTP サーバーをゲスト仮想マシン内で実行できるようにするための追加の要件を、FTP コントロールトラフィックの場合はポート 21 に到達できるようにし、ゲスト仮想マシンがゲスト仮想マシンがゲスト仮想マシンの TCP ポート 20 から FTP クライアント(FTP active モード)への発信 TCP 接続を確立できるようにする要件です。このフィルターの書き込み方法はいくつかあり、考えられる 2 つのソリューションが例に記載されています。
最初のソリューションでは、Linux ホスト物理マシンの接続追跡フレームワークにフックを提供する TCP プロトコルの状態属性を利用します。ゲスト仮想マシンで開始された FTP データ接続(FTP アクティブモード)の場合、RELATED 状態を使用して、ゲスト仮想マシンで開始される FTP データ接続の結果(または「has a relationship with」)が既存の FTP コントロール接続の結果(または「has a relationship with」)がファイアウォールを介してパケットをパスできるようになります。ただし、RELATED 状態は、FTP データパスの送信 TCP 接続の最初のパケットにのみ有効です。その後、ステータスは ESTABLISHED で、受信および発信方向に同様に適用されます。これらはすべて、ゲスト仮想マシンの TCP ポート 20 からの FTP データトラフィックに関連します。これにより、以下のソリューションが実行されます。
<filter name='test-eth0'>
  <!- - This filter (eth0) references the clean traffic filter to prevent MAC, IP, and ARP spoofing. By not providing an IP address parameter, libvirt will detect the IP address the guest virtual machine is using. - ->
  <filterref filter='clean-traffic'/>

  <!- - This rule enables TCP port 21 (FTP-control) to be reachable - ->
  <rule action='accept' direction='in'>
    <tcp dstportstart='21'/>
  </rule>

  <!- - This rule enables TCP port 20 for guest virtual machine-initiated FTP data connection related to an existing FTP control connection - ->
  <rule action='accept' direction='out'>
    <tcp srcportstart='20' state='RELATED,ESTABLISHED'/>
  </rule>

  <!- - This rule accepts all packets from a client on the FTP data connection - ->
  <rule action='accept' direction='in'>
    <tcp dstportstart='20' state='ESTABLISHED'/>
  </rule>

  <!- - This rule enables TCP port 22 (SSH) to be reachable - ->
  <rule action='accept' direction='in'>
    <tcp dstportstart='22'/>
  </rule>

  <!- -This rule enables TCP port 80 (HTTP) to be reachable - ->
  <rule action='accept' direction='in'>
    <tcp dstportstart='80'/>
  </rule>

  <!- - This rule enables general ICMP traffic to be initiated by the guest virtual machine, including ping traffic - ->
  <rule action='accept' direction='out'>
    <icmp/>
  </rule>

  <!- - This rule enables outgoing DNS lookups using UDP - ->
  <rule action='accept' direction='out'>
    <udp dstportstart='53'/>
  </rule>

  <!- - This rule drops all other traffic - ->
  <rule action='drop' direction='inout'>
    <all/>
  </rule>

</filter>
RELATED 状態を使用してフィルターを試す前に、適切な接続追跡モジュールがホスト物理マシンのカーネルに読み込まれていることを確認する必要があります。カーネルのバージョンに応じて、ゲスト仮想マシンとの FTP 接続が確立される前に、以下のいずれかのコマンドを実行する必要があります。
  • modprobe nf_conntrack_ftp - where available OR
  • modprobe ip_conntrack_ftp if above is not available
FTP 以外のプロトコルが RELATED 状態とともに使用される場合は、対応するモジュールをロードする必要があります。モジュールは、ftp、tftp、irc、sip、sctp、および amanda などのプロトコルで利用できます。
2 つ目のソリューションでは、前の解よりも多くの接続の状態フラグを使用します。このソリューションは、トラフィックフローの最初のパケットが検出されると、接続の NEW 状態が有効であるというという利点があります。その後、フローの最初のパケットが許可されると、フローが接続になり、ESTABLISHED 状態になります。したがって、一般的なルールを作成して、ESTABLISHED 接続のパケットによるゲスト仮想マシンに到達できるようにするか、ゲスト仮想マシンで送信したりできます。これは、NEW 状態によって識別される最初のパケットに対して特定のルールを作成し、データが受け入れ可能であるポートを決定します。明示的に許可されていないポートに使用されるすべてのパケットは破棄されるため、ESTABLISHED 状態になりません。そのポートから送信される後続のパケットもドロップされます。
<filter name='test-eth0'>
  <!- - This filter references the clean traffic filter to prevent MAC, IP and ARP spoofing. By not providing and IP address parameter, libvirt will detect the IP address the VM is using. - ->
  <filterref filter='clean-traffic'/>

  <!- - This rule allows the packets of all previously accepted connections to reach the guest virtual machine - ->
  <rule action='accept' direction='in'>
    <all state='ESTABLISHED'/>
  </rule>

  <!- - This rule allows the packets of all previously accepted and related connections be sent from the guest virtual machine - ->
  <rule action='accept' direction='out'>
    <all state='ESTABLISHED,RELATED'/>
  </rule>

  <!- - This rule enables traffic towards port 21 (FTP) and port 22 (SSH)- ->
  <rule action='accept' direction='in'>
    <tcp dstportstart='21' dstportend='22' state='NEW'/>
  </rule>

  <!- - This rule enables traffic towards port 80 (HTTP) - ->
  <rule action='accept' direction='in'>
    <tcp dstportstart='80' state='NEW'/>
  </rule>

  <!- - This rule enables general ICMP traffic to be initiated by the guest virtual machine, including ping traffic - ->
  <rule action='accept' direction='out'>
    <icmp state='NEW'/>
  </rule>

  <!- - This rule enables outgoing DNS lookups using UDP - ->
  <rule action='accept' direction='out'>
    <udp dstportstart='53' state='NEW'/>
  </rule>

  <!- - This rule drops all other traffic - ->
  <rule action='drop' direction='inout'>
    <all/>
  </rule>

</filter>

17.14.12. 制限

以下は、ネットワークフィルタリングサブシステムの現在の既知の制限の一覧です。
  • 仮想マシンの移行は、ゲスト仮想マシンの最上位フィルターによって参照されるフィルターツリー全体がターゲットホストの物理マシンでも利用できる場合にのみサポートされます。たとえば、ネットワークフィルター clean-traffic はすべての libvirt インストールで利用できるようにし、このフィルターを参照するゲスト仮想マシンの移行を有効化する必要があります。バージョンの互換性を維持するには、パッケージを定期的に更新して、libvirt の最新のバージョンを使用していることを確認してください。
  • インターフェースに関連するネットワークトラフィックフィルターが失われないように、libvirt のバージョン 0.8.1 以降の libvirt 間で移行を行う必要があります。
  • VLAN(802.1Q)パケット(ゲスト仮想マシンにより送信された場合)は、プロトコル ID、rarp、ipv4、および ipv6 のルールでフィルターできません。プロトコル ID、MAC、および VLAN でのみフィルターを設定できます。そのため、フィルター 例17.1「ネットワークフィルタリングの例」 は予想通りに機能しません。