Peter Clark wrote:
Grubs wrote:

Hello,

I'm have been struggling with tuning IPFilter in the following environment.

FreeBSD 6.3.
IPFilter is compiled into the kernel (i.e. not using loadable module)
IPFILTER_DEFAULT_BLOCK  option is set in kernel

I am administering the machine remotely over an SSH session so I am always wary of being locked out by the default block condition when ipf pass rules are cleared.

***Q1.  Is it possible to boot FreeBSD with IPFilter using non-
default tuning values (e.g. fr_tcpidletimeout) when IPfilter is compiled into the kernel?

Following the documented methods of setting sysctl parameters in /boot/loader.conf and/or /etc/sysctl.conf fail.

e.g. in /boot/loader.conf

net.inet.ipf.fr_tcpidletimeout=7200

and/or the same setting in /etc/syctl.conf does not alter the default value during bootup (net.inet.ipf.fr_tcpidletimeout = 864000 after reboot)

I understand that after IPfilter is loaded then fr_tcpidletimeout can only be changed when IPFilter is disabled (ipf -D) but can these setting be set during the first load of IPF by the OS?

***Q2. Is disabling and re-enabling IPF using ipf -D/E supposed to clear the loaded rule set and NAT? My testing (below) indicates it seems to. If this is normal - can the man page *please* be updated to say this.

Following the ipf man page example:

ipf -D -T fr_tcpidletimeout,fr_tcpidletimeout=3600 -E

results in a total lockout All network traffic is blocked (the IPFILTER_DEFAULT_BLOCK option). It appears that disabling and re- enabling IPFilter using ipf -D/E *clears the loaded rules* but this fact isn't documented in the man page or documentation that I could find. The state table and NAT rules are also flushed (which makes sense when we are changing the size of it!). With the default block option clearing the PASS rules = death!
I found I needed to include my ipf.rules when re-enabling.

ipf -D -T fr_tcpidletimeout,fr_tcpidletimeout=3600 -E -f /etc/ipf.rules

^^^  this works.

The SSH session is terminated ( I assume the state table is cleared when disabling and re-enabling also), but IP traffic is not blocked and I can start a new SSH session. fr_tcpidletimeout is correctly set to the specified value. sysctl net.inet.ipf.fr_tcpidletimeout: 7200
After reconnecting I then had to manually reload the NAT rules.

ipnat -f /etc/ipnat.rules

So currently I can only boot the server with the default tuning values and then run a script on bootup to re-tune IPF to my requirements (reloading the block rules and nat rules). ***Q.3 Is there a better way I should be using to tune IPF on bootup?

Thanks for any help,
Shane



I too have struggled with this very topic. The only solution I came up with was throwing those variables into rc.local.


vanity# more /etc/rc.local
ipf -D -T fr_icmptimeout=35 -E
ipf -D -T fr_tcpclosewait=120 -E
ipf -D -T fr_tcphalfclosed=300 -E
ipf -D -T fr_tcpidletimeout=7200 -E
ipf -D -T fr_tcplastack=120 -E
ipf -D -T fr_tcptimeout=240 -E
ipf -D -T fr_udptimeout=90 -E
ipf -Fa -f /etc/ipf.rules


which certainly seems to work

vanity# ipf -T list
fr_tcpidletimeout       min 0x1 max 0x7fffffff  current 7200
fr_tcpclosewait min 0x1 max 0x7fffffff  current 120
fr_tcplastack   min 0x1 max 0x7fffffff  current 120
fr_tcptimeout   min 0x1 max 0x7fffffff  current 240
fr_tcphalfclosed        min 0x1 max 0x7fffffff  current 300
fr_udptimeout   min 0x1 max 0x7fffffff  current 90
fr_icmptimeout  min 0x1 max 0x7fffffff  current 35


So I am not sure if there is a "right" way or even a more eloquent way but this does the job for me.


Peter



ipf -D
/sbin/sysctl -w net.inet.ipf.ipf_hostmap_sz=8087
/sbin/sysctl -w net.inet.ipf.fr_statemax=7079
/sbin/sysctl -w net.inet.ipf.fr_statesize=10163
#use these number if you are still exceeding the state table.
#/sbin/sysctl -w net.inet.ipf.fr_statemax=10163
#/sbin/sysctl -w net.inet.ipf.fr_statesize=14983
/sbin/sysctl -w net.inet.ipf.ipf_rdrrules_sz=509
/sbin/sysctl -w net.inet.ipf.ipf_natrules_sz=509
/sbin/sysctl -w net.inet.ipf.ipf_nattable_sz=16889
# optional
#/sbin/sysctl -w net.inet.ipf.fr_tcpidletimeout=7200
#/sbin/sysctl -w net.inet.ipf.fr_tcphalfclosed=7200

# can only be changed with -T option - no sysctl variable
ipf -T ipf_nattable_max=50000
ipf -E
ipf -Fa -f /etc/ipf.cfg
ipnat -f /etc/ipnat.cfg

The way I do it from a script in /usr/local/etc/rc.d/ .
Steve

Reply via email to