Packet Filter eller pf som den brukar kallas är ett program eller kanske snarare ett system som har dom primära uppgifterna att filtrera TCP/IP trafik och sköta NAT (Network Address Translation). Den klarar också mycket annat som normalisering av paket, bandbreddskontroll, paketprioritering och Quality of Service (QoS).
Historia
Om jag förstått det hela rätt så började det med att Theo de Raadt plockade bort ipf från OpenBSD CVS (Maj 2001) med anledning av att licensen tolkats på ett annat sätt än tidigare…
… Darren Reed has interpreted his (old, new, whichever) licence in a way that makes ipf not free according to the rules we established over 5 years ago, at www.openbsd.org/goals.html
…
software which OpenBSD uses and redistributes must be free to all (be they people or companies), for any purpose they wish to use it, including modification, use, peeing on, or even integration into baby mulching machines or atomic bombs to be dropped on Australia. …
Han är bra lustig den där Theo
Hur som helst behövde man ett substitut. Då började Daniel Hartmeier skriva de första delarna i OpenBSD pf, som OpenBSD teamet tyckte var en bra start och fortsatte utvecklingen under OpenBSD-CURRENT.
OpenBSD pf portades till FreeBSD ports-samling under Juli 2003 och FreeBSD 5.3 som släpptes under 2004 var den första utgåvan som innehöll pf som en del av bas-systemet. (Läs mer här)
FreeBSD setup
För att aktivera pf och gateway (Behövs för att kunna skicka vidare paket från ett nätverkskort till ett annat) lägg till följande, utöver ordinarie nätverkskonfiguration.
pf_enable="YES"
gateway_enable="YES"
Vill man inte starta om efter att ha lagt till ovan kan man köra följande, tänk dock på att skapa din /etc/pf.conf innan du startar pf för första gången. Speciellt om du inte sitter lokalt vid datorn.
/etc/rc.d/pf start
/etc/rc.d/routing start
Konfiguration
Konfigurationsfilen läses in som standard från /etc/pf.conf men det går bra att använda t.ex. pfctl för att tillfälligt läsa in från någon annan fil. Ett exempel finns vanligtvis i /usr/share/examples/pf/pf.conf men den är inte mycket att ha enligt mig.
Man delar vanligtvis upp konfigurationsfilen i sju delar (Macros, Tables, Options, Traffic Normalization, Queueing, Translation, Packet Filtering). Jag kommer dock inte ta upp dom olika delarna här och nu men hänvisar till manualen för pf.conf där det finns detaljerad information.
Min nuvarande konfigurationsfil
Här nedan har jag klistrat in min nuvarande konfigurationsfil. Den är ganska enkel men du kan använda den om du vill, kommentera gärna med förslag på hur den kan förbättras och om det är något jag gjort fel eller missat eller om du har några frågor. Konfigurationsfilen har hängt med i ett antal år nu utan att jag ändrat på några större delar av den, så den kommer säkerligen behöva en hel del uppdateringar
## $FreeBSD: /etc/pf.conf
#
## MACROS
# External network interface
ext_if = "msk0"
# Internal network interface
int_if = "sk0"
# Wireless network interface
wifi_if = "ath0"
# Define all network interfaces
all_if = "{ msk0, sk0, ath0 }"
# Define all allowed TCP-ports
tcp_services = "{ 22, 80, 443, 8000, 50000 }"
# Defined client
clevo = "192.168.11.11"
## TABLES
# Table of black/private networks
table <private> const { 10/8, 172.16/12, 192.168/16 }
# Table for ip-addresses that tried to bruteforce machine
table <bruteforce> persist
## GLOBAL OPTIONS
# Logging on external interface
set loginterface $ext_if
# What to do with blocked traffic
set block-policy return
# Don't filter localhost
set skip on lo0
## TRAFFIC NORMALIZATION
scrub in on $ext_if all fragment reassemble
## QUEUEING RULES
# No need for a queueing ruleset at this network
## TRANSLATION RULES (NAT)
# Translate the web to the local machines
nat on $ext_if from !($ext_if) to any -> ($ext_if)
# Port redirect to client machine (OpenTTD service)
rdr pass on $ext_if proto { udp, tcp } from any to ($ext_if) \
port { 3979 } -> $clevo
## FILTER RULES
# Default to block all incoming connections
block in log on $ext_if
# Keep blocking all connections from bruteforce ip-addresses
block quick from <bruteforce>
# Blocking spoofed traffic
antispoof quick for { lo0 $int_if $wifi_if } inet
# Allow outgoing TCP
pass out on $ext_if proto tcp from ($ext_if) to any \
flags S/SA keep state
# Allow outgoing UPD
pass out on $ext_if proto udp from ($ext_if) to any keep state
# Allow outgoing ICMP
pass out on $ext_if inet proto icmp from ($ext_if) to any keep state
# Hosts that try to bruteforce ssh are sent to bruteforce filter
pass quick proto { tcp, udp } from any to ($ext_if) port ssh \
flags S/SA keep state \
(max-src-conn-rate 4/10, overload <bruteforce> flush global)
# Allow incoming tcp-connections on ports specified in $tcp_services
pass in on $ext_if inet proto tcp from any to ($ext_if) \
port $tcp_services keep state
Aktuella länkar för inlägget:
FreeBSD
The OpenBSD Packet Filter