Application layer classifier for ipfw

Patrick Tracanelli eksffa at freebsdbrasil.com.br
Fri Aug 1 15:59:07 UTC 2008


Julian Elischer escreveu:
> Patrick Tracanelli wrote:
>> Mike Makonnen escreveu:
>>> Hi,
>>>
>>> An Internet Cafe I do some work for was recently having problems with 
>>> very slow internet access. It turns out customers were running P2P 
>>> file sharing applications which were hogging all the bandwidth. I 
>>> looked for  programs that would allow me to shape traffic according 
>>> to the application layer protocol, but couldn't find any for FreeBSD. 
>>> I found a couple: l7-filter and ipp2p, but these are Linux specific. 
>>> So, I decided to write one. The result is ipfw-classifyd :
>>> http://people.freebsd.org/~mtm/ipfw-classifyd.tar.bz2
>>>
>>> As the name implies it uses ipfw(4) to implement a userland daemon 
>>> that classifies TCP and UDP packets according to regular expression 
>>> patterns for various protocols. It's intended to be used with 
>>> divert(4) sockets and dummynet(4) so you can do traffic shaping 
>>> depending on the application level protocol. The protocol patterns 
>>> are from the l7-filter project.
>>>
>>> Basically, you use ipfw(8) to divert tcp/udp packets to the damon. It 
>>> reads its configuration file for a list of protocols and ipfw(8) 
>>> rules. Then, when it detects a matching session it re-injects the 
>>> packet back at the specified rule number. The tarball has a sample 
>>> configuration file and firewall script to get you started.
>>>
>>> While I have not done extensive testing, preliminary tests are 
>>> encouraging and it seems to work, so I thought I'd announce it to the 
>>> rest of the world in case anyone else is interested in this kind of 
>>> application.
>>>
>>> Comments and suggestions highly appreciated.
>>>
>>> Cheers.
>>
>> Wont compile on RELENG_6 but is working perfectly on REL_7. I am 
>> trying hard with ssh, soulseek and msn. Its working like a charm with 
>> the suggested rc.firewall.
>>
>> I have configured ipfw-classfyd.conf changing the rules, for a number 
>> of L7 patterns, and now I try to understand why the "diverted" rules 
>> only match if the rule number is 1 after the configured, ie, I put 
>> soulseek to 65530 and a rule wont match there, but the very same rule 
>> matches 65531. I will read the code, but it seems that reinjection of 
>> the packet is made +1, correct?
> 
> 
> yes,
> the idea is:
> If you get the sockaddr for the received packet, and use it unmodified 
> when reinjecting the packet,
> then it will continue on at the next rule.
> so since the rule number is "unchanged" we need to add 1 to it
> to say where to start from..
> 
> hope that helps..

Perfect. Thanks.

To let you know of my current (real world) tests:

- Wireless Internet Provider 1:
	- 4Mbit/s of Internet Traffic
	- Classifying default protocols + soulseek + ssh
	- Classifying 100Mbit/s of dump over ssh

Results in:
	No latency added, very low CPU usage, no packets dropping.

- Wireless ISP 2:
	- 21 Mbit/s of Internet Traffic
	- Classifying default protocols + soulseek + ssh

Results in:
	No tcp or udp traffic at all; everything that gets diverted never comes 
out of the divert socket, and ipfw-classifyd logs

Aug  1 12:07:35 ourofino last message repeated 58 times
Aug  1 12:17:54 ourofino ipfw-classifyd: Loaded Protocol: bittorrent 
(rule 50000)
Aug  1 12:17:54 ourofino ipfw-classifyd: Loaded Protocol: edonkey 
(rule 50000)
Aug  1 12:17:54 ourofino ipfw-classifyd: Loaded Protocol: fasttrack 
(rule 50000)
Aug  1 12:17:54 ourofino ipfw-classifyd: Loaded Protocol: gnutella 
(rule 1000)
Aug  1 12:17:54 ourofino ipfw-classifyd: Loaded Protocol: soulseek 
(rule 50000)
Aug  1 12:17:54 ourofino ipfw-classifyd: Loaded Protocol: ssh   (rule 50000)
Aug  1 12:18:28 ourofino ipfw-classifyd: unable to write to divert 
socket: Operation not permitted
Aug  1 12:18:50 ourofino last message repeated 90 times
Aug  1 12:18:51 ourofino ipfw-classifyd: packet dropped: input queue full
Aug  1 12:19:11 ourofino last message repeated 94 times

Raised queue len a lot (up to 40960), when the application starts it 
uses up to 25% CPU and a second after that, CPU usage gets lower the 0.1%.

So far, this is what I have in real world enviroments.

-- 
Patrick Tracanelli



More information about the freebsd-net mailing list