Автонастройка сети (и не только?) для виртуальной машины
Вводная: в лекциях по сетям нужно очень быстро разворачивать вируталки, объединённые в некоторую сетевую топологию. С какого-то момента нет смысла вручную настраивать в них сеть (адресацию, маршрутизацию, выход в интернет, NAT, DNS, DHCP и т. д.).
Эти настройки более-менее очевидны (например, в одной сети должен быть один диапазон, машина с выходом в интернет должна быть с NAT, машина с двумя и более интерфейсами — ip_forward и т. д.).
Сведения об имеющейся конфигурации + дополнительные параметры (например, некоторые интерфейсы собраны в бридж, есть DHCP сервер, DHCP-клиент, локальный DNS, avahi, firewall и т. п.) можно передавать через поля DMI, которые потом видны с помощью dmidecode. В идеале в разных системах виртуализации можно найти инвариантные поля DMI. Как минимум нужно поддерживать VirtualBox.
Годится любой иной способ, но желательно минимальное вмешательство со стороны пользователя (например, эти параметры должно быть просто передать вручную).
Задача:
Разработать методиуку описания сети и написать программу, которая считывает эту информацию изнутри работающей виртуалки (в идеале — по максимуму угадывает её, например, опрашивает сетевые интерфейсы, а подключён ли к ним кабель) и превращает всё это в перманентные настройки сети (в первую очередь — systemd-networkd со товарищи) и старт сервисов.
- Сеть и службы должны штатно работать как минимум после перезагрузки, но в идеале —сразу же.
- Разработать интерфейс, задающий описание сети и написать программу, которая формирует соответствующие данные и передаёт их при запуске виртуалки. Возможно это должен быть читаемый текстовый файл, наподобие TOML, MD или в крайнем случае YAML.
- Разработать утилиту, которая развёртывает площадку по описанию (включая создание самих виртуалок).
Главное в этом проекте: интерфейс запуска (подзадача 2) должен быть как можно более простым и коротким. Так-то можно взять какой-нибудь Shorewall или попроще — Netplan, и накатать общий файл. Но он будет, считай, просто складом всех конфигов, и читать/писать такое будет сложно. Нужно внедрить в логику агента (подзадача 1) как можно больше умолчаний и угадаек, и не поддерживать use cases, в которых требуется-таки много информации задавать заранее.
Список имеющихся параметров виртуалок, и что можно на их основании предсказать
- Все виртуалки в лекциях имеют COM-консоль, доступную по TCP. Это значит, что порт доступа у всех запущенных виртуалок должен различаться. Таким образом этот порт является уникальным идентификатором в группе.
- Хостовая часть IP-адреса.
- Все виртуалки подключены к каким-то сетям (в первую очередь — типа intnet и NAT).
- Сетевая часть IP-адреса — на основании хеша имени этой сети, её порядкового номера или дисциплины именования (например, deepnet1, intnet2 и т. п.)
Если сетей больше одной — ip_forward
TODO суффиксы для обозначения других настроек
- Все виртуалки имеют имена
- hostname
- В имя виртуалки можно заложить NAT на NAT-сети (тогда ip_forward включается сам), DNS-сервер, DHCP-сервер; bridge
TODO суффиксы для обозначения других настроек
TODO