Hello.
I use ipfilter to do NAT and stateful ip filtering and i really like it.
I use dummynet to limit bandwidth and i really like it too.
The problem is they don't work together in specific situation.
my ipf.rules (in simplification):
block in log all
block out log all
pass out quick on ppp0 proto tcp all flags S keep state keep frags
pass out quick on ppp0 proto udp all keep state keep frags
pass out quick on ppp0 proto icmp all keep state keep frags
ipfw configuration (excluding counters):
ipfw add pipe 1 tcp from any 1025-2400 to any out
ipfw pipe 1 config bw 4Kbytes/s
ipfw add pipe 2 tcp from any 20 to any out
ipfw pipe 2 config bw 3Kbytes/s
ipfw allow all from any to any
So i noticed that ipfilter isn't keeping state correctly on outcoming
tcp connections when above ipfw rules are in charge.
For example ipfstat -t shows connections that are never fully established,
they stop at 4/3. There is no data exchange. I observed that:
gateway.36023 -> mailhost.25 S
mailhost.25 -> gateway.36023 SA
mailhost.25 -> gateway.36023 SA
and connection is not established.. in ipflog we can see:
ppp0: @0:7 b 217.96.180.81,36023 -> 213.180.130.33,25 PR tcp len 20 52 -AF OUT
Packet was blocked. But it shouldn't be.. I can successfuly connect to
this mailhost if before "ipfw add pipe ..." rules I had put
ipfw add allow ip from any to any.
Summarizing: When I try to limit bandwidth i can't use tcp with keep state.
Precisely: I can't use tcp from hosts behind gateway (NAT), I can establish
tcp connections from gateway.
I don't think that exhausting state table is the case here. Even when I had
done ipf -FSs tcp didn't work.
Perhaps I'm missing something obvious (too much time i spent on this problem),
I will be very grateful for every idea, explanation, hint or solution.
best regards, B.
ps. I'm attaching revelant tcpdump, ipfstat -s and ipnat -s output.
# ipfstat -s
IP states added:
10111 TCP
3335 UDP
5330 ICMP
1017243 hits
654090 misses
0 maximum
0 no memory
526 bkts in use
545 active
8665 expired
9566 closed
# ipnat -s
mapped in 140179 out 138894
added 11916 expired 11343
no memory 0 bad nat 0
inuse 573
rules 15
wilds 0
20:54:54.835061 217.96.180.81.37836 > 213.180.130.33.25: S 1001007946:1001007946(0)
win 16060 <mss 1460,sackOK,timestamp 4975732 0,nop,wscale 0> (DF) [tos 0x10]
20:54:54.877479 213.180.130.33.25 > 217.96.180.81.37836: S 3076683582:3076683582(0)
ack 1001007947 win 10136 <nop,nop,timestamp 1129079898 4975732,nop,wscale
0,nop,nop,sackOK,mss 1460> (DF)
20:54:58.243475 213.180.130.33.25 > 217.96.180.81.37836: S 3076683582:3076683582(0)
ack 1001007947 win 10136 <nop,nop,timestamp 1129080235 4975732,nop,wscale
0,nop,nop,sackOK,mss 1460> (DF)
20:55:04.964428 213.180.130.33.25 > 217.96.180.81.37836: S 3076683582:3076683582(0)
ack 1001007947 win 10136 <nop,nop,timestamp 1129080910 4975732,nop,wscale
0,nop,nop,sackOK,mss 1460> (DF)