Cramac Posted August 7, 2012 Posted August 7, 2012 (edited) спасибо, попробую визуально понять о чем речь в скрипте :) П.С. правильно ли я понял: в sub db_get_routing идет выбор из базы $sth = $_[0]->prepare(" SELECT `destination`, `mask`, `gateway` FROM `subnets_routes` WHERE `subnet_id` = '$_[2]' LIMIT 30" ); и потом формуриет ответ if (defined($optClasslessRoutesCode)) { $opt_classless_routes_data .= mk_classless_routes_bin_mask(@$row[0], @$row[1], @$row[2]); т.е. на моем примере что должно быть в таблице? Edited August 7, 2012 by Cramac Вставить ник Quote
Cramac Posted August 28, 2012 Posted August 28, 2012 Собрал тестовый стенд для теста сервера. Есть клиент - ES3528M - ES4612 - DHCP на 4612 поднят релей, который со всем вланов релеит запросы на сервер. На сервере (используя сервер от Abram) в лог попадает запись что запрос пришел с ИП и мака маршрутизатора. Сейчас isc-dhcp обрабатывает опцию 82 и по маку свитча и порту выдает ИП. а тут как сделать? Вставить ник Quote
Ivan_83 Posted August 29, 2012 Author Posted August 29, 2012 Нужно написать запросы к базе и разбор ответа/запихивание ответа от базы в дхцп ответ. Обвязка вся есть, просто состыковать. Вставить ник Quote
Abram Posted August 29, 2012 Posted August 29, 2012 Cramac, Дык используй DHCP Relay прямо на свитче, зачем на маршрутизаторе? Вставить ник Quote
Cramac Posted September 1, 2012 Posted September 1, 2012 (edited) помогите разобратся, что то у меня есть только дисковер от клиента на сервер и от сервера(по сниферу от релея) оффер и все на этом. dhcp.txt Edited September 1, 2012 by Cramac Вставить ник Quote
Ivan_83 Posted September 2, 2012 Author Posted September 2, 2012 Вроде так и должно быть, дальше клиент должен слать запрос на аренду. Только обратите внимание: IP: 10.10.10.254 (0:12:cf:39:97:40) > 10.10.10.50 (0:d:61:35:2a:72) OP: 1 (BOOTPREQUEST) .... GIADDR: 172.20.2.254 и в ответе: IP: 10.10.10.50 (0:d:61:35:2a:72) > 172.20.2.254 (0:12:cf:39:97:40) OP: 2 (BOOTPREPLY) дойдёт ли оно до релей агента... Вставить ник Quote
Cramac Posted September 3, 2012 Posted September 3, 2012 10.10.10.254 (0:12:cf:39:97:40) он же 172.20.2.254 это релей (edge core ES4612) снифер на абонентском ПК видит этот оффер, но никак не реагирует. Вставить ник Quote
Ivan_83 Posted September 3, 2012 Author Posted September 3, 2012 Тогда либо попробовать с другим релей агентом и другим клиентом, либо сдампить и там пакет, так трудно сказать почему не принимает. Вставить ник Quote
Cramac Posted September 3, 2012 Posted September 3, 2012 (edited) пробовал isc-dhcp работает через релей... dhcp_client.pcap.txt может в базе что не так? dhcp.sql.txt Edited September 3, 2012 by Cramac Вставить ник Quote
Ivan_83 Posted September 4, 2012 Author Posted September 4, 2012 Если не забуду - вечером скормплю дамп софтине и посмотрю что там. Вставить ник Quote
Ivan_83 Posted September 5, 2012 Author Posted September 5, 2012 Итак. Это из пкап дампа: Started Build date: Sep 6 2012 00:54:59 Rozhuk Ivan, 2011 [00:55:03] DisconnectSocket: all sockets closed [00:55:13] Received 300 bytes from 0.0.0.0:68 -> 255.255.255.255:67 DHCP head: op = 1 (1) - BOOTREQUEST htype = 1 (1) - Ethernet (10Mb) hlen = 6 (6) hops = 0 (0) xid = ff5f6da0 (4284444064) secs = 0 (0) flags = 8000 (32768) [b=1, MBZ=0] ciaddr = 0.0.0.0 yiaddr = 0.0.0.0 siaddr = 0.0.0.0 giaddr = 0.0.0.0 chaddr = 0016361155bb sname = file = 053 [001]: DHCP message type: 01 (001) - DISCOVER 116 [001]: Auto Configure: enabled 061 [007]: DHCP Client identifier: 010016361155bb 012 [015]: Host name: microsof-3380a5 060 [008]: Vendor class identifier: MSFT 5.0 055 [011]: Parameter Request List: 01 (001) - Subnet mask 0f (015) - Domain Name 03 (003) - Routers 06 (006) - DNS servers 2c (044) - NetBIOS name servers 2e (046) - NetBIOS node type 2f (047) - NetBIOS scope 1f (031) - Perform router discovery 21 (033) - Static route (dst host/router) f9 (249) - MSFT - Classless route 2b (043) - Vendor specific info 043 [002]: Vendor specific info: dc00 220 [000]: NAP-SoH 255 [148]: END [00:55:19] Received 300 bytes from 172.20.2.254:67 -> 255.255.255.255:68 DHCP head: op = 2 (2) - BOOTREPLY htype = 1 (1) - Ethernet (10Mb) hlen = 6 (6) hops = 0 (0) xid = ff5f6da0 (4284444064) secs = 0 (0) flags = 8000 (32768) [b=1, MBZ=0] ciaddr = 0.0.0.0 yiaddr = 0.0.0.0 siaddr = 0.0.0.0 giaddr = 172.20.2.254 chaddr = 0016361155bb sname = file = 053 [001]: DHCP message type: 02 (002) - OFFER 054 [004]: DHCP Server identifier: 10.10.10.50 116 [001]: Auto Configure: disabled 255 [000]: END 000 [000]: PAD [47] [00:55:27] Received 300 bytes from 0.0.0.0:68 -> 255.255.255.255:67 DHCP head: op = 1 (1) - BOOTREQUEST htype = 1 (1) - Ethernet (10Mb) hlen = 6 (6) hops = 0 (0) xid = ff5f6da0 (4284444064) secs = 300 (768) flags = 8000 (32768) [b=1, MBZ=0] ciaddr = 0.0.0.0 yiaddr = 0.0.0.0 siaddr = 0.0.0.0 giaddr = 0.0.0.0 chaddr = 0016361155bb sname = file = 053 [001]: DHCP message type: 01 (001) - DISCOVER 116 [001]: Auto Configure: enabled 061 [007]: DHCP Client identifier: 010016361155bb 012 [015]: Host name: microsof-3380a5 060 [008]: Vendor class identifier: MSFT 5.0 055 [011]: Parameter Request List: 01 (001) - Subnet mask 0f (015) - Domain Name 03 (003) - Routers 06 (006) - DNS servers 2c (044) - NetBIOS name servers 2e (046) - NetBIOS node type 2f (047) - NetBIOS scope 1f (031) - Perform router discovery 21 (033) - Static route (dst host/router) f9 (249) - MSFT - Classless route 2b (043) - Vendor specific info 043 [002]: Vendor specific info: dc00 220 [000]: NAP-SoH 255 [152]: END [00:55:28] Received 300 bytes from 172.20.2.254:67 -> 255.255.255.255:68 DHCP head: op = 2 (2) - BOOTREPLY htype = 1 (1) - Ethernet (10Mb) hlen = 6 (6) hops = 0 (0) xid = ff5f6da0 (4284444064) secs = 300 (768) flags = 8000 (32768) [b=1, MBZ=0] ciaddr = 0.0.0.0 yiaddr = 0.0.0.0 siaddr = 0.0.0.0 giaddr = 172.20.2.254 chaddr = 0016361155bb sname = file = 053 [001]: DHCP message type: 02 (002) - OFFER 054 [004]: DHCP Server identifier: 10.10.10.50 116 [001]: Auto Configure: disabled 255 [000]: END 000 [000]: PAD [47] [00:55:29] Received 300 bytes from 0.0.0.0:68 -> 255.255.255.255:67 DHCP head: op = 1 (1) - BOOTREQUEST htype = 1 (1) - Ethernet (10Mb) hlen = 6 (6) hops = 0 (0) xid = ff5f6da0 (4284444064) secs = b00 (2816) flags = 8000 (32768) [b=1, MBZ=0] ciaddr = 0.0.0.0 yiaddr = 0.0.0.0 siaddr = 0.0.0.0 giaddr = 0.0.0.0 chaddr = 0016361155bb sname = file = 053 [001]: DHCP message type: 01 (001) - DISCOVER 116 [001]: Auto Configure: enabled 061 [007]: DHCP Client identifier: 010016361155bb 012 [015]: Host name: microsof-3380a5 060 [008]: Vendor class identifier: MSFT 5.0 055 [011]: Parameter Request List: 01 (001) - Subnet mask 0f (015) - Domain Name 03 (003) - Routers 06 (006) - DNS servers 2c (044) - NetBIOS name servers 2e (046) - NetBIOS node type 2f (047) - NetBIOS scope 1f (031) - Perform router discovery 21 (033) - Static route (dst host/router) f9 (249) - MSFT - Classless route 2b (043) - Vendor specific info 043 [002]: Vendor specific info: dc00 220 [000]: NAP-SoH 255 [160]: END [00:55:30] Received 300 bytes from 172.20.2.254:67 -> 255.255.255.255:68 DHCP head: op = 2 (2) - BOOTREPLY htype = 1 (1) - Ethernet (10Mb) hlen = 6 (6) hops = 0 (0) xid = ff5f6da0 (4284444064) secs = b00 (2816) flags = 8000 (32768) [b=1, MBZ=0] ciaddr = 0.0.0.0 yiaddr = 0.0.0.0 siaddr = 0.0.0.0 giaddr = 172.20.2.254 chaddr = 0016361155bb sname = file = 053 [001]: DHCP message type: 02 (002) - OFFER 054 [004]: DHCP Server identifier: 10.10.10.50 116 [001]: Auto Configure: disabled 255 [000]: END 000 [000]: PAD [47] Я просмотрел это в первом дампе, на стороне сервера - в оффер нужно давать настройки, и IP тоже!!!!! Офер на то и оффер, чтобы клиент собрал со всех дхцп серверов варианты и выбрал что больше нравится, и уже потом он посылает понравившемуся серверу запрос на аренду того что ему предложили. У вас сервер клиенту отдаёт 0.0.0.0 адрес, не выдаёт маску и вообще ничего не отдаёт, только выключает автоконфиг на клиенте (запрещает ему брать адреса из 169.254...). Посмотрите ещё раз в сервер и хотя бы руками для тестов пропишите адрес и маску на отдачу, раз из базы почему то не берёт. Вставить ник Quote
Cramac Posted September 5, 2012 Posted September 5, 2012 (edited) хм, странно конечно, попробую, спасибо за анализ :) Edited September 5, 2012 by Cramac Вставить ник Quote
Cramac Posted September 6, 2012 Posted September 6, 2012 (edited) Спасибо Ivan_83. Дело было в МАКах в базе, из за этого ничего не выдавалось. П.С. Нормально отработало на стенде с релеем на маршрутизаторе (accton ES4612) Edited September 6, 2012 by Cramac Вставить ник Quote
Cramac Posted September 7, 2012 Posted September 7, 2012 (edited) О знающие люди, подскажите как оживить функцию db_get_routing при формировании ответа клиенту на запрос. В db_get_requested_data есть такой вызов db_get_routing($_[0], $dhcpreqparams, $result->{subnet_id}, $dhcp_opt82_vlan_id); что надо поправить в db_get_routing что бы формировалось две опции 121 и 249 если для указанного влана присутствуют в базе маршруты? сама функция: sub db_get_routing { #my $dbh = $_[0]; #my $dhcpreqparams = $_[1]; #my $subnet_id = $_[2]; #my $dhcpresp = $_[3]; my $sth; my $opt33Enbled; my $optClasslessRoutesCode; # do not add routes if not requested if (defined($_[1]) == 0) { return(); } $opt33Enbled = index($_[1], DHO_STATIC_ROUTES()); if ($opt33Enbled == -1) { $opt33Enbled = undef; } $optClasslessRoutesCode = index($_[1], 121); if ($optClasslessRoutesCode == -1) { $optClasslessRoutesCode = index($_[1], 249); if ($optClasslessRoutesCode == -1) { $optClasslessRoutesCode = undef; }else{ $optClasslessRoutesCode = 249; } }else{ $optClasslessRoutesCode = 121; } if (defined($opt33Enbled) == 0 && defined($optClasslessRoutesCode) == 0) { # nothink to do, return return(); } $sth = $_[0]->prepare(" SELECT `destination`, `mask`, `gateway` FROM `subnets_routes` WHERE `subnet_id` = '$_[2]' LIMIT 30" ); $sth->execute(); if ($sth->rows()) { my $ref; my $row; my $opt33_data = undef;# routes to single hosts my $opt_classless_routes_data = undef;# routes to nets $ref = $sth->fetchall_arrayref; foreach $row ( @{$ref} ) { if (defined($opt33Enbled) && @$row[1] eq '255.255.255.255') { # pack dst $opt33_data .= pack('CCCC', split(/\./, @$row[0])); # pack gw $opt33_data .= pack('CCCC', split(/\./, @$row[2])); } if (defined($optClasslessRoutesCode)) { $opt_classless_routes_data .= mk_classless_routes_bin_mask(@$row[0], @$row[1], @$row[2]); } } if (defined($opt33_data)) {# add option $_[3]->addOptionRaw(DHO_STATIC_ROUTES(), $opt33_data); } if (defined($opt_classless_routes_data)) {# add option $_[3]->addOptionRaw($optClasslessRoutesCode, $opt_classless_routes_data); } } $sth->finish(); } Edited September 7, 2012 by Cramac Вставить ник Quote
bomberman Posted September 14, 2012 Posted September 14, 2012 Новые версии данной разработки имеются? :) Автор не забросли свою, на мой взгляд, замечательную идею? :) Вставить ник Quote
Cramac Posted September 14, 2012 Posted September 14, 2012 если багов нет, нет и новых версий :) Тестил, вроде все работает как надо и задумалось... Вставить ник Quote
bomberman Posted September 14, 2012 Posted September 14, 2012 Ну хотелось бы ещё видеть работу демона без релея. Если кто допилил, поделитесь пжлст. Вставить ник Quote
Ivan_83 Posted September 14, 2012 Author Posted September 14, 2012 Чтобы работало без релея нужно через bpf/pcap интерфейс работать, самому формировать полностью эзернет+IP+юдп пакеты и разбирать тоже. В принципе то не сложно переписать. У нас ISP и всё равно через релей летят, а допиливания требует именно логика работы с базой, которая не выкладывалась ибо специфично для наших нужд. Вставить ник Quote
NiTr0 Posted September 18, 2012 Posted September 18, 2012 Для статического IP в принципе понятно как прикрутить, ничего особо заумного там нет... Для общего развития: как с динамикой быть? Нужно вести таблицу лиз ведь? Вставить ник Quote
Ivan_83 Posted September 19, 2012 Author Posted September 19, 2012 Да, именно так. Вставить ник Quote
NiTr0 Posted September 22, 2012 Posted September 22, 2012 Вроде как прилепил к абиллсу, статика без опции 82 (пока большего не требуется, хотя опцию 82 в коде предусмотрел но не тестировал), и вроде даже работает оно на стенде. Только несколько перепилил собссно логику демона/журналирование/прочее сопутствующее и подправил код, + основной поток сделал watcher'ом за worker потоками, чтобы пересоздавал потоки при их смерти. Приеду с отпуска - буду пытаться внедрять... Вставить ник Quote
NiTr0 Posted October 19, 2012 Posted October 19, 2012 Запустил таки, пока вроде полет нормальный. Из замеченого - некоторые клиенты отваливаются либо шлют часто запросы (что-то им не нравится, в частности - один с дир-300 роутером, судя по имени хоста; хотя может роутер протаращило - он и в логи isc dhcpd гадил так же). Желающие могут потестировать у себя. abills-perl-dhcp.tar.gz Вставить ник Quote
KaDaBRa Posted November 20, 2012 Posted November 20, 2012 Запустил таки, пока вроде полет нормальный. Из замеченого - некоторые клиенты отваливаются либо шлют часто запросы (что-то им не нравится, в частности - один с дир-300 роутером, судя по имени хоста; хотя может роутер протаращило - он и в логи isc dhcpd гадил так же). Желающие могут потестировать у себя. Было бы чудестно, если бы вы выложили еще и структуру базы и веб-морду :) Вставить ник Quote
bomberman Posted November 21, 2012 Posted November 21, 2012 (edited) KaDaBRa Я так пологаю Web-интерфейс и структура берутся из abills. NiTr0 Какая нагрузка на данный момнет у вас на нём? Сколько абонентов? Сколько в среднем запросов к серверу? Где релеете? Спасибо посмотрим. Может пригодится. :) Edited November 21, 2012 by bomberman Вставить ник Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.