Гость и хост не могут видеть друг друга с помощью linux-kvm и macvtap

8

Я перевожу виртуальную машину kvm со старого хоста (как аппаратного, так и операционного) на новый.

Для работы в сети virt-manager предложил мне новую опцию: macvtap . Это выглядело хорошей альтернативой настройке моста на eth0.

Так что теперь гость загружается просто отлично, получает IP-адрес от моего локального сетевого DHCP-сервера, может выйти в Интернет. Гость также видит другие машины в локальной сети, я могу ssh их и т. Д.

Проблема в том, что хост и гость не видят друг друга. Я не могу связаться с гостем с хоста, используя гостевой IP, и при этом я не могу связаться с хостом с гостя, используя хост-IP. Нет пинг, сш, 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, предназначенный для связи между хостом и гостем, но это выглядит немного излишним. Есть ли способ заставить хозяина и гостя общаться?

ascobol
источник
Macvtap не является допустимой заменой мостов. Если вы хотите переключение, а не мостовое соединение, посмотрите на openvswitch.
user186658

Ответы:

4

Я задал этот вопрос на IRC, и кажется, что Macvtap

вводит гостевой трафик в сетевой стек, слишком низкий для этого

Решение состоит в том, чтобы добавить сетевой интерфейс для связи между гостем и хостом или остаться со старым мостовым решением ...

ascobol
источник
1
Вот пошаговые инструкции о том, как создать интерфейс хост / гость без отключения сетевого менеджера: wiki.libvirt.org/page/…
HDave
1
Я не мог заставить эти инструкции работать ...
HDave
4

virt-manager прямо говорит, что при настройке macvtap не работает связь между хостом и гостевой сетью. Я просто добавил второй интерфейс на основе nat, настроил его в гостевой системе и использовал его для связи с моим хостом.

Подмастерье Компьютерщик
источник
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
npen
источник
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-адрес.

Теперь вы создаете сценарий инициализации - который должен быть запущен до инициализации сети - для создания адаптера macvlan при каждом запуске. Команда для этого:

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

Пример сценария инициализации Upstart для этой цели:

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

на ваш сценарий инициализации.

Когда вы сейчас перезагружаете свою машину, связь между хостом и гостем должна работать как с 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

Я использовал то, что Lazzaro написал для Debian, но я хочу добавить несколько заметок.

Прежде всего, гостевой интерфейс должен быть установлен на «Исходное устройство» -> «Хост-устройство eth0: macvtap»; «Режим источника» -> « Мост ».

Во-вторых, у вас не работал скрипт инициализации ( кажется, что интерфейс 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
Никнейм
источник