web-dev-qa-db-ja.com

KVMゲストがホストの同じネットワーク上にあるための適切なネットワーク構成

LennyでDebianLinuxサーバーを実行しています。その中で、KVMを使用して別のLennyインスタンスを実行しています。両方のサーバーは外部で利用可能であり、パブリックIPと、LANのプライベートIPを備えた2番目のインターフェイスがあります。 VMは、すべてのネットワークトラフィックがホストサーバーから発信されていると見なす以外は、すべて正常に機能します。これは、ホストで実行しているiptablesベースのファイアウォールと関係があると思われます。

私が理解したいのは、これらの要件がすべて満たされるようにホストのネットワークを適切に構成する方法です。

  1. ホストとVMの両方に2つのネットワークインターフェイス(パブリックとプライベート)があります。
  2. ホストとVMの両方を個別にファイアウォールで保護できます。
  3. 理想的には、VMトラフィックはホストファイアウォールを通過する必要はありません。
  4. VMは、ホストではなく、実際のリモートIPアドレスを認識します。

現在、ホストのネットワークインターフェイスはブリッジとして構成されています。 eth0とeth1にはIPアドレスが割り当てられていませんが、br0とbr1には割り当てられています。

/etc/network/interfacesホスト上:

# The primary network interface
auto br1
iface br1 inet static
    address 24.123.138.34
    netmask 255.255.255.248
    network 24.123.138.32
    broadcast 24.123.138.39
    gateway 24.123.138.33
    bridge_ports eth1
    bridge_stp off

auto br1:0
iface br1:0 inet static
    address 24.123.138.36
    netmask 255.255.255.248
    network 24.123.138.32
    broadcast 24.123.138.39

# Internal network
auto br0
iface br0 inet static
    address 192.168.1.1
    netmask 255.255.255.0
    network 192.168.1.0
    broadcast 192.168.1.255
    bridge_ports eth0
    bridge_stp off

これは、VMのlibvirt/qemu構成ファイルです。

<domain type='kvm'>
  <name>apps</name>
  <uuid>636b6620-0949-bc88-3197-37153b88772e</uuid>
  <memory>393216</memory>
  <currentMemory>393216</currentMemory>
  <vcpu>1</vcpu>
  <os>
    <type Arch='i686' machine='pc'>hvm</type>
    <boot dev='hd'/>
  </os>
  <features>
    <acpi/>
    <apic/>
    <pae/>
  </features>
  <clock offset='utc'/>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>restart</on_crash>
  <devices>
    <emulator>/usr/bin/kvm</emulator>
    <disk type='file' device='cdrom'>
      <target dev='hdc' bus='ide'/>
      <readonly/>
    </disk>
    <disk type='file' device='disk'>
      <source file='/raid/kvm-images/apps.qcow2'/>
      <target dev='vda' bus='virtio'/>
    </disk>
    <interface type='bridge'>
      <mac address='54:52:00:27:5e:02'/>
      <source bridge='br0'/>
      <model type='virtio'/>
    </interface>
    <interface type='bridge'>
      <mac address='54:52:00:40:cc:7f'/>
      <source bridge='br1'/>
      <model type='virtio'/>
    </interface>
    <serial type='pty'>
      <target port='0'/>
    </serial>
    <console type='pty'>
      <target port='0'/>
    </console>
    <input type='mouse' bus='ps2'/>
    <graphics type='vnc' port='-1' autoport='yes' keymap='en-us'/>
  </devices>
</domain>

残りのファイアウォールルールに加えて、ファイアウォールスクリプトには、KVMゲスト:

# Allow bridged packets to pass (for KVM guests).
iptables -A FORWARD -m physdev --physdev-is-bridged -j ACCEPT

(この質問には当てはまりませんが、ブリッジ設定の副作用として、正常にシャットダウンできないようです。カーネルは最終的に「unregister_netdevice:br1が解放されるのを待っています」と表示し、ハードリセットする必要があります。システム。たぶん私が何か馬鹿げたことをした兆候?)

4
Steve Madsen

VMを間違ったインターフェースにブリッジしました。それらは、外界に接続するネットワークインターフェースにブリッジする必要があります(br1あなたの場合)。

各VMは、ゲストにIPアドレスを設定する必要があり、ホストではnotであることに注意してください。

2
Michael Hampton

なぜbr1:0にエイリアスが必要なのですか?これはそこの邪魔になるかもしれません
エイリアスの他に、次のスキームを使用することをお勧めします。
eth0-> br0 <-VMのタップデバイス
ホストはbr0をIFとして使用できる必要があり、VMは仮想スイッチに接続された仮想NICとしてタップデバイスを使用します(br0は事実上ここになります)

もちろん、すべてのネットワークに同じことが当てはまります。したがって、eth1の場合、br1をセットアップし、br1に接続するVMを起動する必要があります。

1
dyasny

Lenny/Squeeze VM Lennyホスト内でlib-virtとvirtioブリッジを使用してbr0(br1もbr0:0もなし)で同じセットアップを行っています。特別なiptables構成がなくても正しく動作します。ホスト。各ゲストVM内ですべてのファイアウォール構成を行います。

ネットワークルートをチェックして、VMがホストをゲートウェイとして使用しているかどうかを確認することでメリットが得られると思います。鉱山は外部ルーターをゲートウェイとして使用するように構成されています。もちろん、my = VMとホストは同じ範囲内の異なるIPアドレスにあります。

0
sybreon