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