Doug Hardie wrote:

1. pf allows short cuts, but these also makes it more difficult to debug. I'd 
separate NAT from filtering,

Ok.  I guess you want some white space between them?  Here it is with the white 
space and comments:

ext_if="dc0" table <blackhole> persist file "/etc/blackhole"
table <spamd> persist
table <spamd-white> persist
table <spamd-white-local> persist file "/etc/mail/whitelist"
MAILHOSTS = "{zool.lafn.org}"

# NAT/RDR Rules
no rdr on { lo0, lo1 } from any to any
no rdr inet proto tcp from <spamd-white-local> to any port smtp
no rdr inet proto tcp from <spamd-white> to any port smtp
rdr pass log inet proto tcp from any to any port smtp -> 127.0.0.1 port spamd

# Filter Rules
pass in log inet proto tcp to $MAILHOSTS port smtp keep state
pass in log on sis0 reply-to (sis0 192.168.25.1) proto tcp from any to any port 
75 keep state
block in quick log on $ext_if from <blackhole> to any

Other than the comments I don't see the difference.

you didn't separate nat from filtering, and you didn't add interfaces on your rdr rules. When you make these shortcuts, maybe your ruleset becomes more compact, maybe it works, but it becomes more difficult to debug.

that is never use "rdr pass" even though pf allows it. You also need to 
understand when rdr takes place to write your filtering rules.

That would be really helpful if that information were available somewhere it could be found. I have not been able to find that anywhere.

Basically, for rdr, the address translation takes place before the packet is parsed by the filter rules. For nat, it takes place after the filtering. For binat, you can think of it as nat in one direction rdr in the other.

This is for the first packet, keep state and you don't have to worry about the rest.

se also,

http://www.openbsd.org/faq/pf/rdr.html
http://www.openbsd.org/faq/pf/nat.html

2. you can deploy one of two policies: Default block with a whitelist or 
default pass with a black list. Mixing these is a bad idea.

This is one thing you should see to clarify in your ruleset above. When you have both whitelist and blacklist what happens to those that are in neither? what happens to those that are in both.

Which default policy makes sense depends on the service. You may want to use black lists for smtp but whitelist for ssh for example.

anyway, to interpret the output of pflog, you need the output from pfctl -sr 
and pfctl -sn rather than your config file.

zool# pfctl -sr
No ALTQ support in kernel
ALTQ related functions disabled
pass in log inet proto tcp from any to 206.117.18.7 port = smtp flags S/SA keep 
state
pass in log on sis0 reply-to (sis0 192.168.25.1) inet proto tcp from any to any 
port = 75 flags S/SA keep state
block drop in log quick on dc0 from <blackhole> to any

so your filter rules are numbered 0, 1, 2

zool# pfctl -sn
No ALTQ support in kernel
ALTQ related functions disabled
no rdr on lo0 all
no rdr on lo1 all
no rdr inet proto tcp from <spamd-white-local> to any port = smtp
no rdr inet proto tcp from <spamd-white> to any port = smtp
rdr pass log inet proto tcp from any to any port = smtp -> 127.0.0.1 port 8025

your rdr rules are numbered 0, .. 4, but you only have log in rule 4.

So, when you see matches in your pflog, rule 0 .. 2 are filter rules and rule 4 is rdr rule, which you can also see from the action logged, pass, block or rdr. That seems to explain why you have no matches for rule 3.

So, to solve your problem, separate first NAT and filtering. Things becomes so 
much more clear.

Repeated: Get rid of that "rdr pass" make an rdr rule and a pass rule. Yes, it's the rule recommended by the spamd man page, but if you want to see and understand what's going on, that kind of rules can really make things obscure.

BR, Erik

--
Erik Nørgaard
Ph: +34.666334818/+34.915211157                  http://www.locolomo.org
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-questions
To unsubscribe, send any mail to "[email protected]"

Reply via email to