KVM Bridged Network no funciona

20

Acabo de instalar KVM en mi Servidor Ubuntu de acuerdo con esta guía: enlace

Luego preparó una red en puente como se muestra aquí: enlace

Luego, creé una máquina virtual con virt-manager. Lo intenté varias veces, pero el invitado no puede conectarse a la red. ¿Alguna ayuda?

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

ruta 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

* En el invitado * no pude copiar pegar la información del invitado porque no puedo enviarla. No obtuvo ningún ip de DHCP. No funcionará incluso después de configurarlo manualmente.

    
pregunta THpubs 23.08.2012 - 16:56

3 respuestas

18

Preliminares

Esto siguiente funcionó para Ubuntu 12.04. Debe desactivar el firewall de su computadora mientras prueba esto para que no interfiera.

El archivo / etc / default / qemu-kvm debe estar como originalmente instalado.

Necesitará tener bridge-utils qemu -kvm y libvirt-bin instalado. Cualquier usuario que use máquinas virtuales debe agregarse al grupo libvirtd.

Ya no parece ser necesario agregar CAP_NET_ADMIN capacidad.

Configuración de red

El modo de red predeterminado es el modo de usuario, también llamado SLIRP. Utiliza un puente virbr0 predefinido que se enruta NAT a la computadora invitada. El enrutamiento NAT utiliza la función ip_forwarding del kernel y iptables . El modo puente usa un puente virtual en el invitado al que se conecta la interfaz Ethernet (no numerada) y en la que tanto el host como el invitado tienen sus interfaces de red.

Los siguientes diagramas pueden aclarar las diferencias:

Puede ver cómo se define la red de usuario predeterminada con:

virsh net-dumpxml default

Puedo configurar el modo de puente con los siguientes enfoques:

En / etc / network / interfaces (de la parte puente de la publicación que mencionas en tu pregunta):

auto lo
iface lo inet loopback
#auto eth0
#iface eth0 inet dhcp
auto eth0
iface eth0 inet manual
auto br0
iface br0 inet dhcp
    bridge_ports eth0
    bridge_stp off
    bridge_fd 0
    bridge_maxwait 0

Reiniciar; y asegúrese de que la red inalámbrica no esté activa. Verifique la ruta IP predeterminada con ip route . Debe estar utilizando la interfaz br0.

N.B. Si su Ethernet no está conectada cuando se realiza este cambio, necesita conectar su cable Ethernet y obtener un operador, o el arranque se bloqueará durante dos minutos y no tendrá capacidad de red Eso es porque el eth0 La interfaz, al estar en este archivo, debe aparecer antes de que el inicio pueda continuar normalmente.

N.B. En general, no se puede usar una red inalámbrica en lugar de eth0 debido a su incapacidad para usar múltiples direcciones MAC (infiero que necesitan una segunda para el puente).

Como alternativa, puede desactivar el uso de Ethernet y asegurarse de que no tenga una dirección IP, y que no haya una ruta predeterminada configurada con ip route . Entonces:

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

También podría proporcionar una dirección IP estática aquí, así como también definir la ruta predeterminada y la dirección DNS. Para este ejemplo dhclient hace esto.

Aquí está mi tabla de rutas:

$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

Uso de kvm

Luego puedo iniciar una máquina kvm puenteada con:

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

El parámetro -netdev tap hace sudo un requisito. A medida que se inicia vm, qemu-kvm ejecuta los siguientes comandos:

ifconfig vnet0 0.0.0.0 up
brctl addif brctl addif br0 vnet0

Esto lo hace / etc / qemu-ifup

La interfaz de vnet0 de vm se agrega al puente br0 porque la ruta predeterminada anterior usa esa interfaz de puente. Si no estuviera allí, la interfaz de tap se agregaría a la interfaz virbr0. Como eso no está conectado a Internet, NAT se usaría para conectar al invitado al host y a Internet en mis experimentos. Puede dirigir el vnet0 a un puente en particular en / etc / default / qemu-kvm. Usando virt-manager a continuación, puede indicar explícitamente a qué puente conectarse.

Debido a los comandos anteriores emitidos por qemu-kvm, y el parámetro -netdev tap,id=tunnel,ifname=vnet0 , la máquina virtual vm está conectada al túnel vnet0 y el túnel está conectado al puente br0.

Ahora puedo acceder directamente a esta cuenta de invitado desde otra computadora de mi red.

Mi host ifconfig (observe la interfaz de vnet0 que aparece en mi red cuando se está ejecutando vm):

$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 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)

La configuración de mi puente al ejecutar la máquina virtual:

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

Tenga en cuenta que tanto la interfaz vnet0 de la máquina virtual como la interfaz eth0 están conectadas al puente br0.

Y los MAC en la interfaz br0:

$brctl showmacs br0
port no mac addr        is local?   ageing timer
  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   no         0.80
  1 58:6d:8f:17:5b:c0   no         5.91
  1 c8:aa:21:be:8d:16   no       167.69
  2 ca:0c:73:c3:bc:45   yes        0.00

Tenga en cuenta que la interfaz br0 conecta mi computadora host al mismo puente que usa el invitado.

Puede verificar que está puenteado en lugar de NAT enrutado a su propia red utilizando traceroute 8.8.8.8 . Si el primer nodo es el enrutador de su red en lugar de la dirección IP del huésped, su red debería funcionar correctamente.

Consulte esta documentación .

virt-manager

Asegúrese de haber instalado virt-manager y hal . El paquete hal es una dependencia sugerida para virt-manager y se usa para determinar la configuración de red de su sistema al crear o editar invitados.

Mientras tenía el puente br0 definido como anteriormente, creé una máquina virtual con virt-manager de la siguiente manera:

Pude ir directamente al resto de la red de mi casa y a Internet desde este invitado. También pude acceder desde la otra computadora Ubuntu (no anfitriona, no huésped) en mi red doméstica.

Este es el muy largo comando kvm ejecutado por virt-manager (para compararlo con EApubs o cualquier otra persona que tenga problemas con esto):

/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

Aquí está la parte de la red de la descripción de la máquina virtual en /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>

De acuerdo con este enlace, por rendimiento y confiabilidad, puede ser mejor que configure el modelo de dispositivo de red en virtio , puede hacerlo en el virt-viewer presionando el botón i , yendo a la configuración de NIC y configurando el "Modelo de dispositivo" en virtio . También puede agregar esto al xml anterior agregando la línea:

      <model type='virtio'/>

En resumen

Todo esto tomó 12.04 fue:

  1. Instalación de virt-manager, bridge-utils, qemu-kvm y paquetes relacionados
  2. Asegúrese de que cada usuario que desee usar kvm esté en el grupo libvirtd.
  3. Definir / etc / network / interfaces como se indicó anteriormente (que coincide con el artículo citado)
  4. Reinicie, asegurándose de que Ethernet esté conectado y de que esté inactivo (si corresponde).
  5. Ejecuta kvm contra una imagen directamente con, p. ej. -device e1000,netdev=tunnel -netdev tap,id=tunnel,ifname=vnet0 , o cree una máquina virtual con virt-manager, especificando Bridge br0 de la red en el panel de Opciones avanzadas del paso 4- & gt;

No se necesitaban más cambios para redes, capacidades, plantillas o configuraciones.

Para exponer un servicio en su nuevo invitado a Internet, debe:

  1. Prepare y configure cualquier servicio de firewall que necesite.
  2. Asigne una dirección estática en su configuración de invitado o en su servicio DHCP.
  3. Si está utilizando un enrutador NAT, abra un puerto para el servicio que está implementando y diríjalo a la dirección IP del invitado.

Recuerde probar y volver a habilitar el servicio de firewall para su computadora host. Puede necesitar cualquier entrada para reenviar el tráfico al invitado.

Consulte enlace , enlace , y enlace .

    
respondido por el John S Gruber 15.09.2012 - 00:34
3

Estos son los dos scripts que uso para crear un puente para qemu-kvm .

Primero, permita que el host se convierta en un enrutador de IP.

Script 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" != "x" ] ; then
    internetinterface=""
fi  

if [ "x" == "xdel" ] || [ "x" == "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  

Luego, cree la interfaz tun-tap y bridge con su interfaz predeterminada (generalmente la que tiene conexión a Internet).

Script create-qemu-bridged-tuntap.sh :

#!/bin/bash

bridgename=br0
tapinterface=tap0
outinterface=eth1

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

ifaces='awk -F: '{print }' /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 }' | awk '{print }''
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

Utilizo estos scripts diariamente, por lo que también deberían funcionar bien para ti. Tendrás que instalar algún paquete para que todo esto funcione. Usando:

dlocate 'which COMMAND'

puede ver qué paquete se requiere para tener COMMAND . Por ejemplo, para ver qué paquete se requiere para tener brctl , simplemente ejecute:

dlocate 'which brctl'

y tendrás:

bridge-utils: /sbin/brctl

Utilizando el mismo enfoque para todos los comandos en estos scripts, debe (al menos) ejecutar esta línea de comando aptitude :

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

Finalmente, puede iniciar el script principal (como un usuario normal):

#> 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

Ejecutando ip addr debería ver una interfaz br0 con la dirección IP 192.168.1.1 , como se especifica dentro del script 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

Este es el host address como lo ve el guest . Por el contrario, el invitado tendrá como dirección IP 192.168.1.95 (de nuevo, esto se puede cambiar fácilmente dentro del script principal).

Ahora, usando virt-manager , solo tiene que configurar su invitado para usar br0 como interfaz física.

Dentro del guest , solo tiene que dar a eth0 una dirección IP de 192.168.1.95 y todo debe funcionar bien.

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
    
respondido por el Avio 14.09.2012 - 09:32
3

Si el comportamiento que está viendo es el host puede acceder al huésped y el invitado puede acceder al host, pero el invitado no puede acceder a otras máquinas en la red o viceversa ... probablemente el firewall del host esté bloqueando el acceso.

Ver: enlace

Específicamente, esta sección: "El último paso es desactivar netfilter en el puente:

# 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
    
respondido por el Jeremy Spilman 13.06.2013 - 05:59

Lea otras preguntas en las etiquetas