Red Hat Training
A Red Hat training course is available for Red Hat Enterprise Linux
18.12.11.5. 独自のフィルターの作成
libvirt はネットワークフィルターの例をいくつか提供しているだけなので、独自のフィルターを作成することを検討してください。これを計画する際に、ネットワークフィルターサブシステムと、それが内部でどのように機能するかについて知っておく必要があります。フィルターをかけるプロトコルを必ず熟知して理解しておく必要があります。それにより、通過するトラフィック以上のトラフィックがなくなり、実際に許可するトラフィックが通過するようになります。
ネットワークフィルターサブシステムは、現在 Linux ホストの物理マシンでのみ利用でき、Qemu および KVM タイプの仮想マシンでのみ機能します。Linux では、ebtable、iptables、および ip6tables に対応し、その機能を利用します。「サポートされているプロトコル」 に記載されている一覧を考慮し、ebtable を使用して以下のプロトコルを実装できます。
- 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 ルールと値が自動的に使用されます。
同じプロトコルに複数のチェーンを作成できます。チェーンの名前は、以前に列挙されたプロトコルのいずれかの接頭辞を持つ必要があります。ARP トラフィックを処理するための追加のチェーンを作成する場合は、たとえば、名前が arp-test のチェーンを指定できます。
たとえば、IP プロトコルフィルターを使用し、受け入れる UDP パケットのソース、宛先 IP、およびポートの属性を指定して、送信元および宛先のポートで UDP トラフィックでフィルターリングできます。これにより、ebtables を使用した UDP トラフィックの早期フィルターリングが可能になります。ただし、UDP パケットなどの IP または IPv6 パケットが ebtables レイヤーを通過し、iptables ルールまたは ip6tables ルールをインスタンス化するフィルターツリーに少なくとも 1 つのルールがある場合、UDP パケットの通過を許可するルールもこれらのフィルターレイヤーに指定する必要があります。これは、適切な udp トラフィックフィルターノードまたは udp-ipv6 トラフィックフィルターノードを含むルールで実行できます。
例18.11 カスタムフィルターの作成
以下の要件の一覧を満たすためにフィルターが必要であるとします。
- 仮想マシンのインターフェイスによる MAC、IP、および ARP のスプーフィングの阻止
- 仮想マシンのインターフェイスの TCP ポート 22 および 80 のみを開く
- 仮想マシンがインターフェイスから ping トラフィックを送信できるようにしますが、インターフェイスで仮想マシンの ping を行わないようにします。
- 仮想マシンが DNS ルックアップ (ポート 53 への UDP) を実行できるようにします。
スプーフィングを防ぐための要件は、すでに存在する
clean-traffic
ネットワークフィルターにより満たされています。そのため、これを行う方法は、カスタムフィルターから参照することです。
TCP ポート 22 および 80 のトラフィックを有効にするには、このタイプのトラフィックを有効にするために 2 つのルールが追加されました。ゲスト仮想マシンが 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>