Red Hat Training

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

19.12.4. フィルター内での変数の使い方

ネットワークトラフィックフィルターのサブシステムで使用するよう MAC と IP の 2 種類の変数が予約されています。
ネットワークインターフェースの MAC アドレスには MAC が指定されます。この変数を参照するフィルタールールは自動的にインターフェースの MAC アドレスに置換されます。ユーザー側で明示的に MAC パラメータを与える必要がないため便利です。 前述の IP パラメーター同様、 MAC パラメーターの指定は可能ですが、インターフェースが使用する MAC アドレスは libvirt で認識できるためお勧めしません。
パラメーター IP は、 仮想マシン内のオペレーティングシステムに特定のインターフェースで使用させる IP アドレスを表します。パラメーターが明示的な指定ではなく参照する形になっている場合、libvirt デーモンによりインターフェースで使用されている IP アドレス (および IP パラメータの値) の確定が試行されるため、この場合 IP パラメーターは特殊となります。現在の IP アドレス検出には限界があるため、この機能の使い方および使用した場合に期待できる限度については 「限界」 をよくお読みください。 「フィルターチェーン」 で示した XML ファイルには no-arp-spoofing のフィルターが含まれています。MAC と IP の変数を参照する場合にネットワークフィルター XML を利用した事例になります。
参照させる変数には常に $ 文字のプレフィックスが付きます。変数の値の形式は XML で指定されるフィルター属性によって期待されるタイプにする必要があります。上記の例では、IP パラメーターに正式な IP アドレスを標準形式で持たせる必要があります。不適切な形式を与えると、フィルターの変数が値に置換されないため仮想マシンが起動しなくなったり、ホットプラグインを使用している場合はインターフェースが接続されなくなります。XML 属性に期待されるタイプをいくつか 例19.4「変数タイプの例」 に示します。

例19.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>

例19.5 各種変数の使い方

$VARIABLE[@<iterator id="x">] の表記を使用すると、異なる一覧のルールを使ってあらゆる組み合わせを表すことができるフィルタールールの作成が可能です。次のルールでは、仮想マシンが DSTPORTS で指定されている複数のポート上で SRCIPADDRESSES に指定されている複数のソース IP アドレスからのトラフィックを受信できるよう許可しています。ルールは、 要素へのアクセスに 2 種類の独立した反復子を使って、変数 SRCIPADDRESSESDSTPORTS のあらゆる組み合わせを生成します。
  <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] の表記など、1 つの反復子を使って前述の変数にアクセスすると、両方の一覧に並列にアクセスするため、次のような組み合わせになります。
  • 10.0.0.1, 80
  • 11.1.2.3, 8080

注記

$VARIABLE$VARIABLE[@0] の簡略形になります。このセクションの冒頭で示したように、先の表記は常に反復子の役割となる iterator id="0" が付くと仮定しています。