#######################################################################
#                       PF Firewall                                   #
#######################################################################
#Script Name: pf.conf
#Version: 1.05
#Description: Firewall rules for FreeBSD pf firewall
#Last Modify Date: 03102021
#Author:Brent Dacus
#Email:brent[at]thedacus[dot]net                                                #
#######################################################################
#                       Macros                                        #
#######################################################################
ext_inf="vtnet0"
icmp_types = "{ echoreq, unreach }"
tcp_in_pass = "{ 14, 25, 53, 80, 443, 465, 587, 993, 995, 1414, 1415, 2222, 10000 }"
tcp_out_pass = "{ 14, 25, 43, 53, 80, 443, 587, 993, 995, 1414, 1415, 2222, 8081, 10000 }"
udp_in_pass = "{ 53 }"
udp_out_pass = "{ 43, 53, 113, 123 }"

#######################################################################
#                      Tables                                         #
#######################################################################
table <geoblock> persist
table <bruteforce> persist
table <abuseipdb> persist
table <trusted> persist file "/usr/local/etc/whitelist_ips"
table <spamd> persist
table <spamd-white> persist

#######################################################################
#                      Options                                        #
#######################################################################
set loginterface vtnet0
set optimization aggressive
set block-policy return
set fail-policy return
set state-policy if-bound
set skip on lo0

#######################################################################
#                      Normalization                                  #
#######################################################################
scrub in on $ext_inf all fragment reassemble max-mss 1440

#######################################################################
#                      Translations                                 #
#######################################################################
#------Spamd Settings
rdr pass on $ext_inf inet proto tcp from <spamd> to \
      { $ext_inf } port smtp -> 127.0.0.1 port 8025
rdr pass on $ext_inf inet proto tcp from !<spamd-white> to \
      { $ext_inf } port smtp -> 127.0.0.1 port 8025

#######################################################################
#                      Packet Filter                                  #
#######################################################################
block log quick from <geoblock>
block log quick from <abuseipdb>
block log quick from <bruteforce>
antispoof log quick for $ext_inf
anchor "blacklistd/*" in on $ext_inf
# ----"Block all in or out"
block
# ---- Allow all traffic from support ip
pass quick proto {tcp, udp} from 99.34.232.208 to $ext_inf
# ---- Allow ssh traffic from Trusted send bruteforcers to table
pass quick proto tcp from <trusted> to $ext_inf port { 14, 22, 1415 } \
flags S/SA keep state \
(max-src-conn 15, max-src-conn-rate 5/3, \
overload <bruteforce> flush global)
# ---- Allow tcp out
pass out proto tcp from $ext_inf to any port $tcp_out_pass
# ---- Allow UDP out
pass out proto udp from $ext_inf to any port $udp_out_pass
# ---- Allow incoming TCP
pass in proto tcp from any to $ext_inf port $tcp_in_pass
# ---- Allow incoming UDP
pass in proto udp from any to $ext_inf port $udp_in_pass
# ---- Allow ICMP
pass on $ext_inf inet proto icmp icmp-type $icmp_types
