Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 13 Jun 2006 01:45:44 +0400
From:      "Alexander V. Chernikov" <melifaro@su29.net>
To:        Vadim Goncharov <vadimnuclight@tpu.ru>
Cc:        "freebsd-net@freebsd.org" <freebsd-net@freebsd.org>, "freebsd-current@freebsd.org" <freebsd-current@freebsd.org>
Subject:   Re: [PATCH] ng_tag - new netgraph node,	please test (L7 filtering possibility)
Message-ID:  <448DE088.8070700@su29.net>
In-Reply-To: <optax2g7jq4fjv08@nuclight.avtf.net>
References:  <optax2g7jq4fjv08@nuclight.avtf.net>

next in thread | previous in thread | raw e-mail | index | archive | help
Hi,
   I have recent 7.0-current and this node seems to work for me.

   Node code compiles and loads into kernel without any problems.
   After some time experimenting with ng_bpf(4) i was able to tag
   packets matched by bpf filter.
   Of course, the following is not a real-world example, but it
   confirms module is working. Great job!

[root@ws /home/melifaro/ng]# make
@ -> /usr/src/sys
machine -> /usr/src/sys/i386/include
touch opt_netgraph.h
cc -O2 -fno-strict-aliasing -pipe -g -Werror -D_KERNEL -DKLD_MODULE 
-nostdinc -I-  -I/usr/home/melifaro/ng -I. -I@ -I@/contrib/altq 
-finline-limit=8000 --param inline-unit-growth=100 --param 
large-function-growth=1000 -fno-common  -mno-align-long-strings 
-mpreferred-stack-boundary=2  -mno-mmx -mno-3dnow -mno-sse -mno-sse2 
-mno-sse3 -ffreestanding -Wall -Wredundant-decls -Wnested-externs 
-Wstrict-prototypes  -Wmissing-prototypes -Wpointer-arith -Winline 
-Wcast-qual  -Wundef -fformat-extensions -std=c99 -c ng_tag.c
ld  -d -warn-common -r -d -o ng_tag.kld ng_tag.o
touch export_syms
awk -f /sys/conf/kmod_syms.awk ng_tag.kld  export_syms | xargs -J% 
objcopy % ng_tag.kld
ld -Bshareable  -d -warn-common -o ng_tag.ko ng_tag.kld
objcopy --strip-debug ng_tag.ko

[root@ws /home/melifaro/ng]# make load
/sbin/kldload -v /usr/home/melifaro/ng/ng_tag.ko
Loaded /usr/home/melifaro/ng/ng_tag.ko, id=14

[root@ws /usr/home/melifaro/ng]# sysctl -w net.inet.ip.fw.one_pass=0
net.inet.ip.fw.one_pass: 1 -> 0

[root@ws /home/melifaro/ng]# ngctl mkpeer ipfw: bpf 41 ipfw
[root@ws /home/melifaro/ng]# ngctl name ipfw:41 dcbpf
[root@ws /home/melifaro/ng]# ngctl mkpeer dcbpf: tag matched th1
[root@ws /home/melifaro/ng]# ngctl name dcbpf:matched ngdc
root@ws /usr/home/melifaro/ng]#

[root@ws /home/melifaro/ng]# ngctl msg ngdc: sethookin { 
thisHook=\"th1\" ifNotMatch=\"th1\" }
[root@ws /home/melifaro/ng]# ngctl msg ngdc: sethookout { 
thisHook=\"th1\" tag_cookie=1148380143 tag_id=412 }
root@ws /usr/home/melifaro/ng]#

[root@ws /home/melifaro/ng]# ngctl msg dcbpf: setprogram '{ 
thisHook="matched" ifMatch="ipfw" bpf_prog_len=1 bpf_prog=[ { code=6 
k=8192 } ] }'
root@ws /usr/home/melifaro/ng]#

; Matching part now, generated by script from ng_bpf(4) man page
; We are trying to tag all packets with dst port = 8888
; link layer is cut, so offset is 20 + 2

[root@ws /usr/home/melifaro/ng]# head -n 5 bpf.script
PATTERN="ether[22:2]=8888"
NODEPATH="dcbpf:"
INHOOK="ipfw"
MATCHHOOK="matched"
NOTMATCHHOOK="ipfw"

root@ws /usr/home/melifaro/ng]# ./bpf.script
root@ws /usr/home/melifaro/ng]#

[root@ws /usr/home/melifaro/ng]# ipfw add 100 netgraph 41 tcp from me to 
1.2.3.4 8888
00100 netgraph 41 tcp from me to 1.2.3.4 dst-port 8888
[root@ws /usr/home/melifaro/ng]# ipfw add 110 reset tcp from any to any 
tagged 412
00110 reset tcp from any to any tagged 412
[root@ws /usr/home/melifaro/ng]#
[root@ws /usr/home/melifaro/ng]# telnet 1.2.3.4 8888
Trying 1.2.3.4...
telnet: connect to address 1.2.3.4: Connection refused
telnet: Unable to connect to remote host
[root@ws /usr/home/melifaro/ng]# ipfw show 100-110
00100       1         64 netgraph 41 tcp from me to 1.2.3.4 dst-port 8888
00110       1         64 reset tcp from any to any tagged 412





Vadim Goncharov wrote:
> Hello All!
> 
> I wrote new netgraph(4) node, called ng_tag, able to match packets by
> their mbuf_tags(9) and assign new tags to mbufs. This can be used for
> many things in the kernel network subsystem, but particularly useful
> with recently added ipfw(8) tag/tagged functionality (will be MFCed to
> RELENG_6 after Jun 24).
> 
> With this node, in conjunction with ng_bpf(4), I was able to match and 
> block (perhaps shaping is also possible, but this relies solely on ipfw) 
> DirectConnect P2P data connections traffic - you know, they're using 
> random ports, so you can't match them with usual firewall rules and must 
> check data payload contents of the packets. See man page for example of 
> how to do this.
> 
> Download files from here: http://antigreen.org/vadim/freebsd/ng_tag/
> Then do:
> 
>   make
>   kldload ./ng_tag.ko
> 
> Man page can be viewed as:
> 
>   cat ng_tag.4 | /usr/bin/tbl | /usr/bin/groff -S -Wall -mtty-char -man \
>     -Tascii | /usr/bin/col | more -s
> 
> Please especially test tags with non-zero tag_len, if you can (though it's
> not needed for ipfw).
> 
> P.S. BTW, what is correct subject prefix for new contributions? I think
> [PATCH] is not correct as these are new files, not patch :)
> 
> --WBR, Vadim Goncharov
> _______________________________________________
> freebsd-net@freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-net
> To unsubscribe, send any mail to "freebsd-net-unsubscribe@freebsd.org"
> 




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?448DE088.8070700>