Application layer classifier for ipfw

Ian Smith smithi at nimnet.asn.au
Sun Aug 3 18:05:27 UTC 2008


On Sun, 3 Aug 2008, Mike Makonnen wrote:
 > Ian Smith wrote:
 > > On Fri, 1 Aug 2008, Mike Makonnen wrote:
 > >  > Patrick Tracanelli wrote:
 > >  > > Mike Makonnen escreveu:
[..]
 > >                 /*
 > >                  * Inform divert(4) what rule to send it to by
 > >                  * modifying the port number of the associated sockaddr_in
 > >                  * structure. Note: we subtract one from the ipfw(4) rule
 > >                  * number because processing in ipfw(4) will start with
 > >                  * the next rule *after* the supplied rule number.
 > >                  */
 > >                 if (flow->if_fwrule != 0) {
 > >                         pkt->fp_saddr.sin_port = flow->if_fwrule;
 > >                         goto enqueue;
 > >                 }
 > >
 > > and noticed that we weren't subtracting one ..
 > >   
 > 
 > The comment is wrong. It was for a prior version of the code. Initially, 
 > I had the configuration file specify the rule number that passes the 
 > diverted packets to dummynet(4). The code (as the comment says) would 
 > subtract 1 from the number when it wrote the packet back, but I wasn't 
 > sure how ipfw(4) would react to a possibly non-existant rule so changed 

>From my reading, that shouldn't be a problem.  But I'm reading 5-STABLE
sources and haven't access to my 7.0 system this week to try it out, and
I could be entirely mistaken anyway!

I guess it might be worth checking that the target rule number isn't
less than the divert rule number that got us here, to guard against
loops that $anyone might try to configure?

 > it to its current form. However, after thinking about it some more I 
 > think it is more intuitive and easier to understand if the configuration 
 > file specified the rule that passes the diverted packet to the pipe or 
 > queue.

Yes, the rule to skipto on a match, anyway.  I can see doing plenty of
other stuff with this than necessarily (immediately) queueing packets; 
depending on protocols detected you might count, log, pipe, queue with
some weight, just pass, deny, test against various src/dst, whatever.

 > > I thought at first that this behaviour is fine, and just needed a bit
 > > better describing.  But I'm starting to wonder if subtracting one isn't
 > > really a better idea?
 > >   
 > 
 > I'm leaning in the same direction.

Worth a try?  One thing you might test is whether it still works with
net.inet.ip.fw.one_pass=1 ?  That's only supposed to affect dummynet
pipe diversion, but there's a bit of XXX code in after_ip_checks in
ip_fw2.c (in 5-STABLE anyway) that makes me wonder about that ..

 > Glad to hear people are finding it useful :-)

Only conceptually so far, but that's fun enough for now, while I'm
really supposed to be relocating a server by sometime last week :)

cheers, Ian



More information about the freebsd-net mailing list