KVM-Bridged-Netzwerk funktioniert nicht

23

Ich habe KVM soeben auf meinem Ubuntu-Server gemäß dieser Anleitung installiert: https://help.ubuntu.com/community/KVM/Installation

Bereiten Sie dann ein überbrücktes Netzwerk vor, wie hier gezeigt: https://help.ubuntu.com/community/KVM/Networking

Dann habe ich mit virt-manager eine virtuelle Maschine erstellt. Ich habe es mehrmals versucht, aber der Gast kann keine Verbindung zum Netzwerk herstellen! Irgendeine Hilfe?

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

 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

ip route:

 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

* Im Gast * Ich konnte die Informationen aus dem Gast nicht kopieren und einfügen, weil ich sie nicht kopieren kann. Es wurde keine IP von DHCP empfangen. Funktioniert auch nach dem manuellen Einrichten nicht.

THpubs
quelle
Darf ich vorschlagen, dass Sie die Ausgabe der folgenden Befehle bereitstellen? Auf dem Host: ifconfig, brctl show, brctl showmacs br0, und ip route. Auf dem Gast: ifconfig, ip route, ping 8.8.8.8, ping <your internet router>, und traceroute 8.8.8.8. Ich kann nicht behaupten, dass ich kvm so konfiguriert habe, wie Sie es getan haben, aber ich habe es geschafft, mithilfe des kvmBefehls eine Brücke zur Arbeit zu schlagen . Ich musste die drahtlose Verbindung trennen, damit mein Host eine Verbindung zum Internet herstellen konnte, und wie in den von Ihnen angegebenen Anweisungen angegeben, müssen Sie eine Verbindung zum Internet über Ethernet herstellen.
John S Gruber
@JohnSGruber hat soeben die gewünschten Informationen hinzugefügt. Aber ich konnte die Informationen des Gastes nicht kopieren, da ich sie nicht kopieren kann. Es wurde keine IP von DHCP empfangen. Funktioniert auch nach dem manuellen Einrichten nicht.
THpubs
Ist die MAC-Adresse, die Sie dem Gast in der brctl showmacs br0obigen Liste zugewiesen haben ?
John S Gruber
Ich habe den Mac nicht manuell hinzugefügt, sondern den Mac überprüft.
THpubs
@JohnSGruber Nein, ich sehe diesen MAC hier nicht!
THpubs

Antworten:

22

Vorbereitungen

Das Folgende funktionierte bei mir für Ubuntu 12.04. Sie sollten die Firewall Ihres Computers beim Testen deaktivieren, damit sie nicht stört.

Die Datei / etc / default / qemu-kvm sollte wie ursprünglich installiert sein.

Sie müssen die Bridge- Utils qemu-kvm und libvirt-bin installiert haben. Alle Benutzer, die virtuelle Maschinen verwenden, sollten der Gruppe libvirtd hinzugefügt werden.Installieren Sie Bridge-Utils Installieren Sie qemu-kvmInstallieren Sie libvirt-bin

Es scheint keine Notwendigkeit mehr zu bestehen, CAP_NET_ADMIN-Funktionen hinzuzufügen.

Netzwerkeinrichtung

Der Standardnetzwerkmodus ist der Benutzermodus, auch SLIRP genannt. Es verwendet eine vordefinierte virbr0-Brücke, die NAT-fähig ist und auf den Gastcomputer geroutet wird. Das NAT-Routing verwendet die Kernel-Funktion ip_forwarding und iptables . Im Bridge-Modus wird eine virtuelle Bridge im Gast verwendet, mit der die (nicht nummerierte) Ethernet-Schnittstelle verbunden ist und auf der sowohl der Host als auch der Gast über ihre Netzwerkschnittstellen verfügen.

Die folgenden Abbildungen können die Unterschiede verdeutlichen:

Netzwerkdiagramme

Sie können sehen, wie das Standardbenutzernetzwerk definiert ist mit:

virsh net-dumpxml default

Ich kann den Bridged-Modus mit den folgenden Ansätzen einrichten:

In / etc / network / interfaces (aus dem überbrückenden Teil des Posts, den Sie in Ihrer Frage erwähnt haben):

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 aus
    bridge_fd 0
    bridge_maxwait 0

Neustart; und stellen Sie sicher, dass das drahtlose Netzwerk nicht aktiv ist. Überprüfen Sie die Standard-IP-Route mit ip route. Es muss die br0-Schnittstelle verwenden.

NB Wenn Ihr Ethernet nicht angeschlossen ist, wenn diese Änderung vorgenommen wird, müssen Sie Ihr Ethernet-Kabel eingesteckt haben und einen Netzbetreiber besorgen. Andernfalls bleibt der Startvorgang zwei Minuten lang hängen und Sie haben keine Netzwerkfähigkeit. Das liegt an der eth0-Schnittstelle von Wenn Sie sich in dieser Datei befinden, muss sie aufgerufen werden, bevor der Startvorgang normal fortgesetzt werden kann.

NB Im Allgemeinen können Sie kein drahtloses Netzwerk anstelle von eth0 verwenden, da sie nicht mehrere MAC-Adressen verwenden können (ich schätze, dass sie eine zweite für die Bridge benötigen).

Alternativ können Sie die Verwendung von Ethernet deaktivieren und sicherstellen, dass es keine IP-Adresse hat und dass keine Standardroute eingerichtet ist ip route. Dann:

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

Sie können hier auch eine statische IP-Adresse sowie die Standardroute und die DNS-Adresse angeben. In diesem Beispiel dhclientwird dies ausgeführt.

Hier ist meine Routentabelle:

$ ip Routenliste
Standardmäßig über 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

Mit kvm

Ich kann dann eine überbrückte KVM-Maschine booten mit:

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

Der -netdev tapParameter macht sudo zu einer Anforderung. Beim Start der VM führt qemu-kvm die folgenden Befehle aus:

ifconfig vnet0 0.0.0.0 up
brctl addif brctl addif br0 vnet0

Dies erledigt / etc / qemu-ifup

Die vnet0-Schnittstelle der VM wird der br0-Brücke hinzugefügt, da die oben angegebene Standardroute diese Brückenschnittstelle verwendet. Wäre dies nicht der Fall, würde stattdessen die Tap-Schnittstelle zur virbr0-Schnittstelle hinzugefügt. Da dies nicht mit dem Internet verbunden ist, wird NAT in meinen Experimenten verwendet, um den Gast mit dem Host und dem Internet zu verbinden. Sie können das vnet0 auf eine bestimmte Bridge in / etc / default / qemu-kvm richten. Mit dem unten stehenden virt-manager können Sie explizit festlegen, zu welcher Bridge eine Verbindung hergestellt werden soll.

Aufgrund der obigen Befehle von qemu-kvm und des -netdev tap,id=tunnel,ifname=vnet0Parameters ist die virtuelle Maschine vm mit dem Tunnel vnet0 und der Tunnel mit der Brücke br0 verbunden.

Ich kann jetzt direkt von einem anderen Computer in meinem Netzwerk auf diese Gast-VM zugreifen.

Mein Host ifconfig(beachten Sie die vnet0-Schnittstelle, die in meinem Netzwerk angezeigt wird, wenn die VM ausgeführt wird):

$ ifconfig
br0 Verbindungskapsel: 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 Metrisch: 1
          RX-Pakete: 6526 Fehler: 0 verworfen: 0 Überläufe: 0 Rahmen: 0
          TX-Pakete: 7543 Fehler: 0 verworfen: 0 Überläufe: 0 Träger: 0
          Kollisionen: 0 txqueuelen: 0 
          Empfangsbytes: 2712940 (2,7 MB) Sendebytes: 1071835 (1,0 MB)

eth0-Verbindungskapsel: Ethernet HWaddr 00: 1e: 33: 88: 07: e5  
          UP BROADCAST RUNNING MULTICAST MTU: 1500 Metrisch: 1
          Empfangspakete: 7181 Fehler: 0 Verworfen: 0 Überläufe: 0 Rahmen: 0
          TX-Pakete: 7740 Fehler: 0 verworfen: 0 Überläufe: 0 Träger: 0
          Kollisionen: 0 txqueuelen: 1000 
          Empfangsbytes: 2974585 (2,9 MB) Sendebytes: 1096580 (1,0 MB)
          Interrupt: 43 Basisadresse: 0x6000 

lo Link encap: Lokales Loopback  
          inet addr: 127.0.0.1 Mask: 255.0.0.0
          inet6 addr: :: 1/128 Gültigkeitsbereich: Host
          UP LOOPBACK RUNNING MTU: 16436 Metrisch: 1
          Empfangspakete: 10 Fehler: 0 fallen gelassen: 0 Überläufe: 0 Rahmen: 0
          TX-Pakete: 10 Fehler: 0 fallen gelassen: 0 Überläufe: 0 Träger: 0
          Kollisionen: 0 txqueuelen: 0 
          Empfangsbytes: 664 (664,0 B) Sendebytes: 664 (664,0 B)

vnet0 Verbindungskapsel: Ethernet HWaddr ca: 0c: 73: c3: bc: 45  
          inet6 addr: fe80 :: c80c: 73ff: fec3: bc45 / 64 Gültigkeitsbereich: Link
          UP BROADCAST RUNNING MULTICAST MTU: 1500 Metrisch: 1
          RX-Pakete: 226 Fehler: 0 verworfen: 0 Überläufe: 0 Rahmen: 0
          TX-Pakete: 429 Fehler: 0 verworfen: 0 Überläufe: 0 Träger: 0
          Kollisionen: 0 txqueuelen: 500 
          Empfangsbytes: 26919 (26,9 KB) Sendebytes: 58929 (58,9 KB)

virbr0 Verbindungskapsel: 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 Metrisch: 1
          Empfangspakete: 0 Fehler: 0 Verworfen: 0 Überschreitungen: 0 Rahmen: 0
          TX-Pakete: 0 Fehler: 0 verworfen: 0 Überläufe: 0 Träger: 0
          Kollisionen: 0 txqueuelen: 0 
          RX-Bytes: 0 (0,0 B) TX-Bytes: 0 (0,0 B)

Meine Bridge-Konfiguration beim Ausführen der VM:

$ brctl show
Brückenname Brücken-ID STP-fähige Schnittstellen
br0 8000.001e338807e5 no eth0
                                                        vnet0
virbr0 8000.000000000000 ja

Beachten Sie, dass sowohl die vnet0-Schnittstelle der virtuellen Maschine als auch die eth0-Schnittstelle mit der br0-Brücke verbunden sind.

Und die MACs auf der br0-Schnittstelle:

$ brctl showmacs br0
port no mac addr ist lokal? Alterungs-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 ja 0,00

Beachten Sie, dass die br0-Schnittstelle meinen Host-Computer mit derselben Bridge verbindet, die vom Gast verwendet wird.

Sie können mithilfe von überprüfen, ob Sie überbrückt sind, anstatt NAT an Ihr eigenes Netzwerk weiterzuleiten traceroute 8.8.8.8. Wenn der erste Knoten der Router Ihres Netzwerks ist und nicht die IP-Adresse des Gasts, sollte Ihr Netzwerk ordnungsgemäß funktionieren.

Siehe diese Dokumentation .

virt-manager

Achten Sie darauf , dass Sie installiert haben virt-managerund hal. Das halPaket ist eine empfohlene Abhängigkeit für virt-managerund wird verwendet, um die Netzwerkkonfiguration Ihres Systems beim Erstellen oder Bearbeiten von Gästen zu bestimmen.

Während die br0-Brücke wie oben definiert wurde, habe ich mit virt-manager eine virtuelle Maschine wie folgt erstellt:

Bildbeschreibung hier eingeben Bildbeschreibung hier eingeben Bildbeschreibung hier eingeben Bildbeschreibung hier eingeben Bildbeschreibung hier eingeben

Von diesem Gast konnte ich direkt in mein restliches Heimnetzwerk und ins Internet gehen. Ich konnte auch von einem anderen Ubuntu-Computer (nicht vom Host, nicht vom Gast) in meinem Heimnetzwerk darauf zugreifen.

Hier ist der sehr lange kvmBefehl, den virt-manager ausführt (zum Vergleich mit EApubs oder anderen, die Probleme damit haben):

/ usr / bin / kvm -S-M pc-1.0 -enable-kvm -m 1024 -smp 1, Sockets = 1, Cores = 1, Threads = 1 -name präzise -uid f057a729-eda6-4b85-84dc-f100c9ae3789 - nodefconfig -nodefaults -chardev socket, id = charmonitor, path = / var / lib / libvirt / qemu / precision.monitor, server, nowait -mon chardev = charmonitor, id = monitor, mode = control -rtc base = utc -no- Shutdown -Drive -Datei = / media / natty / home / gruber / ubuntu-kvm / tmpW8gSGB.qcow2, wenn = keine, id = Laufwerk-ide0-0-0, Format = qcow2 -Device-ide-Laufwerk, 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

Hier ist der Netzwerkabschnitt der Beschreibung der virtuellen Maschine in /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>

Laut diesem Link ist es aus Gründen der Leistung und Zuverlässigkeit am besten, das Netzwerkgerätemodell so einzustellen virtio, dass Sie dies im virtuellen Viewer tun können, indem Sie die i- Taste drücken, zur NIC-Einstellung wechseln und das "Gerätemodell" einstellen "zu virtio. Sie können dies auch zum obigen XML-Code hinzufügen, indem Sie die folgende Zeile einfügen:

      <model type='virtio'/>

Zusammenfassend

Das alles dauerte am 12.04 war:

  1. Installation von virt-manager, bridge-utils, qemu-kvm und verwandten Paketen
  2. Stellen Sie sicher, dass alle Benutzer, die kvm verwenden möchten, zur Gruppe libvirtd gehören.
  3. Definiere / etc / network / interfaces wie oben (passend zum zitierten Artikel)
  4. Starten Sie den Computer neu und vergewissern Sie sich, dass das Ethernet angeschlossen und drahtlos (falls vorhanden) ausgeschaltet ist.
  5. Führen Sie kvm entweder direkt mit einem Image aus -device e1000,netdev=tunnel -netdev tap,id=tunnel,ifname=vnet0, oder erstellen Sie mit virt-manager eine virtuelle Maschine, indem Sie unter Schritt 4-> Erweiterte Optionen die Netzwerkbrücke br0 angeben.

An Netzwerken, Funktionen, Vorlagen oder Konfigurationen waren keine weiteren Änderungen erforderlich.

Um einen Dienst in Ihrem neuen Gast dem Internet zugänglich zu machen, sollten Sie:

  1. Bereiten Sie den gewünschten Firewall-Dienst vor und konfigurieren Sie ihn.
  2. Weisen Sie entweder eine statische Adresse in Ihrer Gastkonfiguration oder in Ihrem DHCP-Dienst zu.
  3. Wenn Sie einen NAT-Router verwenden, öffnen Sie einen Port für den Dienst, den Sie implementieren, und leiten Sie ihn an die IP-Adresse des Gasts weiter.

Denken Sie daran, den Firewall-Dienst für Ihren Host-Computer zu testen und erneut zu aktivieren. Möglicherweise ist ein Eintrag erforderlich, um den Datenverkehr an den Gast weiterzuleiten.

Siehe https://help.ubuntu.com/community/KVM/Installation , https://help.ubuntu.com/community/KVM/Networking und https://help.ubuntu.com/12.04/serverguide/libvirt. html .

John S Gruber
quelle
Hallo, ich habe keine WLAN-Karte auf diesem Computer. nur Ethernet :)
THpubs
Ich verstehe, Sie haben kein drahtloses Netzwerk - aber andere, die diese Frage lesen, könnten dies tun. Ich habe einen Virt-Manager-Bereich gepostet, da Sie diesen verwendet haben. Haben Sie Bridged to br0 in Schritt 4 Erweiterte Optionen beim Erstellen der virtuellen Maschine angegeben? Stimmen die Netzwerkparameter in dem von virt-manager gestarteten Befehl kvm mit meinen überein? (Sie können es durch Laufen sehen ps aux | grep kvm).
John S Gruber
Hallo, beim Erstellen einer virtuellen Maschine mit dem virt-Manager werden in den erweiterten Optionen eth0 und br0 nicht angezeigt.
THpubs
Nun, das ist wahrscheinlich das Problem - es ist der Schlüssel, um es unter virt-manager zum Laufen zu bringen. Laufen Sie auf dem Rechner, auf dem es gehostet wird (und in dem br0 definiert ist, brctl showwie Sie es in Ihrer Frage haben?)? Welche Ubuntu-Version führen Sie aus? Vielleicht ist das der Unterschied. Welche Version von virt-manager? (Meins ist 0.9.1-1ubuntu5.1).
John S Gruber
Ich arbeite mit Ubuntu 12.04 und virt-manager 0.9.1-1ubuntu5.1. Eigentlich habe ich keinen virt-manager auf dem Host installiert. Ich habe es in einem Remote-Computer und ich benutze es, um eine Verbindung zum Host herzustellen. Ist das das Problem, das ich habe?
THpubs
6

Wenn als Verhalten Host angezeigt wird, kann der Gast darauf zugreifen, und Gast kann auf den Host zugreifen, der Gast kann jedoch nicht auf andere Computer im Netzwerk zugreifen oder umgekehrt. Wahrscheinlich blockiert die Firewall des Hosts den Zugriff.

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

Insbesondere dieser Abschnitt: "Der letzte Schritt ist das Deaktivieren von netfilter auf der Bridge:

# 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
Jeremy Spilman
quelle
3

Dies sind die beiden Skripte, mit denen ich eine Bridge erstelle qemu-kvm.

Lassen Sie den Host zunächst zu einem IP-Router werden.

Skript 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  

Erstellen Sie dann die tun-tapSchnittstelle und bridgediese mit Ihrer Standardschnittstelle (normalerweise mit einer Internetverbindung).

Skript 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

Ich benutze diese Skripte täglich, daher sollten sie auch für Sie gut funktionieren. Sie müssen ein Paket installieren, damit all dies funktioniert. Verwenden von:

dlocate `which COMMAND`

Sie können sehen, welches Paket benötigt wird COMMAND. Um beispielsweise zu sehen, welches Paket benötigt wird, führen Sie brctleinfach Folgendes aus:

dlocate `which brctl`

und du wirst haben:

bridge-utils: /sbin/brctl

Wenn Sie für alle Befehle in diesen Skripten denselben Ansatz verwenden, sollten Sie (mindestens) diese aptitudeBefehlszeile ausführen :

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

Schließlich können Sie das Hauptskript (als normaler Benutzer) starten:

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

Beim Ausführen ip addrsollte eine br0Schnittstelle mit der IP-Adresse angezeigt werden 192.168.1.1, die im create-qemu-bridged-tuntap.shSkript angegeben ist :

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

Dies ist die host addressvon der guest. Umgekehrt hat der Gast eine IP-Adresse 192.168.1.95(diese kann wiederum problemlos im Hauptskript geändert werden).

Jetzt müssen virt-managerSie nur noch Ihre Gast-Netzwerkkarte einrichten, um sie br0als physische Schnittstelle zu verwenden.

virt-manager-br0-nic

Innerhalb der guestmuss man nur eth0eine IP-Adresse von 192.168.1.95angeben und alles sollte gut laufen.

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
Avio
quelle
Obwohl Sie dazu eine Bridge verwenden, scheint es mir, dass Sie eine NAT-Weiterleitungsfunktion erstellen. Wenn Sie jedoch bestimmte Host-Ports weiterleiten können, wird dies möglicherweise den Anforderungen von EApubs entsprechen. Sehr interessante und sehr nützliche Antwort, ohne Rücksicht auf.
John S Gruber
Vielen Dank, es funktioniert einwandfrei für meine Zwecke. Tatsächlich benötige ich jedoch keinen Remotezugriff auf meine VM, und ich dachte, dass EApubs lediglich versucht hat, einen Internetzugriff auf die VM zu haben.
Avio
@Avio Nein, mein Freund, ich benötige Fernzugriff auf meine Maschine. Wenn ich NAT einstelle und die VM erstelle, funktioniert es.
THpubs
Es gibt einen Anhaltspunkt hier auf ein Problem , das ich hatte , wo IP - Forwarding ausgeschaltet war, also cat /proc/sys/net/ipv4/ip_forwardgibt 0. Durch das Aktivieren und Fortbestehen wurde das Problem für mich behoben. Anweisungen in diesem Beitrag .
Jake Cobb