<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="uk">
	<id>https:///index.php?action=history&amp;feed=atom&amp;title=Dhcp-%D0%BA%D0%BE%D0%BD%D1%84%D0%B8%D0%B3_%D1%81_%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E_make_config</id>
	<title>Dhcp-конфиг с помощью make config - Історія редагувань</title>
	<link rel="self" type="application/atom+xml" href="https:///index.php?action=history&amp;feed=atom&amp;title=Dhcp-%D0%BA%D0%BE%D0%BD%D1%84%D0%B8%D0%B3_%D1%81_%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E_make_config"/>
	<link rel="alternate" type="text/html" href=""/>
	<updated>2026-05-05T12:28:26Z</updated>
	<subtitle>Історія редагувань цієї сторінки в вікі</subtitle>
	<generator>MediaWiki 1.40.0</generator>
	<entry>
		<id></id>
		<title>Sv в 14:25, 29 жовтня 2020</title>
		<link rel="alternate" type="text/html" href=""/>
		<updated>2020-10-29T14:25:26Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Нова сторінка&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Конфиги будут разными в зависимости от разных факторов (option82, один на порту, существует ли привязка mac к ip или нет). Сначала рассмотрим типичный случай. Допустим, надо сформировать конфигурационный файл для isc-dhcpd в таком виде:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
option domain-name-servers 1.1.1.1, 8.8.8.8;&lt;br /&gt;
default-lease-time 28800;&lt;br /&gt;
subnet 10.0.0.0 netmask 255.255.255.0 {&lt;br /&gt;
    option subnet-mask 255.255.255.0;&lt;br /&gt;
    option broadcast-address 10.0.0.255;&lt;br /&gt;
}&lt;br /&gt;
host host10.0.0.1 {&lt;br /&gt;
    hardware ethernet 00:11:00:11:00:11;&lt;br /&gt;
    fixed-address 10.0.0.1;&lt;br /&gt;
}&lt;br /&gt;
host host10.0.0.2 {&lt;br /&gt;
    hardware ethernet 00:11:22:33:44:55;&lt;br /&gt;
    fixed-address 10.0.0.2;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
По данному конфигу isc-dhcpd будет выдавать ip в зависимости от мак-адреса, привязанного к учетке абонента. Например, видим, что для двух абонентов прописаны такие связки мак&amp;amp;nbsp;→&amp;amp;nbsp;ip:&lt;br /&gt;
&lt;br /&gt;
* 00:11:00:11:00:11 → 10.0.0.1&lt;br /&gt;
* 00:11:22:33:44:55 → 10.0.0.2&lt;br /&gt;
&lt;br /&gt;
Эта информация зависит от данных в биллинге, поэтому ее необходимо заменить на переменные. Создадим шаблон /usr/local/nodeny/kernel/make_config/dhcp.tmpl:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
option domain-name-servers 1.1.1.1, 8.8.8.8;&lt;br /&gt;
subnet 10.0.0.0 netmask 255.255.255.0 {&lt;br /&gt;
    option subnet-mask 255.255.255.0;&lt;br /&gt;
    option broadcast-address 10.0.0.255;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
{% for user in users %}&lt;br /&gt;
    {% for con in user.connection %}&lt;br /&gt;
        {% if con.type eq 'static' &amp;amp;&amp;amp; con.mac %}&lt;br /&gt;
        host host{{con.ipa}} {&lt;br /&gt;
            hardware ethernet {{con.mac|pretty_mac}};&lt;br /&gt;
            fixed-address {{con.ipa}};&lt;br /&gt;
        }&lt;br /&gt;
        {% endif %}&lt;br /&gt;
    {% endfor %}&lt;br /&gt;
{% endfor %}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Мы видим, что информация по связкам мак-ip была заменена на относительно непонятную конструкцию.  Давайте разберемся в ней:&lt;br /&gt;
&lt;br /&gt;
Все что находится внутри {% .. %} или {{ .. }} - это команды для шаблонизатора.&lt;br /&gt;
&lt;br /&gt;
* '''{% for user in users %}''' -  в переменную user загружаем данные пользователя (сначала первого из users, затем второго и т.д).;&lt;br /&gt;
* '''{% for con in user.connection %}''' - в переменную con загружаем информацию по первому подключению (затем второму и т.д);&lt;br /&gt;
* '''{% if con.type eq 'static' &amp;amp;&amp;amp; con.mac %}''' - это проверка, что в соединении ip статический и к нему привязан не пустой мак-адрес;&lt;br /&gt;
* '''&amp;lt;nowiki&amp;gt;{{ con.ipa }}&amp;lt;/nowiki&amp;gt;''' - в данное место будет вставлен ip адрес. Обратите внимание, что в базе данных ip хранятся в виде чисел (для сокращения объема), поэтому, чтобы ip был в виде xx.xx.xx.xx нужно использовать переменную ipa;&lt;br /&gt;
* '''&amp;lt;nowiki&amp;gt;{{ con.mac|pretty_mac }}&amp;lt;/nowiki&amp;gt;''' - в данное место будет вставлен мак-адрес, при этом он будет приведен в удобочитаемую форму (вставлены разделители в виде двоеточия);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Кроме самого шаблона необходим файл настроек для модуля make_config: kernel/make_config.cfg. Он может быть таким:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
run     =&amp;gt; 0,&lt;br /&gt;
period  =&amp;gt; 60,&lt;br /&gt;
template  =&amp;gt; {&lt;br /&gt;
            'dhcp.tmpl' =&amp;gt; {&lt;br /&gt;
                # куда будет записан сформированный конфиг&lt;br /&gt;
                file       =&amp;gt; '/usr/local/etc/dhcpd.conf',&lt;br /&gt;
&lt;br /&gt;
                # системная команда, которая будет выполнена перед записью конфига, можно ''&lt;br /&gt;
                cmd_before =&amp;gt; '',&lt;br /&gt;
&lt;br /&gt;
                # системная команда, которая будет выполнена после записи конфига, можно ''&lt;br /&gt;
                cmd_after  =&amp;gt; '/usr/local/etc/rc.d/isc-dhcpd forcerestart &amp;gt;/dev/null',&lt;br /&gt;
&lt;br /&gt;
                # удалять пустые строки&lt;br /&gt;
                pretty =&amp;gt; 1,&lt;br /&gt;
            },&lt;br /&gt;
},&lt;br /&gt;
subs    =&amp;gt; {&lt;br /&gt;
            pretty_mac =&amp;gt; sub {&lt;br /&gt;
                my $mac = shift;&lt;br /&gt;
                $mac =~ s/(..)/$1:/g;&lt;br /&gt;
                chop $mac;&lt;br /&gt;
                return $mac;&lt;br /&gt;
            },&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Здесь:&lt;br /&gt;
* dhcp.tmpl - имя файла с шаблоном;&lt;br /&gt;
* /usr/local/etc/dhcpd.conf - имя файла, куда будет записан результат;&lt;br /&gt;
* переменная period указывает на период в секундах, с которым будут проверяться изменения данных в биллинге. Например, если period = 60 секундам, то при изменении ip какого-либо абонента, эти изменения отобразятся в конфиге dhcp максимум через 60 секунд (обычно раньше: от 1 до 60 сек);&lt;br /&gt;
* pretty_mac - функция, которая добавляет двоеточия в мак-адрес (в базе мак хранится в виде 001122334455).&lt;br /&gt;
&lt;br /&gt;
Запустим модуль make_config с выводом результата на экран:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
perl /usr/local/nodeny/nokernel.pl -v -m=make_config&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если результат корректный, добавим запуск make_config в автозагрузку:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo '/usr/bin/perl /usr/local/nodeny/nokernel.pl -m=make_config -d &amp;amp;' &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можно запустить несколько копий модуля для формирования разных конфигов:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
perl nokernel.pl -v -m=make_config -g=make_config_2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
При этом необходимо создать файл /usr/local/nodeny/kernel/make_config_2.cfg&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==Ключ connection==&lt;br /&gt;
&lt;br /&gt;
ключ connection - это текущие подключения абонента. Обычно он хранит список ip. Но при использовании модуля dhcp, в connection попадает информация о мак-адресе клиентского оборудования, мак-адресе свича, порта и другие параметры.&lt;br /&gt;
&lt;br /&gt;
По умолчанию список ip, выданных абоненту, не имеет никакого соответствия с привязанными мак-адресами. Поэтому, модуль make_config сам их связывает в неопределенном порядке. Вероятно, вас это устроит, если не требуется жестко привязывать ip к конкретному устройству абонента.&lt;br /&gt;
&lt;br /&gt;
Обычно, к учетной записи привязан один ip и один мак-адрес. В этом случае make_config объединит ip и mac в одно соединение.&lt;br /&gt;
&lt;br /&gt;
В случае использования нескольких подключений на одну учетку, есть возможность привязать ip к mac:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ip mac bind.png|800px]]&lt;br /&gt;
&lt;br /&gt;
Если не все привязанные ip будут привязаны к мак - эти связки будут созданы автоматически, но в неопределенном порядке.&lt;br /&gt;
&lt;br /&gt;
Пример, фрагментов шаблонов для разных ситуаций:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{% for user in users %}&lt;br /&gt;
    {% for con in user.connection %}&lt;br /&gt;
        {% if con.device_mac %}&lt;br /&gt;
            class &amp;quot;host-{{con.ipa}}&amp;quot; { match if suffix(option agent.circuit-id,1)={{con.device_port}} and suffix(option agent.remote-id,6)={{con.device_mac|pretty_mac}}; } &lt;br /&gt;
        {% endif %}&lt;br /&gt;
    {% endfor %}&lt;br /&gt;
{% endfor %}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Данный шаблон сформирует записи такого вида:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class &amp;quot;host-10.0.0.26&amp;quot; { match if suffix(option agent.circuit-id,1)=1 and suffix(option agent.remote-id,6)=77:88:77:00:00:11; }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обратите внимание на ''{% if con.device_mac %}'' - это проверка, что в подключении указан мак устройства. Следовательно, данное подключение &amp;quot;использует&amp;quot; option 82. Если в вашей сети один абонент на порту управляемого свича - мак адрес абонента можно не проверять, что и сделано в данном примере.&lt;br /&gt;
&lt;br /&gt;
В сети может быть как управляемое, так и неуправляемое оборудование. Вы можете формировать комбинированный конфиг, учитывающий option82 и не учитывающий:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{% for user in users %}&lt;br /&gt;
    {% for con in user.connection %}&lt;br /&gt;
        {% if con.device_mac %}&lt;br /&gt;
            class &amp;quot;host-{{con.ipa}}&amp;quot; { match if suffix(option agent.circuit-id,1)={{con.device_port}} and suffix(option agent.remote-id,6)={{con.device_mac|pretty_mac}}; } &lt;br /&gt;
        {% endif %}&lt;br /&gt;
    {% endfor %}&lt;br /&gt;
{% endfor %}&lt;br /&gt;
&lt;br /&gt;
{% for user in users %}&lt;br /&gt;
    {% for con in user.connection %}&lt;br /&gt;
        {% if ! con.device_mac &amp;amp;&amp;amp; con.mac %}&lt;br /&gt;
            host {{con.ipa}} { hardware ethernet {{con.mac|pretty_mac}}; fixed-address {{con.ipa}}; }&lt;br /&gt;
        {% endif %}&lt;br /&gt;
    {% endfor %}&lt;br /&gt;
{% endfor %}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sv</name></author>
	</entry>
</feed>