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

Как назначить хосты классам в ISC DHCPD?

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

host host2 { hardware ethernet 10:bf:48:xx:xx:xx; fixed-address 192.168.1.2; }
host host3 { hardware ethernet 10:bf:48:xx:xx:xx; fixed-address 192.168.1.3; }
# etc ...   

subnet 192.168.1.0 netmask 255.255.255.0 {
  option subnet-mask 255.255.255.0;
  option broadcast-address 192.168.1.255;
  option routers 192.168.1.254;
  option domain-name-servers 8.8.8.8, 8.8.4.4;

  # Unknown test clients get this pool.
  pool {
    max-lease-time 1800; # 30 minutes
    range 192.168.1.100 192.168.1.250;
    allow unknown-clients;
  }

  # MyHosts nodes get this pool
  pool {
    max-lease-time 1800;
    range 192.168.1.1 192.168.1.20;
    allow members of MyHosts;
    deny unknown-clients;
  }
}

Я хочу поместить их в класс и назначить их пулу, чтобы гарантировать, что в этом пуле разрешены только эти хосты.

Я попытался определить их как:

class "MyHosts" {
  host host2 { hardware ethernet 10:bf:48:xx:xx:xx; fixed-address 192.168.1.2; }
  host host3 { hardware ethernet 10:bf:48:xx:xx:xx; fixed-address 192.168.1.3; }
}

Но это выдало ошибку «здесь не разрешены объявления хоста».

Как мне это сделать?

Как вы обнаружили, вы не можете объявить hostс внутри class. В class декларация может содержать только match или match if заявления. Если вы хотите сгруппировать свои клиентские запросы в классы, используя class construct, вы можете сделать это примерно так:

class "MyHosts" {
    match hardware;
}
subclass "MyHosts" 1:10:bf:48:xx:xx:xx;  # host2
subclass "MyHosts" 1:10:bf:48:xx:xx:xx;  # host3

В приведенном выше match заявление в class объявляет, что подклассы будут соответствовать hardware атрибут. (hardware оценивает конкатенацию типа оборудования и MAC-адреса клиента; для клиентов Ethernet тип оборудования - 1, поэтому 1: префикс в строке данных subclass заявления.)

Когда клиент является членом подкласса, он также является членом родительского класса, поэтому теперь вы можете использовать allow и deny статьи в вашем pool декларации, гарантирующие, что члены MyHosts назначаются IP-адреса из желаемого пула, например:

subnet 192.168.1.0 netmask 255.255.255.0 {
    ...
    pool {
        range 192.168.1.101 192.168.1.250;
        ...
        deny members of "MyHosts";
        ...
    }
    pool {
        range 192.168.1.1 192.168.1.20;
        ...
        allow members of "MyHosts";
        ...
    }
}