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