Ich versuche seit Wochen, die richtige Netzwerkkonfiguration für die gemeinsame Nutzung einer Reihe öffentlicher IPs mit virtuellen KVM-Maschinen auf meinem Server herauszufinden. aber bisher mit wenig glückund mit Hilfe der freundlichen ServerFault-Community habe ich es geschafft, dass es funktioniert. Mein Arbeitssetup findest du unten:

Mein ISP leitet den gesamten Verkehr an 192.168.8.118(das muss also die primäre IP von eth0) sein, aber ich muss 192.168.239.160/28zu meiner Verfügung stehen.

Hier /etc/network/interfacesauf dem Host-Rechner:

# 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

Ich habe eine virtuelle Maschine wie folgt konfiguriert:

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 ;

Wenn ich die XML-Definition der virtuellen Maschine überprüfe, wird ihre Netzwerkschnittstelle wie folgt definiert:

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

Wenn ich die virtuelle Maschine (neu) starte, /var/log/syslogerhält sie diese Zeilen:

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

Auf meinem Server läuft Ubuntu 12.04 64-Bit mit Kernel 3.2.0-26-generic (von Ubuntu). Ich laufe libvirt-bin 0.9.8-2ubuntu1und qemu-kvm 1.0+noroms-0ubuntu13.

iptables auf dem Host-Rechner ist derzeit so eingerichtet, dass der gesamte Datenverkehr zugelassen wird (um dies als Problemquelle zu beseitigen), und ich habe die Weiterleitung von IPv4- und IPv6-Datenverkehr aktiviert.

Wenn ich mich über SSH vom Host beim Gast anmelde, habe ich keine Internetverbindung im Gastbetriebssystem. Der Gast /etc/network/interfacessieht so aus:

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

Jetzt gehts

Die obige Konfigurationsübersicht funktioniert tatsächlich so, wie ich es möchte. Schlagen Sie im Bearbeitungsverlauf nach, wenn Sie meine früheren Versuche sehen möchten.

answer

Wenn Sie überbrücken, müssen Sie auf dem Hostcomputer nichts im Zusammenhang mit den IP-Adressen der VMs konfigurieren. Konfigurieren Sie sie einfach, um eine Verbindung zur Bridge herzustellen, und konfigurieren Sie die IPs innerhalb jeder VM wie gewohnt. Bridging verbindet Netzwerke auf der Ethernet-Schicht, wo IP-Adressen keine Rolle spielen; aus der Sicht Ihres ISP sieht es so aus, als hätten Sie mehrere Computer an einen Switch angeschlossen, der direkt mit dem ISP verbunden ist.

Aber wenn Ihre ISP Routing - Verkehr auf den 0,118 - Adresse des Hosts, werden Sie benötigen eine VM - Host konfigurieren als Router zu fungieren und die VMs' Verkehr weiterleiten. Entfernen Sie dazu die bridge_ports eth0Zeile aus Ihrer Interface-Datei ip route add to 192.168.239.160/28 dev br0, und echo 1 > /proc/sys/net/ipv4/ip_forward. In den VMs müssen Sie 192.168.8.118 als Standard-Gateway konfigurieren und eine Route hinzufügen, die besagt, dass 192.168.8.118 direkt über erreichbar ist eth0. (Das sind die VMs eth0, die eine Verbindung zu den Hosts herstellen br0.)

In keinem Fall sollten Sie die Adressen der VMs direkt zur br0Schnittstelle hinzufügen . Im Bridging-Fall sollen die VMs und nicht der Host ARP-Anfragen für diese Adressen beantworten, und im Routing-Fall soll der Host verstehen, dass wenn er ein Paket für eine dieser Adressen empfängt, es weitergeleitet werden muss woanders, nicht lokal geliefert.

Sie möchten die IP-Adresse Ihrer VMs nicht der br0-Schnittstelle Ihres Hosts zuweisen - das würde nur dazu führen, dass diese Adresse zum Host gehört, nicht zur VM.

Ihre VMs benötigen jedoch eine Gateway-Adresse, an die alle ausgehenden Pakete weitergeleitet werden. Ich würde empfehlen, Ihrem Host eine IP in /28 zuzuweisen und Ihre VMs so zu konfigurieren, dass sie diese IP als Standardroute verwenden. Die erste oder letzte verfügbare IP in einem Subnetz ist eine vernünftige Wahl für eine Gateway-Adresse....

ip addr add 192.168.239.161/28 dev br0

hast du die IP-Weiterleitung aktiviert? Entkommentieren Sie zB Folgendes in /etc/sysctl.conf (eine oder beide für ipv4 und/oder ipv6):

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

Haben Sie zum Schluss versucht, sich an der Konsole der VM anzumelden (zB mit virt-manager oder einem VNC-Viewer wie vinagre oder xvnc4viewer)? Wenn ja, welche IP-Adresse hat es (falls vorhanden)? Ist die VM so konfiguriert, dass sie eine statische IP oder DHCP hat? Falls letzteres, haben Sie Ihren DHCP-Server so konfiguriert, dass er der MAC-Adresse der VMs die entsprechende IP-Adresse zuweist?