Re: ng_ipacct

From
Eugene Grosbein (2:5006/1)
To
Dmitry Dolzenko (2:5054/37.63)
Date
2006-09-03T18:07:42Z
Area
RU.UNIX.BSD
Reply-To: eugen@grosbein.pp.ru

30 авг 2006, среда, в 13:09 KRAST, Dmitry Dolzenko написал(а):

 AS>> А не проще ли передавать пакет с в nethraph помощью ipfw ngtee ? Или на
 AS>> этой
 AS>> машине не установлена шестёрка ?
 >> 4.11-STABLE. Но за напоминание о ng_ipfw спасибо.
 DD> А ты мог бы по завершинии своих исследований написать HOWTO
 DD> как сделать ip accounting через netgraph?

Вот рецепт, который работает на 4.11 и выше, конструкция получается
практически один в один с ipacctd, можно использовать те же правила
ipfw divert для заворачивания трафика на считающую софтинку.
Единственное отличие - для съема разультатов обсчета использовать
скрипт такого типа:

ipacctctl ipfw_ip_acct:ipfw checkpoint
ipacctctl ipfw_ip_acct:ipfw show
ipacctctl ipfw_ip_acct:ipfw clear

Ставим ng_ipacct из портов и в /usr/local/etc/ng_ipaccf.conf
пишем:

ng_ipacct_modules_list="netgraph ng_echo ng_ksocket ng_tee ng_ipacct"
ng_ipacct_interfaces="ipfw"

# EXAMPLE 5. Really _divert_ traffic to ng_ksocket

# ipfw add divert 4001 ip from any to any via em0 in
# ipfw add divert 4002 ip from any to any via em0 out

#    USER-LEVEL | KERNEL-LEVEL
# 	        |
# div4 *.4001 ->|-> ipfw_ks_in                              in-(ipfw_echo_in)
#               |       |                                   |
#               | (inet/raw/divert)---(left)-(ipfw_tee_in)-right
#               |                                |
#               |                            left2right---(ipfw_in)
#               |			                |
#	        |		                    ipfw_ip_acct
#	        |			                |
#               |                            left2right---(ipfw_out)
#               |                                |
#	        | (inet/raw/divert)---(left)-(ipfw_tee_out)-right
#	        |	  |                                  |
# div4 *.4002 ->|-> ipfw_ks_out                             
# div4 *.4002 ->out-(ipfw_echo_out)
#
# ipfw_ks_in	- ng_ksocket
# ipfw_ks_out	- ng_ksocket
# ipfw_tee_in	- ng_tee
# ipfw_tee_out	- ng_tee
# ipfw_ip_acct	- ng_ipacct
# ipfw_echo_in	- ng_echo
# ipfw_echo_out	- ng_echo

ng_ipacct_ipfw_dlt="RAW"
ng_ipacct_ipfw_start='
	mkpeer ipacct dummy dummy
	name .:dummy %%iface%%_ip_acct

	mkpeer %%iface%%_ip_acct: tee  %%iface%%_in left2right
	name   %%iface%%_ip_acct:%%iface%%_in  %%iface%%_tee_in
	mkpeer %%iface%%_ip_acct: tee  %%iface%%_out left2right
	name   %%iface%%_ip_acct:%%iface%%_out %%iface%%_tee_out

	mkpeer %%iface%%_tee_in:  echo right in
	name   %%iface%%_tee_in:right  %%iface%%_echo_in
	mkpeer %%iface%%_tee_out: echo right out
	name   %%iface%%_tee_out:right %%iface%%_echo_out
	
	mkpeer %%iface%%_tee_in: ksocket  left inet/raw/divert
	name   %%iface%%_tee_in:left  %%iface%%_ks_in
	msg    %%iface%%_ks_in:  bind inet/0.0.0.0:4001

	mkpeer %%iface%%_tee_out: ksocket left inet/raw/divert
	name   %%iface%%_tee_out:left %%iface%%_ks_out
	msg    %%iface%%_ks_out: bind inet/0.0.0.0:4002

	rmhook .:dummy
'
ng_ipacct_ipfw_stop='
	shutdown %%iface%%_ks_in:
	shutdown %%iface%%_ks_out:
	shutdown %%iface%%_tee_in:
	shutdown %%iface%%_tee_out:
'

ng_ipacct_ipfw_threshold="15000"	# '5000' by default
ng_ipacct_ipfw_verbose="no"	# 'yes' by default
ng_ipacct_ipfw_saveuid="no"	# 'no' by default
ng_ipacct_ipfw_savetime="no"	# 'no' by default
ng_ipacct_ipfw_checkpoint_script="/usr/local/adm/showngipacct ipfw"

Скрипт /usr/local/adm/showngipacct должен, используя указанные
выше три команды ipacctctl, куда-нибудь сохранять вывод команды
show. Его же (или команду /usr/local/etc/rc.d/ng_ipacct.sh checkpoint)
нужно вызывать периодически для сброса накопленных данных и предотвращения
переполнения памяти в ng_ipacct.

Командами ipfw divert 4001 организуется обсчет входящего трафика,
ipfw divert 4002 для исходящего. Если нужно считать только одно направление,
можно ненужный трафик и не дивертить.

Это как раз то, что мне надо было. Всем спасибо за советы.

Eugene
-- 
А ученый уподобляется обученному слону, которого погонщик поставил перед
преградой. Он пользуется силой разума, как слон --- силой мышц, подчиняясь
приказу. Это необычайно удобно: ученый отныне готов на все, так как ни за
что уже не отвечает.
--- slrn/0.9.8.0 (FreeBSD)
 * Origin: Svyaz Service JSC (2:5006/1@fidonet)
SEEN-BY: 50/12 203 400/814 450/159 186 1024 451/30 461/43 132 640 469/999
SEEN-BY: 550/196 4616/3 4625/8 4635/4 4641/444 5000/76 5000 5006/1 8 9 10 14
SEEN-BY: 5006/15 16 17 5007/1 5010/70 352 5011/13 5012/46 5015/28 5019/31
SEEN-BY: 5020/18 154 175 194 400 545 549 715 758 982 1057 1523 1604 1630 1909
SEEN-BY: 5020/1922 2142 2238 2395 2450 2590 2871 4441 5021/3 29 5022/128
SEEN-BY: 5025/3 750 5026/45 5027/12 5029/32 5030/49 500 556 966 1063 1080 1900
SEEN-BY: 5030/1957 2828 5031/47 70 5034/10 13 5035/3 38 5036/1 5040/47 5042/13
SEEN-BY: 5045/7 5049/1 50 97 5051/15 5054/1 4 8 9 11 28 35 36 37 45 63 66 67
SEEN-BY: 5054/70 75 84 85 5055/95 5057/1 5059/9 5060/88 5061/15 5062/1 10
SEEN-BY: 5063/3 5064/7 5066/18 5074/9 5075/5 5077/70 5080/80 1003 5082/6
SEEN-BY: 5083/21 5085/13 5090/108 5094/4 5095/20 5096/18 5099/11 6001/3 10
PATH: 5006/1 5020/400 4441 545 5054/1 37