versen Posted June 1, 2011 Posted June 1, 2011 ограниченным перебором. на русской винде используются cp866, cp1251 и utf16. Если у кого-нибудь будет немецкая винда, то вы увидете мусор вместо их национальных символов, предполагая что используется cp866 Понял. thanks Теперь по dhcp серверу, вопрос, скорее к Ivan_83: в request_loop: в строку logger("Thread $tid: Got a packet src = $ipaddr:$port length = ".length($buf)); добавил $dhcpreq->xid()."\t". logger($dhcpreq->xid()."\t"."Thread $tid: Got a packet src = $ipaddr:$port length = ".length($buf)); и в логе нашел такую запись: [01/Jun/2011 12:35:15] 4055216833 DHCPTYPE = 3;HOST_NAME = microsof-f284e2 [01/Jun/2011 12:35:15] 4055216833 Thread 0: Got a packet src = 172.16.16.33:68 length = 339 [01/Jun/2011 12:35:15] 4055216833 Thread 2: Got a packet src = 172.16.16.252:68 length = 339 [01/Jun/2011 12:35:15] 4055216833 DHCPTYPE = 3;HOST_NAME = microsof-f284e2 [01/Jun/2011 12:35:15] 4055216833 sw_ip = 172.16.16.166; port = 27 [01/Jun/2011 12:35:15] 4055216833 sw_ip = 172.16.16.252; port = 19 [01/Jun/2011 12:35:15] 4055216833 DHCPTYPE = 3;HOST_NAME = microsof-f284e2 [01/Jun/2011 12:35:15] 4055216833 sw_ip = 172.16.16.33; port = 25 [01/Jun/2011 12:35:15] 4055216833 Sending response to = 172.16.16.33:67 length = 300 [01/Jun/2011 12:35:15] 4055216833 Thread 0: the code took: 0.00656295 wallclock secs ( 0.00 usr + 0.00 sys = 0.00 CPU) [01/Jun/2011 12:35:15] 4055216833 Sending response to = 172.16.16.252:67 length = 310 [01/Jun/2011 12:35:15] 4055216833 Thread 2: the code took: 0.00982499 wallclock secs ( 0.00 usr + 0.00 sys = 0.00 CPU) [01/Jun/2011 12:35:15] 4055216833 Sending response to = 172.16.16.166:67 length = 300 [01/Jun/2011 12:35:15] 4055216833 Thread 8: the code took: 0.014338 wallclock secs ( 0.00 usr + 0.00 sys = 0.00 CPU) Непонятно, что за глюк.. Почему в трех разных нитях один и тот же xid? Хотя параметры, к примеру, свитч_порт, которые берутся из того же $dhcpreq, у каждой нити получились свои? А вот $dhcpreq->getOptionValue(DHO_DHCP_MESSAGE_TYPE()) и $dhcpreq->getOptionRaw(DHO_HOST_NAME()) одинаковые. !?!? Перенес строку my ($buf, $fromaddr, $dhcpreq); # recv data чуть ниже в while( $RUNNING == 1 ) { my ($buf, $fromaddr, $dhcpreq); # recv data может из-за этого? Вставить ник Quote
Ivan_83 Posted June 3, 2011 Author Posted June 3, 2011 В винде оно теперь называется: OEMCP, я тоже подбирал для своего виндового снифера. На вскидку: возможно "$dhcpreq->xid()" в данном случае интерпретируется как указатель/адрес на функцию. $dhcpreq->Xid попробуйте так, прямое обращение к переменной. Вставить ник Quote
versen Posted June 6, 2011 Posted June 6, 2011 (edited) В винде оно теперь называется: OEMCP, я тоже подбирал для своего виндового снифера. На вскидку: возможно "$dhcpreq->xid()" в данном случае интерпретируется как указатель/адрес на функцию. $dhcpreq->Xid попробуйте так, прямое обращение к переменной. Thread 3: Caught error in main loop: Can't locate object method "Xid" via package "Net::DHCP::Packet" at ./dhcpsql.pl line 273 Line273: logger($dhcpreq->xid()."\t"."Thread $tid: Got a packet src = $ipaddr:$port length = ".length($buf)); PS Перенес строку my ($buf, $fromaddr, $dhcpreq); # recv data чуть ниже в while( $RUNNING == 1 ) { my ($buf, $fromaddr, $dhcpreq); # recv data Это тоже не помогло.. Edited June 6, 2011 by versen Вставить ник Quote
Ivan_83 Posted June 8, 2011 Author Posted June 8, 2011 $dhcpreq->{xid} Подробности в: /usr/local/lib/perl5/site_perl/5.10.1/Net/DHCP/Packet.pm Вставить ник Quote
kaba Posted June 22, 2011 Posted June 22, 2011 Доброго времени суток. Господа, есть вопрос: скачал файл DHCP-сервера из шапки, все необходимые модули установил. Далее хочу запустить все это. Не могли бы вы на пальцах объяснить, какова должна быть изначальная структура БД, с которой будет работать сервер. А еще лучше, ткнуть носом в нужные строки скрипта, где эта самая структура задается. Я так понял, что вся конфигурация сервера хранится именно в БД. Извиняюсь за дошкольные вопросы, просто с Perl-ом пришлось столкнуться впервые. Если что-то я не правильно понял, поправьте пожалуйста. Спасибо. Вставить ник Quote
Ivan_83 Posted June 22, 2011 Author Posted June 22, 2011 Создать базу и написать запросы - домашнее задание :) В моём случае база была, она специфична. Поэтому я вынес всю работу с ней в отдельные функции, максимально разделив и реализовав всю обвязку. Вставить ник Quote
kaba Posted June 23, 2011 Posted June 23, 2011 Создать базу и написать запросы - домашнее задание :) Ладно, спасибо. Буду разбирать дальше. Вставить ник Quote
Lynx10 Posted June 29, 2011 Posted June 29, 2011 пробовал заточить под свои задачи - всё встало без особых вопросов Спасибо Ivan_83 Вставить ник Quote
zep Posted August 1, 2011 Posted August 1, 2011 Винда XP Prof SP3 не хочет просить адреса DNS (отдавал дпже принудительно, см. ниже) ... Хотя в связке с Dlink DIR-615 все впорядке. мистика. Options : DHO_DHCP_MESSAGE_TYPE(53) = DHCPACK DHO_DHCP_SERVER_IDENTIFIER(54) = 91.1.1.2 DHO_ROUTER_DISCOVERY(31) = 0 DHO_VENDOR_ENCAPSULATED_OPTIONS(43) = \x01\x04\x00\x00\x00\x02\x02\x04\x00\x00\x00\x01\xFF DHO_NETBIOS_NODE_TYPE(46) = 8 (249) = \x16[\xCA\x08\xAC\x10\x02\x01 DHO_DHCP_LEASE_TIME(51) = 300 DHO_DHCP_RENEWAL_TIME(58) = 400 DHO_DHCP_REBINDING_TIME(59) = 500 DHO_SUBNET_MASK(1) = 255.255.255.0 DHO_ROUTERS(3) = 172.16.2.1 DHO_DOMAIN_NAME_SERVERS(6) = 1.2.3.4 DHO_DOMAIN_NAME(15) = kuku2.net DHO_ROUTER_DISCOVERY(31) = 0 DHO_VENDOR_ENCAPSULATED_OPTIONS(43) = \x01\x04\x00\x00\x00\x02\x02\x04\x00\x00\x00\x01\xFF DHO_NETBIOS_NODE_TYPE(46) = 8 (249) = \x16[\xCA\x08\xAC\x10\x02\x01 DHO_DHCP_AGENT_OPTIONS(82) = \x01\x06\x00\x04\x00\xCA\x00\x09\x02\x08\x00\x06\xF0}h5\xD1 padding [0] = Вставить ник Quote
s.lobanov Posted August 1, 2011 Posted August 1, 2011 zep Может в настройках соединения стоит "получить адрес автоматически", но нет галочки "получить dns автоматически"? Вставить ник Quote
zep Posted August 1, 2011 Posted August 1, 2011 zep Может в настройках соединения стоит "получить адрес автоматически", но нет галочки "получить dns автоматически"? нет. там все ок. Вообще идея с этой программой хорошая, но стиль написания непредсказуемый. Наверно буду переписывать. П.С. Не в обиду разработчику Вставить ник Quote
Abram Posted August 2, 2011 Posted August 2, 2011 zep, В спецификации протокола написано, что клиент ДОЛЖЕН запрашивать списком опции (и принимать пакет только с тем, что он запросил, остальные - считать ошибочными), а сервер ДОЛЖЕН отдавать только те, что запросил клиент. На деле же получается, что множество клиентов (читай: винда) неправильно запрашивают, отсюда у серверов костыль - некоторые опции отдавать всегда, отсюда у клиентов костыль - игнорировать опции, которые клиент не запрашивал... Вот так и живем :). Вставить ник Quote
Ivan_83 Posted August 2, 2011 Author Posted August 2, 2011 Вообще идея с этой программой хорошая, но стиль написания непредсказуемый. Наверно буду переписывать. П.С. Не в обиду разработчику Я и сам такой. %) Вставить ник Quote
Инкогнито Posted October 21, 2011 Posted October 21, 2011 Ёкарный бабай... А банально структуру требуемой базы описать нельзя? Хотя бы в форме sql. Приходится заниматься ананизмом... Идея и реализация - большое спасибо. Но довести бы "до ума", вообще цены небыло бы. Вставить ник Quote
Ivan_83 Posted October 21, 2011 Author Posted October 21, 2011 Спасибо за отзыв и интерес. Может вы поделитесь тем, что у вас получится?) Вставить ник Quote
harmless Posted November 5, 2011 Posted November 5, 2011 Всем привет! А можно дописать возможность к данному серверу обновлять зоны днс? И все же не помешала бы структура базы! для теста создал пару таблиц CREATE TABLE IF NOT EXISTS `subnets_routes` ( `destination` text NOT NULL, `mask` text NOT NULL, `gateway` text NOT NULL, `subnet_id` int(10) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1; CREATE TABLE IF NOT EXISTS `subnets` ( `dhcp_lease_time` text NOT NULL, `dhcp_renewal` text NOT NULL, `dhcp_rebind_time` text NOT NULL, `mask` text NOT NULL, `gateway` text NOT NULL, `dns2` text NOT NULL, `dns1` text NOT NULL, `subnet_id` int(10) NOT NULL, `domain` text NOT NULL, `vlan_id` int(5) NOT NULL, `type` text NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1; CREATE TABLE IF NOT EXISTS `dhcp_log` ( `created` date NOT NULL, `client_mac` varchar(255) NOT NULL, `client_ip` text NOT NULL, `gateway_ip` text NOT NULL, `client_ident` text NOT NULL, `requested_ip` text NOT NULL, `hostname` text NOT NULL, `dhcp_vendor_class` text NOT NULL, `dhcp_user_class` text NOT NULL, `dhcp_opt82_chasis_id` text NOT NULL, `dhcp_opt82_unit_id` text NOT NULL, `dhcp_opt82_port_id` text NOT NULL, `dhcp_opt82_vlan_id` text NOT NULL, UNIQUE KEY `client_mac` (`client_mac`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; CREATE TABLE IF NOT EXISTS `users` ( `id` int(5) NOT NULL AUTO_INCREMENT, `ip` text NOT NULL, `mac` text NOT NULL, PRIMARY KEY (`id`), ) ENGINE=InnoDB DEFAULT CHARSET=latin1 ; Но такой вариант не работает Может подскажите чуток? Вставить ник Quote
Ivan_83 Posted November 6, 2011 Author Posted November 6, 2011 Что значить "обновлять зоны днс"? Где их обновлять? В вашем примере, лучше всего делать не днс1, днс2... а сделать просто днс, в ответе оно всё равно пакутеся в один массив, там может быть хоть 10 днс серверов. Вставить ник Quote
harmless Posted November 6, 2011 Posted November 6, 2011 Что значить "обновлять зоны днс"? Где их обновлять? В вашем примере, лучше всего делать не днс1, днс2... а сделать просто днс, в ответе оно всё равно пакутеся в один массив, там может быть хоть 10 днс серверов. Обновлять днс как при связке isc-dhcpd-server и bind - когда клиент регистрируется на дхцп то вносится запись в днс с именем и ипом новой тачки. Вставить ник Quote
s.lobanov Posted November 6, 2011 Posted November 6, 2011 Обновлять днс как при связке isc-dhcpd-server и bind - когда клиент регистрируется на дхцп то вносится запись в днс с именем и ипом новой тачки. Ну подправьте немного код, чтобы делался insert/update в базу dns-сервера (bind9-dlz, powerdns умеют хранить зоны в базе) Вставить ник Quote
harmless Posted November 6, 2011 Posted November 6, 2011 Ну подправьте немного код, чтобы делался insert/update в базу dns-сервера (bind9-dlz, powerdns умеют хранить зоны в базе) При чем тут вставить в базу Нужно чтоб когда, например, комп с именем test1 получал ип 10.10.10.10 и зону example.org ещ был доступен как test1.example.org В примере звязки приведенной мной выше дхцп сервер посылает какие-то данные днс по rndc на сколько я знаю Вставить ник Quote
s.lobanov Posted November 6, 2011 Posted November 6, 2011 harmless А я предлагаю решить эту задачу другим способом, более универсальным. Вставить ник Quote
harmless Posted November 6, 2011 Posted November 6, 2011 А я предлагаю решить эту задачу другим способом, более универсальным. Если делать таким способом то придется рестартовать днс чтоб обновилась зона Вставить ник Quote
BlackSnow Posted November 6, 2011 Posted November 6, 2011 (edited) Программирую на php, с перлом встретился впервые... 4 часа сижу над кодом... Сервер запустился, вроде отдает все, но клиент IP не принимает =( perl dhcpd.pl -b 0.0.0.0 -v 2 Switch will be removed from the Perl core distribution in the next major release. Please install it from CPAN. It is being used at dhcpd.pl, line 19. [06/Nov/2011 19:46:20] BIND_ADDR: 0.0.0.0, THREADS_COUNT: 4, PIDFILE: /var/run/perl-dhcpd.pid [06/Nov/2011 19:46:20] Thread (1): START [06/Nov/2011 19:46:20] Thread (2): START [06/Nov/2011 19:46:20] Thread (0): START [06/Nov/2011 19:46:20] Thread (3): START [06/Nov/2011 19:46:23] Thread 0: Got a packet src = 0.0.0.0:68 length = 576 [06/Nov/2011 19:46:23] op = BOOTREQUEST htype = HTYPE_ETHER hlen = 6 hops = 0 xid = 1a13 secs = 0 flags = 8000 ciaddr = 0.0.0.0 yiaddr = 0.0.0.0 siaddr = 0.0.0.0 giaddr = 0.0.0.0 chaddr = 0019ffcb8641 sname = file = Options : DHO_DHCP_MESSAGE_TYPE(53) = DHCPDISCOVER DHO_DHCP_MAX_MESSAGE_SIZE(57) = 1152 DHO_DHCP_CLIENT_IDENTIFIER(61) = \x00cisco-0019.ffcb.8641-Vl939 DHO_HOST_NAME(12) = SPb-Salova-switch DHO_DHCP_PARAMETER_REQUEST_LIST(55) = 1 6 15 44 3 33 150 43 DHO_DHCP_OPTION_OVERLOAD(52) = 3 padding [265] = 000000000000000000000000000000000.......................000000000000000000 [06/Nov/2011 19:46:23] Sending response to = 255.255.255.255:68 length = 311 [06/Nov/2011 19:46:23] op = BOOTREPLY htype = HTYPE_ETHER hlen = 6 hops = 0 xid = 1a13 secs = 0 flags = 8000 ciaddr = 0.0.0.0 yiaddr = 192.168.238.11 siaddr = 0.0.0.0 giaddr = 0.0.0.0 chaddr = 0019ffcb8641 sname = file = Options : DHO_DHCP_MESSAGE_TYPE(53) = DHCPOFFER DHO_DHCP_SERVER_IDENTIFIER(54) = 192.168.239.1 DHO_DHCP_LEASE_TIME(51) = 100 DHO_SUBNET_MASK(1) = 255.255.254.0 DHO_ROUTERS(3) = 192.168.238.1 DHO_DOMAIN_NAME_SERVERS(6) = 8.8.8.8 8.8.8.8 DHO_HOST_NAME(12) = client DHO_DOMAIN_NAME(15) = flag.ru DHO_VENDOR_ENCAPSULATED_OPTIONS(43) = \x01\x04\x00\x00\x00\x02\x02\x04\x00\x00\x00\x01\xFF padding [0] = [06/Nov/2011 19:46:23] Thread 0: the code took: 0.0151272 wallclock secs ( 0.01 usr + 0.00 sys = 0.01 CPU) Подскажите, что не так сервер отдает? Edited November 6, 2011 by BlackSnow Вставить ник Quote
Ivan_83 Posted November 6, 2011 Author Posted November 6, 2011 Он писался и отлаживался для работы с релей агентом, напрямую он не тестировался. Посмотрите dhcpdump / tcpdump ~ом, действительно ли пакеты с ответом уходят клиенту, и посмотрите мак адрес на который они улетают, должен быть ff::ff Вставить ник 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.