Перейти к содержимому
Калькуляторы

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

 

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

 

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

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Это тоже не помогло..

Изменено пользователем versen

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

$dhcpreq->{xid}

 

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

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

 

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

 

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

 

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

 

Спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

 

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

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

 

Спасибо Ivan_83

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Винда 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] =

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

zep

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

zep

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

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

zep,

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

 

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

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

 

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

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Всем привет!

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

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

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

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 ;

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

 

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

 

 

 

 

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

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

 

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

 

 

 

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

harmless

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Подскажите, что не так сервер отдает?

Изменено пользователем BlackSnow

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

 

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

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 смайлов.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.