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

3 ответа

Решение

прелиминарии

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

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

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

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

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

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

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

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

virsh net-dumpxml default

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

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

авто ло
iface lo inet loopback
#auto eth0
#iface eth0 inet dhcp
авто eth0
iface eth0 inet инструкция
авто br0
iface br0 inet dhcp
    bridge_ports eth0
    Bridge_stp выключен
    bridge_fd 0
    bridge_maxwait 0 

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

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

NB. Как правило, вы не можете использовать беспроводную сеть вместо 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 list
по умолчанию через 192.168.1.1 dev br0  metric 100 
169.254.0.0/16 dev br0 Метрика ссылки области видимости 1000 
192.168.1.0/24 dev br0 Протока ядра, ссылка на источник src 192.168.1.45 
192.168.122.0/24 dev virbr0 ссылка на ядро ​​протока src 192.168.122.1 

Использование 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 up
brctl addif brctl addif br0 vnet0 

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

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

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

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

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

 $ Ifconfig
br0       Link encap:Ethernet  HWaddr 00:1e:33:88:07:e5  
          адрес в сети Интернет:192.168.1.45  Bcast:255.255.255.255 Маска:255.255.255.0
          inet6 адрес: fe80::21e:33ff:fe88:7e5/64 Область применения: ссылка
          UP BROADCAST RUNNING MULTICAST  MTU:1500 Метрика: 1
          Пакеты RX:6526 ошибок: 0 отброшено: 0 переполнений: 0 кадр: 0
          Пакеты TX:7543 ошибок: 0 отброшено: 0 переполнений: 0 несущая: 0
          столкновений:0 txqueuelen:0 
          RX байт:2712940 (2,7 МБ)  TX байт:1071835 (1,0 МБ)

eth0 Link encap: Ethernet HWaddr 00: 1e: 33: 88: 07: e5  
          UP BROADCAST RUNNING MULTICAST  MTU:1500 Метрика: 1
          Пакеты RX:7181 ошибок: 0 отброшено: 0 переполнений: 0 кадр: 0
          Пакеты TX:7740 ошибок: 0 отброшено: 0 переполнений: 0 несущая: 0
          столкновения:0 txqueuelen:1000 
          RX байт:2974585 (2,9 МБ)  TX байт:1096580 (1,0 МБ)
          Прерывание:43 Базовый адрес: 0x6000 

lo Link encap: Local Loopback  
          адрес в сети:127.0.0.1 маска:255.0.0.0
          inet6 адрес:::1/128 Область применения:Host
          UP LOOPBACK RUNNING  MTU:16436 Метрика: 1
          Пакеты RX: 10 ошибок: 0 отброшено: 0 переполнений: 0 кадр: 0
          Пакеты TX: 10 ошибок: 0 отброшено: 0 переполнений: 0 несущая: 0
          столкновений: 0 txqueuelen: 0 
          Байты RX:664 (664,0 B) байты TX:664 (664,0 B)

vnet0 Link encap: Ethernet HWaddr ca: 0c: 73: c3: bc: 45  
          inet6 адрес: fe80::c80c:73ff:fec3:bc45/64 Область действия: ссылка
          UP BROADCAST RUNNING MULTICAST  MTU:1500 Метрика: 1
          Пакеты RX:226 ошибок: 0 отброшено: 0 переполнений: 0 кадр: 0
          Пакеты TX:429 ошибок: 0 отброшено: 0 переполнений: 0 несущая: 0
          столкновений:0 txqueuelen:500 
          RX-байты:26919 (26,9 КБ). TX-байты:58929 (58,9 КБ).

virbr0    Link encap:Ethernet  HWaddr d6:18:22: дБ:ff:93  
          адрес в сети Интернет:192.168.122.1  Bcast:192.168.122.255 Маска:255.255.255.0
          UP BROADCAST MULTICAST  MTU:1500 Метрика: 1
          Пакеты RX: 0 ошибок: 0 отброшено: 0 переполнений: 0 кадр: 0
          Пакеты TX: 0 ошибок: 0 отброшено: 0 переполнений: 0 несущая: 0
          столкновений:0 txqueuelen:0 
          RX байтов:0 (0,0 B)  TX байтов:0 (0,0 B) 

Моя конфигурация моста во время работы виртуальной машины:

 $ brctl show
имя моста идентификатор моста с поддержкой STP
br0             8000.001e338807e5 нет eth0
                                                        vnet0
virbr0          8000.000000000000 да 

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

И MAC на интерфейсе br0:

 $ brctl showmacs br0
порт нет mac addr является локальным? таймер старения
  1 00:05:5д: ср: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 с8: аа:21: бе: 8д: 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:

введите описание здесьвведите описание здесьвведите описание здесьвведите описание здесьвведите описание здесь

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

Вот очень долго kvm команда, запускаемая virt-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/ точный.monitor, сервер,nowait -mon chardev=charmonitor,id= монитор, режим = контроль -rtc base=utc -no-shutdown -drive file=/media/natty/home/gruber/ubuntu-kvm/tmpW8gSGB.qcow2, если = нет,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 -устройство rtl8139,netdev=hostnet0,id=net0,mac=52:54:00:0e:da:9b, шина =pci.0,addr=0x3 -chardev pty,id=charserial0 -устройство isa-serial,chardev=charserial0,id=serial0 -usb -vnc 127.0.0.1:0 -vga cirrus -устройство intel-hda,id=sound0,bus=pci.0,addr=0x4 -устройство hda-duplex,id=sound0-codec0,bus=sound0.0,cad=0 -девайс virtio-balloon- PCI, ID =balloon0, автобус = pci.0, адр =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>

Согласно этой ссылке, для производительности и надежности, может быть лучше установить модель сетевого устройства на 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. Перезагрузитесь, убедившись, что 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/+source/ufw/+bug/573461

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

# 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

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

Во-первых, пусть хост станет 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

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

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

вирт-менеджер-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
Другие вопросы по тегам