conf/130555: [patch] No good way to set ipfilter variables at boot time

G. Paul Ziemba p-fbsd-bugs at ziemba.us
Wed Jan 14 10:30:02 PST 2009


>Number:         130555
>Category:       conf
>Synopsis:       [patch] No good way to set ipfilter variables at boot time
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Wed Jan 14 18:30:01 UTC 2009
>Closed-Date:
>Last-Modified:
>Originator:     G. Paul Ziemba
>Release:        7.1-PRERELEASE
>Organization:
>Environment:
FreeBSD foo 7.1-PRERELEASE FreeBSD 7.1-PRERELEASE #0: Tue Nov 11 23:08:18 PST 2008     root at foo:/usr/obj/usr/src/sys/GPZ  i386

>Description:
ipfilter has a number of tunable variables (run "ipf -T list" to see the list). Although many (all?) of these are made available via sysctl, it is not possible to configure them in the context of the current /etc/rc.conf or /etc/sysctl.conf arrangements due to the following constraints/interactions:

1. Some of the tunables can be set only if ipfilter is disabled.

2. The current /etc/rc.d/ipfilter startup script enables ipfilter and
   causes it to load the filter rules before doing anything about
   ipfilter_flags, which might theoretically be set to "-D -T <foo> -E".

3. You could try ipfilter_flags="-D -T <foo> -E -f ${ipfilter_rules}" to
   reload the rules. However, ipfilter_flags are also used for the reload
   and resync commands of the startup script (i.e., later on), so you
   run into...

4. disabling ipfilter not only flushes existing configured filter rules, it
   also flushes any configured NAT rules (loaded independently via
   /etc/rc.d/ipnat).

5. /etc/sysctl.conf is processed after /etc/rc.d/ipfilter runs, so ipfilter
   tunables set in sysctl.conf fail due to ipfilter being enabled.

6. Oh, and they can't be set in /boot/loader.conf either

Here is a fix that allows variables to be specified in /etc/rc.conf so they will be set early in the /etc/rc.d/ipfilter script
>How-To-Repeat:

>Fix:
Patch attached

Patch attached with submission follows:

diff -ruN etc.orig/defaults/rc.conf etc.new/defaults/rc.conf
--- etc.orig/defaults/rc.conf	2008-11-12 08:27:20.000000000 -0800
+++ etc.new/defaults/rc.conf	2009-01-14 09:46:23.000000000 -0800
@@ -152,6 +152,7 @@
 ipfilter_rules="/etc/ipf.rules"	# rules definition file for ipfilter, see
 				# /usr/src/contrib/ipfilter/rules for examples
 ipfilter_flags=""		# additional flags for ipfilter
+ipfilter_variables=""		# <optionlist> for -T, see ipf(8)
 ipnat_enable="NO"		# Set to YES to enable ipnat functionality
 ipnat_program="/sbin/ipnat"	# where the ipnat program lives
 ipnat_rules="/etc/ipnat.rules"	# rules definition file for ipnat
diff -ruN etc.orig/rc.d/ipfilter etc.new/rc.d/ipfilter
--- etc.orig/rc.d/ipfilter	2008-01-27 23:55:44.000000000 -0800
+++ etc.new/rc.d/ipfilter	2009-01-14 09:43:34.000000000 -0800
@@ -30,6 +30,14 @@
 ipfilter_start()
 {
 	echo "Enabling ipfilter."
+	if [ ! -z "${ipfilter_variables}" ]; then
+		# Can set ipfilter variables only when it is disabled,
+		# which flushes filter and nat rules
+		if [ `sysctl -n net.inet.ipf.fr_running` -gt 0 ]; then
+			${ipfilter_program:-/sbin/ipf} -D
+		fi
+		${ipfilter_program:-/sbin/ipf} -T "${ipfilter_variables}"
+	fi
 	if [ `sysctl -n net.inet.ipf.fr_running` -le 0 ]; then
 		${ipfilter_program:-/sbin/ipf} -E
 	fi


>Release-Note:
>Audit-Trail:
>Unformatted:


More information about the freebsd-bugs mailing list