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

Назначьте фиксированный IP-адрес через DHCP с помощью поиска DNS

Предисловие

Я создаю среду виртуализации с 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, однако в руководстве четко сказано:

Имейте в виду, что только параметр dhcp-client-identifier и аппаратный адрес могут использоваться для соответствия объявлению хоста или параметру параметра host-identifier для серверов DHCPv6. Например, невозможно сопоставить объявление хоста с параметром имени хоста. Это связано с тем, что нельзя гарантировать уникальность опции host-name для любого данного клиента, в то время как и аппаратный адрес, и опция dhcp-client-identifier, по крайней мере, теоретически гарантированно уникальны для данного клиента.

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

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", которые я собираюсь исправить, как только это будет запущено.

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

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

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

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