Some quick observations (disclaimer: I only just got my morning coffee,
so there's too much blood in my caffeine)

On Fri, Jul 31, 2009 at 08:18:28PM +0200, Laurent CARON wrote:
> Here is my pf config:
> LO="lo"
> EXTIF001="bge0"
> EXTIF002="em0"
> INTIF="em1"
> PFSYNCIF="em2"
>
> set skip on {$LO, $PFSYNCIF}

A macro for lo is a bit redundant; but that's a matter of taste.

> PFSYNCALLOW="{172.16.1.1, 172.16.1.2}"
>
> CARPALLOW="{Router internal IPs}"
>
> SSHALLOW="{Trusted admin IPs}"
>
> EBGPALLOW="ISP BGP Peer"
>
> IBGPALLOW="{Internal BGP sessions}"
>
> ROUTERSINTIFACES="{Internal IPs of routers (including carp)}"
>
> DECLAREDHOSTS="{Active hosts on the internal interface}"

Use tables to avoid your macros expanding into huge amounts of similar
rules. That way you can even put the IP lists in files if they grow too large.

> BAD_UDP_PORTS="{epmap, netbios-ns, netbios-dgm, netbios-ssn, microsoft-ds}"
> BAD_TCP_PORTS="{telnet, finger, epmap, netbios-ns, netbios-dgm,  
> netbios-ssn, microsoft-ds}"

"Default pass" is a bad idea; if you understand this and just want to
silence crap from logs, this is good. A default block would be even
better but might not be possible, that's understandable.

> ROUTER_ALLOW_OUT="{www, ftp, telnet, ssh, domain, https, imaps, smtp,  
> smtps}"
>
>
> SYNSTATE="flags S/SAFR synproxy state"
> TCPSTATE="flags S/SAFR modulate state"
> UDPSTATE="keep state"
>
> ### Stateful Options ###
> EXTIFSTO="(max 9000, source-track rule, max-src-conn   2000,  
> max-src-nodes 254)"
> INTIFSTO="(max 250,  source-track rule, max-src-conn   100,  
> max-src-nodes 254, max-src-conn-rate 75/20)"
> POSTFIXSTO="(max 100,  source-track rule, max-src-states 5,  
> max-src-nodes 30,  max-src-conn-rate 10/300, overload <BLACKLIST> flush  
> global, tcp.established 45)"
> SPAMDSTO="(max 500,  source-track rule, max-src-conn   10, max-src-nodes 
> 300, max-src-conn-rate 2/300,  tcp.established 10)"
> SSHSTO="(max 10,   source-track rule, max-src-states 10,   max-src-nodes  
> 5,   max-src-conn-rate 20/60, overload <OVERLOAD_SSH> flush global)"
> PORTSCANSTO="(max 60,  source-track rule, max-src-conn 1, max-src-nodes  
> 60,  max-src-conn-rate 1/60, overload <BLACKLIST> flush global)"
>
> ### Tables ###
> table <BLACKLIST> persist file "/etc/blacklist"
> table <SLOWQUEUE> persist file "/etc/slowqueue"
> table <OVERLOAD_SSH> persist
>
> ### Options ###
> set debug urgent
> set require-order yes
> set block-policy drop
> set loginterface $EXTIF001
> set fingerprints "/etc/pf.os"
> set ruleset-optimization none
>
>
> ### Timeout Options ###
> set optimization aggressive

Are you sure you need this?

> set timeout { frag 10, tcp.established 3600 }

this can annoyingly kill live ssh sessions if your coffee break takes
too long; but it can also be necessary.

> set timeout { tcp.first 30, tcp.closing 10, tcp.closed 10, tcp.finwait 10 }
> set timeout { udp.first 30, udp.single 30, udp.multiple 30 }
> set timeout { other.first 30, other.single 30, other.multiple 30 }
> set timeout { adaptive.start 5000, adaptive.end 10000 }

Again, if you've thought about these and need them they're fine, if
you're just twisting knobs because they're there you might want to
re-think.

> ### Queueing ###
> altq on $EXTIF001 bandwidth 30000Kb hfsc queue { ack, voip, dns, ssh,  
> web, mail, bulk, spamd }
> queue ack               bandwidth 60% priority 9 qlimit 500 hfsc  
> (realtime 40%)
> queue voip              bandwidth 10% priority 8 qlimit 500 hfsc  
> (realtime 1%)
> queue dns               bandwidth  6% priority 7 qlimit 500 hfsc  
> (realtime  5%)
> queue ssh               bandwidth  9% priority 6 qlimit 500 hfsc  
> (realtime  5%) {ssh_login, ssh_bulk}
>         queue ssh_login bandwidth 90% priority 6 qlimit 500 hfsc
>         queue ssh_bulk  bandwidth 10% priority 5 qlimit 500 hfsc
> queue web               bandwidth 10% priority 5 qlimit 500 hfsc  
> (realtime 10%)
> queue mail              bandwidth  3% priority 4 qlimit 500 hfsc  
> (realtime  5%)
> queue bulk              bandwidth  1% priority 3 qlimit 500 hfsc  
> (realtime  5% default)
> queue spamd             bandwidth  1% priority 1 qlimit 500 hfsc  
> (upperlimit 3Kb)
>
>
> antispoof log quick for { lo0 $EXTIF001 $INTIF }
>
>
> block        log on $EXTIF001
>
>
> pass quick on $PFSYNCIF inet proto pfsync       from $PFSYNCALLOW keep state
> pass quick on $INTIF    inet proto carp         from $CARPALLOW keep state

IIRC you should use keep state (no-sync) here since these aren't very
meaningful on the other fw

>
> block in quick on $EXTIF001 inet proto tcp from any to port $BAD_TCP_PORTS
> block in quick on $EXTIF001 inet proto udp from any to port $BAD_UDP_PORTS
>
>
> block        in log quick           from no-route to any
> block        in log quick on $EXTIF001 from <SLOWQUEUE> to any  
> probability 97%
> block        in     quick on $EXTIF001 from <BLACKLIST> to any
> block        in     quick on $EXTIF001 inet proto tcp from  
> <OVERLOAD_SSH> to any port ssh
> block        in     quick on $EXTIF001 from any to 255.255.255.255
> block return in     quick on $INTIF from any to <BLACKLIST>
> block return in     quick on $INTIF from any to 224.0.0.1
>
>
> block in log on $EXTIF001 inet from any to $ROUTERSINTIFACES
>
>
> pass in quick log on $EXTIF001 inet proto icmp from any to $EXTIF001  
> icmp-type 8 code 0 $UDPSTATE
> pass in log quick on $EXTIF001 inet proto icmp  from any to  
> $ROUTERSINTIFACES icmp-type 8 code 0 $UDPSTATE
> pass out log quick on $INTIF inet proto icmp  from any to $DECLAREDHOSTS  
> icmp-type 8 code 0 $UDPSTATE
>
>
> pass in log quick inet proto udp from any to $EXTIF001 port 33433 ><  
> 33626 keep state
> pass in log quick on $EXTIF001 inet proto udp from any to  
> $ROUTERSINTIFACES port 33433 >< 33626 keep state
> pass out log quick on $INTIF inet proto udp from any to $DECLAREDHOSTS  
> port 33433 >< 33626 keep state
>
> pass in log quick inet proto {tcp, udp} from $EBGPALLOW to $EXTIF001  
> port bgp
>
>
> pass in quick log on $EXTIF001 inet proto tcp from $SSHALLOW to  
> $EXTIF001 port ssh $SYNSTATE $SSHSTO queue (ssh_bulk, ssh_login) tag 
> OPENSSH
>
> pass in quick log on $EXTIF001 inet proto tcp  from $SSHALLOW to  
> $ROUTERSINTIFACES port ssh $SYNSTATE $SSHSTO queue (ssh_bulk, ssh_login)  
> tag OPENSSH
> pass out quick log on $INTIF inet proto tcp  from $SSHALLOW to  
> $DECLAREDHOSTS port ssh $SYNSTATE $SSHSTO queue (ssh_bulk, ssh_login)  
> tag OPENSSH
>
>
>
> pass in log quick on $EXTIF001 from any to $DECLAREDHOSTS
>
>
> pass out log quick on $INTIF from any to $DECLAREDHOSTS
>
>
> pass in log on $INTIF proto {tcp,udp} from $IBGPALLOW   to  $INTIF port  
> bgp   $TCPSTATE $INTIFSTO
>
>
> pass in log on $INTIF inet proto tcp  from $DECLAREDHOSTS to  $INTIF  
> port ssh   $TCPSTATE $INTIFSTO
> pass in log on $INTIF proto icmp  from $DECLAREDHOSTS to  $INTIF
>
> pass in log on $INTIF inet proto icmp from $DECLAREDHOSTS to  $INTIF  
> icmp-type 8 code 0 $UDPSTATE $INTIFSTO
>
> pass out log on $EXTIF001 proto {tcp, udp} from $DECLAREDHOSTS to any  
> port $ROUTER_ALLOW_OUT
>
>
> pass out log on $EXTIF001 proto icmp from  
> {$ROUTERSINTIFACES,$IBGPALLOW,$DECLAREDHOSTS} to any
> pass out log on $EXTIF001 proto {tcp, udp} from  
> {$ROUTERSINTIFACES,$IBGPALLOW} to any port $ROUTER_ALLOW_OUT
>
> # IPv6 config not yet completed, will do once v4 fully done
> pass    quick   inet6
>

I'm not sure if I see a typical border filtering scheme (maybe I didn't
read carefully enough), you'll want to drop:

* Packets not from you (your advertised prefix) to your ISP, probably
  also log these (even though your ISP should drop them, they might
  not[1] and you really want to know about them)

* Packets from you from your ISP, they are not you. Logging these should
  be interesting, too.

* Probably also: packets not addressed to you from your ISP


[1] I once managed to send packets from an RFC1918 address through two
    AS's to my home DSL line. Don't trust your ISP, do your own
    filtering.

-- 
Jussi Peltola

Reply via email to