скрипт if-up для интерфейса virtualbox «host-only network»

скрипт if-up для интерфейса virtualbox «host-only network»

Я использую сеть Virtualbox host-only и у меня есть интерфейс vboxnet0.

На хосте (Ubuntu 14) у меня есть несколько маршрутных сотрудников, несколько таблиц маршрутизации (основная и две дополнительные), набор правил IP и т. д.

Все изменения, которые я вносил в таблицы маршрутизации для интерфейса vbonxen0 на хосте, терялись при перезагрузке.

Как создать скрипт, подобный ifup, для интерфейса vboxnet0?

решение1

При использовании VirtualBox следует помнить о некоторых вещах.только хост-сетевое взаимодействиережим (по крайней мере V4.3.36), особенно когдамостнет возможности и вручную, пользовательские маршруты необходимо настроить впоследствии:

  • vboxnet0узел устройства - этонетавтоматически доступен после загрузки (!)
    За исключением случаев, когда вы настраиваете его вручную, /etc/network/interfacesчто может помешать VirtualBox запустить свой собственный экземпляр.
  • Он даже недоступен, когда загружены модули vbox(pci|netadp|netflt|drv).
  • Использование vboxmanage hostonlyif createпросто добавит узел устройства, но оставит его в состоянии DOWN, которое пока не маршрутизируется.
  • vboxnet0Состояние устройства останется неизвестным даже при запуске интерфейса:
    4: vboxnet0: <BROADCAST,MULTICAST,UP,LOWER_UP> ... state UNKNOWN ...
    Любая попытка использованиявверхсобытия из /etc/network/interfaces, ifupили /etc/network/if-up.d/MYSCRIPTбесполезны, так как это состояние никогда не достигается.
  • На хосте это становитсятолькодоступен и готов к использованию при запуске первой гостевой виртуальной машины.

Единственный способ попасть междувиртуальный бокси начало вашей виртуальной машины, которую я пока нашел, используетправило udevпоместив файл, например: /etc/udev/rules.d/80-vboxnetс:

ЯДРО=="vboxnet0", ПОДСИСТЕМА=="net", ДЕЙСТВИЕ=="add", ВЫПОЛНЕНИЕ+="/bin/bash -c '/bin/sleep 1; /sbin/ip route add xxxx dev vboxnet0'"

который запускает экземпляр bash. Я поместил оператор ip route ...непосредственно в файл правил, но в качестве альтернативы можно просто вызвать скрипт в другом месте и поместить туда дополнительные конфигурации маршрута.

решение2

Ответ 3roncoдает хорошее представление о том, как VirtualBox обманывает нас в этом вопросе, но я обнаружил, что его решение Udev не работает на моем Ubuntu 19.04, поскольку на момент запуска скрипта соединение все еще было недоступно.

Я попробовал добавить интерфейс внетпланоднако по неизвестным причинам статические маршруты были настроены игнорировались.

Если в вашей системе есть networkd-dispatcher, вы можете разместить скрипт здесь

/etc/networkd-dispatcher/routable.d/99-vboxnetworks

Вот мой:

#!/bin/bash

if [ $IFACE == vboxnet2 ]; then
   /sbin/ip route add fdnn:nnnn:nnnn:2::/64 via fdnn:nnnn:nnnn:1::2
   /sbin/ip route add fdnn:nnnn:nnnn:3::/64 via fdnn:nnnn:nnnn:1::3
fi

Теперь оказывается, что этот скрипт не будет запущен, если интерфейс не имеет записи в netplan. Мой включает одну из игнорируемых записей маршрутизации, просто чтобы сделать его синтаксически правильным (вероятно, есть более аккуратный способ сделать это). Поэтому я

/etc/netplan/01-mynet.yaml

Содержит:

network:
    ethernets:
            vboxnet2:
                    routes:
                            # These routes are ignored for reasons unknow,
                            # I have included them just so that vboxnet2 gets
                            # a mention here. Actual routes are added by
                            # /etc/networkd-dispatcher/routable.d/99-vboxnetworks
                            #
                            - to: fdnn:nnnn:nnnn:2::/64
                              via: fdnn:nnnn:nnnn:1::2

Связанный контент