Dimic Опубликовано 18 марта, 2016 · Жалоба Издеваешься? http://www.netlab.linkpc.net/wiki/ru:software:freebsd:igmpproxy_on_netgraph вот тут как из tcpdump делать вот такой вот асм, на tcpdump тренируешься и потом получаешь программу для бпф на асме. А ты под спойлер-то заглядывал вообще? О_о Там как раз уже готовые программы на bpf. Я к тому, что не хочу вешать на каждый bpf правило файрвола, который будет отправлять туда фреймы. Вопрос был в том, чтобы нетграф сам рассовывал по нескольким bpf программам параллельно (hub, switch, one2many?), с которых я потом снимаю статистику. Надеюсь, что мы просто друг друга не поняли. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Dimic Опубликовано 18 марта, 2016 (изменено) · Жалоба Вот что получилось #!/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: Прошу прощения за офтоп, но может кому пригодится. Осталось оформить в нормальный скрипт и добавить в систему мониторинга нужные метрики. Изменено 18 марта, 2016 пользователем Dimic Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Ivan_83 Опубликовано 18 марта, 2016 · Жалоба А ты под спойлер-то заглядывал вообще? О_о Там как раз уже готовые программы на bpf. Потому и написал что это издевательство - у меня нет интерпретатора БПФ асма в мозгах. Сделать можно компактнее: в начале фильтруем по общим параметрам и убеждаемся что это дхцп, а потом цепочкой подобно switch проверяем только значение нужного кода в дхцп заголовке. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Dimic Опубликовано 19 марта, 2016 · Жалоба Сделать можно компактнее: в начале фильтруем по общим параметрам и убеждаемся что это дхцп, а потом цепочкой подобно switch проверяем только значение нужного кода в дхцп заголовке. Ну я так и сделал. Разбирают по опции 53 в bpf. Где заматчилось, там счетчик и увеличился. На каждый тип свой фильтр. Фрейм на фильтры размножается через ноду one2many. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
pashaumka Опубликовано 4 августа, 2016 · Жалоба День добрый! просмотрел форум и увидел, что все правки скрипта с пулами, выкладываемые на Яндекс дисказ потерли... кто-то может выложить повторно рабочий скрипт и структуры баз? Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Urs_ak Опубликовано 12 января, 2017 · Жалоба Решил поглядеть - чего-то на бубунте 14.04 не работает, вообще пакеты не видит от DHCP релея (tcpdump и isc-dhcp-server пакеты видят). Походу какие-то проблемы на системном уровне или в библиотеке Socket (ставилась через apt), другого объяснения у меня нету, т.к. совсем упростил скрипт до bind(), recv() и всё равно такая фигня. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Ivan_83 Опубликовано 12 января, 2017 · Жалоба может rp=0 фльтр этот дурацкий выключить через сисцтл? Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Urs_ak Опубликовано 16 января, 2017 · Жалоба может rp=0 фльтр этот дурацкий выключить через сисцтл? Да, net.ipv4.conf.all.rp_filter = 0 помогло! Спасибо большое. Хм, странно тогда что isc-dhcp-server работает с включенной фильтрацией - принимает запросы от DHCP Relay'я. Буду дальше ковырять. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Cramac Опубликовано 5 июня, 2017 · Жалоба Приветствую. а кто нить прикрутил жепон к данному серверу? Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
kayot Опубликовано 5 июня, 2017 · Жалоба странно-глупый вопрос Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Cramac Опубликовано 5 июня, 2017 · Жалоба Не так выразился. Тестировал бдком. Он шлет номер епон порта и номер ону. Что поправить что бы из этого получить уникальный номер порта Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Ivan_83 Опубликовано 6 июня, 2017 · Жалоба Я тоже всех шлю, кто не прикладывает дампов задавая такие вопросы :) (Откуда мне знать в какой опции и каком формате оно тебе там ходит.) Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Cramac Опубликовано 6 июня, 2017 · Жалоба В 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) Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
zhenya` Опубликовано 6 июня, 2017 · Жалоба Вроде скрипт не умеет работать в таком режиме. у вас relay agent ip 0.0.0.0 Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Cramac Опубликовано 6 июня, 2017 · Жалоба Это описание опции из документации. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Ivan_83 Опубликовано 6 июня, 2017 · Жалоба Посмотрел. GetRelayAgentOptions Вроде как парсит 1 и 2, и размеры совпадают. Те он как раз 5 и 6 байт выковыривает из запроса, если тебе с ними что то особое нужно - дописывай. По идее оно парсит и даже в лог этим гадит (db_log_detailed) , так что смотри/правь, там скорее всего только логику применения этого всего нужно поправить. Релей агент обязателен: я не учил софтину принимать пакеты без адреса отправителя и получателя и отправлять обратно в таком же виде. С одной стороны задачи такой не было, с другой возится не хотелось. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Cramac Опубликовано 6 июня, 2017 · Жалоба спасибо. То что нужно, посмотрю, подправлю Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Cramac Опубликовано 2 июля, 2017 · Жалоба решение оч. простое оказалось 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]; } в итоге имеем номер порта олт+ид ону пока смотрю, но не сломается ли из за этого? Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Ivan_83 Опубликовано 3 июля, 2017 · Жалоба А чему там ломаться? Ты же сам потом эти параметры юзаешь по позвращении из функции. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Cramac Опубликовано 3 июля, 2017 · Жалоба Да хз :) пока мониторю от куда могут придти эти данные кроме как с олт Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Ivan_83 Опубликовано 11 июля, 2017 · Жалоба и? Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
bomberman Опубликовано 13 июля, 2017 · Жалоба если не ошибаюсь, версия данного DHCP сервера, по прежнему работает через релей, нет ли в планах у автора доработки с возможностью работы без релея. Или я что то упустил? Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Alex/AT Опубликовано 13 июля, 2017 · Жалоба Поглядите в сторону FreeRADIUS. Модуль dhcp там давно работает и легко скриптуется... Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
GrandPr1de Опубликовано 13 июля, 2017 · Жалоба А FreeRadius dhcp научился в броадкаст? Он же тоже только через релей умел. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
bomberman Опубликовано 13 июля, 2017 · Жалоба А FreeRadius dhcp научился в броадкаст? Он же тоже только через релей умел. Отнюдь.. Он давно уж умел. Только были какие то нарекания о сырости, и не полноценности решения. Но это было давно оч. Сам такой метод не использовал. Alex/AT GrandPr1de Кто пользовался FreeRadius в роли dhcp? Поделитесь впечатлениями, реализацией. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...