Jump to content
Калькуляторы

DHCP option 82 и ISC DHCPD ...помогите допилить связку

Всем привет! Реализуем опцию 82 у себя в сети и застряли с ДХЦП сервером.

 

 

Итак. Когда мы конфигурируем обычный ДХЦП с привязкой ИП к МАК-адресу клиента все очень просто.

 

1. В верху конфигурации dhcpd.conf описываем все интересующие нас подсети, например:

shared-network subs_Eth1 {

deny unknown-clients;

# abonents

subnet 10.177.2.0 netmask 255.255.255.0 {

range 10.177.2.1;

option routers 10.177.2.254;

option domain-name-servers 10.0.0.128;

server-identifier 10.0.0.128;

}

}

2. Потом делаем инклуд:

include "/dhcpd/include-fixed.conf";

 

3. В этом инклуде для каждого абонента с фиксированным ИП, привязанным к маку делаем одну запись:

host host-10.177.2.2 {

hardware ethernet 00:e7:19:d0:32:00;

fixed-address 10.177.2.2;

}

 

4. Перезапускаем сервер.

 

Таким образом, получается, что мы или добавляем в инклуд нужную запись для нового клиента или же удаляем(пересоздаем инклуд) в случае удаления клиента. Т.е. оперируем с одним плоским файлом, что вполне адекватно.

 

 

--------------------------------- Проблемы с использованием опции 82 ------------------------

Хотелось бы здесь сделать точно так же, т.е. оперировать с одним плоским файлом - добавлять нужные сроки для связки client_IP, switch_MAC, switch_PORT ну или удалять ненужные(пересоздавать файл).

 

В общем-то необходимо использовать две конструкции, например:

# CLIENT 1.1.1.1

class "host-1.1.1.1-class" {

match if binary-to-ascii (16, 8, ":", suffix ( option agent.remote-id, 6)) = "f:f5:ff:ef:1:f" - это switch_MAC

and binary-to-ascii(10, 8, "", substring(option agent.circuit-id, 5, 1)) = "5"; - это switch_PORT

}

 

pool "host-1.1.1.1-pool" {

range 1.1.1.1;

allow members of "host-1.1.1.1-class";

}

 

Но! Проблема в том, что эти конструкции должны быть вписаны внутри описания подсети, т.е. правильно писать вот так:

 

subnet 1.0.0.0 netsmask 255.0.0.0 {

# CLIENT 1.1.1.1

class "host-1.1.1.1-class" {

match if binary-to-ascii (16, 8, ":", suffix ( option agent.remote-id, 6)) = "f:f5:ff:ef:1:f" - это switch_MAC

and binary-to-ascii(10, 8, "", substring(option agent.circuit-id, 5, 1)) = "5"; - это switch_PORT

}

 

pool "host-1.1.1.1-pool" {

range 1.1.1.1;

allow members of "host-1.1.1.1-class";

}

}

 

И соостветственно в этом сабнете должны быть описаны адреса гейта и ДНС для клиентов этой подсети. И все клиенты, входящие в эту подсеть, должны вписываться внутрь этой конструкции и удаляться изнутри ее. Учитвая тот факт, что подсетей много(как минимум на каждый vlan) необходимо таких вот сложенных конструкций иметь много и менять конфиг внутри каждой подсети с учетом адреса клиента. Этот процесс выглядит весьма нетривиальным. Т.е. очень не хотелось бы из-за сложности скриптов конфигурирования создавать лишние проблемы, способные привести к остановке DHCP сервера при любой ошибке в файлах конфигурации.

 

Внимание вопрос: Возможно можно как-то более просто приписывать адрес клиенту при использовании опции 82? Так что бы все прописывалось для каждого клиента последовательно в одном плоском файле, как в примере с fixed-address - где достаточно перечислить правила привязок МАК-ИП, при чем сделать это можно вне описания подсетей и неважно в какой последовательности.

 

Спасибо!

Share this post


Link to post
Share on other sites
И все клиенты, входящие в эту подсеть, должны вписываться внутрь этой конструкции и удаляться изнутри ее.

не обязательно.

И еще не обязательно писать все в один конфиг. Разбивайте на несколько файлов

Share this post


Link to post
Share on other sites

На разные файлы да, так и есть. Но хочется в статических файлах описать подсети, а в инклудах конфигурировать привязки ip к клиенту. Это отлично работает с host {} и прязкой ip-mac, т.к. все привязки в любом порядке описываются в инклуде. Никаких проблем.

 

Подскажите пожалуйста - как тоже самое сделать для опции 82? Как описывать привязки ip клиентов вне структуры subnet используя switch_mac&switch_port(как в примере в первом сообщенит)? Сервер говорит, что структуру pool {} нельзя описывать вне subnet. :-( Если не сложно - приведите пожалуйста пример, как это можно сделать?

 

Спасибо огромное!

Edited by telephonist

Share this post


Link to post
Share on other sites

Коллеги, я надеюсь, что разобрался немного. Подскажите пожалуйста, правильно ли.

 

1. Есть статический файл, с основной конфигурацией и описанием подсетей dhcpd.conf:

---------------------------------------------- dhcpd.conf ----------

option domain-name-servers 10.0.0.2;
local-address 10.0.0.2;
log-facility local7;
authoritative;

shared-network HomeNet_Eth1 {
       subnet 10.0.0.0 netmask 255.255.255.0 {
               option routers 10.10.0.2;
       }
       subnet 10.17.0.0 netmask 255.255.255.0 {
               option routers 10.17.0.254;
       }
       include "/dhcpd/include82.conf";
}

----------------------------------

 

2. Здесь есть одна вставка include82.conf где я делаю связку данных опции 82(switch_MAC-switch_port-client_IP), пример для клиента, которому я хочу дать адрес 10.17.0.3:

------------------------------------- include82.conf -----------------

# CLIENT 10.17.0.3 PORT=2 SWITCH=0:12:df:5c:9:20
class "host-10.17.0.3-class" {
         match if binary-to-ascii (16, 8, ":", suffix ( option agent.remote-id, 6)) = "0:12:df:5c:9:20"
               and binary-to-ascii(10, 8, "", substring(option agent.circuit-id, 5, 1)) =  "2";
}
pool {
       range 10.17.0.3;
       allow members of "host-10.17.0.3-class";
}

----------------------------------------------------------------------

 

Соответственно мне достаточно из скриптов и БД генерировать только файл include82.conf, добавляя/удаляя записи class&pool для всех моих клиентов. Насколько это правильная конструкция?

 

Спасибо еще раз!

Edited by telephonist

Share this post


Link to post
Share on other sites

Подскажите пожалуйста - правильная ли конфигурация? Наблюдается странное поведение на разных свичах. На алькателе вроде все хорошо, а вот на длинке линукс отлично получает адрес, а вин2008(и домашний рутер длинк-300) не хочет... и еще вот такое сообщение появляется в логе

DHCPREQUEST for 10.17.0.39 (10.0.0.2) from 00:26:18:ea:ec:b7 via 10.17.0.254: lease 10.17.0.39 unavailable.

 

Время жизни лиза ставил в 1 минуту, вин2008 все равно не хотел получать адрес спустя даже несколько минут.

 

Может еще какое волшебное слово нужно где-то сказать?

 

Заранее спасибо!

Share this post


Link to post
Share on other sites

option agent.remote-id -не вижу смысла использовать -это надо еще и базу мак адресов анализировать и переписывать конфиг если свич поменяли

 

проще опираться на IP свича с которого пришел запрос

Вот тут описана конструкция и пример. http://biparasite.ru/?p=130

 

class "192.168.10.5:p1" {
match if binary-to-ascii (10, 8, "", suffix( option agent.circuit-id, 1)) = "1"
and binary-to-ascii(10, 8, ".", packet(24, 4)) = "192.168.10.5";
}

pool {
range 10.0.0.10;
allow members of "192.168.10.5:p1";

}

 

В остальном- все похоже на правду, но есть особенности:

1-Если выдавать по 1 адресу на порт -то при попытке получить адрес на другой машине(с другим мак -адресом) до истечения lease time -адрес получить не получится -сервер напишет что no free leases - что логично.

Лечится разными способами:

можно удалять инфу из leases.conf, можно уменьшить время лизы до минимума -что некрасиво, можно юзать патч для dhcpd -ищи на этом форуме.

 

2-На длинках множаться запросы dhcp discover -потому что relay не отрабатывает как положено, броадкаст в абонентском влане дойдет до всех свичей в этом влане и все они сделают discover на сервер.

Лечится убиванием dhcp на всех портах свичей доступа с помощью ACL. Подробности на форуме длинка.

Share this post


Link to post
Share on other sites

Спасибо!

 

К сожалению IP свича в качестве remote_id испольовать не получается. Потому как в центре "большой" коммутатор Л3, коммутирует вланы и является релеем DHCP. В итоге к серверу DHCPD в опции 82 приходит не адрес свича доступа, а адрес центрального свича в конкретном влане, а мак приходит от свича доступа.

Share this post


Link to post
Share on other sites

А как Вы связываете базу пользователей с адресами получаемыми по дхцп? Или монтажники делают какие то манипуляции при подключении? Передают номер порта?

Или еще как то?

Планируем переводить на дхцп все, но сеть полу умная полу тупая, и там где умные хочется использовать опцию 82. С существующими абонентами проще перевести со статики на динамику, есть таблицы соотношения порт/мак, а как быть с новыми? Кто как делает?

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this