Биллинговая система Nodeny

Главная категория => Модули NodenyPlus => Тема начата: Efendy от 28 Июля 2015, 10:59:22



Название: dhcpd + opt82, один на порту, make_config
Отправлено: Efendy от 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


Название: Re: dhcpd + opt82, один на порту, make_config
Отправлено: cojiict от 28 Июля 2015, 14:34:19
а тут хіба не можна використовувати option_82?
ht_p://app.nodeny-plus.com.ua/docs/work/dhcp.html#dhcp_radius




Название: Re: dhcpd + opt82, один на порту, make_config
Отправлено: Efendy от 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


Название: Re: dhcpd + opt82, один на порту, make_config
Отправлено: Docent от 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;
            },

И все заработало как часы


Название: Re: dhcpd + opt82, один на порту, make_config
Отправлено: Gosha от 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
В чем может быть причина?


Название: Re: dhcpd + opt82, один на порту, make_config
Отправлено: Gosha от 07 Ноября 2016, 18:08:41
Делал всё по мануалу. h_tt_p://app.nodeny-plus.com.ua/docs/work/make_config_dhcp.html


Название: Re: dhcpd + opt82, один на порту, make_config
Отправлено: Efendy от 07 Ноября 2016, 18:22:34
Пофиксил. Обнови N+


Название: Re: dhcpd + opt82, один на порту, make_config
Отправлено: Gosha от 07 Ноября 2016, 18:27:27
Спасибо.


Название: Re: dhcpd + opt82, один на порту, make_config
Отправлено: Gosha от 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')


Название: Re: dhcpd + opt82, один на порту, make_config
Отправлено: Efendy от 07 Ноября 2016, 21:08:11
user.ips.0.ip


Название: Re: dhcpd + opt82, один на порту, make_config
Отправлено: Gosha от 07 Ноября 2016, 21:10:19
Спасибо. Приходится конфиг делать для разных сегментов.


Название: Re: dhcpd + opt82, один на порту, make_config
Отправлено: Gosha от 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; }

отлично работает


Название: Re: dhcpd + opt82, один на порту, make_config
Отправлено: Gosha от 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}}; }
как в мануале, и всё заработало.
Кстати получился универсальный конфиг, статика, динамика, и клиент на порту.