# Macros: define common values, so they can be referenced and changed easily. ext_if="sis0" # replace with actual external interface name i.e., dc0 int_if="gif0" # replace with actual internal interface name i.e., dc1 internal_net="10.0.1.0/8" external_addr="65.39.xxx.xxx" dev_addr="65.39.xxx.xxx" # Tables: similar to macros, but more flexible for many addresses. #table { 10.0.0.0/8, !10.1.0.0/16, 192.168.0.0/24, 192.168.1.18 } # Options: tune the behavior of pf, default values are given. #set timeout { interval 10, frag 30 } #set timeout { tcp.first 120, tcp.opening 30, tcp.established 86400 } #set timeout { tcp.closing 900, tcp.finwait 45, tcp.closed 90 } #set timeout { udp.first 60, udp.single 30, udp.multiple 60 } #set timeout { icmp.first 20, icmp.error 10 } #set timeout { other.first 60, other.single 30, other.multiple 60 } #set timeout { adaptive.start 0, adaptive.end 0 } #set limit { states 10000, frags 5000 } #set loginterface none #set optimization normal #set block-policy drop #set require-order yes #set fingerprints "/etc/pf.os" # Normalization: reassemble fragments and resolve or reduce traffic ambiguities. #scrub in all # Queueing: rule-based bandwidth control. #altq on $ext_if bandwidth 2Mb cbq queue { dflt, developers, marketing } #queue dflt bandwidth 5% cbq(default) #queue developers bandwidth 80% #queue marketing bandwidth 15% # Translation: specify how addresses are to be mapped or redirected. # nat: packets going out through $ext_if with source address $internal_net will # get translated as coming from the address of $ext_if, a state is created for # such packets, and incoming packets will be redirected to the internal address. #nat on $ext_if from $internal_net to any -> ($ext_if) # rdr: packets coming in on $ext_if with destination $external_addr:1234 will # be redirected to 10.1.1.1:5678. A state is created for such packets, and # outgoing packets will be translated as coming from the external address. #rdr on $ext_if proto tcp from any to $external_addr/32 port 1234 -> 10.1.1.1 port 5678 # rdr outgoing FTP requests to the ftp-proxy #rdr on $int_if proto tcp from any to any port ftp -> 127.0.0.1 port 8021 # spamd-setup puts addresses to be redirected into table . #table persist #no rdr on { lo0, lo1 } from any to any #rdr inet proto tcp from to any port smtp -> 127.0.0.1 port 8025 # Filtering: the implicit first two rules are #pass in all #pass out all # block all incoming packets but allow ssh, pass all outgoing tcp and udp # connections and keep state, logging blocked packets. #block in log all #pass in on $ext_if proto tcp from any to $ext_if port 22 keep state #pass out on $ext_if proto { tcp, udp } all keep state # pass incoming packets destined to the addresses given in table . #pass in on $ext_if proto { tcp, udp } from any to port 80 keep state # pass incoming ports for ftp-proxy #pass in on $ext_if inet proto tcp from any to $ext_if port > 49151 keep state # Alternate rule to pass incoming ports for ftp-proxy # NOTE: Please see pf.conf(5) BUGS section before using user/group rules. #pass in on $ext_if inet proto tcp from any to $ext_if user proxy keep state # assign packets to a queue. #pass out on $ext_if from 192.168.0.0/24 to any keep state queue developers #pass out on $ext_if from 192.168.1.0/24 to any keep state queue marketing # Queue for most services altq on $ext_if cbq bandwidth 10Mb queue { std, http, mail, ssh, ftp, icmp, udp } queue std bandwidth 15% cbq(default) queue http bandwidth 22% priority 2 cbq(borrow red) queue mail bandwidth 15% priority 0 cbq(borrow ecn) queue ssh bandwidth 25% cbq(borrow) { ssh_interactive, ssh_bulk } queue ssh_interactive bandwidth 65% priority 7 cbq(borrow) queue ssh_bulk bandwidth 35% priority 0 cbq(borrow) queue ftp bandwidth 10% cbq(borrow red) queue icmp bandwidth 3% cbq queue udp bandwidth 10% cbq(borrow red) # Pass rules for queues block return out on $ext_if inet all queue std pass log quick on $ext_if proto tcp from any to any port 22 flags S/SA \ keep state queue (ssh_bulk, ssh_interactive) pass in on $ext_if proto tcp from any to any port 20 flags S/SA \ keep state queue ftp pass in quick on $ext_if proto tcp from any to any port 80 flags S/SA \ keep state queue http pass on $ext_if proto tcp from any to any port 25 \ keep state queue mail pass in on $ext_if proto tcp from any to any port 143 \ keep state queue mail pass out on $ext_if inet proto tcp from any to any port 20 \ keep state queue ftp pass out quick on $ext_if inet proto tcp from any to any port 22 \ keep state queue(ssh_bulk, ssh_interactive) pass out on $ext_if proto tcp from any to any port 143 \ keep state queue mail pass out on $ext_if proto icmp all keep state queue icmp # UDP pass rules pass out on $ext_if proto udp all keep state queue udp # DNS pass rules pass in quick on $ext_if proto tcp from any to any port 53 \ keep state queue std pass in quick on $ext_if proto udp from any to any port 53 \ keep state queue udp pass out quick on $ext_if proto tcp from any to any port 53 \ keep state queue std pass in quick on $int_if proto tcp from any to any port 953 \ keep state queue std # VPN pass rules pass out on $ext_if proto esp from any to any keep state pass in on $ext_if proto udp from any to any port = isakmp keep state pass in on $ext_if proto esp from any to any keep state # Holes for misc services pass out quick on $ext_if proto tcp from any to any port 113 keep state queue std pass in quick on $ext_if proto tcp from any to any port 113 keep state queue std # Holes for dev pass out on $ext_if proto tcp from $dev_addr to any port 6667 keep state queue \ std pass in quick on $ext_if proto tcp from $dev_addr to any port 113 keep state queue \ std pass out quick on $ext_if proto tcp from $dev_addr to any port 113 keep state queue \ std