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 -n
polecenie 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?
źródło
Odpowiedzi:
Zadałem to pytanie na IRC i wygląda na to, że macvtap
Rozwiązaniem jest dodanie interfejsu sieciowego dla gościa i hosta do komunikacji lub pozostanie przy starym rozwiązaniu zmostkowanym ...
źródło
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.
źródło
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):
źródło
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:
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:
Przykładowy skrypt inicjujący Upstart w tym celu to:
Po prostu włóż to np
/etc/init/macvlan.conf
.Konfigurowanie konfiguracji sieci
W
/etc/network/interfaces
ustaw 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: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
do
/etc/sysctl.conf
, tworząc plik w/etc/sysctl.d/
tym wierszu lub dodającdo 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.
źródło
Chcesz skończyć z czymś takim:
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:
Głównie podobny do rozwiązania npen. Jeśli chcesz bardziej wyrafinowanego skryptu, zobacz moją stronę internetową na ten temat.
źródło
macvlan
modułu:modprobe macvlan
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:
Zmień mac na ten, który został przypisany podczas tworzenia interfejsu:
Zapisz i ustaw bit wykonania:
i dodaj wszystkie linki do init:
źródło