Red Hat Training

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

18.12.11.6. サンプルのカスタムフィルター

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

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

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

この例は、上記の例と同様のフィルターを作成する方法を示していますが、ゲスト仮想マシン内にある ftp サーバーを使用して要件のリストを拡張しています。このフィルターの要件は以下のとおりです。
  • ゲスト仮想マシンのインターフェイスの MAC、IP、および ARP スプーフィングを防ぎます。
  • ゲスト仮想マシンのインターフェイスで TCP ポート 22 および 80 のみを開きます。
  • ゲスト仮想マシンがインターフェイスから ping トラフィックを送信できるようにしますが、インターフェイスでゲスト仮想マシンへの ping は許可しません。
  • ゲスト仮想マシンが DNS ルックアップ (ポート 53 への UDP) を実行できるようにします。
  • ftp サーバーを有効にし (アクティブモード)、ゲスト仮想マシン内で実行できるようにします。
FTP サーバーをゲスト仮想マシン内で実行できるようにするという追加の要件は、ポート 21 が FTP 制御トラフィックに到達できるようにするという要件と、ゲスト仮想マシンが、ゲスト仮想マシンの TCP ポート 20 からの発信 TCP 接続を FTP クライアント (FTP アクティブモード) に確立できるようにする要件にマッピングします。このフィルターを作成する方法はいくつかあります。この例では、2 つの解決策を説明します。
最初のソリューションは、TCP プロトコルの state 属性を使用します。この属性は、Linux ホストの物理マシンの接続追跡フレームワークにフックを提供します。ゲスト仮想マシンが開始する FTP データ接続 (FTP アクティブモード) の場合は、RELATED 状態を使用して、ゲスト仮想マシンが開始する FTP データ接続が既存の FTP 制御接続の結果である (または関連している) ことを検出できるようにします。これにより、ファイアウォールを介して、パケットを渡すことができます。ただし、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 接続を確立する前に、次の 2 つのコマンドのいずれかを実行する必要があります。
  • #modprobe nf_conntrack_ftp (利用可能な場合)
  • #modprobe ip_conntrack_ftp (上記が利用可能でない場合)
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>