Гість і хост не можуть бачити один одного за допомогою linux-kvm та macvtap


9

Я переміщую віртуальну машину kvm зі старого хоста (як апаратного, так і ОС) на новий.

Для роботи в мережі, virt-менеджер запропонував мені новий варіант: macvtap . Це виглядало гарною альтернативою встановленню мосту на eth0.

Тож тепер гість завантажується просто чудово, отримує IP від ​​мого локального сервера DHCP, може дістатися до Інтернету. Гість також бачить інші машини в локальній мережі, я можу їх зламати тощо.

Проблема в тому, що господар і гість не бачать один одного. Я не можу дістатись до гостя від хоста, використовуючи гостьову IP, і я не можу отримати доступ до хоста від гостя, використовуючи IP хоста. Ні ping, ssh, http, нічого.

Ось route -nкоманда від хоста:

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

(той же вихід від гостя).

Можливо, я міг би створити новий інтерфейс tun / tap, призначений для спілкування між господарем та гостем, але це виглядає трохи непосильним. Чи є спосіб змусити господаря та гостя спілкуватися?


Macvtap не є дійсною заміною для мостів. Якщо ви хочете переключитися, а не мостити, загляньте у openvswitch.
користувач186658

Відповіді:


7

Я задав це питання на IRC і, здається, macvtap

вводить гостьовий трафік у мережевий стек занадто низько для цього

Тоді рішення полягає в тому, щоб додати мережевий інтерфейс для гостя та хоста, щоб спілкуватися або залишатися зі старим мостовим рішенням ...


1
Ось покрокові інструкції, як створити інтерфейс хоста / гостя без відключення мережевого менеджера: wiki.libvirt.org/page/…
HDave

1
Я не міг отримати ці вказівки для роботи ...
HDave

4

virt-менеджер чітко каже, що macvtap не працює для зв’язку з мережею гостьових гостей, коли ви його налаштовуєте. Я просто додав другий інтерфейс, що базується на наті, налаштував його в гості і використовував його для спілкування з моїм хостом.


1

Рішення полягає в налаштуванні інтерфейсу macvlan на гіпервізорі з тією ж IP-адресою, що і в реальному апаратному інтерфейсі (дуже важливо), і налаштування маршрутизації на хості для його використання. У Qemu / KVM використовуйте інтерфейс macvtap на апаратному інтерфейсі, як завжди.

Для моєї конфігурації (мережа 192.168.1.0/24, апаратний інтерфейс p10p1 та шлюз 192.168.1.1) він дає (на гіпервізорі):

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

1

Як було сказано в попередніх відповідях, рішенням цієї проблеми є додавання мережевого адаптера macvlan на хост. Однак я відчув, що перенаправлення маршрутів до адаптера macvlan вручну було хитким, тим більше, що я хотів, щоб підтримка IPv6 та встановлені маршрути вручну могли стати проблемою, коли зміни префікса змінюються. Отже, ось моя конфігурація, яка залишає ядро ​​в управлінні таблицею маршрутизації:

(Конкретна конфігурація тут специфічна для Debian і Upstart, але основні кроки повинні працювати в будь-якому GNU / Linux.)

Створення адаптера macvlan під час завантаження

Спочатку потрібно вибрати MAC-адресу для свого адаптера. Ви можете просто використовувати випадковий, але я пропоную вам вручну створити адаптер macvlan і використовувати його MAC. Таким чином, MAC зобов’язує будь-які конвенції, які там можуть бути.

Встановлення фіксованого MAC доцільно, оскільки в іншому випадку немає можливості, наприклад, DHCP-серверу розпізнати вашу машину після перезавантаження та призначити їй ту саму IP-адресу, що і раніше.

Тому створіть адаптер і знайдіть 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
...

Виділене шістнадцяткове число - це ваша MAC-адреса.

Тепер ви створюєте сценарій init - який потрібно запустити до того, як мережа буде ініціалізована - для створення адаптера macvlan при кожному запуску. Команда зробити це:

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

Прикладом для цього сценарію Upstart init буде:

start on starting networking

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

Просто помістіть це, наприклад /etc/init/macvlan.conf.

Налаштування мережевої конфігурації

В /etc/network/interfaces, встановіть фізичний мережевий адаптер для ручної (але залишити її авто) і перемістити його попередню конфігурацію ( як правило , DHCP або статичний IP - адреса) для вашого macvlan адаптера. Наприклад:

auto eth0
iface eth0 inet manual

auto macvlan0
iface macvlan0 inet dhcp

Відключення IPv6 для фізичного адаптера

Нарешті, ви не хочете, щоб фізичний адаптер отримував IP-адресу. Для IPv4 встановлення адаптера вручну не дозволяє йому отримати адресу. Однак я не знайшов конфігурацію, яка зупиняє ядро ​​від отримання / призначення IPv6 адреси для / до адаптера. Коли це відбувається, він також додає маршрути для них, що може спричинити проблеми. Тому найкращим способом, здається, є відключення IPv6 для фізичного адаптера. Це можна зробити, додавши рядок

net.ipv6.conf.eth0.disable_ipv6=1

до /etc/sysctl.conf, створивши файл /etc/sysctl.d/із цього рядка або додавши його

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

до вашого сценарію init.

Коли ви перезавантажуєте комп'ютер, спілкування від хоста до гостя повинно працювати як з IPv4, так і з IPv6.


Пам’ятайте, що якщо ви зробите помилку під час налаштування, ваш хост може стати недоступним через мережу навіть після перезавантаження. Робіть це лише в тому випадку, якщо у вас є фізичний доступ до машини або інші гарантії, щоб ви могли усунути потенційні проблеми.


1

Ви хочете зробити щось подібне:

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

Зауважте, що останній стовпець містить "macvlan0" замість "eth0".

Для цього ви можете використовувати ці команди, вважаючи 192.168.0.42 як вашу 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

Переважно схожий з розчином npen. Якщо ви хочете більш складний сценарій, перегляньте мою веб-сторінку з цього приводу.


Не забудьте завантажити macvlanмодуль:modprobe macvlan
mdd

0

Я використав те, що написав Лаззаро на Debian, але хочу додати кілька приміток.

Перш за все, для гостьового інтерфейсу потрібно встановити "Вихідний пристрій" -> "Хост-пристрій eth0: macvtap"; "Режим джерела" -> " Міст ".

По-друге, сценарій init, який ви не працювали для мене ( схоже, інтерфейс macvlan0 був створений занадто пізно під час запуску ), тому я використав це:

nano /etc/init.d/macvlan

Змініть mac на той, який був призначений під час першого створення інтерфейсу:

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

Збережіть і встановіть біт виконання:

chmod +x /etc/init.d/macvlan

і додайте всі посилання для init:

update-rc.d macvlan defaults
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.