Предисловие

Я создаю среду виртуализации с Ubuntu 14.04 и LXC. Я не хочу писать свой собственный шаблон, поскольку обновление с 12.04 до 14.04 показало, что обратная совместимость не гарантируется.

Поэтому я развертываю свои виртуальные машины через lxc-create, используя шаблон Ubuntu по умолчанию. DNS для серверов предоставляется Amazon Route 53, поэтому локальный DNS-сервер не требуется.

Я также использую Puppet для настройки своих серверов, поэтому я хочу, чтобы ручные усилия по развертыванию были минимальными.

Теперь шаблон Ubuntu по умолчанию назначает IP-адреса через DHCP. Поэтому мне нужен локальный DHCP-сервер для назначения IP-адресов узлам, чтобы я мог подключиться к ним по SSH и запустить Puppet. Поскольку Puppet требует правильной настройки DNS, назначение временных IP-адресов невозможно, клиенту необходимо с самого начала получить правильное имя хоста и IP-адрес.

Вопрос

Какой DHCP-сервер я использую и как заставить его назначать IP-адрес только на основе параметра DHCP имени хоста, выполнив поиск DNS для этого самого имени хоста?

Что я пробовал

Я пытался заставить его работать с помощью DHCP-сервера ISC, однако в руководстве четко сказано:

Please be aware that only the dhcp-client-identifier option and the hardware address can be used to match a host declaration, or the host-identifier option parameter for DHCPv6 servers. For example, it is not possible to match a host declaration to a host-name option. This is because the host-name option cannot be guaranteed to be unique for any given client, whereas both the hardware address and dhcp-client-identifier option are at least theoretically guaranteed to be unique to a given client.

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

class "my-client-name" {
    match if option host-name = "my-client-name";
    fixed-address my-client-name.my-domain.com;
}

К сожалению, параметр фиксированного адреса не разрешен в операторах класса . Я могу заменить его пулом размером 1, который работает как положено:

subnet 10.103.0.0 netmask 255.255.0.0 {
    option routers 10.103.1.1;

    class "my-client-name" {
        match if option host-name = "my-client-name";
    }
    pool {
        allow members of "my-client-name";
        range 10.103.1.2 10.103.1.2;
    }
}

Однако для этого мне потребуется администрировать IP-адреса в двух местах (Amazon Route53 и DHCP-сервер), чего я бы предпочел не делать .

О безопасности

Поскольку это используется только на этапе начальной загрузки во внутренней сети и затем заменяется статической сетевой конфигурацией Puppet, это не должно быть проблемой с точки зрения безопасности. Однако мне известно, что виртуальная машина загружается с учетными данными «ubuntu: ubuntu», которые я собираюсь исправить, как только она будет запущена.

answer

Надеюсь, вы сможете контролировать аппаратные MAC-адреса ваших виртуальных интерфейсов Ethernet.

В этом случае у меня была аналогичная проблема, и привязка ISC также не соответствовала моим усилиям по настройке. Лучшее решение, которое я до сих пор надежно использую в течение многих лет, - это отредактировать файл аренды, чтобы желаемые IP-адреса были назначены соответствующему MAC-адресу оборудования.

Во-первых, вы просто запускаете клиентов для заполнения файла аренды. Затем остановите клиентов и выполните привязку, а затем отредактируйте файл аренды.

Как заметил друг, я мог бы использовать Puppet для замены автоматически сгенерированного MAC-адреса в файле конфигурации LXC. Это позволило бы мне использовать директиву фиксированного адреса с именем DNS.