Мостовая сеть KVM Не работает

Я только что установил KVM на свой сервер Ubuntu в соответствии с этим руководством : 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 :

 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. Он не получил никакого ip-адреса от DHCP. Не будет работать даже после настройки вручную.

Предварительные мероприятия

Это следующее сработало для меня в Ubuntu 12.04. Во время тестирования вам следует отключить брандмауэр вашего компьютера, чтобы он не мешал работе.

Файл /etc/default/qemu-kvm должен быть таким, как был установлен изначально.

Вам нужно будет иметь мост-утилитыInstall bridge-utils qemu-kvmInstall qemu-kvm и libvirt-binInstall libvirt-bin установленный. Все пользователи, использующие виртуальные машины, должны быть добавлены в группу libvirtd.

Похоже, больше нет необходимости добавлять возможность CAP_NET_ADMIN.

Настройка сети

Сетевым режимом по умолчанию является пользовательский режим, также называемый SLIRP. Он использует предопределенный мост virbr0, который маршрутизируется NAT на гостевой компьютер. Маршрутизация NAT использует функцию ip_forwarding ядра и iptables. Режим моста использует виртуальный мост в гостевой системе, к которому подключается (ненумерованный) интерфейс Ethernet и на котором как хост, так и гость имеют свои сетевые интерфейсы.

Следующие диаграммы могут прояснить различия:

Network diagrams

Вы можете увидеть, как определяется пользовательская сеть по умолчанию с помощью:

virsh net-dumpxml default

Я могу настроить мостовой режим с помощью следующих подходов:

В /etc /network /interfaces (из связующей части сообщения, которое вы упомянули в своем вопросе):

auto loiface lo inet loopback#auto eth0#iface eth0 inet dhcpauto eth0iface eth0 inet manualauto br0iface br0 inet dhcp bridge_ports eth0 bridge_stp off bridge_fd 0 bridge_maxwait 0

Перезагрузитесь; и убедитесь, что беспроводная сеть не активна. Проверьте IP-маршрут по умолчанию с помощью ip route. Он должен использовать интерфейс br0.

Примечание. Если ваш Ethernet не подключен при внесении этого изменения, вам необходимо подключить кабель Ethernet и подключить носитель, иначе загрузка зависнет на две минуты, и у вас не будет возможности подключения к сети Это связано с тем, что интерфейс eth0, находясь в этом файле, должен появиться до того, как загрузка сможет продолжаться нормально.

Примечание: Как правило, вы не можете использовать беспроводную сеть вместо eth0 из-за их неспособности использовать несколько MAC-адресов (я предполагаю, что им нужен второй для моста).

В качестве альтернативы вы можете отключить использование Ethernet и убедиться, что у него нет 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 listdefault 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 обязательным требованием. При запуске виртуальной машины qemu-kvm выполняет следующие команды:

ifconfig vnet0 0.0.0.0 brctl addif brctl addif br0 vnet0

Это делается с помощью /etc/qemu-ifup

Интерфейс vnet0 виртуальной машины добавляется к мосту br0, потому что приведенный выше маршрут по умолчанию использует этот интерфейс моста. Если бы его там не было, интерфейс tap вместо этого был бы добавлен к интерфейсу virbr0. Поскольку он не подключен к Интернету, в моих экспериментах NAT будет использоваться для подключения гостя к хосту и Интернету. Вы можете направить vnet0 на определенный мост в /etc/default/qemu-kvm. Используя virt-manager, приведенный ниже, вы можете явно указать, к какому мосту подключаться.

Из-за вышеуказанных команд, выданных qemu-kvm, и -netdev tap,id=tunnel,ifname=vnet0 параметр, виртуальная машина виртуальной машины подключена к туннелю vnet0, а туннель подключен к мосту br0.

Теперь я могу напрямую подключиться к этой гостевой виртуальной машине по ssh с другого компьютера в моей сети.

Мой хозяин ifconfig (обратите внимание на интерфейс vnet0, который появляется в моей сети при запуске виртуальной машины):

$ifconfigbr0       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 packets:6526 errors:0 dropped:0 overruns:0 frame:0          TX packets:7543 errors:0 dropped:0 overruns:0 carrier:0          collisions:0 txqueuelen:0           RX bytes: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 packets:7181 errors:0 dropped:0 overruns:0 frame:0          TX packets:7740 errors:0 dropped:0 overruns:0 carrier:0          collisions:0 txqueuelen:1000           RX bytes:2974585 (2.9 MB)  TX bytes:1096580 (1.0 MB)          Interrupt:43 Base address:0x6000 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:10 errors:0 dropped:0 overruns:0 frame:0          TX packets:10 errors:0 dropped:0 overruns: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 packets:226 errors:0 dropped:0 overruns:0 frame:0          TX packets:429 errors:0 dropped:0 overruns:0 carrier:0          collisions:0 txqueuelen:500           RX bytes:26919 (26.9 KB)  TX bytes:58929 (58.9 KB)virbr0    Link encap:Ethernet  HWaddr d6:18:22:db:ff:93            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 showbridge name идентификатор моста интерфейсы с поддержкой stpbr0 8000.001e338807e5 нет eth0 vnet0virbr0 8000.000000000000 да

Обратите внимание, что как интерфейс виртуальной машины vnet0, так и интерфейс eth0 подключены к мосту br0.

И MAC находится на интерфейсе br0:

$brctl showmacs br0port ни один mac-адрес не является локальным?   таймер старения 1 00:05:5d:cf:64:61 нет 2.54 1 00:19:d2:42:5d:3f нет 36.76 1 00:19:df:da:af:7c нет 2.86 1 00:1e:33:88:07:e5 да 0.00 1 00:60:0f:e4:17:d6 нет 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 соединяет мой главный компьютер с тем же мостом, который используется гостем.

Вы можете проверить, что вы подключены к мосту, а не к NAT, маршрутизируемому в вашу собственную сеть, используя traceroute 8.8.8.8. Если первым узлом является маршрутизатор вашей сети, а не IP-адрес гостя, ваша сеть должна работать правильно.

Видеть эта документация.

вирт-менеджер

Убедитесь, что вы установили 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

Я смог напрямую подключиться к остальной части моей домашней сети и к Интернету от этого гостя. Я также смог подключиться к нему по ssh с другого (не хоста, не гостя) Компьютер Ubuntu в моей домашней сети.

Вот очень длинный kvm команда, выполняемая virtual-manager (для сравнения с EApubs или кем-либо еще, у кого возникли проблемы с этим):

/usr/bin/kvm -S -M pc-1.0 -enable-kvm -m 1024 -smp 1,сокеты=1,ядра=1,потоки=1 -точное имя -uuid f057a729-eda6-4b85-84dc-f100c9ae3789 -nodefconfig -nodefaults -сокет chardev,id=charmonitor,путь=/var/lib/libvirt/qemu/precise.monitor,сервер,nowait -mon chardev=charmonitor,id=monitor,mode=control -rtc base=utc -no-shutdown -файл диска=/media/natty/home/gruber/ubuntu-kvm/tmpW8gSGB.qcow2,если=нет,id=drive-ide0-0-0,format=qcow2 -ide-диск устройства,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0,bootindex=1 -netdev tap,fd=18,id=hostnet0 -устройство rt для самолеты 813 теперь,netdev=hostnet0,id=net0,mac=52:54:00:0e:da:9b,шина=pci.0,addr=0x3 -chardev pty,id=charserial0 -isa-последовательное устройство,chardev=charserial0,id=serial0 -usb -vnc 127.0.0.1:0 -vga cirrus -устройство intel-hda,id=sound0,шина=pci.0,addr=0x4 -устройство hda-duplex,id=sound0-codec0,шина=sound0.0,cad=0 -устройство virtio-balloon-pci,идентификатор=balloon0,шина=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>

Согласно с этот link, для повышения производительности и надежности, возможно, лучше всего установить модель сетевого устройства на virtio, вы можете сделать это в программе просмотра виртуальных машин, нажав на i кнопку, переходя к настройке сетевого адаптера и устанавливая "Модель устройства" на virtio. Вы также можете добавить это в приведенный выше XML, добавив строку:

      <model type='virtio'/>

Вкратце

Все это произошло 12.04 было:

  1. Установка virt-manager, bridge-utils, qemu-kvm и связанных с ними пакетов
  2. Убедитесь, что каждый пользователь, желающий использовать kvm, находится в группе libvirtd.
  3. Определение /etc /network/interfaces, как указано выше (которые соответствуют цитируемой статье)
  4. Перезагрузитесь, убедившись, что Ethernet подключен, а беспроводная связь (если таковая имеется) отключена.
  5. Либо запустите kvm непосредственно для изображения с помощью, например -device e1000,netdev=tunnel -netdev tap,id=tunnel,ifname=vnet0>, или создайте виртуальную машину с помощью virt-manager, указав сетевой мост br0 на панели Шаг 4-Дополнительные параметры.

Никаких дополнительных изменений в сети, возможностях, шаблонах или конфигурациях не требовалось.

Чтобы предоставить доступ к Интернету службе вашего нового гостя, вам следует:

  1. Подготовьте и настройте любую необходимую вам службу брандмауэра.
  2. Либо назначьте статический адрес в вашей гостевой конфигурации, либо в вашей службе DHCP.
  3. Если вы используете маршрутизатор NAT, откройте порт для реализуемой вами службы, направив его на IP-адрес гостя.

Не забудьте протестировать и повторно включить службу брандмауэра для вашего главного компьютера. Для переадресации трафика гостю может потребоваться любая запись.

Видеть https://help.ubuntu.com/community/KVM/Installation, https://help.ubuntu.com/community/KVM/Networking, и https://help.ubuntu.com/12.04/serverguide/libvirt.html.

Если поведение, которое вы видите, заключается в том, что хост может получить доступ к гостю, а гость может получить доступ к хосту, но гость не может получить доступ к другим машинам в сети или наоборот ... вероятно, брандмауэр хоста блокирует доступ.

Видеть: https://bugs .launchpad.net/ubuntu /+источник/ufw/+ошибка/573461

В частности, этот раздел: "Последний шаг - отключить netfilter на мосту:

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

Это два сценария, которые я использую для создания моста для qemu-kvm.

Во-первых, пусть хост станет IP-маршрутизатором.

Скрипт ip-router.sh:

#!/bin/bashinternetinterface="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 MASQUERADEelse    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 MASQUERADEfi  

Затем создайте tun-tap интерфейс и bridge это с вашим интерфейсом по умолчанию (обычно с подключением к Интернету).

Скрипт create-qemu-bridged-tuntap.sh:

#!/bin/bashbridgename=br0tapinterface=tap0outinterface=eth1if [ "x$1" != "x" ] ; then    outinterface="$1"fi  ifaces=`awk -F: '{print $1}' /proc/net/dev | tail -n +3`iffound="0"for i in $ifacesdo      if [ "$outinterface" == "$i" ] ; then            iffound="1"    fi  doneif [ "$iffound" == "0" ] ; then    echo    echo "Can't find the output interface."    echo    exit 1fi  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 1fi  hostaddress="192.168.1.1"guestaddress="192.168.1.95"sudo tunctl -t $tapinterfacesudo brctl addbr $bridgenamesudo brctl addif $bridgename $tapinterfacesudo ip link set $bridgename upsudo ip addr add $hostaddress/24 dev $bridgenamesudo route add -host $guestaddress dev $bridgenamesudo parprouted eth1 $bridgenamesudo ~/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 eth0Set 'tap0' persistent and owned by uid 0Enabling IP forward and setting up masquerade NAT on interface eth0

Бегущий ip addr вы должны увидеть br0 интерфейс с IP-адресом 192.168.1.1, как указано внутри create-qemu-bridged-tuntap.sh скрипт:

#> ip addr8: 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

Это host address как видно из guest. И наоборот, гость будет иметь в качестве IP-адреса 192.168.1.95 (опять же, это можно легко изменить внутри основного скрипта).

Теперь, используя virt-manager, вам просто нужно настроить свой гостевой сетевой адаптер для использования br0 как физический интерфейс.

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

Могу ли я предложить вам предоставить выходные данные следующих команд? На хосте: ifconfig, brctl show, brctl showmacs br0 и ip route. На гостевой: ifconfig, ip route, ping 8.8.8.8, ping <ваш интернет-маршрутизатор> и traceroute 8.8.8.8. Я не могу сказать, что я настроил kvm так, как вы, но я заставил мост работать с помощью команды kvm. Мне действительно пришлось отключить беспроводную связь, чтобы мой хост подключился к Интернету, и, как указано в приведенных вами инструкциях, вам нужно подключиться к Интернету с помощью Ethernet.

@JohnSGruber только что добавил запрошенную вами информацию. Но я не смог скопировать и вставить информацию от гостя, потому что не могу подключиться к нему по ssh. Он не получил никакого ip-адреса от DHCP. Не будет работать даже после настройки вручную.

Указан ли MAC-адрес, который вы назначили гостю, в списке brctl showmacs br0 выше?

Я не добавлял mac вручную… но позвольте мне проверить mac, который он получил…

@JohnSGruber Нет, я не вижу здесь этого мака!