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

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

спасибо, попробую визуально понять о чем речь в скрипте :)

 

П.С. правильно ли я понял:

 

в 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 by Cramac

Share this post


Link to post
Share on other sites

Собрал тестовый стенд для теста сервера.

Есть клиент - ES3528M - ES4612 - DHCP

на 4612 поднят релей, который со всем вланов релеит запросы на сервер.

На сервере (используя сервер от Abram) в лог попадает запись что запрос пришел с ИП и мака маршрутизатора.

Сейчас isc-dhcp обрабатывает опцию 82 и по маку свитча и порту выдает ИП. а тут как сделать?

Share this post


Link to post
Share on other sites

Нужно написать запросы к базе и разбор ответа/запихивание ответа от базы в дхцп ответ.

Обвязка вся есть, просто состыковать.

Share this post


Link to post
Share on other sites

Cramac,

Дык используй DHCP Relay прямо на свитче, зачем на маршрутизаторе?

Share this post


Link to post
Share on other sites

помогите разобратся, что то у меня есть только дисковер от клиента на сервер и от сервера(по сниферу от релея) оффер и все на этом.

dhcp.txt

Edited by Cramac

Share this post


Link to post
Share on other sites

Вроде так и должно быть, дальше клиент должен слать запрос на аренду.

Только обратите внимание:

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)

 

дойдёт ли оно до релей агента...

Share this post


Link to post
Share on other sites

10.10.10.254 (0:12:cf:39:97:40) он же 172.20.2.254 это релей (edge core ES4612)

снифер на абонентском ПК видит этот оффер, но никак не реагирует.

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

Итак.

 

Это из пкап дампа:

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...).

Посмотрите ещё раз в сервер и хотя бы руками для тестов пропишите адрес и маску на отдачу, раз из базы почему то не берёт.

Share this post


Link to post
Share on other sites

хм, странно конечно, попробую, спасибо за анализ :)

Edited by Cramac

Share this post


Link to post
Share on other sites

Спасибо Ivan_83. Дело было в МАКах в базе, из за этого ничего не выдавалось.

 

П.С. Нормально отработало на стенде с релеем на маршрутизаторе (accton ES4612)

Edited by Cramac

Share this post


Link to post
Share on other sites

О знающие люди, подскажите как оживить функцию 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 by Cramac

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

Ну хотелось бы ещё видеть работу демона без релея. Если кто допилил, поделитесь пжлст.

Share this post


Link to post
Share on other sites

Чтобы работало без релея нужно через bpf/pcap интерфейс работать, самому формировать полностью эзернет+IP+юдп пакеты и разбирать тоже. В принципе то не сложно переписать.

У нас ISP и всё равно через релей летят, а допиливания требует именно логика работы с базой, которая не выкладывалась ибо специфично для наших нужд.

Share this post


Link to post
Share on other sites

Для статического IP в принципе понятно как прикрутить, ничего особо заумного там нет...

Для общего развития: как с динамикой быть? Нужно вести таблицу лиз ведь?

Share this post


Link to post
Share on other sites

Вроде как прилепил к абиллсу, статика без опции 82 (пока большего не требуется, хотя опцию 82 в коде предусмотрел но не тестировал), и вроде даже работает оно на стенде. Только несколько перепилил собссно логику демона/журналирование/прочее сопутствующее и подправил код, + основной поток сделал watcher'ом за worker потоками, чтобы пересоздавал потоки при их смерти.

Приеду с отпуска - буду пытаться внедрять...

Share this post


Link to post
Share on other sites

Запустил таки, пока вроде полет нормальный. Из замеченого - некоторые клиенты отваливаются либо шлют часто запросы (что-то им не нравится, в частности - один с дир-300 роутером, судя по имени хоста; хотя может роутер протаращило - он и в логи isc dhcpd гадил так же). Желающие могут потестировать у себя.

abills-perl-dhcp.tar.gz

Share this post


Link to post
Share on other sites

Запустил таки, пока вроде полет нормальный. Из замеченого - некоторые клиенты отваливаются либо шлют часто запросы (что-то им не нравится, в частности - один с дир-300 роутером, судя по имени хоста; хотя может роутер протаращило - он и в логи isc dhcpd гадил так же). Желающие могут потестировать у себя.

Было бы чудестно, если бы вы выложили еще и структуру базы и веб-морду :)

Share this post


Link to post
Share on other sites

KaDaBRa Я так пологаю Web-интерфейс и структура берутся из abills.

NiTr0 Какая нагрузка на данный момнет у вас на нём? Сколько абонентов? Сколько в среднем запросов к серверу? Где релеете? Спасибо посмотрим. Может пригодится. :)

Edited by bomberman

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