DHCPD 2
DHCPD
Заметки по настройке isc dhcpd
Скрипт запуска (тестовый)
Запуск в нейспейсе
#!/bin/bash. rm ./dhcpd.leases2 ./dhcpd.leases2~ touch ./dhcpd.leases2 ip netns exec DHCP /usr/sbin/dhcpd \ -cf ./dhcpd.conf \ -lf ./dhcpd.leases2 \ -pf ./dhcpd.pid \ -f \ -d \ -tf ./trace-output-file \ dhcp_to_main_ns
Прежде чем начать - логгирование
Уточнить! Странно но внятный лог можно получить только при выдаче адреса - те если сервер адрес не выдал то (почему?!) конструкции вида
log(info, concat("Client ",binary-to-ascii(16, 8, ":", substring(hardware, 0, 4))));
Не срабатывают
По этой причине задача номер один при отладке сервера - сделать конфиг который всегда выдает адреса (но не обязательно маршрутизируемые) что бы видеть что прислал клиент, что добавил свитч и/или релей и тд.
Мой минимальный конфиг такой
ddns-update-style none; default-lease-time 36000; max-lease-time 72000; authoritative; log-facility local6; log(info, concat( "log start\n", "-->", binary-to-ascii(10, 8, ".", packet(0, 1000)), "\n", "-->", binary-to-ascii(10, 8, ".", packet(0, 1000)), "\n", suffix (concat ("0", binary-to-ascii (16, 8, "", substring(hardware,0,1))),2), ":", suffix (concat ("0", binary-to-ascii (16, 8, "", substring(hardware,1,1))),2), ":", suffix (concat ("0", binary-to-ascii (16, 8, "", substring(hardware,2,1))),2), ":", suffix (concat ("0", binary-to-ascii (16, 8, "", substring(hardware,3,1))),2), ":", suffix (concat ("0", binary-to-ascii (16, 8, "", substring(hardware,4,1))),2), ":", suffix (concat ("0", binary-to-ascii (16, 8, "", substring(hardware,5,1))),2), ":", suffix (concat ("0", binary-to-ascii (16, 8, "", substring(hardware,6,1))),2), "\n", "log end\n" ) ); class "any" { match if (binary-to-ascii(16, 8, ":", substring(hardware, 0, 1)) = "1"); } #class "b8" { match if (binary-to-ascii(16, 8, ":", substring(hardware, 1, 1)) = "b8"); } class "b9" { match if (binary-to-ascii(16, 8, ":", substring(hardware, 1, 1)) = "b9"); } # b8:27:eb:24:8d:f2 class "never_match" { match if ( binary-to-ascii(10, 16, "", substring(option agent.circuit-id, 2, 2)) = "4096" );} shared-network "networks" { subnet 172.31.99.0 netmask 255.255.255.0 { } subnet 10.32.99.0 netmask 255.255.255.0 { } subnet 10.30.0.1 netmask 255.255.255.255 { } subnet 10.5.0.0 netmask 255.255.255.0 { option subnet-mask 255.255.255.0; option broadcast-address 10.5.0.255; option routers 10.4.0.1; pool { range 10.5.0.2 10.5.0.253; default-lease-time 10; max-lease-time 10; deny members of "never_match"; deny members of "b9"; allow members of "any"; } } }
Тут определены 3 класса - any, под который должен попадать любой запрос (1 в нулевом байте означает тип ether)
class "any" { match if (binary-to-ascii(16, 8, ":", substring(hardware, 0, 1)) = "1"); }
Класс для клиентов с b9 в первом байте МАК-адреса
class "b9" { match if (binary-to-ascii(16, 8, ":", substring(hardware, 1, 1)) = "b9"); }
Класс который никогда не сработает (VLAN ID = 4096) - он нужен при автоненерации в качестве заглушки для случая если в какой-то момент нет ни одного клиента в сабнете
class "never_match" { match if ( binary-to-ascii(10, 16, "", substring(option agent.circuit-id, 2, 2)) = "4096" );}
Далее
deny members of "never_match"; deny members of "b9"; allow members of "any";
- Явно запретить известного клиента b9
- Явно разрешить всех
Порядок выдачи адресов для клиентов попадающих под несколько условий
Порядок выдачи адресов
Задача
Есть 4 группы клиентов
- известные с положительным балансом (с правильным option 82 и условием в базе)
- известные с отрицательным балансом (с правильным option 82 и условием в базе)
- неизвестные (нет в базе но есть opt82 - по сути только включенные)
- неправильные (нет opt82 или он не соответвует ожидаемому - по сути, ошибка настройки сети)