Gość i host nie widzą się za pomocą linux-kvm i macvtap

9

Migruję maszynę wirtualną KVM ze starego hosta (zarówno sprzętowego, jak i systemu operacyjnego) na nową.

W przypadku sieci virt-manager zaproponował mi nową opcję: macvtap . To wyglądała na dobrą alternatywę dla ustanowienia mostu na eth0.

Więc teraz gość uruchamia się dobrze, otrzymuje adres IP z mojej sieci lokalnej serwera DHCP, może uzyskać dostęp do Internetu. Gość widzi także inne maszyny w sieci lokalnej, mogę je ssh itp.

Problem polega na tym, że gospodarz i gość nie widzą się nawzajem. Nie mogę dotrzeć do gościa z hosta za pomocą adresu IP gościa, ani nie mogę dotrzeć do gościa z gościa za pomocą adresu IP hosta. Brak ping, ssh, http, nic.

Oto route -npolecenie z hosta:

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

(to samo wyjście od gościa).

Prawdopodobnie mógłbym skonfigurować nowy interfejs tun / tap dedykowany do komunikacji między gospodarzem a gościem, ale wygląda to na przesadne. Czy istnieje sposób na komunikację gospodarza i gościa?

askobol
źródło
Macvtap nie jest prawidłowym zamiennikiem mostkowania. Jeśli chcesz przełączyć się zamiast mostkowania, spójrz na openvswitch.
user186658,

Odpowiedzi:

7

Zadałem to pytanie na IRC i wygląda na to, że macvtap

wstrzykuje zbyt mały ruch gości do stosu sieciowego

Rozwiązaniem jest dodanie interfejsu sieciowego dla gościa i hosta do komunikacji lub pozostanie przy starym rozwiązaniu zmostkowanym ...

askobol
źródło
1
Oto instrukcje krok po kroku dotyczące tworzenia interfejsu hosta / gościa bez konieczności wyłączania menedżera sieci: wiki.libvirt.org/page/…
HDave
1
Nie mogłem sprawić, by te instrukcje zadziałały ...
HDave
4

virt-manager mówi wyraźnie, że macvtap nie działa dla komunikacji między hostem a gościem podczas jego konfigurowania. Po prostu dodałem interfejs oparty na drugim nat, skonfigurowałem go w gościu i używam go do komunikacji z moim hostem.

Journeyman Geek
źródło
1

Rozwiązaniem jest skonfigurowanie interfejsu macvlan na hiperwizorze o tym samym adresie IP, co rzeczywisty interfejs sprzętowy (bardzo ważne) oraz skonfigurowanie routingu na hoście, aby z niego korzystać. W Qemu / KVM, jak zwykle użyj interfejsu macvtap na interfejsie sprzętowym.

W przypadku mojej konfiguracji (sieć 192.168.1.0/24, interfejs sprzętowy p10p1 i brama 192.168.1.1) daje (na hiperwizorze):

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
źródło
1

Jak wspomniano w poprzednich odpowiedziach, rozwiązaniem tego problemu jest dodanie karty sieciowej macvlan na hoście. Jednak czułem, że ręczne przeinstalowanie tras do adaptera macvlan było trochę hacky, szczególnie, że chciałem obsługi IPv6 i ręcznie ustawione trasy mogą stać się problemem, gdy zmienia się prefiks. Oto moja konfiguracja, która pozostawia jądro kontrolujące tablicę routingu:

(Konkretna konfiguracja tutaj jest specyficzna dla Debiana i Upstart, ale podstawowe kroki powinny działać na każdym systemie GNU / Linux).

Tworzenie adaptera macvlan podczas uruchamiania

Najpierw musisz wybrać adres MAC karty. Możesz po prostu użyć losowego, ale sugeruję, aby ręcznie utworzyć adapter Macvlan i użyć jego MAC. W ten sposób MAC zobowiązuje się do wszelkich obowiązujących konwencji.

Zalecane jest ustawienie stałego adresu MAC, ponieważ w przeciwnym razie serwer DHCP nie będzie w stanie rozpoznać komputera po ponownym uruchomieniu i przypisać mu tego samego adresu IP co poprzednio.

Utwórz adapter i sprawdź 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
...

Podświetlony numer szesnastkowy to Twój adres MAC.

Teraz tworzysz skrypt inicjujący - który należy uruchomić przed zainicjowaniem pracy w sieci - aby utworzyć adapter macvlan przy każdym uruchomieniu. Polecenie to:

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

Przykładowy skrypt inicjujący Upstart w tym celu to:

start on starting networking

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

Po prostu włóż to np /etc/init/macvlan.conf.

Konfigurowanie konfiguracji sieci

W /etc/network/interfacesustaw fizyczną kartę sieciową na ręczną (ale pozostaw ją automatyczną) i przenieś jej poprzednią konfigurację (zazwyczaj DHCP lub statyczny adres IP) na kartę macvlan. Na przykład:

auto eth0
iface eth0 inet manual

auto macvlan0
iface macvlan0 inet dhcp

Wyłączanie IPv6 dla adaptera fizycznego

Wreszcie nie chcesz, aby adapter fizyczny uzyskiwał adres IP. W przypadku IPv4 ustawienie adaptera na ręczne uniemożliwia uzyskanie adresu. Nie znalazłem jednak konfiguracji, która powstrzymywałaby jądro od uzyskiwania / przypisywania adresu IPv6 dla / do adaptera. Gdy to zrobi, dodaje również trasy dla nich, co może powodować problemy. Wydaje się więc, że najlepszym sposobem jest wyłączenie IPv6 dla adaptera fizycznego. Możesz to zrobić, dodając wiersz

net.ipv6.conf.eth0.disable_ipv6=1

do /etc/sysctl.conf, tworząc plik w /etc/sysctl.d/tym wierszu lub dodając

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

do twojego skryptu init.

Po ponownym uruchomieniu komputera komunikacja między hostem a gościem powinna działać zarówno z IPv4, jak i IPv6.


Należy pamiętać, że jeśli popełnisz błąd podczas konfigurowania, Twój host może stać się nieosiągalny przez sieć nawet po ponownym uruchomieniu. Zrób to tylko, jeśli masz fizyczny dostęp do maszyny lub istnieją inne zabezpieczenia, aby można było rozwiązać potencjalne problemy.

Lazzaro
źródło
1

Chcesz skończyć z czymś takim:

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

Zauważ, że ostatnia kolumna zawiera „macvlan0” zamiast „eth0”.

Aby to osiągnąć, możesz użyć tych poleceń, przyjmując 192.168.0.42 jako adres IP:

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

Głównie podobny do rozwiązania npen. Jeśli chcesz bardziej wyrafinowanego skryptu, zobacz moją stronę internetową na ten temat.

Evert Mouw
źródło
Nie zapomnij załadować macvlanmodułu:modprobe macvlan
mdd
0

Użyłem tego, co Lazzaro napisał o Debianie, ale chcę dodać kilka notatek.

Przede wszystkim należy ustawić interfejs gościa na „Urządzenie źródłowe” -> „Urządzenie hosta eth0: macvtap”; „Tryb źródła” -> „ Most ”.

Po drugie, skrypt inicjujący, dla którego nie działałeś dla mnie ( wygląda na to, że interfejs macvlan0 został utworzony zbyt późno podczas uruchamiania ), więc użyłem tego:

nano /etc/init.d/macvlan

Zmień mac na ten, który został przypisany podczas tworzenia interfejsu:

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

Zapisz i ustaw bit wykonania:

chmod +x /etc/init.d/macvlan

i dodaj wszystkie linki do init:

update-rc.d macvlan defaults
Przezwisko
źródło