18.14. ネットワークのフィルター機能の適用
18.14.1. はじめに
- ネットワーク
- イーサネット -- ブリッジモードで使用してください
- bridge
例18.1 ネットワークフィルターの例
<devices>
<interface type='bridge'>
<mac address='00:16:3e:5d:c7:9e'/>
<filterref filter='clean-traffic'/>
</interface>
</devices># virsh nwfilter-dumpxml clean-traffic コマンドを使用して表示できます。
例18.2 記述の拡張
<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>18.14.2. フィルターチェーン
- root
- mac
- stp (スパニングツリープロトコル)
- vlan
- arp と rarp
- ipv4
- ipv6
例18.3 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>18.14.3. フィルターチェーンの優先度
表18.1 フィルターチェーンのデフォルト優先度値
| チェーン (プレフィックス) | デフォルトの優先度 |
|---|---|
| stp | -810 |
| mac | -800 |
| vlan | -750 |
| ipv4 | -700 |
| ipv6 | -600 |
| arp | -500 |
| rarp | -400 |
注記
18.14.4. フィルター内での変数の使用
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 属性に予想されるタイプのいくつかを 例18.4「変数タイプの例」に示します。
例18.4 変数タイプの例
<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>
<rule action='accept' direction='in' priority='500'>
<tcp srpipaddr='$IP'/>
</rule>
<rule action='accept' direction='in' priority='500'>
<udp dstportstart='$DSTPORTS[1]'/>
</rule>例18.5 各種変数の使用
$VARIABLE[@<iterator id="x">] の表記を使用すると、異なる一覧からの許容範囲内にあるルールのあらゆる組み合わせを表すことができるフィルタールールの作成が可能です。次のルールは、仮想マシンが DSTPORTS で指定されている複数のポート上で SRCIPADDRESSES に指定されている複数のソース IP アドレスからのトラフィックを受信できるよう許可します。このルールは、要素へのアクセスに 2 種類の独立した反復子を使って、変数 SRCIPADDRESSES と DSTPORTS のあらゆる組み合わせを生成します。
<rule action='accept' direction='in' priority='500'>
<ip srcipaddr='$SRCIPADDRESSES[@1]' dstportstart='$DSTPORTS[@2]'/>
</rule>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" が付くと仮定しています。
18.14.5. 自動 IP アドレス検出と DHCP スヌーピング
18.14.5.1. はじめに
CTRL_IP_LEARNING を使用します。any、dhcp、none が有効な値になります。
CTRL_IP_LEARNING が設定されていない場合のデフォルトになります。このメソッドの場合、検出する IP アドレスはインターフェースごとに 1 つのみとなります。ゲスト仮想マシンの IP アドレスが検出されると、その IP ネットワークトラフィックがそのアドレスにロックされ、IP アドレスのなりすましなどがそのフィルターの 1 つで防止されます。この場合、IP アドレスのなりすましと見られるような、仮想マシンのユーザーによるゲスト仮想マシン内からのインターフェースの IP アドレスの変更は行えなくなります。ゲスト仮想マシンを別のホスト物理マシンに移行したり、一時停止状態から再開させた場合、ゲスト仮想マシンが送信する最初のパケットによって特定のインターフェースで使用できる IP アドレスが再度確定されます。
18.14.5.2. DHCP スヌーピング
CTRL_IP_LEARNING=dhcp (DHCP スヌーピング) により、とくに IP アドレスの割り当てを信頼できる DHCP サーバーに限るフィルターと併用したい場合に、なりすまし防止に対する安全性が強化されます。これを有効にするには、DHCPSERVER 変数を有効な DHCP サーバーの IP アドレスに設定し、この変数を使って着信 DHCP の応答を処理するフィルターを指定します。
注記
例18.6 DHCP スヌーピング用に IP をアクティブ化
<interface type='bridge'>
<source bridge='virbr0'/>
<filterref filter='clean-traffic'>
<parameter name='CTRL_IP_LEARNING' value='dhcp'/>
</filterref>
</interface>18.14.6. 予約済み変数
表18.2 予約済み変数
| 変数名 | 定義 |
|---|---|
| MAC | インターフェースの MAC アドレス |
| IP | インターフェースで使用中の IP アドレス一覧 |
| IPV6 | 現在のところ実装されていません。インターフェースで使用中の IPV6 アドレスの一覧 |
| DHCPSERVER | 信頼できる DHCP サーバーの IP アドレス一覧 |
| DHCPSERVERV6 | 現在のところ実装されていません。信頼できる DHCP サーバーの IPv6 アドレスの一覧 |
| CTRL_IP_LEARNING | IP アドレス検出モードの選択 |
18.14.7. 要素と属性の概要
<filter> になります。name 属性は特定フィルターの固有名を指定します。chain 属性はオプションですが、基礎となるホスト物理マシンのファイアウォールサブシステムによってより効率的な処理を実現するために特定のフィルターを編成することができます。現在、システムで対応しているチェーンは、root、ipv4、ipv6、arp、および rarp のみです。
18.14.8. 他のフィルターへの参照
例18.7 clean traffic フィルターの例
<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>
<filterref> をフィルターノード内に指定する必要があります。このノードには参照先のフィルター名を値として持つ属性フィルターを持たせる必要があります。
18.14.9. フィルタールール
例18.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>- action を mandatory にすると、次の値を取ることができます。
- drop (ルールに一致すると、さらに分析することなくパケットを破棄し、メッセージは出力されません)
- reject (ルールに一致すると、さらに分析することなく ICMP 拒否メッセージを生成します)
- accept (ルールに一致すると、さらに分析することなくパケットを受け取ります)
- return (ルールに一致すると、このフィルターを通過しますがさらに分析するため呼び出しフィルターに制御を戻します)
- continue (ルールに一致すると、さらに分析するため次のルールに移動します)
- direction を mandatory にすると、次の値を取ることができます。
- in - 着信トラフィック
- out - 発信トラフィック
- inout - 着信と発信のトラフィック
- priority はオプションです。ルールの優先度は、ルールが他のルールに対して相対的にインスタンス化される順序を制御します。小さい値のルールは大きい値のルールより先にインスタンス化されます。有効な値は -1000 から 1000 の範囲です。この属性が指定されないと、デフォルトでは優先度 500が指定されます。ルートチェーン内のフィルタールールは、その優先度に基づいて、ルートチェーンに接続されるフィルターで分類されます。これにより、フィルターチェーンへのアクセスを持たせながらフィルタールール同士を交互配置することができるようになります。詳細は「フィルターチェーンの優先度」を参照してください。
- statematch はオプションです。「0」または「false」に設定すると、基礎となる接続状態のマッチングをオフにします。デフォルト設定は「1」または「 true」です。
priority=500 になることを示しています。type ip のトラフィックがチェーン ipv4 に関連付けられる別のフィルターが参照される場合は、そのフィルターのルールは先のルールの priority=500 に基づいて順序付けられます。
18.14.10. サポート対象プロトコル
srcipaddr 属性を示しています。この属性は ip トラフィックフィルターノード内で有効になります。次のセクションでは有効な属性と期待されるデータタイプについて示します。次のようなデータタイプが使用可能です。
- 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 属性を使って無効にすることができます。無効にした複数の属性を 1 つのまとめることもできます。次の XML の抜粋部分で抽象属性を使った一例を示します。
[...]
<rule action='drop' direction='in'>
<protocol match='no' attribute1='value1' attribute2='value2'/>
<protocol attribute3='value3'/>
</rule>
[...]attribute1 が value1 に一致せず、プロトコルプロパティーの attribute2 が value2 に一致せず、かつプロトコルプロパティー attribute3 が value3 に一致する場合、着信トラフィックのみがドロップされます。
18.14.10.1. MAC (イーサネット)
表18.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] |
| comment | STRING | 最長 256 文字のテキスト文字列 |
[...] <mac match='no' srcmacaddr='$MAC'/> [...]
18.14.10.2. VLAN (802.1Q)
表18.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 | カプセル化されたレイヤー 3 プロトコル ID、有効な文字列 arp、ipv4、ipv6 |
| comment | STRING | 最長 256 文字のテキスト文字列 |
18.14.10.3. STP (Spanning Tree Protocol)
表18.5 STP プロトコルタイプ
| 属性名 | データタイプ | 定義 |
|---|---|---|
| srcmacaddr | MAC_ADDR | 送信側の MAC アドレス |
| srcmacmask | MAC_MASK | 送信側の MAC アドレスに適用されるマスク |
| type | UINT8 | BPDU (Bridge Protocol Data Unit) タイプ |
| flags | UINT8 | BPDU flagdstmacmask |
| root-priority | UINT16 | ルート優先度範囲の始点 |
| root-priority-hi | UINT16 (0x0-0xfff, 0 - 4095) | ルート優先度範囲の終点 |
| 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 | フォワード遅延 (範囲の終点) |
| comment | STRING | 最長 256 文字のテキスト文字列 |
18.14.10.4. ARP/RARP
表18.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 パケットをチェックするかどうかを指定するブール値 |
| comment | STRING | 最長 256 文字のテキスト文字列 |
18.14.10.5. IPv4
表18.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, STRING | レイヤー 4 プロトコルの識別子。protocol に有効な文字列: tcp、udp、udplite、esp、ah、icmp、igmp、sctp |
| srcportstart | UINT16 | 有効なソースポート範囲の開始点。プロトコルが必要。 |
| srcportend | UINT16 | 有効なソースポート範囲の終了点。プロトコルが必要。 |
| dstportstart | UNIT16 | 有効な宛先ポート範囲の開始点。プロトコルが必要。 |
| dstportend | UNIT16 | 有効な宛先ポート範囲の終了点。プロトコルが必要。 |
| comment | STRING | 最長 256 文字のテキスト文字列 |
18.14.10.6. IPv6
表18.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, STRING | レイヤー 4 プロトコル識別子。protocol に有効な文字列: tcp、udp、udplite、esp、ah、icmpv6、sctp |
| scrportstart | UNIT16 | 有効なソースポート範囲の開始点。プロトコルが必要。 |
| srcportend | UINT16 | 有効なソースポート範囲の終了点。プロトコルが必要。 |
| dstportstart | UNIT16 | 有効な宛先ポート範囲の開始点。プロトコルが必要。 |
| dstportend | UNIT16 | 有効な宛先ポート範囲の終了点。プロトコルが必要。 |
| comment | STRING | 最長 256 文字のテキスト文字列 |
18.14.10.7. TCP/UDP/SCTP
表18.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 | 有効な宛先ポート範囲の終了点。プロトコルが必要。 |
| comment | STRING | 最長 256 文字のテキスト文字列 |
| state | STRING | NEW、ESTABLISHED、RELATED、INVALID または NONE のコンマで区切った一覧 |
| flags | STRING | TCP のみ: マスク/フラグの形式。マスクおよびフラグを SYN、ACK、URG、PSH、FIN、RST または NONE か ALL のコンマで区切った一覧 |
| ipset | STRING | libvirt の外側で管理されている IPSet の名前 |
| ipsetflags | IPSETFLAGS | IPSet のフラグ。ipset 属性が必要。 |
18.14.10.8. ICMP
表18.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 コード |
| comment | STRING | 最長 256 文字のテキスト文字列 |
| state | STRING | NEW、ESTABLISHED、RELATED、INVALID または NONE のコンマで区切った一覧 |
| ipset | STRING | libvirt の外側で管理されている IPSet の名前 |
| ipsetflags | IPSETFLAGS | IPSet のフラグ。ipset 属性が必要。 |
18.14.10.9. IGMP、ESP、AH、UDPLITE、'ALL'
表18.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 アドレス範囲の終了点 |
| comment | STRING | 最長 256 文字のテキスト文字列 |
| state | STRING | NEW、ESTABLISHED、RELATED、INVALID または NONE のコンマで区切った一覧 |
| ipset | STRING | libvirt の外側で管理されている IPSet の名前 |
| ipsetflags | IPSETFLAGS | IPSet のフラグ。ipset 属性が必要。 |
18.14.10.10. IPV6 経由の TCP/UDP/SCTP
表18.12 IPv6 経由の TCP、UDP、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 | 有効な宛先ポート範囲の終了点 |
| comment | STRING | 最長 256 文字のテキスト文字列 |
| state | STRING | NEW、ESTABLISHED、RELATED、INVALID または NONE のコンマで区切った一覧 |
| ipset | STRING | libvirt の外側で管理されている IPSet の名前 |
| ipsetflags | IPSETFLAGS | IPSet のフラグ。ipset 属性が必要。 |
18.14.10.11. ICMPv6
表18.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 コード |
| comment | STRING | 最長 256 文字のテキスト文字列 |
| state | STRING | NEW、ESTABLISHED、RELATED、INVALID または NONE のコンマで区切った一覧 |
| ipset | STRING | libvirt の外側で管理されている IPSet の名前 |
| ipsetflags | IPSETFLAGS | IPSet のフラグ。ipset 属性が必要。 |
18.14.10.12. IPv6 経由の IGMP、ESP、AH、UDPLITE、'ALL'
表18.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 アドレス範囲の終了点 |
| comment | STRING | 最長 256 文字のテキスト文字列 |
| state | STRING | NEW、ESTABLISHED、RELATED、INVALID または NONE のコンマで区切った一覧 |
| ipset | STRING | libvirt の外側で管理されている IPSet の名前 |
| ipsetflags | IPSETFLAGS | IPSet のフラグ。ipset 属性が必要。 |
18.14.11. 高度なフィルター設定について
18.14.11.1. 接続の追跡
例18.9 TCP ポートへの接続をオフにする XML 例
[...]
<rule direction='in' action='accept' statematch='false'>
<cp dstportstart='12345'/>
</rule>
[...]18.14.11.2. 接続数の制限
例18.10 接続数に制限を設定した 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>
[...]注記
sysfs 内のタイムアウトをコマンド「# echo 3 > /proc/sys/net/netfilter/nf_conntrack_icmp_timeout」で調整する方法です。このコマンドにより、ICMP 接続の追跡タイムアウトが 3 秒に設定されます。1 つの ping が終了すると、別の ping が 3 秒後に開始されます。
18.14.11.3. コマンドラインツール
nwfilter のプレフィックスで開始されます。使用できるコマンドは次の通りです。
nwfilter-list: 全ネットワークフィルターの UUID と名前を一覧表示します。nwfilter-define: 新しいネットワークフィルターを定義するか、または既存のフィルターを更新します (フィルター名の入力要)。nwfilter-undefine: 指定したネットワークフィルターを削除します (フィルター名の入力要)。現在使用中のネットワークフィルターは削除しません。nwfilter-dumpxml: 指定したネットワークフィルターを表示します (フィルター名の入力要)。nwfilter-edit: 指定したネットワークフィルターを編集します (フィルター名の入力要)。
18.14.11.4. 既存のネットワークフィルター
表18.15 ICMPv6 プロトコルタイプ
| プロトコル名 | 説明 |
|---|---|
allow-arp | ゲスト仮想マシンに対するすべての着信および発信アドレス解決プロトコル (ARP) トラフィックを許可します。 |
no-arp-spoofing、no-arp-mac-spoofing、and no-arp-ip-spoofing | これらのフィルターは、ゲスト仮想マシンによる ARP トラフィックのなりすましを防ぎます。さらに、ARP 要求と返信メッセージだけを許可し、パケットに以下の項目が含まれるよう強制します。
|
low-dhcp | ゲスト仮想マシンによる DHCP 経由の IP アドレスの要求を許可します (すべての DHCP サーバーから)。 |
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 のなりすましを防ぎます。このフィルターはビルディングブロックとして他の複数のフィルターを参照します。 |
18.14.11.5. 独自のフィルターの記述
- mac
- stp (スパニングツリープロトコル)
- vlan (802.1Q)
- arp、rarp
- ipv4
- ipv6
例18.11 カスタムフィルターの作成
- 仮想マシンのインターフェースでの MAC、IP、ARP のなりすましを防ぐ
- 仮想マシンのインターフェースの TCP ポート 22 と 80 のみを開く
- 仮想マシンによるインターフェースからの ping トラフィック送信を許可する。ただしインターフェース上での仮想マシンに対する ping には応答させない
- 仮想マシンによる DNS ルックアップを許可する (ポート 53 への UDP)
clean-traffic フィルターで満たすことができるため、カスタムフィルターからこのフィルターを参照させることで防止することができます。
test、フィルターを関連付けるインターフェースは eth0 とし、作成するフィルターには test-eth0 という名前を付けるとします。
<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>18.14.11.6. カスタムフィルターのサンプル
例18.12 ネットワークインターフェースの詳細部分のサンプル XML
[...]
<interface type='bridge'>
<source bridge='mybridge'/>
<filterref filter='test-eth0'/>
</interface>
[...]
<!- - 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>例18.13 カスタムフィルターのサンプル 2
- ゲスト仮想マシンのインターフェースでの MAC、IP、ARP のなりすましを防ぐ
- ゲスト仮想マシンのインターフェースの TCP ポート 22 と 80 のみを開く
- ゲスト仮想マシンによるインターフェースからの ping トラフィック送信を許可するが、インターフェース上でのゲスト仮想マシンに対する ping には応答させない
- ゲスト仮想マシンによる DNS ルックアップを許可する (ポート 53 への UDP)
- 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>- #
modprobe nf_conntrack_ftp- 利用可能な場合、あるいは - #
modprobe ip_conntrack_ftp- 上記のコマンドが利用できない場合
<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>18.14.12. 制限
- 仮想マシンの移行サポートは、ゲスト仮想マシンのトップレベルのフィルターで参照されるフィルターツリー全体がターゲットのホスト物理マシンでも使用できる場合に限られます。たとえば、ネットワークフィルター
clean-trafficはすべての libvirt インストールで使用できる状態でなければなりません。これにより、このフィルターを参照するゲスト仮想マシンの移行が可能になります。バージョンの互換性が問題とならないよう、定期的にパッケージの更新を行い、常に最新の libvirt バージョンを使用するようにしてください。 - インターフェースに関連しているネットワークトラフィックフィルターを失わないよう、移行はバージョン 0.8.1 またはそれ以降の libvirt インストール間で行うようにしてください。
- VLAN (802.1Q) パケットがゲスト仮想マシンによって送信された場合、プロトコル ID が arp、rarp、ipv4、ipv6 のルールではフィルターを行うことができません。このようなパケットをフィルターできるのは、プロトコル ID が MAC か VLAN の場合のみです。したがって、clean-traffic フィルターの例である 例18.1「ネットワークフィルターの例」は期待通りには機能しません。

Where did the comment section go?
Red Hat's documentation publication system recently went through an upgrade to enable speedier, more mobile-friendly content. We decided to re-evaluate our commenting platform to ensure that it meets your expectations and serves as an optimal feedback mechanism. During this redesign, we invite your input on providing feedback on Red Hat documentation via the discussion platform.