Подсчет количества DHCP запросов по типам при помощи netgraph и ipfw.
Смотреть статистику вот так
Вывод
Перед использованием скрипта изменить номер правила в ipfw на собственное.
Также во FreeBSD надо подгрузить необходимые модули:
kldload ng_ipfw
kldload ng_one2many
kldload ng_bpf
Остается только добавить необходимую метрику в Zabbix.
Code:
#!/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
Code:
#!/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`
Code:
DISCOVER: 2650 OFFER: 156 REQUEST: 2204 DECLINE: ACK: 1970 NAK: 3 RELEASE: INFORM: 26
Также во FreeBSD надо подгрузить необходимые модули:
kldload ng_ipfw
kldload ng_one2many
kldload ng_bpf
Остается только добавить необходимую метрику в Zabbix.