Модуль dev_dhcp

Материал из Felix2
Перейти к: навигация, поиск


Модуль осуществляет интеграцию АСР Felix2 с DHCP сервером ISC-DHCP. Модуль создает/обновляет конфигурацию DHCP сервера по заданному шаблону.
Также модуль может передавать в АСР Felix2 информацию о выданных IP адресах и соответствующим им MAC адресам.



Параметры конфигурации модуля

  • ip_binding – тип привязки IP адреса абонента. Поддерживаются следующие типы (или их комбинации):
    mac – привязка выдаваемого IP адреса к MAC адресу абонента.
    opt82 – привязка выдаваемого IP к паре IP-порт оборудования.
  • device_ip_binding - тип привязки IP адреса оборудования (из справочника оборудования). Используется при выдаче IP адресов оборудованию по DHCP. Поддерживается выдача IP адреса на основе MAC адреса оборудования (device_ip_binding="mac").
  • stop_dhcp – команда остановки DHCP сервера (по умолчанию: /etc/init.d/isc-dhcp-server stop)
  • restart_dhcp – команда перезапуска DHCP сервера (по умолчанию: /etc/init.d/isc-dhcp-server restart)
  • update_mac_method – метод обновления доверенных пар IP-MAC (используется в режиме привязки opt82) (по умолчанию: leases log). Возможно указание следующих методов (или их комбинаций):
    leases – обновление данных из файла leases_filename
    log – обновление данных из файла log_filename
  • leases_filename – файл "leases" DHCP сервера (по умолчанию: /var/lib/dhcp/dhcpd.leases)
  • log_filename –файл "syslog" (по умолчанию: /var/log/syslog)
  • <template> – шаблон файла конфигурации DHCP сервера.
    • input_file – имя шаблона файла конфигурации DHCP сервера.
    • output_file – имя генерируемого по данному шаблону файла конфигурации DHCP сервера.

Пример конфигурации модуля

    ...
    <module name="dev_dhcp" file="modules/dev_dhcp.so" />
    ...
    <scheduler>
        ...
        <entry cmd="dev_dhcp.update" period="5 sec" start_delay="2 sec" />
        <entry cmd="dev_dhcp.update_mac_list" period="5 sec" start_delay="3 sec" />
        ...
    </scheduler>
    ...
    <dev_dhcp ip_binding="opt82 mac">
        <template name="dhcp" input_file="/etc/felix2/dhcp_opt82_and_mac.conf" output_file="/etc/dhcp/dhcpd.conf" />
    </dev_dhcp>
    ...

В данном примере каждые 5 секунд проверяется необходимость обновления конфигурации DHCP сервера (dev_dhcp.update). Система выполняет обновление/применение новой конфигурации только если это необходимо.
Также каждые 5 секунд проверяется появление новых доверенных пар IP-MAC (dev_dhcp.update_mac_list). Данные пары далее передаются в подсистему авторизации.

Пара IP-MAC считается доверенной, если данный IP был выдан хосту, который отправил DHCP запрос через заданный коммутатор (DHCP relay) с заданного порта. IP адрес и порт коммутатора, в который подключен абонент задается в биллинге. MAC адрес хоста берется из DHCP пакета.


Структура исходных данных для файла конфигурации

Конфигурация для DHCP сервера генерируется на основе следующих данных:


  • date - дата и время генерации файла (в формате dd.mm.YYYY HH:MM:SS)
  • <subnet> - массив подсетей из справочника подсетей.
    • id - идентификатор подсети
    • ip - IP подсети
    • mask - маска подсети (в формате A.B.C.D)
    • subnet - подсеть (в формате IP/N)
    • gate - IP шлюза
    • dns - IP адреса DNS серверов, разделенные запятой.
    • begin_ext_ip - первый адрес дополнительного диапазона IP адресов
    • end_ext_ip - последний адрес дополнительного диапазона IP адресов
    • <device> - массив оборудования в данной подсети (присутствует только если задана опция "device_ip_binding")
      • id - идентификатор оборудования
      • ip - IP оборудования
      • mac - MAC адрес оборудования
      • opt82_id - дополнительная информация для режима привязки opt82 (не используется)
      • device_model_id - внутренний идентификатор модели оборудования
    • <account> - массив аккаунтов пользователей в данной подсети
      • id - идентификатор аккаунта
      • ip - IP аккаунта
      • mac0 - зарегистрированный MAC адрес пользователя (для режима привязки mac)
      • mac1 - зарегистрированный MAC адрес пользователя (для режима привязки mac)
      • mac2 - зарегистрированный MAC адрес пользователя (для режима привязки mac)
      • device_id - идентификатор оборудования к которому подключен пользователь (для режима привязки opt82)
      • device_port - порт оборудования к которому подключен пользователь (для режима привязки opt82)
      • <device> - информация об оборудовании к которому подключен пользователь (для режима привязки opt82)
        • id - идентификатор оборудования
        • ip - IP оборудования
        • mac - MAC адрес оборудования
        • opt82_id - дополнительная информация для режима привязки opt82 (не используется)
        • device_model_id - внутренний идентификатор модели оборудования

Данные обрабатываются в соответствии с указанным шаблоном и сохраняются в виде конфигурационного файла.

Формат шаблона файла конфигурации

В шаблоне файла конфигурации используется свой мини-язык, по написанию схожий с HTML-тегами.

<TMPL_loop subnet>
subnet <TMPL_var ip> netmask <TMPL_var mask> {
    <TMPL_if gate>option routers <TMPL_var gate>;</TMPL_if>
    <TMPL_if dns>option domain-name-servers <TMPL_var dns>;</TMPL_if>
}
</TMPL_loop>

Данный мини-язык обладает следующим набором тегов.

TMPL_var

<TMPL_var NAME>

Самый простой тег. Выводит значение переменной NAME.

TMPL_loop

<TMPL_loop LOOP_NAME>

Цикл по массиву LOOP_NAME. <TMPL_loop> могут быть вложенными.

TMPL_if

<TMPL_if NAME>DATA</TMPL_if>

Условное включение текста в конфигурацию. Текст DATA будет включен в конфигурацию только если определена и не равна нулю переменная NAME.

TMPL_else

<TMPL_if NAME><TMPL_else>DATA</TMPL_if>

Альтернативная ветвь для условного ветвления. Текст DATA будет включен в конфигурацию только если НЕ определена ИЛИ равна нулю переменная NAME.

TMPL_unless

<TMPL_unless NAME>DATA</TMPL_unless>

Условное включение текста в конфигурацию. Тег, обратный по действию тегу <TMPL_if>.


Пример шаблона файла конфигурации ISC-DHCP сервера

#
# Automatically generated configuration file
# Filename: dhcpd.conf (/etc/dhcp/dhcpd.conf)
# Generator: Felix2
# Creation Date: <TMPL_var date>
#

#
# option definitions common to all supported networks...
#

authoritative;

default-lease-time 86400;
max-lease-time 86400;
ddns-update-style none;


log-facility local7;


if exists agent.remote-id and exists agent.circuit-id
{
    if binary-to-ascii(16, 8, "", substring(option agent.remote-id, 2, 1)) = "0" {
        set switch-mac = concat("0", binary-to-ascii(16, 8, "", substring(option agent.remote-id, 2, 1)), ":", binary-to-ascii(16, 8, ":", substring(option agent.remote-id, 3, 6)));
    } else {
        set switch-mac = binary-to-ascii(16, 8, ":", substring(option agent.remote-id, 2, 6));
    }
    set switch-addr = binary-to-ascii(10, 8, ".", packet(24, 4));
    set switch-port = binary-to-ascii(10, 8, "", suffix(option agent.circuit-id, 1));
    set switch-port-vlan = binary-to-ascii(10, 8, "", substring(option agent.circuit-id, 2, 2));
    log(info, concat("- Lease: ", binary-to-ascii(10, 8, ".", leased-address), " via IP: ", switch-addr, " (MAC: ", switch-mac, ") on port: ", switch-port, " in VLAN: ", switch-port-vlan));
}

#
# subnets
#

<TMPL_loop subnet>
subnet <TMPL_var ip> netmask <TMPL_var mask> {
    <TMPL_if gate>option routers <TMPL_var gate>;</TMPL_if>
    <TMPL_if dns>option domain-name-servers <TMPL_var dns>;</TMPL_if>

<TMPL_loop account><TMPL_if device_port>
    class "<TMPL_var device_id>:<TMPL_var device_port>" {match if binary-to-ascii(10, 8, ".", packet(24, 4))="<TMPL_loop device><TMPL_var ip></TMPL_loop>" 
        and binary-to-ascii(10, 8, "", suffix(option agent.circuit-id, 1)) = "<TMPL_var device_port>";}
    pool {range <TMPL_var ip>; allow members of "<TMPL_var device_id>:<TMPL_var device_port>";}
<TMPL_else><TMPL_if mac0>
    host <TMPL_var id>_0 {
        hardware ethernet <TMPL_var mac0>;
        fixed-address <TMPL_var ip>;
    }</TMPL_if><TMPL_if mac1>
    host <TMPL_var id>_1 {
        hardware ethernet <TMPL_var mac1>;
        fixed-address <TMPL_var ip>;
    }</TMPL_if><TMPL_if mac2>
    host <TMPL_var id>_2 {
        hardware ethernet <TMPL_var mac2>;
        fixed-address <TMPL_var ip>;
    }</TMPL_if>
</TMPL_if></TMPL_loop account><TMPL_if begin_ext_ip><TMPL_if end_ext_ip>
    range <TMPL_var begin_ext_ip> <TMPL_var end_ext_ip>;</TMPL_if></TMPL_if>
}
</TMPL_loop>


В данном примере реализована следующая логика выдачи IP адресов:

IP адреса абонентам выдаются на основании номера порта коммутатора, переданного в DHCP пакете ( DHCP Option 82 ), и IP адреса коммутатора (куда подключен абонент).
Если не указан порт коммутатора, но в биллинге задан MAC адрес для данного абонента (можно задать до 3х штук), IP адрес абоненту выдается на основании MAC адреса.
Если никаких соответствий не найдено, но в справочнике подсетей для данной подсети задан "дополнительный диапазон IP адресов", IP адрес абоненту будет выдаваться из этого диапазона.