Jump to content
Калькуляторы

DHCP server with SQL support on Perl DHCP сервер с базой SQL на Perl, с опцией 82, маршрутами и прочим

ограниченным перебором. на русской винде используются 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

 

может из-за этого?

Share this post


Link to post
Share on other sites

В винде оно теперь называется: OEMCP, я тоже подбирал для своего виндового снифера.

 

На вскидку: возможно "$dhcpreq->xid()" в данном случае интерпретируется как указатель/адрес на функцию.

 

$dhcpreq->Xid попробуйте так, прямое обращение к переменной.

 

 

Share this post


Link to post
Share on other sites

В винде оно теперь называется: 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 by versen

Share this post


Link to post
Share on other sites

$dhcpreq->{xid}

 

Подробности в: /usr/local/lib/perl5/site_perl/5.10.1/Net/DHCP/Packet.pm

 

 

Share this post


Link to post
Share on other sites

Доброго времени суток.

 

Господа, есть вопрос:

 

скачал файл DHCP-сервера из шапки, все необходимые модули установил. Далее хочу запустить все это. Не могли бы вы на пальцах объяснить, какова должна быть изначальная структура БД, с которой будет работать сервер. А еще лучше, ткнуть носом в нужные строки скрипта, где эта самая структура задается. Я так понял, что вся конфигурация сервера хранится именно в БД.

 

Извиняюсь за дошкольные вопросы, просто с Perl-ом пришлось столкнуться впервые. Если что-то я не правильно понял, поправьте пожалуйста.

 

Спасибо.

Share this post


Link to post
Share on other sites

Создать базу и написать запросы - домашнее задание :)

 

В моём случае база была, она специфична. Поэтому я вынес всю работу с ней в отдельные функции, максимально разделив и реализовав всю обвязку.

 

 

Share this post


Link to post
Share on other sites

Создать базу и написать запросы - домашнее задание :)

Ладно, спасибо. Буду разбирать дальше.

Share this post


Link to post
Share on other sites

пробовал заточить под свои задачи - всё встало без особых вопросов

 

Спасибо Ivan_83

Share this post


Link to post
Share on other sites

Винда XP Prof SP3 не хочет просить адреса DNS (отдавал дпже принудительно, см. ниже) ... Хотя в связке с Dlink DIR-615 все впорядке. мистика.

 

QcBfkERR.jpg

 

 

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] =

Share this post


Link to post
Share on other sites

zep

Может в настройках соединения стоит "получить адрес автоматически", но нет галочки "получить dns автоматически"?

Share this post


Link to post
Share on other sites

zep

Может в настройках соединения стоит "получить адрес автоматически", но нет галочки "получить dns автоматически"?

 

нет. там все ок.

Вообще идея с этой программой хорошая, но стиль написания непредсказуемый. Наверно буду переписывать. П.С. Не в обиду разработчику

Share this post


Link to post
Share on other sites

zep,

В спецификации протокола написано, что клиент ДОЛЖЕН запрашивать списком опции (и принимать пакет только с тем, что он запросил, остальные - считать ошибочными), а сервер ДОЛЖЕН отдавать только те, что запросил клиент.

На деле же получается, что множество клиентов (читай: винда) неправильно запрашивают, отсюда у серверов костыль - некоторые опции отдавать всегда, отсюда у клиентов костыль - игнорировать опции, которые клиент не запрашивал... Вот так и живем :).

Share this post


Link to post
Share on other sites
Вообще идея с этой программой хорошая, но стиль написания непредсказуемый. Наверно буду переписывать. П.С. Не в обиду разработчику

 

Я и сам такой. %)

 

 

Share this post


Link to post
Share on other sites

Ёкарный бабай... А банально структуру требуемой базы описать нельзя? Хотя бы в форме sql. Приходится заниматься ананизмом...

 

Идея и реализация - большое спасибо. Но довести бы "до ума", вообще цены небыло бы.

Share this post


Link to post
Share on other sites

Спасибо за отзыв и интерес.

 

Может вы поделитесь тем, что у вас получится?)

 

 

Share this post


Link to post
Share on other sites

Всем привет!

А можно дописать возможность к данному серверу обновлять зоны днс?

И все же не помешала бы структура базы!

для теста создал пару таблиц

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 ;

Но такой вариант не работает

Может подскажите чуток?

Share this post


Link to post
Share on other sites

Что значить "обновлять зоны днс"?

 

Где их обновлять?

 

 

 

 

В вашем примере, лучше всего делать не днс1, днс2... а сделать просто днс, в ответе оно всё равно пакутеся в один массив, там может быть хоть 10 днс серверов.

 

 

Share this post


Link to post
Share on other sites

Что значить "обновлять зоны днс"?

 

Где их обновлять?

 

 

 

 

В вашем примере, лучше всего делать не днс1, днс2... а сделать просто днс, в ответе оно всё равно пакутеся в один массив, там может быть хоть 10 днс серверов.

Обновлять днс как при связке isc-dhcpd-server и bind - когда клиент регистрируется на дхцп то вносится запись в днс с именем и ипом новой тачки.

Share this post


Link to post
Share on other sites

Обновлять днс как при связке isc-dhcpd-server и bind - когда клиент регистрируется на дхцп то вносится запись в днс с именем и ипом новой тачки.

 

Ну подправьте немного код, чтобы делался insert/update в базу dns-сервера (bind9-dlz, powerdns умеют хранить зоны в базе)

Share this post


Link to post
Share on other sites

Ну подправьте немного код, чтобы делался insert/update в базу dns-сервера (bind9-dlz, powerdns умеют хранить зоны в базе)

При чем тут вставить в базу

Нужно чтоб когда, например, комп с именем test1 получал ип 10.10.10.10 и зону example.org ещ был доступен как test1.example.org

В примере звязки приведенной мной выше дхцп сервер посылает какие-то данные днс по rndc на сколько я знаю

Share this post


Link to post
Share on other sites

harmless

А я предлагаю решить эту задачу другим способом, более универсальным.

Share this post


Link to post
Share on other sites

А я предлагаю решить эту задачу другим способом, более универсальным.

Если делать таким способом то придется рестартовать днс чтоб обновилась зона

Share this post


Link to post
Share on other sites

Программирую на 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 by BlackSnow

Share this post


Link to post
Share on other sites

Он писался и отлаживался для работы с релей агентом, напрямую он не тестировался.

 

Посмотрите dhcpdump / tcpdump ~ом, действительно ли пакеты с ответом уходят клиенту, и посмотрите мак адрес на который они улетают, должен быть ff::ff

 

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this