====== Using PF for Firewall ====== ===== Introduction ===== Packet Filtering (pf) is one of the many firewalls available with FreeBSD. I believe it originally came from OpenBSD and has been ported to many operating systems since. To enable pf in FreeBSD, you need to create the file ''/etc/pf.conf'', then add the correct stanzas in ''/etc/rc.conf''. ===== Setting up ===== ==== pf.conf ==== First, a basic pf.conf file. This one is designed to block all IP's outside of my country (US) since this particular machine has a very limited audience # https://cmcenroe.me/2016/06/04/freebsd-pf-fail2ban.html # https://www.freebsd.org/doc/handbook/firewalls-pf.html # http://ipdeny.com/ipblocks/ # https://www.openbsd.org/faq/pf/tables.html # https://undeadly.org/cgi?action=article&sid=20140527054301 set skip on lo0 # allow all outbound traffic pass out quick all # create table us_zones from file containing all us IP's # use wget -4 --no-proxy --no-cookies --no-cache http://ipdeny.com/ipblocks/data/countries/us.zone -O /etc/pf-files/us.zone table persist file "/etc/pf-files/us.zone" # create table tcp_services for the only services we need tcp_services = "{ 22, 80 }" # the local networks, just in case table { 10.10.10.0/24, 172.45.42.0/24, x.x.x.x/26 } # create a table for fail2ban to use table persist # allow anything from our local network pass in quick from # block everything by default block in all # block anything loaded in fail2ban table immediately block in quick from # allow icmp from anyplace EXCEPT fail2ban pass in quick inet proto icmp all pass in quick inet6 proto icmp6 all # allow our tcp services from US Zones pass in proto tcp from to any port $tcp_services Check your configuration file with: pfctl -vnf /etc/pf.conf This will process, but not start, the configuration. It does some macro expansion, which can also give you a better idea of what is actually going on. ==== enable pf service ==== To enable the service, simply add the correct lines in ''/etc/rc.conf''. The following commands turns on pf and pflogger (/var/log/pflog). echo '# firewall used is PF' >> /etc/rc.conf echo 'pf_enable="YES"' >> /etc/rc.conf echo 'pflog_enable="YES"' >> /etc/rc.conf Now, you can start the firewall with: service pf start ===== Useful Commands ===== # flush and reload rule set pfctl -f ALL -f /etc/pf.conf # show all rules. May also be nat and/or states pfctl -s rules # validate config file (dry run kind of thing) pfctl -vnf /etc/pf.conf # display all entries in the fail2ban table pfctl -t fail2ban -T show # add an IP to table fail2ban pfctl -t fail2ban -T add 203.0.113.0/24 # remove IP from table fail2ban pfctl -t fail2ban -T delete 203.0.113.0/24 ===== Bibliography ===== * https://cmcenroe.me/2016/06/04/freebsd-pf-fail2ban.html * https://www.freebsd.org/doc/handbook/firewalls-pf.html * http://ipdeny.com/ipblocks/ * https://www.openbsd.org/faq/pf/tables.html * https://undeadly.org/cgi?action=article&sid=20140527054301