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

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

Издеваешься?

http://www.netlab.linkpc.net/wiki/ru:software:freebsd:igmpproxy_on_netgraph

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

 

А ты под спойлер-то заглядывал вообще? О_о Там как раз уже готовые программы на bpf. Я к тому, что не хочу вешать на каждый bpf правило файрвола, который будет отправлять туда фреймы. Вопрос был в том, чтобы нетграф сам рассовывал по нескольким bpf программам параллельно (hub, switch, one2many?), с которых я потом снимаю статистику. Надеюсь, что мы просто друг друга не поняли.

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


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

Вот что получилось

 

#!/bin/sh

ipfw delete 20000

ngctl shutdown ipfw:1 
ngctl mkpeer ipfw: one2many 1 one
ngctl name ipfw:1 one2many
ngctl msg ipfw:1 setconfig "{ xmitAlg=2 failAlg=1 enabledLinks=[ 1 1 1 1 1 1 1 1 ] }"
ngctl mkpeer one2many: bpf many0 main
ngctl name one2many:many0 dhcp_discover
ngctl mkpeer one2many: bpf many1 main
ngctl name one2many:many1 dhcp_offer
ngctl mkpeer one2many: bpf many2 main
ngctl name one2many:many2 dhcp_request
ngctl mkpeer one2many: bpf many3 main
ngctl name one2many:many3 dhcp_decline
ngctl mkpeer one2many: bpf many4 main
ngctl name one2many:many4 dhcp_ack
ngctl mkpeer one2many: bpf many5 main
ngctl name one2many:many5 dhcp_nak
ngctl mkpeer one2many: bpf many6 main
ngctl name one2many:many6 dhcp_release
ngctl mkpeer one2many: bpf many7 main
ngctl name one2many:many7 dhcp_inform

#DHCPDISCOVER
#udp port 67 and udp[247:4] = 0x63350101
ngctl msg dhcp_discover: setprogram { thisHook=\"main\" ifMatch=\"main\" ifNotMatch=\"main\" bpf_prog_len=19 bpf_prog=[ \
{ code=48 jt=0 jf=0 k=0 } { code=84 jt=0 jf=0 k=240 } { code=21 jt=15 jf=0 k=96 } { code=48 jt=0 jf=0 k=0 } \
{ code=84 jt=0 jf=0 k=240 } { code=21 jt=0 jf=12 k=64 } { code=48 jt=0 jf=0 k=9 } { code=21 jt=0 jf=10 k=17 } \
{ code=40 jt=0 jf=0 k=6 } { code=69 jt=8 jf=0 k=8191 } { code=177 jt=0 jf=0 k=0 } { code=72 jt=0 jf=0 k=0 } \
{ code=21 jt=2 jf=0 k=67 } { code=72 jt=0 jf=0 k=2 } { code=21 jt=0 jf=3 k=67 } { code=64 jt=0 jf=0 k=247 } \
{ code=21 jt=0 jf=1 k=1664418049 } { code=6 jt=0 jf=0 k=65535 } { code=6 jt=0 jf=0 k=0 } ] }

#DHCPOFFER
#udp port 67 and udp[247:4] = 0x63350102
ngctl msg dhcp_offer: setprogram { thisHook=\"main\" ifMatch=\"main\" ifNotMatch=\"main\" bpf_prog_len=19 bpf_prog=[ \
{ code=48 jt=0 jf=0 k=0 } { code=84 jt=0 jf=0 k=240 } { code=21 jt=15 jf=0 k=96 } { code=48 jt=0 jf=0 k=0 } \
{ code=84 jt=0 jf=0 k=240 } { code=21 jt=0 jf=12 k=64 } { code=48 jt=0 jf=0 k=9 } { code=21 jt=0 jf=10 k=17 } \
{ code=40 jt=0 jf=0 k=6 } { code=69 jt=8 jf=0 k=8191 } { code=177 jt=0 jf=0 k=0 } { code=72 jt=0 jf=0 k=0 } \
{ code=21 jt=2 jf=0 k=67 } { code=72 jt=0 jf=0 k=2 } { code=21 jt=0 jf=3 k=67 } { code=64 jt=0 jf=0 k=247 } \
{ code=21 jt=0 jf=1 k=1664418050 } { code=6 jt=0 jf=0 k=65535 } { code=6 jt=0 jf=0 k=0 } ] }

#DHCPREQUEST
#udp port 67 and udp[247:4] = 0x63350103
ngctl msg dhcp_request: setprogram { thisHook=\"main\" ifMatch=\"main\" ifNotMatch=\"main\" bpf_prog_len=19 bpf_prog=[ \
{ code=48 jt=0 jf=0 k=0 } { code=84 jt=0 jf=0 k=240 } { code=21 jt=15 jf=0 k=96 } { code=48 jt=0 jf=0 k=0 } \
{ code=84 jt=0 jf=0 k=240 } { code=21 jt=0 jf=12 k=64 } { code=48 jt=0 jf=0 k=9 } { code=21 jt=0 jf=10 k=17 } \
{ code=40 jt=0 jf=0 k=6 } { code=69 jt=8 jf=0 k=8191 } { code=177 jt=0 jf=0 k=0 } { code=72 jt=0 jf=0 k=0 } \
{ code=21 jt=2 jf=0 k=67 } { code=72 jt=0 jf=0 k=2 } { code=21 jt=0 jf=3 k=67 } { code=64 jt=0 jf=0 k=247 } \
{ code=21 jt=0 jf=1 k=1664418051 } { code=6 jt=0 jf=0 k=65535 } { code=6 jt=0 jf=0 k=0 } ] }

#DHCPDECLINE
#udp port 67 and udp[247:4] = 0x63350104
ngctl msg dhcp_decline: setprogram { thisHook=\"main\" ifMatch=\"main\" ifNotMatch=\"main\" bpf_prog_len=19 bpf_prog=[ \
{ code=48 jt=0 jf=0 k=0 } { code=84 jt=0 jf=0 k=240 } { code=21 jt=15 jf=0 k=96 } { code=48 jt=0 jf=0 k=0 } \
{ code=84 jt=0 jf=0 k=240 } { code=21 jt=0 jf=12 k=64 } { code=48 jt=0 jf=0 k=9 } { code=21 jt=0 jf=10 k=17 } \
{ code=40 jt=0 jf=0 k=6 } { code=69 jt=8 jf=0 k=8191 } { code=177 jt=0 jf=0 k=0 } { code=72 jt=0 jf=0 k=0 } \
{ code=21 jt=2 jf=0 k=67 } { code=72 jt=0 jf=0 k=2 } { code=21 jt=0 jf=3 k=67 } { code=64 jt=0 jf=0 k=247 } \
{ code=21 jt=0 jf=1 k=1664418052 } { code=6 jt=0 jf=0 k=65535 } { code=6 jt=0 jf=0 k=0 } ] }

#DHCPACK
#udp port 67 and udp[247:4] = 0x63350105
ngctl msg dhcp_ack: setprogram { thisHook=\"main\" ifMatch=\"main\" ifNotMatch=\"main\" bpf_prog_len=19 bpf_prog=[ \
{ code=48 jt=0 jf=0 k=0 } { code=84 jt=0 jf=0 k=240 } { code=21 jt=15 jf=0 k=96 } \
{ code=48 jt=0 jf=0 k=0 } { code=84 jt=0 jf=0 k=240 } { code=21 jt=0 jf=12 k=64 } \
{ code=48 jt=0 jf=0 k=9 } { code=21 jt=0 jf=10 k=17 } { code=40 jt=0 jf=0 k=6 } \
{ code=69 jt=8 jf=0 k=8191 } { code=177 jt=0 jf=0 k=0 } { code=72 jt=0 jf=0 k=0 } \
{ code=21 jt=2 jf=0 k=67 } { code=72 jt=0 jf=0 k=2 } { code=21 jt=0 jf=3 k=67 } \
{ code=64 jt=0 jf=0 k=247 } { code=21 jt=0 jf=1 k=1664418053 } { code=6 jt=0 jf=0 k=65535 } \
{ code=6 jt=0 jf=0 k=0 } ] }

#DHCPNAK
#udp port 67 and udp[247:4] = 0x63350106
ngctl msg dhcp_nak: setprogram { thisHook=\"main\" ifMatch=\"main\" ifNotMatch=\"main\" bpf_prog_len=19 bpf_prog=[ \
{ code=48 jt=0 jf=0 k=0 } { code=84 jt=0 jf=0 k=240 } { code=21 jt=15 jf=0 k=96 } { code=48 jt=0 jf=0 k=0 } \
{ code=84 jt=0 jf=0 k=240 } { code=21 jt=0 jf=12 k=64 } { code=48 jt=0 jf=0 k=9 } { code=21 jt=0 jf=10 k=17 } \
{ code=40 jt=0 jf=0 k=6 } { code=69 jt=8 jf=0 k=8191 } { code=177 jt=0 jf=0 k=0 } { code=72 jt=0 jf=0 k=0 } \
{ code=21 jt=2 jf=0 k=67 } { code=72 jt=0 jf=0 k=2 } { code=21 jt=0 jf=3 k=67 } { code=64 jt=0 jf=0 k=247 } \
{ code=21 jt=0 jf=1 k=1664418054 } { code=6 jt=0 jf=0 k=65535 } { code=6 jt=0 jf=0 k=0 } ] }

#DHCPRELEASE
#udp port 67 and udp[247:4] = 0x63350107
ngctl msg dhcp_release: setprogram { thisHook=\"main\" ifMatch=\"main\" ifNotMatch=\"main\" bpf_prog_len=19 bpf_prog=[ \
{ code=48 jt=0 jf=0 k=0 } { code=84 jt=0 jf=0 k=240 } { code=21 jt=15 jf=0 k=96 } { code=48 jt=0 jf=0 k=0 } \
{ code=84 jt=0 jf=0 k=240 } { code=21 jt=0 jf=12 k=64 } { code=48 jt=0 jf=0 k=9 } { code=21 jt=0 jf=10 k=17 } \
{ code=40 jt=0 jf=0 k=6 } { code=69 jt=8 jf=0 k=8191 } { code=177 jt=0 jf=0 k=0 } { code=72 jt=0 jf=0 k=0 } \
{ code=21 jt=2 jf=0 k=67 } { code=72 jt=0 jf=0 k=2 } { code=21 jt=0 jf=3 k=67 } { code=64 jt=0 jf=0 k=247 } \
{ code=21 jt=0 jf=1 k=1664418055 } { code=6 jt=0 jf=0 k=65535 } { code=6 jt=0 jf=0 k=0 } ] }

#DHCPINFORM
#udp port 67 and udp[247:4] = 0x63350108
ngctl msg dhcp_inform: setprogram { thisHook=\"main\" ifMatch=\"main\" ifNotMatch=\"main\" bpf_prog_len=19 bpf_prog=[ \
{ code=48 jt=0 jf=0 k=0 } { code=84 jt=0 jf=0 k=240 } { code=21 jt=15 jf=0 k=96 } { code=48 jt=0 jf=0 k=0 } \
{ code=84 jt=0 jf=0 k=240 } { code=21 jt=0 jf=12 k=64 } { code=48 jt=0 jf=0 k=9 } { code=21 jt=0 jf=10 k=17 } \
{ code=40 jt=0 jf=0 k=6 } { code=69 jt=8 jf=0 k=8191 } { code=177 jt=0 jf=0 k=0 } { code=72 jt=0 jf=0 k=0 } \
{ code=21 jt=2 jf=0 k=67 } { code=72 jt=0 jf=0 k=2 } { code=21 jt=0 jf=3 k=67 } { code=64 jt=0 jf=0 k=247 } \
{ code=21 jt=0 jf=1 k=1664418056 } { code=6 jt=0 jf=0 k=65535 } { code=6 jt=0 jf=0 k=0 } ] }

ipfw add 20000 netgraph 1 udp from any to any dst-port 67

 

Смотреть статистику вот так

#!/bin/sh

ngctl=`which ngctl`
egrep=`which egrep`

echo DISCOVER: `${ngctl} msg dhcp_discover: getstats \"main\" | ${egrep} 'recvMatchFrames=[0-9]+' -o | ${egrep} '[0-9]+' -o`
echo OFFER: `${ngctl} msg dhcp_offer: getstats \"main\" | ${egrep} 'recvMatchFrames=[0-9]+' -o | ${egrep} '[0-9]+' -o`
echo REQUEST: `${ngctl} msg dhcp_request: getstats \"main\" | ${egrep} 'recvMatchFrames=[0-9]+' -o | ${egrep} '[0-9]+' -o`
echo DECLINE: `${ngctl} msg dhcp_decline: getstats \"main\" | ${egrep} 'recvMatchFrames=[0-9]+' -o | ${egrep} '[0-9]+' -o`
echo ACK: `${ngctl} msg dhcp_ack: getstats \"main\" | ${egrep} 'recvMatchFrames=[0-9]+' -o | ${egrep} '[0-9]+' -o`
echo NAK: `${ngctl} msg dhcp_nak: getstats \"main\" | ${egrep} 'recvMatchFrames=[0-9]+' -o | ${egrep} '[0-9]+' -o`
echo RELEASE: `${ngctl} msg dhcp_release: getstats \"main\" | ${egrep} 'recvMatchFrames=[0-9]+' -o | ${egrep} '[0-9]+' -o`
echo INFORM: `${ngctl} msg dhcp_inform: getstats \"main\" | ${egrep} 'recvMatchFrames=[0-9]+' -o | ${egrep} '[0-9]+' -o`

 

Вывод

DISCOVER: 2
OFFER: 2
REQUEST: 7
DECLINE:
ACK: 7
NAK:
RELEASE: 1
INFORM:

 

Прошу прощения за офтоп, но может кому пригодится. Осталось оформить в нормальный скрипт и добавить в систему мониторинга нужные метрики.

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

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


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

А ты под спойлер-то заглядывал вообще? О_о Там как раз уже готовые программы на bpf.

Потому и написал что это издевательство - у меня нет интерпретатора БПФ асма в мозгах.

Сделать можно компактнее: в начале фильтруем по общим параметрам и убеждаемся что это дхцп, а потом цепочкой подобно switch проверяем только значение нужного кода в дхцп заголовке.

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


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

Сделать можно компактнее: в начале фильтруем по общим параметрам и убеждаемся что это дхцп, а потом цепочкой подобно switch проверяем только значение нужного кода в дхцп заголовке.

Ну я так и сделал. Разбирают по опции 53 в bpf. Где заматчилось, там счетчик и увеличился. На каждый тип свой фильтр. Фрейм на фильтры размножается через ноду one2many.

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


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

День добрый! просмотрел форум и увидел, что все правки скрипта с пулами, выкладываемые на Яндекс дисказ потерли... кто-то может выложить повторно рабочий скрипт и структуры баз?

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


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

Решил поглядеть - чего-то на бубунте 14.04 не работает, вообще пакеты не видит от DHCP релея (tcpdump и isc-dhcp-server пакеты видят).

Походу какие-то проблемы на системном уровне или в библиотеке Socket (ставилась через apt), другого объяснения у меня нету, т.к. совсем упростил скрипт до bind(), recv() и всё равно такая фигня.

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


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

может rp=0 фльтр этот дурацкий выключить через сисцтл?

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


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

может rp=0 фльтр этот дурацкий выключить через сисцтл?

Да, net.ipv4.conf.all.rp_filter = 0 помогло! Спасибо большое.

 

Хм, странно тогда что isc-dhcp-server работает с включенной фильтрацией - принимает запросы от DHCP Relay'я.

 

Буду дальше ковырять.

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


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

Приветствую. а кто нить прикрутил жепон к данному серверу?

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


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

Не так выразился. Тестировал бдком. Он шлет номер епон порта и номер ону. Что поправить что бы из этого получить уникальный номер порта

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


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

Я тоже всех шлю, кто не прикладывает дампов задавая такие вопросы :)

(Откуда мне знать в какой опции и каком формате оно тебе там ходит.)

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


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

В 82 опции

Circuit-id is dhcp vlan (000a=vlan10)+00(slot id ,1 u device not has slot id)+unique id (0a=10)+llid of onu(01=llid 1)

IMG_1351.PNG

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


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

Вроде скрипт не умеет работать в таком режиме. у вас relay agent ip 0.0.0.0

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


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

Посмотрел.

GetRelayAgentOptions

Вроде как парсит 1 и 2, и размеры совпадают.

Те он как раз 5 и 6 байт выковыривает из запроса, если тебе с ними что то особое нужно - дописывай.

По идее оно парсит и даже в лог этим гадит (db_log_detailed) , так что смотри/правь, там скорее всего только логику применения этого всего нужно поправить.

 

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

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


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

решение оч. простое оказалось

sub GetRelayAgentOptions($$$$$)

....

for (my $i = 0; defined($RelayAgent[$i]); $i += 2){

switch($RelayAgent[$i]){

case 1 { # Circuit ID

if (length($RelayAgent[($i+1)]) < 6)

{

 

$_[1] = unpack('n', substr($RelayAgent[($i+1)], 0, 2)); # may be 's'

$_[2] = unpack('C', substr($RelayAgent[($i+1)], 2, 1));

$_[3] = unpack('C', substr($RelayAgent[($i+1)], 3, 1));

$_[5] = unpack('C', substr($RelayAgent[($i+1)], 4, 1));

$_[3]=$_[3].$_[5];

}

в итоге имеем номер порта олт+ид ону

пока смотрю, но не сломается ли из за этого?

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


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

А чему там ломаться?

Ты же сам потом эти параметры юзаешь по позвращении из функции.

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


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

Да хз :) пока мониторю от куда могут придти эти данные кроме как с олт

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


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

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

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


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

Поглядите в сторону FreeRADIUS. Модуль dhcp там давно работает и легко скриптуется...

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


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

А FreeRadius dhcp научился в броадкаст? Он же тоже только через релей умел.

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


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

А FreeRadius dhcp научился в броадкаст? Он же тоже только через релей умел.

Отнюдь.. Он давно уж умел. Только были какие то нарекания о сырости, и не полноценности решения. Но это было давно оч. Сам такой метод не использовал.

Alex/AT GrandPr1de

Кто пользовался FreeRadius в роли dhcp? Поделитесь впечатлениями, реализацией.

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


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

Join the conversation

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

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

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

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

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

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

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