J'essaie depuis des semaines de trouver la bonne configuration réseau pour partager une gamme d'adresses IP publiques avec des machines virtuelles KVM s'exécutant sur mon serveur, mais pour l'instant avec peu de chanceet avec l'aide de la sympathique communauté ServerFault, j'ai réussi à le faire fonctionner. Vous pouvez trouver ma configuration de travail ci-dessous:

Mon FAI achemine tout le trafic vers 192.168.8.118(cela doit donc être l'adresse IP principale de eth0), mais je dois être 192.168.239.160/28à ma disposition.

Voici /etc/network/interfacessur la machine hôte :

# Loopback device:
auto lo
iface lo inet loopback

# device: eth0
auto  eth0
iface eth0 inet static
  address   192.168.8.118
  broadcast 192.168.8.127
  netmask   255.255.255.224
  gateway   192.168.8.97
  pointopoint 192.168.8.97
  # This device acts as gateway for the bridge, so provide a route.
  up ip route add 192.168.8.118/32 dev eth0 scope host

# device: br0
auto  br0
iface br0 inet static
  bridge_stp      off
  bridge_maxwait  0
  bridge_fd       0
  address   192.168.239.174
  broadcast 192.168.239.175
  netmask   255.255.255.240
  gateway   192.168.8.118
  # Create and destroy the bridge automatically.
  pre-up brctl addbr br0
  post-down brctl delbr br0
  # Our additional IPs are allocated on the bridge.
  up ip route add to 192.168.239.160/28 dev br0 scope host

J'ai configuré une machine virtuelle comme ceci :

sudo ubuntu-vm-builder kvm precise \
                  --domain pippin \
                  --dest pippin \
                  --hostname pippin.hobbiton.arnor \
                  --flavour virtual \
                  --mem 8196 \
                  --user mikl \
                  --pass hest \
                  --bridge=br0 \
                  --ip 192.168.239.162 \
                  --mask 255.255.255.240 \
                  --net 192.168.239.160 \
                  --bcast 192.168.239.175 \
                  --gw 192.168.239.174 \
                  --dns 8.8.8.8 \
                  --components main,universe \
                  --addpkg git \
                  --addpkg openssh-server \
                  --addpkg vim-nox \
                  --addpkg zsh \
                  --libvirt qemu:///system ;

Si j'inspecte la définition XML de la machine virtuelle, son interface réseau est définie comme ceci :

<interface type='bridge'>
  <mac address='52:54:00:b1:e9:52'/>
  <source bridge='br0'/>
  <model type='virtio'/>
  <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>

Lorsque je (re)démarre la machine virtuelle, /var/log/syslogreçoit ces lignes :

Jul 20 03:13:02 olin kernel: [ 4084.652906] device vnet0 entered promiscuous mode
Jul 20 03:13:02 olin kernel: [ 4084.686388] br0: port 2(vnet0) entering forwarding state
Jul 20 03:13:02 olin kernel: [ 4084.686394] br0: port 2(vnet0) entering forwarding state

Mon serveur exécute Ubuntu 12.04 64 bits avec le noyau 3.2.0-26-generic (depuis Ubuntu). Je cours libvirt-bin 0.9.8-2ubuntu1et qemu-kvm 1.0+noroms-0ubuntu13.

iptables sur la machine hôte est actuellement configuré pour autoriser tout le trafic (pour éliminer cela en tant que source de problème), et j'ai activé le transfert du trafic ipv4 et ipv6.

Lorsque je me connecte à l'invité via SSH depuis l'hôte, je n'ai pas de connexion Internet à l'intérieur du système d'exploitation invité. L'invité /etc/network/interfacesressemble à ceci :

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
    address 192.168.239.162
    netmask 255.255.255.240
    network 192.168.239.160
    broadcast 192.168.239.175
    gateway 192.168.239.174
    # dns-* options are implemented by the resolvconf package, if installed
    dns-nameservers 8.8.8.8
    dns-search pippin

Maintenant ça marche

Le schéma de configuration ci-dessus fonctionne réellement comme je le souhaite. Reportez-vous à l'historique des modifications si vous souhaitez voir mes tentatives précédentes.

answer

Si vous effectuez un pontage, vous ne devriez pas avoir besoin de configurer quoi que ce soit concernant les adresses IP des machines virtuelles sur la machine hôte. Il suffit de les configurer pour se connecter au pont et de configurer les adresses IP au sein de chaque VM de la manière habituelle. Le pontage relie les réseaux au niveau de la couche Ethernet, où les adresses IP n'ont pas d'importance ; du point de vue de votre FAI, il semblera que vous ayez plusieurs ordinateurs branchés sur un commutateur directement connecté au FAI.

Mais si votre FAI achemine le trafic vers l'adresse .118 de l'hôte, vous devrez configurer votre hôte VM pour qu'il agisse comme un routeur et transmette le trafic des VM. Pour ce faire, supprimez la bridge_ports eth0ligne de votre fichier d'interface, ip route add to 192.168.239.160/28 dev br0, et echo 1 > /proc/sys/net/ipv4/ip_forward. Dans les machines virtuelles, vous devrez configurer 192.168.8.118 comme passerelle par défaut et ajouter une route indiquant que 192.168.8.118 est directement accessible via eth0. (C'est le VM's eth0, qui se connecte au host's br0.)

Dans aucun des cas, vous ne devez ajouter les adresses des machines virtuelles directement à l' br0interface. Dans le cas du pont, vous voulez que les machines virtuelles et non l'hôte répondent aux demandes ARP pour ces adresses, et dans le cas du routage, vous voulez que l'hôte comprenne que lorsqu'il reçoit un paquet pour l'une de ces adresses, il doit être routé ailleurs, non livré localement.

Vous ne voulez pas allouer l'adresse IP de vos machines virtuelles à l'interface br0 de votre hôte - cela ferait simplement que cette adresse appartiendrait à l'hôte, pas à la machine virtuelle.

Cependant, vos machines virtuelles auront besoin d'une adresse de passerelle vers laquelle acheminer tous les paquets sortants. Je recommanderais d'attribuer une IP dans ce /28 à votre hôte et de configurer vos machines virtuelles pour utiliser cette IP comme route par défaut. La première ou la dernière IP disponible dans un sous-réseau est un choix raisonnable pour une adresse de passerelle....

ip addr add 192.168.239.161/28 dev br0

as-tu activé la redirection ip ? par exemple, décommentez ce qui suit dans /etc/sysctl.conf (un ou les deux pour ipv4 et/ou ipv6) :

#net.ipv4.ip_forward=1
#net.ipv6.conf.all.forwarding=1

Enfin, avez-vous essayé de vous connecter à la console de la VM (par exemple avec virt-manager ou un visualiseur VNC comme vinagre ou xvnc4viewer) ? si oui, quelle adresse IP a-t-il (le cas échéant) ? La VM est-elle configurée pour avoir une adresse IP statique ou DHCP ? Dans ce dernier cas, avez-vous configuré votre serveur DHCP pour donner l'adresse IP appropriée à l'adresse MAC des VM ?