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.
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-utilsqemu-kvm et 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:
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, dhclient
fait 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 hal
name__. Le package hal
est 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:
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 kvm
exé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 virtio
name__. 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 virtio
name__. 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:
-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:
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 .
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
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 bridge
avec 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 COMMAND
name__. Par exemple, pour voir quel paquet doit avoir brctl
name__, 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 aptitude
name__:
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 guest
name__. 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.
Dans guest
name__, 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