web-dev-qa-db-fra.com

KVM Le réseau ponté ne fonctionne pas

Je viens d'installer KVM sur mon serveur Ubuntu conformément à ce guide: https://help.ubuntu.com/community/KVM/Installation

Ensuite, préparez un réseau ponté comme indiqué ci-dessous: https://help.ubuntu.com/community/KVM/Networking

Ensuite, j'ai créé une machine virtuelle avec virt-manager. J'ai essayé plusieurs fois mais l'invité ne parvient pas à se connecter au réseau! De l'aide?

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

route 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

* Dans l'invité * , je ne pouvais pas copier-coller les informations de l'invité, car je ne pouvais pas le faire ssh. Il n'a reçu aucune adresse IP de DHCP. Ne fonctionnera pas même après l'avoir configuré manuellement.

21
THpubs

Préliminaires

Cette suite a fonctionné pour moi pour Ubuntu 12.04. Vous devez désactiver le pare-feu de votre ordinateur lorsque vous le testez pour qu'il n'interfère pas.

Le fichier/etc/default/qemu-kvm doit être tel qu’il a été installé à l’origine.

Vous aurez besoin de bridge-utilsInstall bridge-utilsqemu-kvmInstall qemu-kvm et libvirt-binInstall libvirt-bin installé. Tous les utilisateurs de machines virtuelles doivent être ajoutés au groupe libvirtd.

Il ne semble plus nécessaire d'ajouter de la capacité CAP_NET_ADMIN.

Configuration du réseau

Le mode réseau par défaut est le mode utilisateur, également appelé SLIRP. Il utilise un pont prédéfini virbr0 qui est NAT routé vers l'ordinateur invité. Le routage NAT utilise la fonctionnalité ip_forwarding du noyau et iptables . Le mode pont utilise un pont virtuel dans l'invité auquel l'interface Ethernet (non numérotée) se connecte et sur lequel l'hôte et l'invité ont leurs interfaces réseau.

Les diagrammes suivants peuvent rendre les différences plus claires:

Network diagrams

Vous pouvez voir comment le réseau d'utilisateurs par défaut est défini avec:

virsh net-dumpxml default

Je peux configurer le mode ponté avec les approches suivantes:

Dans/etc/network/interfaces (à partir de la partie relais du message que vous avez mentionné dans votre question):

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

Redémarrer; et assurez-vous que le réseau sans fil n'est pas actif. Vérifiez la route IP par défaut avec ip route. Il doit utiliser l'interface br0.

N.B. Si votre réseau Ethernet n’est pas branché lorsque cette modification est apportée, vous devez brancher votre câble Ethernet et obtenir un opérateur ou le démarrage sera suspendu pendant deux minutes et vous n’aurez pas la capacité du réseau L’interface eth0, en étant dans ce fichier, doit apparaître avant que le démarrage ne puisse se dérouler normalement.

N.B. En règle générale, vous ne pouvez pas utiliser un réseau sans fil au lieu de eth0 en raison de leur incapacité à utiliser plusieurs adresses MAC (je suppose qu'ils ont besoin d'une seconde pour le pont).

Vous pouvez également désactiver l'utilisation d'Ethernet et vous assurer qu'il ne possède pas d'adresse IP et qu'aucun chemin par défaut n'est configuré avec ip route. Ensuite:

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

Vous pouvez également fournir ici une adresse IP statique, ainsi que définir l'itinéraire et l'adresse DNS par défaut. Pour cet exemple, dhclientfait ceci.

Voici mon tableau de route:

$ ip route list 
 par défaut via 192.168.1.1 métrique de dév br0 100 
 169.254.0.0/16 lien de portée dev br0 métrique 1000 
 192.168.1.0/24 lien de portée de noyau proto src 192.168.1.45 
 192.168.122.0/24 dev virbr0 proto noyau portée lien src 192.168.122.1

Utilisation de kvm

Je peux alors démarrer une machine kvm pontée avec:

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

Le paramètre -netdev tap fait de Sudo une exigence. Au démarrage de VM, qemu-kvm exécute les commandes suivantes:

ifconfig vnet0 0.0.0.0 jusqu'à 
 brctl addif brctl addif br0 vnet0

Ceci est fait par/etc/qemu-ifup

L'interface vnet0 de la machine virtuelle est ajoutée au pont br0 car la route par défaut ci-dessus utilise cette interface de pont. S'il n'y en avait pas, l'interface tap serait à la place ajoutée à l'interface virbr0. Puisque ce n'est pas connecté à Internet, NAT serait utilisé pour connecter l'invité à l'hôte et à Internet, dans le cadre de mes expériences. Vous pouvez diriger le vnet0 vers un pont particulier dans/etc/default/qemu-kvm. En utilisant virt-manager ci-dessous, vous pouvez indiquer explicitement à quel pont vous connecter.

En raison des commandes ci-dessus émises par qemu-kvm et du paramètre -netdev tap,id=tunnel,ifname=vnet0, la machine virtuelle vm est connectée au tunnel vnet0 et le tunnel est connecté au pont br0.

Je peux maintenant directement ssh dans cet invité VM à partir d'un autre ordinateur de mon réseau.

Mon hôte ifconfig(notez l'interface vnet0 qui apparaît sur mon réseau lorsque le VM est en cours d'exécution):

$ ifconfig 
 br0 Encapsulation de la liaison: Ethernet HWaddr 00: 1e: 33: 88: 07: e5 
 inet addr: 192.168.1.45 Transmission: 255.255.255.255 Masque: 255.255.255.0 
 inet6 addr: fe80 :: 21e: 33ff: fe88: 7e5/64 Portée: Link 
 UP BROADCAST RUNNING MULTICAST MTU: 1500 Métrique: 1 
 Paquets RX: 6526 erreurs: 0 supprimées: 0 Remplacées: 0 trame: 0 
 Paquets TX: 7543 erreurs: 0 omis: 0 dépassements: 0 porteuse: 0 
 Collisions: 0 txqueuelen: 0 
 Octets RX: 2712940 (2,7 Mo) TX octets: 1071835 (1,0 Mo) 
 
 eth0 Encapsulation de la liaison: Ethernet HWaddr 00: 1e: 33: 88: 07: e5 
 UP DIFFUSION RUNNING MULTICAST MTU: 1500 Métrique: 1 
 Paquets RX: 7181 erreurs: 0 omis: 0 dépassements: 0 image: 0 
 Paquets TX: 7740 erreurs: 0 omis: 0 dépassements: 0 porteur: 0 
 Collisions: 0 txqueuelen : 1000 
 Octets RX: 2974585 (2,9 Mo) Octets TX: 1096580 (1,0 Mo) 
 Interruption: 43 Adresse de base: 0x60 00 
 
 Lo Encapsulation de la liaison: boucle locale 
 Inet addr: 127.0.0.1 Masque: 255.0.0.0 
 Inet6 addr: :: 1/128 Portée: Hôte 
 UP LOOPBACK RUNNING MTU: 16436 Métrique: 1 
 Paquets RX: 10 erreurs: 0 omis: 0 dépassements: 0 image: 0 
 Paquets TX: 10 erreurs: 0 omis: 0 : 0 transporteur: 0 
 Collisions: 0 txqueuelen: 0 
 Octets RX: 664 (664.0 B) octets TX: 664 (664.0 B) 
 
 Vnet0 lien encap. : Ethernet HWaddr ca: 0c: 73: c3: bc: 45 
 Inet6 addr: fe80 :: c80c: 73ff: fec3: bc45/64 Portée: Lien 
 JUSQU'À UNE DIFFUSION MULTIMÉDIA MTU: 1500 métrique : 1 
 Paquets RX: 226 erreurs: 0 omis: 0 dépassements: 0 image: 0 
 Paquets TX: 429 erreurs: 0 omis: 0 dépassements: 0 porteur: 0 
 Collisions : 0 txqueuelen: 500 
 Octets RX: 26919 (26,9 KB) octets TX: 58929 (58,9 KB) 
 
 Virbr0 Encapsulation de liaison: Ethernet HWaddr d6: 18: 22: db: ff: 9 3 
 Inet addr: 192.168.122.1 Bcast: 192.168.122.255 Masque: 255.255.255.0 
 UP BROADCAST MULTICAST MTU: 1500 Métrique: 1 
 Paquets RX: 0 erreurs: 0 supprimées: 0 dépassements: 0 trame: 0 
 Paquets TX: 0 erreurs: 0 omis: 0 dépassements: 0 porteuse: 0 
 Collisions: 0 txqueuelen: 0 
 Octets RX: 0 (0.0 B) octets TX: 0 (0,0 B)

Ma configuration de pont lors de l'exécution de la machine virtuelle:

$ brctl affiche 
 nom du pont identifiant du pont STP interfaces activées 
 br0 8000.001e338807e5 non eth0 
 vnet0 
 virbr0 8000.000000000000 oui

Notez que l'interface vnet0 de la machine virtuelle et l'interface eth0 sont connectées au pont br0.

Et le MAC sur l'interface br0:

$ brctl showmacs br0 
 port aucune adresse mac est locale? vieillissement minuterie 
 1 00: 05: 5d: cf: 64: 61 non 2.54 
 1 00: 19: d2: 42: 5d: 3f non 36,76 
 1 00:19: df: da: af: 7c non 2.86 
 1 00: 1e: 33: 88: 07: e5 oui 0.00 
 1 00: 60: 0f: e4: 17: d6 non 0,79 
 2 52: 54: 00: 12: 34: 56 non 0,80 
 1 58: 6d: 8f: 17: 5b: c0 non 5,91 
 1 c8: aa: 21: être: 8d : 16 non 167,69 
 2 ca: 0c: 73: c3: bc: 45 oui 0,00

Notez que l'interface br0 connecte mon ordinateur hôte au même pont utilisé par l'invité.

Vous pouvez vérifier que vous êtes ponté plutôt que NAT sur votre propre réseau à l'aide de traceroute 8.8.8.8. Si le premier nœud est le routeur de votre réseau plutôt que l'adresse IP de l'invité, votre réseau devrait fonctionner correctement.

Voir cette documentation .

virt-manager

Assurez-vous d'avoir installé virt-manager et halname__. Le package halest une dépendance suggérée pour virt-manager et est utilisé pour déterminer la configuration réseau de votre système lors de la création ou de la modification d'invités.

Tout en ayant le pont br0 défini comme ci-dessus, j'ai créé une machine virtuelle avec virt-manager comme suit:

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

J'ai pu accéder directement au reste de mon réseau domestique et à Internet à partir de cet invité. J'ai également pu entrer en ssh depuis l'autre ordinateur Ubuntu (non hôte, non invité) de mon réseau domestique.

Voici la très longue commande kvmexécutée par virt-manager (pour comparaison avec EApubs ou toute autre personne ayant des problèmes avec cela):

/ usr/bin/kvm -S -M pc-1.0 -enable-kvm -m 1024 -smp 1, sockets = 1, cœurs = 1, threads = 1 -nom précis -uuid f057a729-eda6-4b85-84dc-f100c9ae3789 - nodefconfig -nodefaults -chardev socket, id = charmonitor, chemin =/var/lib/libvirt/qemu/precise.monitor, serveur, maintenant -mon chardev = charmonitor, id = moniteur, mode = contrôle -rtc base = utc -no- shutdown -drive file =/media/natty/home/gruber/ubuntu-kvm/tmpW8gSGB.qcow2, si = aucun, id = lecteur-ide0-0-0, format = qcow2 -appareil id-drive, bus = ide.0 , unité = 0, lecteur = lecteur-ide0-0-0, id = ide0-0-0, bootindex = 1 -netdev tap, fd = 18, id = hostnet0 - périphérique rtl8139, netdev = hostnet0, id = net0, mac = 52: 54: 00: 0e: da: 9b, bus = pci.0, addr = 0x3 -chardev pty, id = charserial0 -device est une série, chardev = charserial0, id = serial0 -usb -vnc 127.0.0.1: 0 -vga cirrus -périphérique intel-hda, id = son0, bus = pci.0, addr = 0x4 -périphérique hda-duplex, id = son0-codec0, bus = son0.0, cad = 0 -périphérique virtio-ballon- pci, id = ballon0, bus = pci.0, addr = 0x5

Voici la partie réseau de la description de la machine virtuelle dans /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>

Selon this link, pour des raisons de performance et de fiabilité, il peut être préférable de définir le modèle de périphérique réseau sur virtioname__. Pour ce faire, dans virt-viewer, appuyez sur . i , passez au paramètre NIC et définissez le "Modèle de périphérique" sur virtioname__. Vous pouvez également ajouter ceci au XML ci-dessus en ajoutant la ligne:

      <model type='virtio'/>

En résumé

Tout cela a pris 12.04 était:

  1. Installation de virt-manager, bridge-utils, qemu-kvm et des packages associés
  2. Assurez-vous que chaque utilisateur souhaitant utiliser kvm se trouve dans le groupe libvirtd.
  3. Définir/etc/network/interfaces comme ci-dessus (correspondant à l'article cité)
  4. Redémarrez en vous assurant qu'Ethernet est branché et que le sans fil (le cas échéant) est désactivé.
  5. Exécutez kvm sur une image directement avec, par exemple, -device e1000,netdev=tunnel -netdev tap,id=tunnel,ifname=vnet0, ou créez une machine virtuelle avec virt-manager, en spécifiant Network Bridge br0 sous le panneau Step 4-> Advanced Options.

Aucune autre modification n'a été nécessaire pour la mise en réseau, les capacités, les modèles ou les configurations.

Pour exposer un service sur Internet à votre nouvel invité, vous devez:

  1. Préparez et configurez tout service de pare-feu dont vous aurez besoin.
  2. Attribuez une adresse statique à votre configuration invité ou à votre service DHCP.
  3. Si vous utilisez un routeur NAT, ouvrez un port pour le service que vous implémentez et dirigez-le vers l'adresse IP de l'invité.

N'oubliez pas de tester et de réactiver le service de pare-feu pour votre ordinateur hôte. Une entrée peut être nécessaire pour transférer le trafic à l'invité.

Voir https://help.ubuntu.com/community/KVM/Installation , https://help.ubuntu.com/community/KVM/Networking , et - https://help.ubuntu.com/12.04/serverguide/libvirt.html .

22
John S Gruber

Si le comportement que vous observez est que l'hôte peut accéder à l'invité et que l'invité peut accéder à l'hôte, mais que l'invité ne peut pas accéder aux autres machines du réseau ou inversement ... le pare-feu de l'hôte bloque probablement l'accès.

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

Plus précisément, cette section: "La dernière étape consiste à désactiver netfilter sur le pont:

# 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

Ce sont les deux scripts que j'utilise pour créer un pont pour qemu-kvm.

Tout d’abord, laissez l’hôte devenir un routeur 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$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  

Créez ensuite l’interface tun-tap et bridgeavec votre interface par défaut (généralement celle avec une connexion Internet).

Script 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

J'utilise ces scripts quotidiennement, ils devraient donc bien fonctionner aussi pour vous. Vous devrez installer un paquet pour que tout cela fonctionne. En utilisant:

dlocate `which COMMAND`

vous pouvez voir quel paquet doit avoir COMMANDname__. Par exemple, pour voir quel paquet doit avoir brctlname__, lancez simplement:

dlocate `which brctl`

et vous aurez:

bridge-utils: /sbin/brctl

En utilisant la même approche pour toutes les commandes de ces scripts, vous devez (au moins) exécuter cette ligne de commande aptitudename__:

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

Enfin, vous pouvez lancer le script principal (en tant qu’utilisateur 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

En exécutant ip addr, vous devriez voir une interface br0 avec une adresse IP 192.168.1.1, comme spécifié dans le 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

C'est le Host address vu par le guestname__. Inversement, l'invité aura comme adresse IP 192.168.1.95 (encore une fois, cela peut être facilement modifié dans le script principal).

Maintenant, en utilisant virt-manager, il vous suffit de configurer votre NIC invité pour utiliser br0 en tant qu’interface physique.

virt-manager-br0-nic

Dans guestname__, il vous suffit de donner à eth0 une adresse IP de 192.168.1.95 et tout devrait fonctionner correctement.

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