pfsync rc script breaks pfsync on cloned interfaces

Dimitry Andric dimitry at andric.com
Fri Jun 26 11:58:24 UTC 2009


On 2009-06-26 11:04, Max Laier wrote:
> I would like input about how a very simple "save default" setup could look 
> like.  A ruleset for pf or ipfw that allows most of the boot process to 
> complete without opening the host to the outside world, yet.  For extra 
> points this ruleset is aware of the rc.conf variables and adjusts 
> accordingly (e.g. opening access to sshd iff it is configured).  In 
> addition there might be *one or two* configuration variables for the early 
> stage to open additional ports or to select a default interface.  However, 
> the fewer the better.

If you look at how OpenBSD implements their /etc/rc script, you will see
it first loads a simple PF ruleset, which allows ssh, dns, icmp echo and
(if applicable) IPv6 routing and neighbor advertisements.

Then it does the regular network setup (/etc/netstart), followed by
loading the full PF rules.

Relevant excerpt:

######################
if [ X"${pf}" != X"NO" ]; then
	RULES="block all"
	RULES="$RULES\npass on lo0"
	RULES="$RULES\npass in proto tcp from any to any port 22 keep state"
	RULES="$RULES\npass out proto { tcp, udp } from any to any port 53 keep state"
	RULES="$RULES\npass out inet proto icmp all icmp-type echoreq keep state"
	if ifconfig lo0 inet6 >/dev/null 2>&1; then
		RULES="$RULES\npass out inet6 proto icmp6 all icmp6-type neighbrsol"
		RULES="$RULES\npass in inet6 proto icmp6 all icmp6-type neighbradv"
		RULES="$RULES\npass out inet6 proto icmp6 all icmp6-type routersol"
		RULES="$RULES\npass in inet6 proto icmp6 all icmp6-type routeradv"
	fi
	RULES="$RULES\npass proto carp keep state (no-sync)"
	case `sysctl vfs.mounts.nfs 2>/dev/null` in
	*[1-9]*)
		# don't kill NFS
		RULES="set reassemble yes no-df\n$RULES"
		RULES="$RULES\npass in proto { tcp, udp } from any port { 111, 2049 } to any"
		RULES="$RULES\npass out proto { tcp, udp } from any to any port { 111, 2049 }"
		;;
	esac
	echo $RULES | pfctl -f -
	pfctl -e
fi

# Fill net.inet.(tcp|udp).baddynamic lists from /etc/services
fill_baddynamic udp
fill_baddynamic tcp

sysctl_conf

# set hostname, turn on network
echo 'starting network'
ifconfig -g carp carpdemote 128
if [ -f /etc/resolv.conf.save ]; then
	mv /etc/resolv.conf.save /etc/resolv.conf
	touch /etc/resolv.conf
fi
. /etc/netstart

if [ X"${pf}" != X"NO" ]; then
	if [ -f ${pf_rules} ]; then
		pfctl -f ${pf_rules}
	fi
	# bring up pfsync after the working ruleset has been loaded
	if [ -f /etc/hostname.pfsync0 ]; then
		. /etc/netstart pfsync0
	fi
fi
######################

Perhaps this approach can be molded into /etc/rc.d form? :)


More information about the freebsd-current mailing list