Я запускаю экземпляр Ubuntu 16.04 с несколькими интерфейсами. Я хочу настроить некоторые маршруты на втором интерфейсе. Хотя я могу сделать это вручную, это не сохраняется после перезагрузки.
Большинство методов предполагают определение маршрутов с интерфейсом в /etc/network/interfaces, что преобразуется в /etc/network/interfaces.d/50-cloud-init.cfg на основе вызова из файла интерфейсов.
Меня сбивает с толку то, что я не уверен, где и как вообще определяется второй интерфейс.
Два интерфейса — ens4 и ens5. Только ens4 определен с помощью iface ens4 inet dhcp
. Я ожидал увидеть что-то подобное для ens5, но нет.
Запуск ifconfig показывает, что ens5 работает. Также ip link show
показывает его.
Похоже, что я могу добавить ens5 в /etc/network/interfaces, ничего не сломав. Если я это сделаю, то, похоже, произойдет что-то еще. Например, файл "ifstate.ens5" теперь появляется в /run/network. Кроме того, ifdown / ifup работают на интерфейсе.
Однако даже добавление post-up route add -net 192.168.2.0 netmask 255.255.255.0 gw 192.168.1.1
не приводит к созданию маршрута при загрузке... Но если я выполняю ifdown, а затем ifup, маршрут добавляется, как и ожидалось.
Мои дополнительные исследования показывают, что ens5 определяется через пакет cloud-init из источника данных Google GCE, что, конечно, хорошо, но не дает ответа на вопрос, почему в файле 50-cloud-init.cfg присутствует только ens4.
Где же определен ens5 и как добавить статический маршрут для ens5?
решение1
Я не уверен, что это лучшее решение, но я нашел способ добиться желаемого результата.
Во-первых, я считаю, что пакет python google_compute_engine выполняет операции по настройке сети в какой-то момент процесса загрузки. Я нашел это в "/usr/lib/python3/dist-packages/google_compute_engine/network_setup".
К сожалению, я считаю, что хотя результатом этого метода является рабочая сеть, он делает некоторые вещи за пределами обычных "каналов" Ubuntu. Например, хотя второй интерфейс (ens5) работает и распознается в большинстве случаев, поскольку он не определен в /etc/network/interfaces, все, что зависит от него, вряд ли будет работать.
Поскольку другие команды, такие как «route», по-прежнему работают, я не уверен, насколько это важно.
Я не уверен, есть ли способ использовать этот пакет Google, поэтому не уверен, что это вообще хорошая идея.
Однако мое текущее решение заключается в использовании сценариев запуска, как определено в "https://cloud.google.com/compute/docs/startupscript".
Поскольку эти скрипты запуска запускаются после настройки сети, я поместил скрипт в контейнер, который выполняет набор действий на хосте на основе локального файла конфигурации хоста. Это позволило мне создавать статические маршруты при загрузке с помощью команды "route add -net 192.168.2.0 netmask 255.255.255.0 gw 192.168.1.1 dev ens5".