Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 22 Jan 2020 11:13:25 +0100
From:      Miroslav Lachman <000.fbsd@quip.cz>
To:        mike tancsa <mike@sentex.net>, "freebsd-pf@freebsd.org" <freebsd-pf@freebsd.org>
Subject:   Re: automatic tables / self statement in pf.conf
Message-ID:  <58a84a53-5efe-c753-2d12-a5b3c56afcaa@quip.cz>
In-Reply-To: <5a989609-3366-bcc0-3e6f-d0ad29046f61@sentex.net>
References:  <5a989609-3366-bcc0-3e6f-d0ad29046f61@sentex.net>

next in thread | previous in thread | raw e-mail | index | archive | help
mike tancsa wrote on 2020/01/20 15:37:
> I have a process that runs every few min looking to see if the pf rules
> changed on some of our firewalls.  On one customer unit, we have a
> "self" statement and the script detected a change this morning.  The
> rule reads
> 
> block log quick from <rejects> to self
> block log quick from self to <rejects>
> 
> but when shown it looks like
> 
> block drop log quick inet from <rejects> to <__automatic_32a5c00f_0>
> block drop log quick inet from <__automatic_32a5c00f_1> to <rejects>
> 
> I guess 'self' is treated like a table ? The diff that got flagged
> looked like
> 
> -block drop log quick inet from <rejects> to <__automatic_786310c4_0>
> -block drop log quick inet from <__automatic_786310c4_1> to <rejects>
> +block drop log quick inet from <rejects> to <__automatic_32a5c00f_0>
> +block drop log quick inet from <__automatic_32a5c00f_1> to <rejects>
> 
> What would trigger the table name to change like that ?	
> 
> Also, is there a better way to monitor pf rule changes ?  I dont see any mention in FreeBSD audit ?

Monitoring of PF rules is kind of hard and not just because of automatic 
tables. (automatic tables are created by optimizer not only for self 
rules, optimizer can be disabled by -o none)

We are monitoring changes between production rules in pf.conf, testing 
temporary rules in pf.conf.tmp and live running rules.
pfctl -s all prints scrub / NAT / rules in different order than for 
pfctl -nvf /etc/pf.conf

I chosen to replace random automatic tables names with sequence numbers 
so they are still the same.

This is the part of our script solving this issue.

==========snippet===========
## this ugly awk hack is needed because PF rules optimizer creates 
__automatic_
## tables when machine has many IPs and similar rules for them
## but tables are named randomly / different for live rules and pfct -nvf
##    live:
## block drop in quick inet from <__automatic_fc1015f3_0> to any
##    file parser
## block drop in quick inet from <__automatic_0> to any
##
## awk will replace automatic table name with own incremental sequence

pfctl -nvf /etc/pf.conf | egrep '^(nat|rdr|scrub|block|pass)' |
         awk '{ if ( $0 ~ /<__automatic_[^>]*>/ ) { ac=ac+1; c=ac-1; 
gsub(/__automatic_[^>]*/, "__automatic_"c); } { print $0 } }' > $tmp_prod
pfctl -nvf /etc/pf.conf.tmp | egrep '^(nat|rdr|scrub|block|pass)' |
         awk '{ if ( $0 ~ /<__automatic_[^>]*>/ ) { ac=ac+1; c=ac-1; 
gsub(/__automatic_[^>]*/, "__automatic_"c); } { print $0 } }' > $tmp_temp

## live rules must be re-ordered because pfctl prints scrub with filter 
rules
## together for live rules, but scrub / NAT / filter rules for check 
from file
_pf_live=$(pfctl -s all | egrep '^(nat|rdr|scrub|block|pass)' |
         awk '{ if ( $0 ~ /<__automatic_[^>]*>/ ) { ac=ac+1; c=ac-1; 
gsub(/__automatic_[^>]*/, "__automatic_"c); } { print $0 } }')
_live_scrub=$(echo "$_pf_live" | grep '^scrub')
_live_nat=$(echo "$_pf_live" | egrep '^(nat|rdr)')
_live_rules=$(echo "$_pf_live" | egrep '^(block|pass)')

## create empty file
: > $tmp_live
if [ -n "$_live_scrub" ]; then
         echo "$_live_scrub" >> $tmp_live
fi
if [ -n "$_live_nat" ]; then
         echo "$_live_nat" >> $tmp_live
fi
if [ -n "$_live_rules" ]; then
         echo "$_live_rules" >> $tmp_live
fi
==========snippet===========

Then we can check for differences between all created files + last known 
live ruleset from previous run.

Kind regards
Miroslav Lachman



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?58a84a53-5efe-c753-2d12-a5b3c56afcaa>