Биллинговая система Nodeny
02 Мая 2024, 13:11:07 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Прекращена поддержка версии Nodeny 49
 
   Начало   Помощь Поиск Войти Регистрация  
Страниц: [1]
  Печать  
Автор Тема: dhcpd + opt82, один на порту, make_config  (Прочитано 5839 раз)
Efendy
Администратор
Спец
*****

Карма: 138
Offline Offline

Сообщений: 4782



Просмотр профиля
« : 28 Июля 2015, 10:59:22 »

Добавил в документацию пример для динамического создания конфига isc-dhcp моудлем make_config для ситуации один абонент на порту:

1) dhcp выдает ip не от балды как в стандартной работе модуля dhcp, а привязанный статически ip к учетке абона
2) рассматривается вариант, когда сеть состоит из управляемых свичей и к каждому управляемому порту подключен только один абонент - в этом случае мак абонента игнорируется, а принимается во внимание мак свича и порт подключения
3) если в настройках подключения не стоит галка "один на порту" - проверяется только мак абонента

http://app.nodeny-plus.com.ua/docs/work/make_config_dhcp.html
Записан
cojiict
Старожил
****

Карма: 0
Offline Offline

Сообщений: 341


Просмотр профиля Email
« Ответ #1 : 28 Июля 2015, 14:34:19 »

а тут хіба не можна використовувати option_82?
ht_p://app.nodeny-plus.com.ua/docs/work/dhcp.html#dhcp_radius


Записан
Efendy
Администратор
Спец
*****

Карма: 138
Offline Offline

Сообщений: 4782



Просмотр профиля
« Ответ #2 : 28 Июля 2015, 15:16:33 »

а тут хіба не можна використовувати option_82?
ht_p://app.nodeny-plus.com.ua/docs/work/dhcp.html#dhcp_radius
это просто другой вариант. На вкус и цвет у каждого свои требования. Главное, что вариантов становится больше:
1) стандартная работа модуля dhcp
2) dhcp + radius
3) dhcp + make_config
Записан
Docent
NoDeny
Пользователь
*

Карма: 1
Offline Offline

Сообщений: 9


Просмотр профиля
« Ответ #3 : 10 Ноября 2015, 02:01:11 »

Хотел поделиться опытом

У меня с такой конструкцией не заработало
после нескольких часов разбирательства оказалось что мак из базы берется и записываться в класс в виде a0:67:b3:0b:2f:8b
а dhcp оперирует маком a0:67:b3:b:2f:8b
явное строчное не совпадение

в dhcp_ok.tmpl изменил процедуру
Код:
{% for user in users %}
  {% if user.ips.0.ipa && user.ips.0.type eq 'static' && user.connection.0 && user.connection.0.oneconnect %}
    {% one_line %}
    class "host{{user.ips.0.ipa}}" { match if binary-to-ascii(10,8,"",suffix(option agent.circuit-id,1))="{{user.connection.0.device_port|hex}}"
    and binary-to-ascii(16,8,":",suffix(option agent.remote-id,6))="{{user.connection.0.device_mac|pretty_mac}}"; }
    {% one_line_end %}
  {% endif %}
{% endfor %}

в make_config_dhcp.cfg изменил
Код:
subs    => {
            pretty_mac => sub {
                my $mac = shift;
                $mac =~ s/(..)/$1:/g;
                $mac =~ s/:0/:/g;
                chop $mac;
                return $mac;
            },

И все заработало как часы
Записан
Gosha
Постоялец
***

Карма: 7
Offline Offline

Сообщений: 199


Просмотр профиля
« Ответ #4 : 07 Ноября 2016, 17:53:44 »

Добрый день. Не хотелось плодить темы.
Попробовал сделать make_config «один на порту» для isc-dhcpd.
dhcp.tmpl
Код:
allow unknown-clients;
option domain-name-servers 1.1.1.1, 8.8.8.8;

default-lease-time 28800;
min-lease-time 10000;
max-lease-time 128800;

authoritative;

ddns-update-style interim;

log-facility local7;

{% for user in users %}
  {% if user.ips.0.ipa && user.ips.0.type eq 'static' && user.connection.0 && user.connection.0.oneconnect %}
    {% one_line %}
class "host{{user.ips.0.ipa}}" { match if suffix(option agent.circuit-id,1)={{user.connection.0.device_port|hex}}
    and suffix(option agent.remote-id,6)={{user.connection.0.device_mac|pretty_mac}}; }
    {% one_line_end %}
  {% endif %}
{% endfor %}

subnet 10.250.0.0 netmask 255.255.255.0 {
    option subnet-mask 255.255.255.0;
    option broadcast-address 10.250.0.255;
    interface em1;
    option routers 10.250.0.254;


{% for user in users %}
  {% if user.ips.0.ipa && user.ips.0.type eq 'static' && user.connection.0 %}
    {% if user.connection.0.oneconnect %}
        pool { range {{user.ips.0.ipa}}; allow members of "host{{user.ips.0.ipa}}"; }
    {% else %}
        host host{{user.ips.0.ipa}} { hardware ethernet {{user.connection.0.mac|pretty_mac}}; fixed-address {{user.ips.0.ipa}}; }
    {% endif %}
  {% endif %}
{% endfor %}

}
make_config_dhcp.cfg
Код:
run     => 0,
period  => 60,
template  => {
            'dhcp_ok.tmpl' => {
                # куда будет записан сформированный конфиг
                file       => '/usr/local/etc/dhcpd.conf',

                # системная команда, которая будет выполнена перед записью конфига, можно ''
                cmd_before => '',

                # системная команда, которая будет выполнена после записи конфига, можно ''
                cmd_after  => '/usr/local/etc/rc.d/isc-dhcpd forcestart >/dev/null',

                # удалять пустые строки
                pretty => 1,
            },
},
subs    => {
            pretty_mac => sub {
                my $mac = shift;
                $mac =~ s/(..)/$1:/g;
                chop $mac;
                return $mac;
            },
            hex => sub {
                return sprintf('%x', $_[0]);
            }
}
Запускаю perl /usr/local/nodeny/nokernel.pl -v -m=make_config -g=make_config_dhcp
И получаю
Код:
Ошибка рендеринга /usr/local/nodeny/kernel/make_config/dhcp.tmpl
syntax error at (eval 32) line 66, near "-> &&"
syntax error at (eval 32) line 66, near "} eq"
syntax error at (eval 32) line 78, near "-> ) "
syntax error at (eval 32) line 86, near ";
        }"
Bareword "connection" not allowed while "strict subs" in use at (eval 32) line 66.
Сейчас работает такой конфиг
Код:
log-facility local7;
option domain-name-servers 1.1.1.1;

shared-network vlan1001 {


subnet 10.250.0.0 netmask 255.255.255.0 {
    range 10.250.0.65 10.250.0.253;
    interface vlan1001;
    option routers 10.250.0.254;
    default-lease-time 2400;
    max-lease-time 1800;
    on commit {
        set ClientIP  = binary-to-ascii(10, 8, ".", leased-address);
        set ClientMac = binary-to-ascii(16, 8, ":", substring(hardware, 1, 6));
        set SwitchMac = "";
        set SwitchPort ="";
        if exists agent.circuit-id
        {
            set SwitchMac = binary-to-ascii(16, 8, ":", suffix(option agent.remote-id, 6));
            set SwitchPort = binary-to-ascii(10, 8, "", suffix(option agent.circuit-id, 2));
        }
        execute("/usr/bin/perl", "/usr/local/nodeny/modules/dhcp/events.pl", "commit",
                ClientIP, ClientMac, SwitchMac, SwitchPort);
    }
    on expiry {
        set ClientIP  = binary-to-ascii(10, 8, ".", leased-address);
        execute("/usr/bin/perl", "/usr/local/nodeny/modules/dhcp/events.pl", "expiry", ClientIP);
    }
    on release {
        set ClientIP  = binary-to-ascii(10, 8, ".", leased-address);
        execute("/usr/bin/perl", "/usr/local/nodeny/modules/dhcp/events.pl", "release", ClientIP);
    }
{% for user in users %}
      {% for ip in user.ips %}
            {% eval i = 0 %}
            {% if ip.type eq 'static' && user.mac.[i] && ip.ip >= inet.aton('10.250.0.1') && ip.ip <= inet.aton('10.250.0.64') %}
                 host {{ user.id }} {
                                 hardware ethernet {{user.mac.[i]|pretty_mac}};
                                 fixed-address {{ip.ipa}}; }
            {% eval i = i + 1 %}
           {% endif %}
       {% endfor %}
 {% endfor %}
}
}

Проблем нет.
Perl v5.20.3
В чем может быть причина?
Записан
Gosha
Постоялец
***

Карма: 7
Offline Offline

Сообщений: 199


Просмотр профиля
« Ответ #5 : 07 Ноября 2016, 18:08:41 »

Делал всё по мануалу. h_tt_p://app.nodeny-plus.com.ua/docs/work/make_config_dhcp.html
Записан
Efendy
Администратор
Спец
*****

Карма: 138
Offline Offline

Сообщений: 4782



Просмотр профиля
« Ответ #6 : 07 Ноября 2016, 18:22:34 »

Пофиксил. Обнови N+
Записан
Gosha
Постоялец
***

Карма: 7
Offline Offline

Сообщений: 199


Просмотр профиля
« Ответ #7 : 07 Ноября 2016, 18:27:27 »

Спасибо.
Записан
Gosha
Постоялец
***

Карма: 7
Offline Offline

Сообщений: 199


Просмотр профиля
« Ответ #8 : 07 Ноября 2016, 20:35:01 »

Извините за назойливось. Не подскажите как добавить в исключение
{% if user.ips.0.ipa && user.ips.0.type eq 'static' && user.connection.0 && user.connection.0.oneconnect %}   выборку IP ?
user.ips.0.ipa - это IP в нормальном виде , а какая переменная в цифровом?
Что то типа && ip.ip >= inet.aton('10.250.0.1') && ip.ip <= inet.aton('10.250.0.64')
Записан
Efendy
Администратор
Спец
*****

Карма: 138
Offline Offline

Сообщений: 4782



Просмотр профиля
« Ответ #9 : 07 Ноября 2016, 21:08:11 »

user.ips.0.ip
Записан
Gosha
Постоялец
***

Карма: 7
Offline Offline

Сообщений: 199


Просмотр профиля
« Ответ #10 : 07 Ноября 2016, 21:10:19 »

Спасибо. Приходится конфиг делать для разных сегментов.
Записан
Gosha
Постоялец
***

Карма: 7
Offline Offline

Сообщений: 199


Просмотр профиля
« Ответ #11 : 10 Февраля 2017, 10:20:24 »

Добрый день. При помощи make_config создал шаблон dhcpd + opt82 - один на порту , для сети ПОН(bdcom). Первичная авторизация, и потом или статика , или клиент на порту. Статика равно как и динамика работают отлично. А клиент на порту не всегда.
make_config_dhcp.cfg
Код:
run     => 0,
period  => 60,
template  => {
            'dhcp.tmpl' => {
                # куда будет записан сформированный конфиг
                file       => '/usr/local/etc/dhcpd.conf',

                # системная команда, которая будет выполнена перед записью конфига, можно ''
                cmd_before => '',

                # системная команда, которая будет выполнена после записи конфига, можно ''
                cmd_after  => '/usr/local/etc/rc.d/isc-dhcpd restart >/dev/null',

                # удалять пустые строки
                pretty => 1,
            },
},
subs    => {
            pretty_mac => sub {
                my $mac = shift;
                $mac =~ s/(..)/$1:/g;
$mac =~ s/:0/:/g;
                chop $mac;
                return $mac;
            },
            hex => sub {
                return sprintf('%x', $_[0]);
            }
}
dhcp.tmpl
Код:
log-facility local7;
option domain-name-servers 1.1.1.1;
shared-network vlan501 {

 {% for user in users %}
  {% if user.ips.0.ipa && user.ips.0.type eq 'static' && user.connection.0 && user.connection.0.oneconnect && user.ips.0.ip >= inet.aton('10.1.1.1') && user.ips.0.ip <= inet.aton('10.1.1.64') %}
    {% one_line %}
class "host{{user.ips.0.ipa}}" { match if binary-to-ascii(10,8,"",suffix(option agent.circuit-id,2))="{{user.connection.0.device_port}}"
    and binary-to-ascii(16,8,":",suffix(option agent.remote-id,6))="{{user.connection.0.device_mac|pretty_mac}}"; }
    {% one_line_end %}
  {% endif %}
{% endfor %}


subnet 10.1.1.0 netmask 255.255.255.0 {
  pool {
 {% for user in users %}
  {% if user.ips.0.ipa && user.ips.0.type eq 'static' && user.connection.0 && user.connection.0.oneconnect && user.ips.0.ip >= inet.aton('10.1.1.1') && user.ips.0.ip <= inet.aton('10.1.1.64') %}
    {% one_line %}
    deny members of  "host{{user.ips.0.ipa}}";
    {% one_line_end %}
  {% endif %}
{% endfor %}
    range 10.1.1.65 10.1.1.253;
}
    interface vlan501;
    option routers 10.1.1.254;
    default-lease-time 2400;
    max-lease-time 1800;
    on commit {
        set ClientIP  = binary-to-ascii(10, 8, ".", leased-address);
        set ClientMac = binary-to-ascii(16, 8, ":", substring(hardware, 1, 6));
        set SwitchMac = "";
        set SwitchPort ="";
        if exists agent.circuit-id
        {
            set SwitchMac = binary-to-ascii(16, 8, ":", suffix(option agent.remote-id, 6));
            set SwitchPort = binary-to-ascii(10, 8, "", suffix(option agent.circuit-id, 2));
        }
        execute("/usr/bin/perl", "/usr/local/nodeny/modules/dhcp/events.pl", "commit",
                ClientIP, ClientMac, SwitchMac, SwitchPort);
    }
    on expiry {
        set ClientIP  = binary-to-ascii(10, 8, ".", leased-address);
        execute("/usr/bin/perl", "/usr/local/nodeny/modules/dhcp/events.pl", "expiry", ClientIP);
    }
    on release {
        set ClientIP  = binary-to-ascii(10, 8, ".", leased-address);
        execute("/usr/bin/perl", "/usr/local/nodeny/modules/dhcp/events.pl", "release", ClientIP);
    }

{% for user in users %}
  {% if user.ips.0.ipa && user.ips.0.type eq 'static' && user.connection.0 && user.ips.0.ip >= inet.aton('10.1.1.1') && user.ips.0.ip <= inet.aton('10.1.1.64') %}
    {% if user.connection.0.oneconnect %}
        pool { range {{user.ips.0.ipa}}; allow members of "host{{user.ips.0.ipa}}"; }
    {% else %}
        host host{{user.ips.0.ipa}} { hardware ethernet {{user.connection.0.mac|pretty_mac}}; fixed-address {{user.ips.0.ipa}}; }
    {% endif %}
  {% endif %}
{% endfor %}

}
}
...................... и тд.

При отсутствии первых нулей в мак адресе - работает(убрал руками).

Код:
class "host10.1.1.50" { match if binary-to-ascii(10,8,"",suffix(option agent.circuit-id,2))="111"
    and binary-to-ascii(16,8,":",suffix(option agent.remote-id,6))="0:12:cf:62:a2:80"; }
При наличии - не рабоает
Код:
class "host10.1.1.50" { match if binary-to-ascii(10,8,"",suffix(option agent.circuit-id,2))="111"
    and binary-to-ascii(16,8,":",suffix(option agent.remote-id,6))="00:12:cf:62:a2:80"; }
perl v5.20.3
Как изменить pretty_mac , что бы получать мак 0:12:cf:62:a2:80
При том, что в
Код:
host host10.1.1.1 { hardware ethernet 00:11:d8:a3:de:c6; fixed-address 10.1.1.1; }

отлично работает
Записан
Gosha
Постоялец
***

Карма: 7
Offline Offline

Сообщений: 199


Просмотр профиля
« Ответ #12 : 10 Февраля 2017, 11:19:36 »

Извините за потраченное время. Сам решил.

Поменял
Код:
 binary-to-ascii(16,8,":",suffix(option agent.remote-id,6))="{{user.connection.0.device_mac|pretty_mac}}"; }
на
Код:
suffix(option agent.remote-id,6)={{user.connection.0.device_mac|pretty_mac}}; }
как в мануале, и всё заработало.
Кстати получился универсальный конфиг, статика, динамика, и клиент на порту.
Записан
Страниц: [1]
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.20 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!