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

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

Решил почитать на ночь код и заметил следующий кусок:

#this keeps the program alive or something after exec'ing perl scripts
END()           { }
BEGIN() { }
{no warnings; *CORE::GLOBAL::exit = sub { die "fakeexit\nrc=".shift()."\n"; }; };
eval q{exit};
if ($@) { exit unless $@ =~ /^fakeexit/; };

 

Вообще-то это что-то связанное с FastCGI ( к примеру, см. Perl + FastCGI + nginx , "Пример с codemongers.com"), а данном контексте оно что делает? Глобально переопределяет "exit"? Но тогда, если верить доке , переопределение должно быть сделано внутри блока BEGIN. Я попробовал потестировать это кусок кода, но в текущем виде не заметил от него никакой реакции. Кто-нибудь может подсказать, зачем он нужен в этом демоне?

Share this post


Link to post
Share on other sites

Кто-нибудь может подсказать, зачем он нужен в этом демоне?

Я не большой спец в перле, поэтому не исключено что это просто мусор.

Эти конструкции по замыслу нужны чтобы форкалось/работало демоном.

Share this post


Link to post
Share on other sites

Демонизация и форканье тут

sub daemonize {
delete @ENV{qw(IFS CDPATH ENV BASH_ENV)}; # Make %ENV safer
#setuid(65534)		or die "Can't set uid: $!\n"; # nobody

open(STDIN,  "+>/dev/null")	or die "Can't open STDIN: $!\n";
open(STDOUT, "+>&STDIN")	or die "Can't open STDOUT: $!\n";
open(STDERR, "+>&STDIN")	or die "Can't open STDERR: $!\n";
defined(my $tm = fork)	or die "Can't fork: $!\n";
exit if $tm;
setsid				or die "Can't start a new session: $!\n";
umask 0;
logger("Daemon mode");
}

Share this post


Link to post
Share on other sites

Кишки fastcgi враппера по ходу, откуда оно выросло...

Походу да, потому что именно под FastCGI exit() делать нельзя и приходится выкручиваться, переопределением в том числе. Вот тут пример граблей, если вдруг кому интересно...

Share this post


Link to post
Share on other sites

Всем привет. Подскажите, что делаю не так, может чего не прописал.

 

Есть свитч, есть релей, есть абонент и сервер ДХЦП

схема:

абонент - свитч - релей - свитч - сервер

 

на свитче настроен влан, на релее прописано все на сервер, все работает. Добавил новый влан на свитч, в админке ДХЦП сервера, прописал этот влан, прописал маршруты, прописал в клиентах на 1 порт новый влан, клиент запрос шлет, сервер его видит, отправляет, и на этом все заканчивается.

 

Где косяк может быть?

 

 

П.С. Странно, вчера не работало, сегодня еще раз попробовал, пошло.

Share this post


Link to post
Share on other sites

Все таки не работает.

 

Попробовал на свитче прям включить релей, вот что видит ДХЦП сервер:

15:52:43.011381 IP (tos 0x0, ttl 255, id 12222, offset 0, flags [none], proto UDP (17), length 334)
   10.10.10.224.bootpc > 10.10.10.50.bootps: [udp sum ok] BOOTP/DHCP, Request from a8:20:66:2a:45:8f (oui Unknown), length 306, hops 1, xid 0xf4487abe, secs 61, Flags [none] (0x0000)
         Gateway-IP 10.10.10.224
         Client-Ethernet-Address a8:20:66:2a:45:8f (oui Unknown)
         Vendor-rfc1048 Extensions
           Magic Cookie 0x63825363
           DHCP-Message Option 53, length 1: Discover
           Parameter-Request Option 55, length 9:
             Subnet-Mask, Default-Gateway, Domain-Name-Server, Domain-Name
             Option 119, LDAP, Option 252, Netbios-Name-Server
             Netbios-Node
           MSZ Option 57, length 2: 1500
           Client-ID Option 61, length 7: ether a8:20:66:2a:45:8f
           Lease-Time Option 51, length 4: 7776000
           Hostname Option 12, length 10: "MBP-Dima-2"
           Agent-Information Option 82, length 18:
             Circuit-ID SubOption 1, length 6: ^@^D^@M-a^A^A
             Remote-ID SubOption 2, length 8: ^@^FprM-O==w
           END Option 255, length 0
15:52:43.016069 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto UDP (17), length 341)
   10.10.10.50.bootps > 10.10.10.224.bootps: [bad udp cksum f29e!] BOOTP/DHCP, Reply, length 313, xid 0xf4487abe, secs 61, Flags [none] (0x0000)
         Gateway-IP 10.10.10.224
         Client-Ethernet-Address a8:20:66:2a:45:8f (oui Unknown)
         Vendor-rfc1048 Extensions
           Magic Cookie 0x63825363
           DHCP-Message Option 53, length 1: Offer
           Server-ID Option 54, length 4: 10.10.10.50
           Lease-Time Option 51, length 4: 84600
           RN Option 58, length 4: 42300
           RB Option 59, length 4: 74025
           Subnet-Mask Option 1, length 4: 255.255.255.0
           Default-Gateway Option 3, length 4: 172.20.25.254
           Domain-Name-Server Option 6, length 8: 10.10.10.1,10.10.10.2
           Netbios-Node Option 46, length 1: h-node
           Agent-Information Option 82, length 18:
             Circuit-ID SubOption 1, length 6: ^@^D^@M-a^A^A
             Remote-ID SubOption 2, length 8: ^@^FprM-O==w
           END Option 255, length 0

 

вот как это выглядит если релеит то что все релеит :)

 

15:55:20.713824 IP (tos 0x0, ttl 64, id 38340, offset 0, flags [none], proto UDP (17), length 334)
   10.10.10.254.bootps > 10.10.10.50.bootps: [udp sum ok] BOOTP/DHCP, Request from a8:20:66:2a:45:8f (oui Unknown), length 306, hops 1, xid 0xf4487ac0, secs 51, Flags [none] (0x0000)
         Gateway-IP 172.20.25.254
         Client-Ethernet-Address a8:20:66:2a:45:8f (oui Unknown)
         Vendor-rfc1048 Extensions
           Magic Cookie 0x63825363
           DHCP-Message Option 53, length 1: Discover
           Parameter-Request Option 55, length 9:
             Subnet-Mask, Default-Gateway, Domain-Name-Server, Domain-Name
             Option 119, LDAP, Option 252, Netbios-Name-Server
             Netbios-Node
           MSZ Option 57, length 2: 1500
           Client-ID Option 61, length 7: ether a8:20:66:2a:45:8f
           Lease-Time Option 51, length 4: 7776000
           Hostname Option 12, length 10: "MBP-Dima-2"
           Agent-Information Option 82, length 18:
             Circuit-ID SubOption 1, length 6: ^@^D^@M-a^A^A
             Remote-ID SubOption 2, length 8: ^@^FprM-O==w
           END Option 255, length 0
15:55:20.718029 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto UDP (17), length 341)
   10.10.10.50.bootps > 172.20.25.254.bootps: [bad udp cksum 808b!] BOOTP/DHCP, Reply, length 313, xid 0xf4487ac0, secs 51, Flags [none] (0x0000)
         Gateway-IP 172.20.25.254
         Client-Ethernet-Address a8:20:66:2a:45:8f (oui Unknown)
         Vendor-rfc1048 Extensions
           Magic Cookie 0x63825363
           DHCP-Message Option 53, length 1: Offer
           Server-ID Option 54, length 4: 10.10.10.50
           Lease-Time Option 51, length 4: 84600
           RN Option 58, length 4: 42300
           RB Option 59, length 4: 74025
           Subnet-Mask Option 1, length 4: 255.255.255.0
           Default-Gateway Option 3, length 4: 172.20.25.254
           Domain-Name-Server Option 6, length 8: 10.10.10.1,10.10.10.2
           Netbios-Node Option 46, length 1: h-node
           Agent-Information Option 82, length 18:
             Circuit-ID SubOption 1, length 6: ^@^D^@M-a^A^A
             Remote-ID SubOption 2, length 8: ^@^FprM-O==w
           END Option 255, length 0

 

Сейчас задампил клиента, посмотрю что там, но клиент не получает ответ сервера... Что не так делаю? Свитч прописан в базе, расположение, клиенты...

 

На клиенте, по дампу видно, что клиент DHCP DISCOVER шлет, но ответа не получает.

Share this post


Link to post
Share on other sites

У вас в логе выше видно что контрольная сумма у некоторых пакетов совсем не та.

Нужно или совсем выключать проверку и генерацию или делать чтобы она правильной была.

Share this post


Link to post
Share on other sites

лог с абонентского ПК

http://yadi.sk/d/VJKpBv6lKcFHB

Почему то один и тот же ВЛАН на 1 свитче запускается, на другом не хочет.

Дискавер уходит от клиента, офер приходит, и на этом заканчивается.

пробую на одном и том же свитче, два разных влана.

Настроил 1, проверил, все работает (задал расположение в нем выбрал свитч этот)

Пробую неработающее расположение (выбираю рабочий свитч). Не идет....

 

Пересоздал расположение, все заработало.... Странно.

Share this post


Link to post
Share on other sites

День добрый Иван!

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

 

хотелось бы параллельно с в4 и в6 раздавать ( айпи на клиента + делегировать ему подсеть )

Share this post


Link to post
Share on other sites

Нету.

Когда я последний раз смотрел то класса для ипв6 не было, а писать его самому не было мотивации.

Технически там ничего сложного нет.

Share this post


Link to post
Share on other sites

отпишу по своей проблеме, так и не нашел (с дебагом) почему не выдает ИП. Единственное что сыпет (в дебаг)

Argument "172.20.3.40" isn't numeric in numeric ne (!=) at /lib/dhcp-perl/dhcpd.pl line 1075.

 

в остальном запросы рабочие, все данные получает демон. Странно что удаление всех клиентов,расположения и добавление его заново, решает проблему.

Share this post


Link to post
Share on other sites

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

$client_ip = $_[1]->ciaddr;

$gateway_ip = $_[1]->giaddr;

if (defined($_[1]->getOptionRaw(DHO_DHCP_CLIENT_IDENTIFIER()))) {

$client_ident = BuffToHEX($_[1]->getOptionRaw(DHO_DHCP_CLIENT_IDENTIFIER()));

}else{

$client_ident = '';

}

if (defined($_[1]->getOptionRaw(DHO_DHCP_REQUESTED_ADDRESS()))) {

$requested_ip = $_[1]->getOptionValue(DHO_DHCP_REQUESTED_ADDRESS());

}else{

if ($client_ip!="") {

$requested_ip = $client_ip;

}

else {

$requested_ip = '';

}

}

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

if ($client_ip!="")	{
$requested_ip = $client_ip;
}
else {
$requested_ip = '';
}

заменить на

$requested_ip = '';
$requested_ip = $client_ip if ($client_ip ne "");

Edited by pppoetest

Share this post


Link to post
Share on other sites

Всем привет.

Хочу поднять тему про пул адресов, хочу поставить вифи точку фрии, чтоб раздавало адреса из пула.

И еще вопрос, иногда бывает конфликт ИП адресов, в лог в теории должно попадать DHCPDecline, но ничего такого нет, можно как то решить?

 

 

П.С. Доната нет? :)

Share this post


Link to post
Share on other sites

Там для записи decline есть отдельная функция: db_lease_decline - добавляйте туда какой угодно запрос к базе.

Денег, давайте :)

Яндекс кошелёк: 410011898378762

Share this post


Link to post
Share on other sites

Подскажите по правильности db_lease_decline

В теории хочу просто видеть в логах, где произошел конфликт ИП.

 

sub db_lease_decline {

#my $dbh = $_[0];

#my $dhcpreq = $_[1];

return(0);

my ($mac, $sth);

my ($dhcp_opt82_vlan_id, $dhcp_opt82_unit_id, $dhcp_opt82_port_id, $dhcp_opt82_chasis_id);

my ($client_ip, $gateway_ip, $client_ident, $requested_ip, $hostname, $dhcp_vendor_class, $dhcp_user_class);

my ($message_type);

 

$message_type = $_[1]->getOptionValue(DHO_DHCP_MESSAGE_TYPE());

 

# change hw addr format

$mac = FormatMAC(substr($_[1]->chaddr(), 0, (2 * $_[1]->hlen())));

 

$sth = $_[0]->prepare("");

 

$sth = $_[0]->prepare("INSERT INTO `log_dhcp`

(`t`, `agent_mac`, `agent_ip`, `cl_mac`, `cl_ip`, `cl_port`, `cl_vlan`, `cl_name`, `cl_vendor`, `m_type`)

VALUES(NOW(), '$dhcp_opt82_chasis_id', '$gateway_ip', '$mac', '$requested_ip', '$dhcp_opt82_port_id', '$dhcp_opt82_vlan_id', '$hostname', '$dhcp_vendor_class', $message_type)

");

 

if ($DEBUG > 1) { logger("INSERT INTO `log_dhcp`

(`t`, `agent_mac`, `agent_ip`, `cl_mac`, `cl_ip`, `cl_port`, `cl_vlan`, `cl_name`, `cl_vendor`, `m_type`)

VALUES(NOW(), '$dhcp_opt82_chasis_id', '$gateway_ip', '$mac', '$requested_ip', '$dhcp_opt82_port_id', '$dhcp_opt82_vlan_id', '$hostname', '$dhcp_vendor_class', $message_type)

") }

 

$sth->execute();

$sth->finish();

 

return(0);

}

Share this post


Link to post
Share on other sites

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.