Назад | Перейти на главную страницу

Мостовая сеть с bhyve и гостями FreeBSD не работает

У меня есть хост FreeBSD10 с bhyve и следующей IP-конфигурацией в rc.conf:

ifconfig_igb0="inet X.X.X.146 netmask 255.255.255.0 broadcast X.X.X.255"
defaultrouter="X.X.X.254"
cloned_interfaces="bridge0"
ifconfig_bridge0="addm igb0 up"

Устройство крана добавляется через сценарии vmrc. У меня есть еще один IPv4-адрес от моего хостера, который находится в другая подсеть: Y.Y.Y.176. Хостер дает мне следующее руководство по настройке мостовой сети с этим IP: Мостовая сеть

Согласно этому руководству я настроил гостя (FreeBSD10) следующим образом (хостер предоставляет мне «виртуальный MAC» для IP):

ifconfig_vtnet0="inet Y.Y.Y.176 netmask 255.255.255.255 ether 02:00:00:8c:46:32"
static_routes="net1 net2"
route_net1="-net X.X.X.254/32 Y.Y.Y.176"
route_net2="default X.X.X.254"

Перед запуском виртуальной машины я настраиваю мост следующим образом:

ifconfig bridge0 addm igb0 addm tap0 up

с участием tap0является «стороной хоста» сетевого адаптера виртуальных машин.

Это не работает. Я не могу подключиться к шлюзу из виртуальной машины и не могу подключиться к хосту из виртуальной машины. Для меня это имеет смысл, потому что маршрутов нет. Непонятно, как это могло вообще работать.

Вероятно, вам нужно сделать:

ifconfig tap0 up

и / или добавить net.link.tap.up_on_open=1 к /etc/sysctl.conf сделать его автоподъем.

Обычно интерфейс касания не появляется, пока вы не дадите ему IP.

Это должно заставить мост работать.

Чтобы настроить мост в rc.conf:

cloned_interfaces="bridge0 tap0"
ifconfig_bridge0="addm igb0 addm tap0 up"

Также вам понадобятся:

if_bridge_load="YES"
if_tap_load="YES"

в /boot/loader.conf так что кран можно создавать на лету.

См. Официальные инструкции, которые я написал Вот.

Несмотря на то, что этому вопросу больше полугода, так как у меня была такая же проблема

Не настраивайте свой IP-адрес на физических интерфейсах моста, а на самом интерфейсе моста. Об этом говорится в Раздел руководства FreeBSD по мостовому соединению.

Насколько я понимаю, это связано со способом обработки пакетов. if_bridge(4) некоторые из них рассматриваются в разделе о фильтрации.

Это не решило, а скорее обошло проблему:

Я назначил igb0 на хосте все IP-адреса с /32 network-mask вместо виртуальных машин и назначил bridge0 частный IP 10.0.0.1/24, то vtnet0 интерфейс в виртуальной машине назначается 10.0.0.2 со шлюзом по умолчанию 10.0.0.1 и я создаю binat, используя pf.

В rc.conf на хосте выглядит так:

ifconfig_igb0="inet X.X.X.146 netmask 255.255.255.0 broadcast X.X.X.255"
defaultrouter="X.X.X.254"

ifconfig_igb0_alias0="inet Y.Y.Y.176/32"
ifconfig_igb0_alias1="inet Y.Y.Y.177/32"
ifconfig_igb0_alias2="inet Y.Y.Y.178/32"
ifconfig_igb0_alias3="inet Y.Y.Y.179/32"

cloned_interfaces="bridge0"
ifconfig_bridge0="inet 10.0.0.1/24"

И pf.conf на хосте:

vm_if1 = "Y.Y.Y.176"
vm_if2 = "Y.Y.Y.177"
vm_if3 = "Y.Y.Y.178"
vm_if4 = "Y.Y.Y.179"

slave = "10.0.0.4"

binat on igb0 from $slave to any -> $vm_if1
nat on igb0 from bridge0:network to any -> (igb0)

ВМ rc.conf действительно просто:

ifconfig_vtnet0="10.0.0.2 netmask 255.255.255.0"
defaultrouter="10.0.0.1"

Теперь, когда я инициализирую новую виртуальную машину, ей нужен IP-адрес в 10.0.0.0/24 диапазон и мне нужно настроить хосты pf.conf.