Gast und Host können sich mit linux-kvm und macvtap nicht sehen

9

Ich migriere eine virtuelle kvm-Maschine von einem alten Host (sowohl Hardware als auch Betriebssystem) auf einen neuen.

Für das Networking schlug mir virt-manager eine neue Option vor: macvtap . Dies schien eine gute Alternative zum Aufbau einer Brücke zu eth0 zu sein.

So, jetzt startet der Gast ganz gut, bekommt eine IP von meinem lokalen Netzwerk-DHCP-Server, kann das Internet erreichen. Der Gast sieht auch andere Maschinen im lokalen Netzwerk, ich kann sie ssh usw.

Das Problem ist, dass sich Gastgeber und Gast nicht sehen. Ich kann den Gast nicht vom Host über die Gast-IP erreichen, und ich kann den Host auch nicht vom Gast über die Host-IP erreichen. Kein Ping, SSH, http, nichts.

Hier ist der route -nBefehl vom Host:

$ /sbin/route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.0.1     0.0.0.0         UG    0      0        0 eth0
192.168.0.0     0.0.0.0         255.255.255.0   U     1      0        0 eth0

(gleiche Ausgabe vom Gast).

Ich könnte wahrscheinlich eine neue Tun / Tap-Schnittstelle einrichten, die der Kommunikation zwischen Host und Gast gewidmet ist, aber sie sieht ein bisschen übertrieben aus. Gibt es eine Möglichkeit, Gastgeber und Gast zur Kommunikation zu bringen?

Ascobol
quelle
Macvtap ist kein gültiger Ersatz für Bridging. Wenn Sie lieber wechseln als überbrücken möchten, schauen Sie in openvswitch nach.
user186658

Antworten:

7

Ich habe diese Frage im IRC gestellt und es scheint, dass Macvtap

injiziert dafür zu wenig Gastverkehr in den Netzwerkstapel

Die Lösung besteht dann darin, eine Netzwerkschnittstelle hinzuzufügen, über die der Gast und der Host kommunizieren können, oder bei der alten überbrückten Lösung zu bleiben ...

Ascobol
quelle
1
Hier finden Sie schrittweise Anweisungen zum Erstellen der Host / Gast-Schnittstelle, ohne den Netzwerkmanager deaktivieren zu müssen: wiki.libvirt.org/page/…
HDave
1
Ich konnte diese Anweisungen nicht zum
Laufen bringen
4

virt-manager sagt explizit, dass macvtap beim Einrichten nicht für die Kommunikation zwischen Host und Gastnetzwerk funktioniert. Ich habe einfach eine zweite nat-basierte Schnittstelle hinzugefügt, sie im Gast eingerichtet und damit mit meinem Host kommuniziert.

Gesellenfreak
quelle
1

Die Lösung besteht darin, eine Macvlan-Schnittstelle auf dem Hypervisor mit derselben IP-Adresse wie die reale Hardwareschnittstelle (sehr wichtig) zu konfigurieren und das Routing auf dem Host für die Verwendung zu konfigurieren. Verwenden Sie in Qemu / KVM wie gewohnt eine Macvtap-Schnittstelle auf der Hardwareschnittstelle.

Für meine Konfiguration (192.168.1.0/24 Netzwerk, p10p1-Hardwareschnittstelle und 192.168.1.1-Gateway) gibt es (auf dem Hypervisor):

ip link add link p10p1 address 00:19:d1:29:d2:58 macvlan0 type macvlan mode bridge
ip address add 192.168.1.100/24 dev macvlan0
ip link set dev macvlan0 up

ip route flush dev p10p1
ip route add default via 192.168.1.1 dev macvlan0 proto static
npen
quelle
1

Wie bereits in früheren Antworten erwähnt, besteht eine Lösung für dieses Problem darin, einen Macvlan-Netzwerkadapter auf dem Host hinzuzufügen. Ich hatte jedoch das Gefühl, dass die manuelle Neuverdrahtung der Routen zum Macvlan-Adapter etwas schwierig war, zumal ich IPv6-Unterstützung wünschte und manuell festgelegte Routen zu einem Problem werden könnte, wenn sich das Präfix ändert. Hier ist meine Konfiguration, bei der der Kernel die Kontrolle über die Routing-Tabelle behält:

(Die spezielle Konfiguration hier ist Debian- und Upstart-spezifisch, aber die grundlegenden Schritte sollten auf jedem GNU / Linux funktionieren.)

Erstellen des Macvlan-Adapters beim Booten

Zunächst müssen Sie eine MAC-Adresse für Ihren Adapter auswählen. Möglicherweise können Sie nur einen zufälligen verwenden, aber ich schlage vor, Sie erstellen manuell einen Macvlan-Adapter und verwenden dessen MAC. Auf diese Weise verpflichtet sich der MAC zu eventuell vorhandenen Konventionen.

Das Festlegen eines festen MAC ist ratsam, da andernfalls beispielsweise ein DHCP-Server Ihren Computer nach einem Neustart nicht erkennen und ihm dieselbe IP-Adresse wie zuvor zuweisen kann.

Erstellen Sie also einen Adapter und suchen Sie den MAC:

root@host:~# ip link add link eth0 macvlan0 type macvlan mode bridge
root@host:~# ip addr show dev macvlan0
#: macvlan0@eth0:  mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1
    link/ether 12:34:56:78:90:ab brd ff:ff:ff:ff:ff:ff
...

Die hervorgehobene Hexadezimalzahl ist Ihre MAC-Adresse.

Jetzt erstellen Sie ein Init-Skript, das ausgeführt werden muss, bevor das Netzwerk initialisiert wird, um den Macvlan-Adapter bei jedem Start zu erstellen. Der Befehl dazu lautet:

ip link add link eth0 address <MACADDRESS> macvlan0 type macvlan mode bridge

Ein Beispiel für ein Upstart-Init-Skript für diesen Zweck wäre:

start on starting networking

script
    ip link add link eth0 address <MACADDRESS> macvlan0 type macvlan mode bridge
end script

Setzen Sie dies einfach in z /etc/init/macvlan.conf.

Einrichten der Netzwerkkonfiguration

In /etc/network/interfaces, stellen Sie Ihren physischen Netzwerkadapter auf manuell (aber es Auto verlassen) und bewegen ihre vorherige Konfiguration ( in der Regel DHCP oder eine statische IP - Adresse) wird an Ihren macvlan Adapter. Z.B:

auto eth0
iface eth0 inet manual

auto macvlan0
iface macvlan0 inet dhcp

Deaktivieren von IPv6 für den physischen Adapter

Schließlich möchten Sie nicht, dass der physische Adapter eine IP-Adresse erhält. Bei IPv4 verhindert das manuelle Einstellen des Adapters, dass er eine Adresse erhält. Ich habe jedoch keine Konfiguration gefunden, die den Kernel daran hindert, eine IPv6-Adresse für / dem Adapter abzurufen / zuzuweisen. In diesem Fall werden auch Routen für sie hinzugefügt, was zu Problemen führen kann. Der beste Weg scheint also zu sein, IPv6 für den physischen Adapter zu deaktivieren. Sie können dies tun, indem Sie die Zeile hinzufügen

net.ipv6.conf.eth0.disable_ipv6=1

zu /etc/sysctl.conf, indem Sie eine Datei /etc/sysctl.d/mit dieser Zeile erstellen oder hinzufügen

sysctl -w net.ipv6.conf.eth0.disable_ipv6=1

zu Ihrem Init-Skript.

Wenn Sie Ihren Computer jetzt neu starten, sollte die Kommunikation vom Host zum Gast sowohl mit IPv4 als auch mit IPv6 funktionieren.


Beachten Sie, dass Ihr Host möglicherweise auch nach einem Neustart über das Netzwerk nicht mehr erreichbar ist, wenn Sie beim Einrichten einen Fehler machen. Tun Sie dies nur, wenn Sie physischen Zugriff auf die Maschine haben oder andere Sicherheitsvorkehrungen getroffen wurden, um potenzielle Probleme zu beheben.

Lazzaro
quelle
1

Sie möchten am Ende so etwas haben:

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.0.1     0.0.0.0         UG    0      0        0 macvlan0
192.168.0.0     0.0.0.0         255.255.255.0   U     1      0        0 macvlan0

Beachten Sie, dass die letzte Spalte "macvlan0" anstelle von "eth0" enthält.

Um dies zu erreichen, können Sie diese Befehle unter der Annahme von 192.168.0.42 als IP-Adresse verwenden:

ip link add link eth0 macvlan0 type macvlan mode bridge
ip address add 192.168.0.42 dev macvlan0
ip link set dev macvlan0 up
ip route flush dev eth0
ip route add default via 192.168.0.1

Meist ähnlich der Lösung von npen. Wenn Sie ein komplexeres Skript wünschen, besuchen Sie meine Webseite zu diesem Thema.

Evert Mouw
quelle
Vergessen Sie nicht, das macvlanModul zu laden :modprobe macvlan
mdd
0

Ich habe verwendet, was Lazzaro über Debian geschrieben hat, aber ich möchte ein paar Notizen hinzufügen.

Zunächst muss die Gastschnittstelle auf "Quellgerät" -> "Hostgerät eth0: macvtap" eingestellt sein; "Quellmodus" -> " Brücke ".

Zweitens hat das Init-Skript, das Sie für mich nicht verwendet haben ( es scheint, dass die macvlan0-Schnittstelle beim Start zu spät erstellt wurde ), also habe ich Folgendes verwendet:

nano /etc/init.d/macvlan

Ändern Sie den Mac in den Mac, der beim ersten Erstellen der Benutzeroberfläche zugewiesen wurde:

#!/bin/sh
### BEGIN INIT INFO
# Provides:          macvlan
# Required-Start:    $local_fs
# Required-Stop:     
# Default-Start:     S
# Default-Stop:      
# Short-Description: Set up macvlan
# Description:       This script sets up the macvlan interface
#                    before it can be used by networking.
# X-Start-Before:    networking
### END INIT INFO


PATH=/sbin:/usr/sbin:/bin:/usr/bin
. /lib/init/vars.sh


do_start () {
        ip link add link eth0 address 00:11:22:aa:bb:cc macvlan0 type macvlan mode bridge
###      REPLACE MAC ON EACH HOST ->  ^^ ^^ ^^ ^^ ^^ ^^
}

case "$1" in
  start|"")
        do_start
        ;;
  *)
        echo "Sorry, this only sets up the macvlan interface." >&2
        exit 3
        ;;
esac

Speichern und setzen Sie das Ausführungsbit:

chmod +x /etc/init.d/macvlan

und füge alle Links für init hinzu:

update-rc.d macvlan defaults
Spitzname
quelle