web-dev-qa-db-ja.com

KVMブリッジネットワークが機能しない

このガイドに従ってUbuntuサーバーにKVMをインストールしました: https://help.ubuntu.com/community/KVM/Installation

次に、ここに示すようにブリッジネットワークを準備します。 https://help.ubuntu.com/community/KVM/Networking

次に、virt-managerを使用して仮想マシンを作成しました。何回か試しましたが、ゲストはネットワークに接続できません!助けがありますか?

ifconfig:

      br0       Link encap:Ethernet  HWaddr d0:27:88:b0:e4:38  
                inet addr:192.168.20.100  Bcast:192.168.20.255  Mask:255.255.255.0
                inet6 addr: fe80::d227:88ff:feb0:e438/64 Scope:Link
                UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
                RX packets:62 errors:0 dropped:0 overruns:0 frame:0
                TX packets:62 errors:0 dropped:0 overruns:0 carrier:0
                collisions:0 txqueuelen:0 
                RX bytes:10493 (10.4 KB)  TX bytes:8433 (8.4 KB)

      eth0      Link encap:Ethernet  HWaddr d0:27:88:b0:e4:38  
                UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
                RX packets:62 errors:0 dropped:0 overruns:0 frame:0
                TX packets:63 errors:0 dropped:0 overruns:0 carrier:0
                collisions:0 txqueuelen:1000 
                RX bytes:11361 (11.3 KB)  TX bytes:8479 (8.4 KB)
                Interrupt:41 

      lo        Link encap:Local Loopback  
                inet addr:127.0.0.1  Mask:255.0.0.0
                inet6 addr: ::1/128 Scope:Host
                UP LOOPBACK RUNNING  MTU:16436  Metric:1
                RX packets:0 errors:0 dropped:0 overruns:0 frame:0
                TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
                collisions:0 txqueuelen:0 
                RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

      virbr0    Link encap:Ethernet  HWaddr 5a:8c:57:95:af:3b  
                inet addr:192.168.122.1  Bcast:192.168.122.255  Mask:255.255.255.0
                UP BROADCAST MULTICAST  MTU:1500  Metric:1
                RX packets:0 errors:0 dropped:0 overruns:0 frame:0
                TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
                collisions:0 txqueuelen:0 
                RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

brctl show:

 bridge name    bridge id      STP enabled    interfaces
 br0       8000.d02788b0e438   no        eth0
 virbr0         8000.000000000000   yes  

brctl showmacs br0:

 port no   mac addr       is local? ageing timer
   1  5c:d9:98:67:b6:28   no          48.33
   1  d0:27:88:b0:e4:38   yes          0.00
   1  e0:2a:82:f9:6c:09   no           0.00

ipルート:

 default via 192.168.20.1 dev br0  metric 100 
 192.168.20.0/24 dev br0  proto kernel  scope link  src 192.168.20.100 
 192.168.122.0/24 dev virbr0  proto kernel  scope link  src 192.168.122.1

*ゲストで*sshできないため、ゲストから情報をコピーして貼り付けることができませんでした。 DHCPからIPを取得できませんでした。手動で設定しても機能しません。

21
THpubs

予備

この次はUbuntu 12.04で機能しました。 これをテストするときは、干渉しないようにコンピューターのファイアウォールを無効にする必要があります。

/ etc/default/qemu-kvmファイルは最初にインストールされたものである必要があります。

bridge-utilsが必要です。Install bridge-utilsqemu-kvmInstall qemu-kvm および libvirt-binInstall libvirt-bin インストール済み。仮想マシンを使用するユーザーはすべて、libvirtdグループに追加する必要があります。

CAP_NET_ADMIN機能を追加する必要はもはやないようです。

ネットワーク設定

デフォルトのネットワークモードは、SLIRPとも呼ばれるユーザーモードです。 NATゲストコンピューターにルーティングされる事前定義されたvirbr0ブリッジを使用します。 NATルーティングは、カーネルのip_forwarding機能とiptablesを使用します。ブリッジモードは、(番号なしの)イーサネットインターフェイスが接続され、ホストとゲストの両方にネットワークインターフェイスがあるゲストの仮想ブリッジを使用します。

次の図は、違いを明確にする可能性があります。

Network diagrams

デフォルトのユーザーネットワークがどのように定義されているかを見ることができます:

virsh net-dumpxml default

次の方法でブリッジモードを設定できます。

/ etc/network/interfacesで(質問で言及した投稿のブリッジ部分から):

 auto lo 
 iface lo inetループバック
#auto eth0 
#iface eth0 inet dhcp 
 auto eth0 
 iface eth0 inetマニュアル
 auto br0 
 iface br0 inet dhcp 
 bridge_ports eth0 
 bridge_stp off 
 bridge_fd 0 
 bridge_maxwait 0

リブート;ワイヤレスネットワークがアクティブになっていないことを確認してください。 ip routeを使用してデフォルトのIPルートを確認します。 br0インターフェイスを使用している必要があります。

N.B。この変更が行われたときにイーサネットが接続されていない場合、イーサネットケーブルを差し込んでキャリアを取得する必要があります。そうしないと、ブートが2分間ハングし、ネットワーク機能を使用できなくなります eth0インターフェースは、このファイル内にあるため、起動が正常に進む前に起動する必要があります。

N.B。一般に、複数のMACアドレスを使用できないため、eth0の代わりにワイヤレスネットワークを使用することはできません(ブリッジに2つ目のアドレスが必要であると推測されます)。

別の方法として、イーサネットの使用を無効にし、IPアドレスがなく、ip routeで設定されたデフォルトルートがないことを確認できます。次に:

 Sudo ifconfig eth0 0.0.0.0 up
 Sudo brctl addbr br0
 Sudo brctl addif br0 eth0
 Sudo ifconfig br0 up
 Sudo dhclient br0 &

ここで静的IPアドレスを指定したり、デフォルトルートとDNSアドレスを定義することもできます。この例では、dhclientがこれを行います。

これが私のルートテーブルです。

$ ip route list 
 default via 192.168.1.1 dev br0 metric 100 
 169.254.0.0/16 dev br0 scope link metric 1000 
 192.168.1.0/24 dev br0 proto kernel scope link src 192.168.1.45 
 192.168.122.0/24 dev virbr0 proto kernel scope link src 192.168.122.1

kvmを使用

その後、次のコマンドでブリッジされたkvmマシンを起動できます。

 $ Sudo kvm -name Quantal -m 1024 -hda foo.qcow2 --soundhw ac97 -device virtio-net,netdev=tunnel -netdev tap,id=tunnel,ifname=vnet0

-netdev tapパラメーターは、Sudoを必須にします。 VMが開始されると、qemu-kvmは次のコマンドを実行します。

ifconfig vnet0 0.0.0.0 up 
 brctl addif brctl addif br0 vnet0

これは/ etc/qemu-ifupによって行われます

上記のデフォルトルートはそのブリッジインターフェイスを使用するため、VMのvnet0インターフェイスがbr0ブリッジに追加されます。存在しない場合は、代わりにタップインターフェイスがvirbr0インターフェイスに追加されます。これはインターネットに接続されていないため、私の実験では、ゲストをホストとインターネットに接続するためにNATが使用されます。/etc/default/qemu-kvmの特定のブリッジにvnet0を向けることができます。以下のvirt-managerを使用すると、接続するブリッジを明示的に指示できます。

Qemu-kvmによって発行される上記のコマンドと-netdev tap,id=tunnel,ifname=vnet0パラメーターにより、vm仮想マシンはvnet0トンネルに接続され、トンネルはbr0ブリッジに接続されます。

これで、ネットワーク上の別のコンピューターからこのゲストVMに直接sshできます。

ホストifconfig(VMの実行中にネットワーク上に表示されるvnet0インターフェイスに注意してください):

$ ifconfig 
 br0 Link encap:Ethernet HWaddr 00:1e:33:88:07:e5 
 inet addr:192.168.1.45 Bcast:255.255.255.255 Mask:255.255.255.0 
 inet6 addr:fe80 :: 21e:33ff:fe88:7e5/64 Scope:Link 
 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 
 RXパケット:6526エラー:0ドロップ:0オーバーラン: 0フレーム:0 
 TXパケット:7543エラー:0ドロップ:0オーバーラン:0キャリア:0 
コリジョン:0 txqueuelen:0 
 RXバイト:2712940(2.7 MB)TX bytes:1071835(1.0 MB)
 
 eth0 Link encap:Ethernet HWaddr 00:1e:33:88:07:e5 
 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 
 RXパケット:7181エラー:0ドロップ:0オーバーラン:0フレーム:0 
 TXパケット:7740エラー:0ドロップ:0オーバーラン:0キャリア:0 
 collisions:0 txqueuelen :1000 
 RXバイト:2974585(2.9 MB)TXバイト:1096580(1.0 MB)
割り込み:43ベースアドレス:0x60 00 
 
 loリンクencap:Local Loopback 
 inet addr:127.0.0.1 Mask:255.0.0.0 
 inet6 addr::: 1/128 Scope:Host 
 UP LOOPBACK RUNNING MTU:16436 Metric:1 
 RXパケット:10エラー:0ドロップ:0オーバーラン:0フレーム:0 
 TXパケット:10エラー:0ドロップ:0オーバーラン:0 carrier:0 
 collisions:0 txqueuelen:0 
 RX bytes:664(664.0 B)TX bytes:664(664.0 B)
 
 vnet0 Link encap :Ethernet HWaddr ca:0c:73:c3:bc:45 
 inet6 addr:fe80 :: c80c:73ff:fec3:bc45/64 Scope:Link 
 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric :1 
 RXパケット:226エラー:0ドロップ:0オーバーラン:0フレーム:0 
 TXパケット:429エラー:0ドロップ:0オーバーラン:0キャリア:0 
コリジョン:0 txqueuelen:500 
 RXバイト:26919(26.9 KB)TXバイト:58929(58.9 KB)
 
 virbr0リンクencap:Ethernet HWaddr d6:18:22:db: ff:9 3 
 inet addr:192.168.122.1 Bcast:192.168.122.255 Mask:255.255.255.0 
 UP BROADCAST MULTICAST MTU:1500 Metric:1 
 RX packets:0 errors:0 dropped: 0オーバーラン:0フレーム:0 
 TXパケット:0エラー:0ドロップ:0オーバーラン:0キャリア:0 
コリジョン:0 txqueuelen:0 
 RXバイト:0(0.0 B)TXバイト:0(0.0 B)

VM実行中のブリッジ構成:

$ brctl show 
 bridge name bridge id STP enabled interfaces 
 br0 8000.001e338807e5 no eth0 
 vnet0 
 virbr0 8000.000000000000はい

仮想マシンのvnet0インターフェイスとeth0インターフェイスの両方がbr0ブリッジに接続されていることに注意してください。

そして、br0インターフェース上のMAC:

$ brctl showmacs br0 
 port no mac addr is local?エージングタイマー
 1 00:05:5d:cf:64:61 no 2.54 
 1 00:19:d2:42:5d:3f no 36.76 
 1 00:19: df:da:af:7c no 2.86 
 1 00:1e:33:88:07:e5 yes 0.00 
 1 00:60:0f:e4:17:d6 no 0.79 
 2 52:54:00:12:34:56いいえ0.80 
 1 58:6d:8f:17:5b:c0いいえ5.91 
 1 c8:aa:21:be:8d :16いいえ167.69 
 2 ca:0c:73:c3:bc:45はい0.00

Br0インターフェイスは、ホストコンピューターをゲストが使用しているのと同じブリッジに接続することに注意してください。

traceroute 8.8.8.8を使用すると、NATが独自のネットワークにルーティングされるのではなく、ブリッジされていることを確認できます。最初のノードがゲストのIPアドレスではなくネットワークのルーターである場合、ネットワークは正しく機能しているはずです。

このドキュメント を参照してください。

virt-manager

virt-managerおよびhalがインストールされていることを確認してください。 halパッケージは、virt-managerの推奨される依存関係であり、ゲストの作成または編集時にシステムのネットワーク構成を決定するために使用されます。

上記のようにbr0ブリッジを定義しながら、次のようにvirt-managerで仮想マシンを作成しました。

enter image description hereenter image description hereenter image description hereenter image description hereenter image description here

このゲストから、ホームネットワークの残りの部分とインターネットに直接アクセスできました。また、ホームネットワーク上の他の(非ホスト、非ゲスト)Ubuntuコンピューターからsshを使用することもできました。

以下は、virt-managerによって実行される非常に長いkvmコマンドです(EApubsまたはこれに問題がある他の人との比較のため):

/ usr/bin/kvm -S -M pc-1.0 -enable-kvm -m 1024 -smp 1、sockets = 1、cores = 1、threads = 1 -name precise -uuid f057a729-eda6-4b85-84dc-f100c9ae3789- nodefconfig -nodefaults -chardev socket、id = charmonitor、path =/var/lib/libvirt/qemu/precise.monitor、server、nowait -mon chardev = charmonitor、id = monitor、mode = control -rtc base = utc -no- shutdown -drive file =/media/natty/home/gruber/ubuntu-kvm/tmpW8gSGB.qcow2、if = none、id = drive-ide0-0-0、format = qcow2 -device ide-drive、bus = ide.0 、unit = 0、drive = drive-ide0-0-0、id = ide0-0-0、bootindex = 1 -netdev tap、fd = 18、id = hostnet0 -device rtl8139、netdev = hostnet0、id = net0、mac = 52:54:00:0e:da:9b、bus = pci.0、addr = 0x3 -chardev pty、id = charserial0 -device isa-serial、chardev = charserial0、id = serial0 -usb -vnc 127.0.0.1: 0 -vga cirrus -device intel-hda、id = sound0、bus = pci.0、addr = 0x4 -device hda-duplex、id = sound0-codec0、bus = sound0.0、cad = 0 -device virtio-balloon- pci、id = balloon0、bus = pci.0、addr = 0x5

/etc/libvirt/qemu/quantal.xmlの仮想マシンの説明のネットワーク部分は次のとおりです。

    <interface type='bridge'>
      <mac address='52:54:00:b0:8e:aa'/>
      <source bridge='br0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>

this リンクによれば、パフォーマンスと信頼性のために、ネットワークデバイスモデルをvirtioに設定するのが最善かもしれません。virt-viewerでiボタン、NIC設定に移動し、「デバイスモデル」をvirtioに設定します。次の行を追加して、上記のXMLにこれを追加することもできます。

      <model type='virtio'/>

まとめ

これが12.04で行ったすべては:

  1. Virt-manager、bridge-utils、qemu-kvm、および関連パッケージのインストール
  2. Kvmを使用する各ユーザーがlibvirtdグループに属していることを確認してください。
  3. 上記のように/ etc/network/interfacesを定義します(引用された記事と一致します)
  4. リブートして、イーサネットが接続され、ワイヤレス(ある場合)がオフになっていることを確認します。
  5. たとえば、イメージに対してkvmを直接実行します。 -device e1000,netdev=tunnel -netdev tap,id=tunnel,ifname=vnet0、またはvirt-managerを使用して仮想マシンを作成し、[ステップ4->詳細オプション]パネルでネットワークブリッジbr0を指定します。

ネットワーク、機能、テンプレート、または構成を変更する必要はありません。

新しいゲストのサービスをインターネットに公開するには:

  1. 必要なファイアウォールサービスを準備して構成します。
  2. ゲスト構成またはDHCPサービスで静的アドレスを割り当てます。
  3. NATルーターを使用している場合、実装するサービスのポートを開いて、ゲストのIPアドレスに転送します。

ホストコンピューターのファイアウォールサービスをテストし、再度有効にすることを忘れないでください。ゲストにトラフィックを転送するためにエントリが必要になる場合があります。

https://help.ubuntu.com/community/KVM/Installationhttps://help.ubuntu.com/community/KVM/Networking 、および-を参照してください https://help.ubuntu.com/12.04/serverguide/libvirt.html

22
John S Gruber

表示されている動作がホストがゲストにアクセスでき、ゲストがホストにアクセスできるが、ゲストがネットワーク上の他のマシンにアクセスできない、またはその逆の場合...ホストのファイアウォールがアクセスをブロックしている可能性があります。

参照: https://bugs.launchpad.net/ubuntu/+source/ufw/+bug/573461

具体的には、このセクション:「最後のステップは、ブリッジでnetfilterを無効にすることです。

# cat >> /etc/sysctl.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0
EOF
6
Jeremy Spilman

これらは、qemu-kvmのブリッジを作成するために使用する2つのスクリプトです。

まず、ホストをIPルーターにします。

スクリプトip-router.sh

#!/bin/bash

internetinterface="eth0"

username=`whoami`

if [ "x$username" != "xroot" ] ; then

    echo    
    echo "You must be root in order to run this script..."
    echo    

    exit    

fi  

if [ "x$1" != "x" ] ; then
    internetinterface="$1"
fi  

if [ "x$1" == "xdel" ] || [ "x$2" == "xdel" ] ; then
    disable="1"
else
    disable="0"
fi  

if [ "$disable" == "0" ] ; then
    echo "Enabling IP forward and setting up masquerade NAT on interface $internetinterface"

    echo 1 > /proc/sys/net/ipv4/ip_forward

    iptables -t nat -A POSTROUTING -o $internetinterface -j MASQUERADE
else
    echo "Disable IP forward and setting down masquerade NAT on interface $internetinterface"

    echo 0 > /proc/sys/net/ipv4/ip_forward

    iptables -t nat -D POSTROUTING -o $internetinterface -j MASQUERADE
fi  

次に、tun-tapインターフェースを作成し、デフォルトのインターフェース(通常はインターネットに接続されているインターフェース)でbridgeインターフェースを作成します。

スクリプトcreate-qemu-bridged-tuntap.sh

#!/bin/bash

bridgename=br0
tapinterface=tap0
outinterface=eth1

if [ "x$1" != "x" ] ; then
    outinterface="$1"
fi  

ifaces=`awk -F: '{print $1}' /proc/net/dev | tail -n +3`
iffound="0"

for i in $ifaces
do  
    if [ "$outinterface" == "$i" ] ; then
            iffound="1"
    fi  
done

if [ "$iffound" == "0" ] ; then
    echo
    echo "Can't find the output interface."
    echo
    exit 1
fi  

outifaceip=`ifconfig | grep -A1 $outinterface | tail -1 | awk -F: '{print $2}' | awk '{print $1}'`
outifaceiptokens=`echo $outifaceip | awk -F \. '{print NF}'`

if [ "$outifaceiptokens" != "4" ] ;  then
    echo
    echo "The selected output interface $outinterface doesn't seem to have a valid IP address."
    echo
    exit 1
fi  

hostaddress="192.168.1.1"
guestaddress="192.168.1.95"

Sudo tunctl -t $tapinterface

Sudo brctl addbr $bridgename
Sudo brctl addif $bridgename $tapinterface

Sudo ip link set $bridgename up
Sudo ip addr add $hostaddress/24 dev $bridgename

Sudo route add -Host $guestaddress dev $bridgename
Sudo parprouted eth1 $bridgename

Sudo ~/scripts/ip-router.sh $outinterface

私はこれらのスクリプトを毎日使用しているので、あなたにとってもうまく機能するはずです。このすべてを機能させるには、いくつかのパッケージをインストールする必要があります。を使用して:

dlocate `which COMMAND`

COMMANDを持つために必要なパッケージを確認できます。たとえば、どのパッケージにbrctlが必要かを確認するには、次を実行します。

dlocate `which brctl`

あなたが持っています:

bridge-utils: /sbin/brctl

これらのスクリプトのすべてのコマンドに同じアプローチを使用して、(少なくとも)このaptitudeコマンドラインを実行する必要があります。

Sudo aptitude install dlocate iproute parprouted iptables uml-utilities bridge-utils net-tools

最後に、メインスクリプトを(通常のユーザーとして)起動できます。

#> create-qemu-bridged-tuntap.sh eth0
Set 'tap0' persistent and owned by uid 0
Enabling IP forward and setting up masquerade NAT on interface eth0

ip addrを実行すると、br0スクリプト内で指定されたIPアドレス192.168.1.1を持つcreate-qemu-bridged-tuntap.shインターフェイスが表示されます。

#> ip addr
8: br0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN 
    link/ether 36:76:ee:d6:63:b2 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.1/24 scope global br0

これは、guestから見たHost addressです。逆に、ゲストはIPアドレスとして192.168.1.95を持ちます(これもメインスクリプト内で簡単に変更できます)。

ここで、virt-managerを使用して、物理インターフェイスとしてbr0を使用するようにゲストnicをセットアップするだけです。

virt-manager-br0-nic

guest内で、eth0にIPアドレス192.168.1.95を与えるだけで、すべて正常に動作するはずです。

Slackware13:~> ifconfig 
eth0      Link encap:Ethernet  HWaddr 52:54:00:F7:6A:78  
          inet addr:192.168.1.95  Bcast:192.168.1.255  Mask:255.255.255.0
3
Avio