Jump to content

Recommended Posts

Posted (edited)

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

 

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

 

в 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
  • 3 weeks later...
  • Replies 364
  • Created
  • Last Reply

Top Posters In This Topic

Top Posters In This Topic

Posted Images

Posted

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

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

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

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

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

Posted

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

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

Posted

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

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

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)

 

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

Posted

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

Posted

Итак.

 

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

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

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

Posted (edited)

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

 

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

Edited by Cramac
Posted (edited)

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

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

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

Posted

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

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

Posted

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

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

  • 4 weeks later...
Posted

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

abills-perl-dhcp.tar.gz

  • 1 month later...
Posted

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

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

Posted (edited)

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

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

Edited by bomberman

Join the conversation

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

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...
На сайте используются файлы cookie и сервисы аналитики для корректной работы форума и улучшения качества обслуживания. Продолжая использовать сайт, вы соглашаетесь с использованием файлов cookie и с Политикой конфиденциальности.