B.9. ゲストは外部ネットワークにアクセスできるが、macvtap 使用時にはホストにアクセスできない

現象
ゲストは他のゲストと通信できるが、macvtap (別名 type='direct') ネットワークインターフェース使用の設定後にはホストに接続できない。
調査
Virtual Ethernet Port Aggregator (VEPA) や VN-Link 対応スイッチに接続していない時でも、macvtap インターフェースは役に立ちます。インターフェースのモードを bridge に設定すると、非常に簡単な方法でゲストは物理ネットワークに直接接続することができます。従来のホストブリッジデバイスにつきものの設定問題 (または、NetworkManager の非互換性) がありません。
しかし、ゲスト仮想マシンが macvtap などの type='direct' ネットワークインターフェースを使用するように設定されていると、ネットワーク上で他のゲストや他の外部ホストと通信する機能がありながら、ゲストは自分のホストと通信できなくなります。
この状況は、実際にはエラーではなく macvtap の定義済み動作です。ホストの物理イーサネットが macvtap ブリッジにアタッチされている方法が原因で、物理インターフェースに転送されるゲストからそのブリッジへのトラフィックは、ホストの IP スタックに跳ね返ってくることができません。さらには、物理インターフェースに送信されたホストの IP スタックからのトラフィックも macvtap ブリッジに跳ね返って来ず、ゲストに転送することができません。
解決法
libvirt を使って、分離したネットワークとこのネットワークに接続する各ゲスト仮想マシン用に 2 つ目のインターフェースを作成します。これでホストとゲストはこの分離したネットワーク上で直接通信できる一方、NetworkManager との互換性も維持できます。

手順B.3 libvirt による分離ネットワークの作成

  1. 以下の XML を /tmp/isolated.xml ファイルに追加して保存します。自分のネットワーク上で 192.168.254.0/24 がすでに使われている場合、別のネットワークを選びます。
    <network>
      <name>isolated</name>
      <ip address='192.168.254.1' netmask='255.255.255.0'>
        <dhcp>
          <range start='192.168.254.2' end='192.168.254.254' />
        </dhcp>
      </ip>
    </network>
  2. 以下のコマンドでネットワークを作成します: virsh net-define /tmp/isolated.xml
  3. virsh net-autostart isolated コマンドでネットワークの自動スタートを設定します。
  4. virsh net-start isolated コマンドでネットワークを起動します。
  5. virsh edit name_of_guest を使って、ネットワーク接続に macvtap を使用するゲストの設定を編集し、以下と同様の新たな <interface><devices> セクションに追加します。( <model type='virtio'/> 行を含めるかはオプション )
    <interface type='network'>
      <source network='isolated'/>
      <model type='virtio'/>
    </interface>
  6. 各ゲストをシャットダウンし再起動します。
これでゲストは 192.168.254.1 のアドレスにあるホストにアクセスでき、ホストは各ゲストが DHCP から取得した IP アドレスでゲストにアクセスできます (または、ゲストに手動で IP アドレスを設定することもできます)。この新たなネットワークはこのホストとゲスト専用に分離されているので、ゲストからの他の通信はすべて macvtap インターフェースを使用することになります。