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

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]);

т.е. на моем примере что должно быть в таблице?

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

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


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

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

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

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

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

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

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


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

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

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

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


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

Cramac,

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

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


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

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

dhcp.txt

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

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


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

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

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

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)

 

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

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


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

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

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

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


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

Тогда либо попробовать с другим релей агентом и другим клиентом, либо сдампить и там пакет, так трудно сказать почему не принимает.

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


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

пробовал isc-dhcp работает через релей...

dhcp_client.pcap.txt

 

может в базе что не так?

dhcp.sql.txt

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

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


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

Если не забуду - вечером скормплю дамп софтине и посмотрю что там.

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


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

Итак.

 

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

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

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

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


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

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

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

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


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

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

 

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

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

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


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

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

}

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

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


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

Новые версии данной разработки имеются? :)

Автор не забросли свою, на мой взгляд, замечательную идею? :)

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


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

если багов нет, нет и новых версий :) Тестил, вроде все работает как надо и задумалось...

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


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

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

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


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

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

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

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


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

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

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

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


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

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

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

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


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

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

abills-perl-dhcp.tar.gz

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


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

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

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

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


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

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

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

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

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


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

Join the conversation

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

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

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

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

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

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

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