Subject: Re: IPF accounting rule limits
To: Erik Rungi <blackbox@openface.ca>
From: Michael Graff <explorer@flame.org>
List: current-users
Date: 04/27/1999 13:24:11
IPF is limited in several ways...

For one, the state table is hard-coded to 2048 states max.  With a
busy server, one incoming TCP connection can easily generate:

	1 state for the TCP connection itself,
	1 state for a reverse DNS lookup (assuming the first DNS
	  server hit had the answer, which is unlikely.  More like
	  2-3 here.)
	1 state for a forward DNS lookup (once again, often 2-3)
	-
	3 minimum, 5-8 typical.

So, for that single incoming connection, for a short while I've
allocated a whole lot of state, and I'm limiting how many clients I
can serve now.

I have always thought that the way ipf tracks state by looking at the
packets is wrong.  It seems like a better way would be to attach a
little bit of state glue to the socket structure, or the udp/tcp
control blocks.  State only makes sense on UDP and TCP anyway,
presently.

As for the 1000 entry limit for counting, wow.  That's a lot of rules
to look through anyway ;)  It seems that the rules are dynamically
allocated, however.  I suspect you're hitting a different limit, that
of CPU searching through a 1000 element linked list.

Can you perhaps break them into groups to speed things up?  The syntax
here might be wrong, but here goes.  I have two IP addresses on my
machine, each of which has different purposes.  Here's what I might
try later today:

pass in from any to 204.152.184.79 head 100
pass in from any to 204.152.184.80 head 200

count in proto tcp all port = 80 group 100

count in proto tcp all port = 80 group 200

This makes one top-level comparison, and if that fails, the (perhaps
hundreds) of count statements won't need to run.

You might need to use

count in proto tcp from any to 204.152.184.79 port = 80 group 100

to make that count line "unique" though, I dunno.

Erik Rungi <blackbox@openface.ca> writes:

> I'm finding that on NetBSD-1.3/i386 after about 1000 IPF "count" rules, my
> NetBSD router box will grind to a halt if I try to forward any significant
> amount of traffic through it.  The box seems fine at low levels of traffic,
> but in combination with 4-5Mbps of packet forwarding, things go bad quickly.
> 
> Are there any OS compile-time parameter limitations to IPFILTER rules that I
> should know about? Lets say I wanted to do byte counts on several thousand
> individual hosts, using a NetBSD ipf configured gateway.  From what I can
> see, this just won't work because the kernel gacks.  This is on a P166 with
> 32MB ram, fully dedicated to doing routing and nothing else. Symptoms include
> nasty packet loss and unresponsive consoles The machine doesn't actually crash
> or anything.
> 
> In my kernel config I previously had a MAXUSER setting of 2, which I
> subsequently changed to 64. This seemed to help, which is why I suspect there
> may be some kernel size limitations at work, but it didn't bring performance
> up enough to make the machine useable with the filter rules I was trying to
> use.
> 
> Am I missing something here?
> 
> Erik