xref: /freebsd/share/man/man5/pf.conf.5 (revision 3c0a0de20ffe9d35a0347ce2d19460e84aac808e)
13b3a8eb9SGleb Smirnoff.\"	$OpenBSD: pf.conf.5,v 1.406 2009/01/31 19:37:12 sobrado Exp $
23b3a8eb9SGleb Smirnoff.\"
33b3a8eb9SGleb Smirnoff.\" Copyright (c) 2002, Daniel Hartmeier
43b3a8eb9SGleb Smirnoff.\" All rights reserved.
53b3a8eb9SGleb Smirnoff.\"
63b3a8eb9SGleb Smirnoff.\" Redistribution and use in source and binary forms, with or without
73b3a8eb9SGleb Smirnoff.\" modification, are permitted provided that the following conditions
83b3a8eb9SGleb Smirnoff.\" are met:
93b3a8eb9SGleb Smirnoff.\"
103b3a8eb9SGleb Smirnoff.\"    - Redistributions of source code must retain the above copyright
113b3a8eb9SGleb Smirnoff.\"      notice, this list of conditions and the following disclaimer.
123b3a8eb9SGleb Smirnoff.\"    - Redistributions in binary form must reproduce the above
133b3a8eb9SGleb Smirnoff.\"      copyright notice, this list of conditions and the following
143b3a8eb9SGleb Smirnoff.\"      disclaimer in the documentation and/or other materials provided
153b3a8eb9SGleb Smirnoff.\"      with the distribution.
163b3a8eb9SGleb Smirnoff.\"
173b3a8eb9SGleb Smirnoff.\" THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
183b3a8eb9SGleb Smirnoff.\" "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
193b3a8eb9SGleb Smirnoff.\" LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
203b3a8eb9SGleb Smirnoff.\" FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
213b3a8eb9SGleb Smirnoff.\" COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
223b3a8eb9SGleb Smirnoff.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
233b3a8eb9SGleb Smirnoff.\" BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
243b3a8eb9SGleb Smirnoff.\" LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
253b3a8eb9SGleb Smirnoff.\" CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
263b3a8eb9SGleb Smirnoff.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
273b3a8eb9SGleb Smirnoff.\" ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
283b3a8eb9SGleb Smirnoff.\" POSSIBILITY OF SUCH DAMAGE.
293b3a8eb9SGleb Smirnoff.\"
3071cf4107SKristof Provost.Dd February 14, 2025
313b3a8eb9SGleb Smirnoff.Dt PF.CONF 5
323b3a8eb9SGleb Smirnoff.Os
333b3a8eb9SGleb Smirnoff.Sh NAME
343b3a8eb9SGleb Smirnoff.Nm pf.conf
353b3a8eb9SGleb Smirnoff.Nd packet filter configuration file
363b3a8eb9SGleb Smirnoff.Sh DESCRIPTION
373b3a8eb9SGleb SmirnoffThe
383b3a8eb9SGleb Smirnoff.Xr pf 4
393b3a8eb9SGleb Smirnoffpacket filter modifies, drops or passes packets according to rules or
403b3a8eb9SGleb Smirnoffdefinitions specified in
413b3a8eb9SGleb Smirnoff.Nm pf.conf .
423b3a8eb9SGleb Smirnoff.Sh STATEMENT ORDER
43ab2886f0SKristof ProvostThere are eight types of statements in
443b3a8eb9SGleb Smirnoff.Nm pf.conf :
453b3a8eb9SGleb Smirnoff.Bl -tag -width xxxx
463b3a8eb9SGleb Smirnoff.It Cm Macros
473b3a8eb9SGleb SmirnoffUser-defined variables may be defined and used later, simplifying
483b3a8eb9SGleb Smirnoffthe configuration file.
493b3a8eb9SGleb SmirnoffMacros must be defined before they are referenced in
503b3a8eb9SGleb Smirnoff.Nm pf.conf .
513b3a8eb9SGleb Smirnoff.It Cm Tables
523b3a8eb9SGleb SmirnoffTables provide a mechanism for increasing the performance and flexibility of
533b3a8eb9SGleb Smirnoffrules with large numbers of source or destination addresses.
543b3a8eb9SGleb Smirnoff.It Cm Options
553b3a8eb9SGleb SmirnoffOptions tune the behaviour of the packet filtering engine.
56ab2886f0SKristof Provost.It Cm Ethernet Filtering
57ab2886f0SKristof ProvostEthernet filtering provides rule-based blocking or passing of Ethernet packets.
583b3a8eb9SGleb Smirnoff.It Cm Traffic Normalization Li (e.g. Em scrub )
593b3a8eb9SGleb SmirnoffTraffic normalization protects internal machines against inconsistencies
603b3a8eb9SGleb Smirnoffin Internet protocols and implementations.
613b3a8eb9SGleb Smirnoff.It Cm Queueing
623b3a8eb9SGleb SmirnoffQueueing provides rule-based bandwidth control.
633b3a8eb9SGleb Smirnoff.It Cm Translation Li (Various forms of NAT)
643b3a8eb9SGleb SmirnoffTranslation rules specify how addresses are to be mapped or redirected to
653b3a8eb9SGleb Smirnoffother addresses.
663b3a8eb9SGleb Smirnoff.It Cm Packet Filtering
673b3a8eb9SGleb SmirnoffPacket filtering provides rule-based blocking or passing of packets.
683b3a8eb9SGleb Smirnoff.El
693b3a8eb9SGleb Smirnoff.Pp
703b3a8eb9SGleb SmirnoffWith the exception of
713b3a8eb9SGleb Smirnoff.Cm macros
723b3a8eb9SGleb Smirnoffand
733b3a8eb9SGleb Smirnoff.Cm tables ,
743b3a8eb9SGleb Smirnoffthe types of statements should be grouped and appear in
753b3a8eb9SGleb Smirnoff.Nm pf.conf
763b3a8eb9SGleb Smirnoffin the order shown above, as this matches the operation of the underlying
773b3a8eb9SGleb Smirnoffpacket filtering engine.
783b3a8eb9SGleb SmirnoffBy default
793b3a8eb9SGleb Smirnoff.Xr pfctl 8
803b3a8eb9SGleb Smirnoffenforces this order (see
813b3a8eb9SGleb Smirnoff.Ar set require-order
823b3a8eb9SGleb Smirnoffbelow).
833b3a8eb9SGleb Smirnoff.Pp
843b3a8eb9SGleb SmirnoffComments can be put anywhere in the file using a hash mark
853b3a8eb9SGleb Smirnoff.Pq Sq # ,
863b3a8eb9SGleb Smirnoffand extend to the end of the current line.
873b3a8eb9SGleb Smirnoff.Pp
883b3a8eb9SGleb SmirnoffAdditional configuration files can be included with the
893b3a8eb9SGleb Smirnoff.Ic include
903b3a8eb9SGleb Smirnoffkeyword, for example:
913b3a8eb9SGleb Smirnoff.Bd -literal -offset indent
923b3a8eb9SGleb Smirnoffinclude "/etc/pf/sub.filter.conf"
933b3a8eb9SGleb Smirnoff.Ed
943b3a8eb9SGleb Smirnoff.Sh MACROS
953b3a8eb9SGleb SmirnoffMacros can be defined that will later be expanded in context.
963b3a8eb9SGleb SmirnoffMacro names must start with a letter, and may contain letters, digits
973b3a8eb9SGleb Smirnoffand underscores.
983b3a8eb9SGleb SmirnoffMacro names may not be reserved words (for example
993b3a8eb9SGleb Smirnoff.Ar pass ,
1003b3a8eb9SGleb Smirnoff.Ar in ,
1013b3a8eb9SGleb Smirnoff.Ar out ) .
1023b3a8eb9SGleb SmirnoffMacros are not expanded inside quotes.
1033b3a8eb9SGleb Smirnoff.Pp
1043b3a8eb9SGleb SmirnoffFor example,
1053b3a8eb9SGleb Smirnoff.Bd -literal -offset indent
1063b3a8eb9SGleb Smirnoffext_if = \&"kue0\&"
1073b3a8eb9SGleb Smirnoffall_ifs = \&"{\&" $ext_if lo0 \&"}\&"
1083b3a8eb9SGleb Smirnoffpass out on $ext_if from any to any
1093b3a8eb9SGleb Smirnoffpass in  on $ext_if proto tcp from any to any port 25
1103b3a8eb9SGleb Smirnoff.Ed
1113b3a8eb9SGleb Smirnoff.Sh TABLES
1123b3a8eb9SGleb SmirnoffTables are named structures which can hold a collection of addresses and
1133b3a8eb9SGleb Smirnoffnetworks.
1143b3a8eb9SGleb SmirnoffLookups against tables in
1153b3a8eb9SGleb Smirnoff.Xr pf 4
1163b3a8eb9SGleb Smirnoffare relatively fast, making a single rule with tables much more efficient,
1173b3a8eb9SGleb Smirnoffin terms of
1183b3a8eb9SGleb Smirnoffprocessor usage and memory consumption, than a large number of rules which
1193b3a8eb9SGleb Smirnoffdiffer only in IP address (either created explicitly or automatically by rule
1203b3a8eb9SGleb Smirnoffexpansion).
1213b3a8eb9SGleb Smirnoff.Pp
1223b3a8eb9SGleb SmirnoffTables can be used as the source or destination of filter rules,
1233b3a8eb9SGleb Smirnoff.Ar scrub
1243b3a8eb9SGleb Smirnoffrules
1253b3a8eb9SGleb Smirnoffor
1263b3a8eb9SGleb Smirnofftranslation rules such as
1273b3a8eb9SGleb Smirnoff.Ar nat
1283b3a8eb9SGleb Smirnoffor
1293b3a8eb9SGleb Smirnoff.Ar rdr
1303b3a8eb9SGleb Smirnoff(see below for details on the various rule types).
1313b3a8eb9SGleb SmirnoffTables can also be used for the redirect address of
1323b3a8eb9SGleb Smirnoff.Ar nat
1333b3a8eb9SGleb Smirnoffand
1343b3a8eb9SGleb Smirnoff.Ar rdr
135c2346c3dSKristof Provostand in the routing options of filter rules, but not for
136c2346c3dSKristof Provost.Ar bitmask
1373b3a8eb9SGleb Smirnoffpools.
1383b3a8eb9SGleb Smirnoff.Pp
1393b3a8eb9SGleb SmirnoffTables can be defined with any of the following
1403b3a8eb9SGleb Smirnoff.Xr pfctl 8
1413b3a8eb9SGleb Smirnoffmechanisms.
1423b3a8eb9SGleb SmirnoffAs with macros, reserved words may not be used as table names.
1433b3a8eb9SGleb Smirnoff.Bl -tag -width "manually"
1443b3a8eb9SGleb Smirnoff.It Ar manually
1453b3a8eb9SGleb SmirnoffPersistent tables can be manually created with the
1463b3a8eb9SGleb Smirnoff.Ar add
1473b3a8eb9SGleb Smirnoffor
1483b3a8eb9SGleb Smirnoff.Ar replace
1493b3a8eb9SGleb Smirnoffoption of
1503b3a8eb9SGleb Smirnoff.Xr pfctl 8 ,
1513b3a8eb9SGleb Smirnoffbefore or after the ruleset has been loaded.
1523b3a8eb9SGleb Smirnoff.It Pa pf.conf
1533b3a8eb9SGleb SmirnoffTable definitions can be placed directly in this file, and loaded at the
1543b3a8eb9SGleb Smirnoffsame time as other rules are loaded, atomically.
1553b3a8eb9SGleb SmirnoffTable definitions inside
1563b3a8eb9SGleb Smirnoff.Nm pf.conf
1573b3a8eb9SGleb Smirnoffuse the
1583b3a8eb9SGleb Smirnoff.Ar table
1593b3a8eb9SGleb Smirnoffstatement, and are especially useful to define non-persistent tables.
1603b3a8eb9SGleb SmirnoffThe contents of a pre-existing table defined without a list of addresses
1613b3a8eb9SGleb Smirnoffto initialize it is not altered when
1623b3a8eb9SGleb Smirnoff.Nm pf.conf
1633b3a8eb9SGleb Smirnoffis loaded.
1643b3a8eb9SGleb SmirnoffA table initialized with the empty list,
1653b3a8eb9SGleb Smirnoff.Li { } ,
1663b3a8eb9SGleb Smirnoffwill be cleared on load.
1673b3a8eb9SGleb Smirnoff.El
1683b3a8eb9SGleb Smirnoff.Pp
1693b3a8eb9SGleb SmirnoffTables may be defined with the following attributes:
1703b3a8eb9SGleb Smirnoff.Bl -tag -width persist
1713b3a8eb9SGleb Smirnoff.It Ar persist
1723b3a8eb9SGleb SmirnoffThe
1733b3a8eb9SGleb Smirnoff.Ar persist
1743b3a8eb9SGleb Smirnoffflag forces the kernel to keep the table even when no rules refer to it.
1753b3a8eb9SGleb SmirnoffIf the flag is not set, the kernel will automatically remove the table
1763b3a8eb9SGleb Smirnoffwhen the last rule referring to it is flushed.
1773b3a8eb9SGleb Smirnoff.It Ar const
1783b3a8eb9SGleb SmirnoffThe
1793b3a8eb9SGleb Smirnoff.Ar const
1803b3a8eb9SGleb Smirnoffflag prevents the user from altering the contents of the table once it
1813b3a8eb9SGleb Smirnoffhas been created.
1823b3a8eb9SGleb SmirnoffWithout that flag,
1833b3a8eb9SGleb Smirnoff.Xr pfctl 8
1843b3a8eb9SGleb Smirnoffcan be used to add or remove addresses from the table at any time, even
1853b3a8eb9SGleb Smirnoffwhen running with
1863b3a8eb9SGleb Smirnoff.Xr securelevel 7
1873b3a8eb9SGleb Smirnoff= 2.
1883b3a8eb9SGleb Smirnoff.It Ar counters
1893b3a8eb9SGleb SmirnoffThe
1903b3a8eb9SGleb Smirnoff.Ar counters
1913b3a8eb9SGleb Smirnoffflag enables per-address packet and byte counters which can be displayed with
1923b3a8eb9SGleb Smirnoff.Xr pfctl 8 .
19321121f9bSMark JohnstonNote that this feature carries significant memory overhead for large tables.
1943b3a8eb9SGleb Smirnoff.El
1953b3a8eb9SGleb Smirnoff.Pp
1963b3a8eb9SGleb SmirnoffFor example,
1973b3a8eb9SGleb Smirnoff.Bd -literal -offset indent
19883f9b68fSKristof Provosttable <private> const { 10/8, 172.16/12, 192.168/16 }
19983f9b68fSKristof Provosttable <badhosts> persist
20083f9b68fSKristof Provostblock on fxp0 from { <private>, <badhosts> } to any
2013b3a8eb9SGleb Smirnoff.Ed
2023b3a8eb9SGleb Smirnoff.Pp
2033b3a8eb9SGleb Smirnoffcreates a table called private, to hold RFC 1918 private network
2043b3a8eb9SGleb Smirnoffblocks, and a table called badhosts, which is initially empty.
2053b3a8eb9SGleb SmirnoffA filter rule is set up to block all traffic coming from addresses listed in
2063b3a8eb9SGleb Smirnoffeither table.
2073b3a8eb9SGleb SmirnoffThe private table cannot have its contents changed and the badhosts table
2083b3a8eb9SGleb Smirnoffwill exist even when no active filter rules reference it.
2093b3a8eb9SGleb SmirnoffAddresses may later be added to the badhosts table, so that traffic from
2103b3a8eb9SGleb Smirnoffthese hosts can be blocked by using
2113b3a8eb9SGleb Smirnoff.Bd -literal -offset indent
2123b3a8eb9SGleb Smirnoff# pfctl -t badhosts -Tadd 204.92.77.111
2133b3a8eb9SGleb Smirnoff.Ed
2143b3a8eb9SGleb Smirnoff.Pp
2153b3a8eb9SGleb SmirnoffA table can also be initialized with an address list specified in one or more
2163b3a8eb9SGleb Smirnoffexternal files, using the following syntax:
2173b3a8eb9SGleb Smirnoff.Bd -literal -offset indent
21883f9b68fSKristof Provosttable <spam> persist file \&"/etc/spammers\&" file \&"/etc/openrelays\&"
21983f9b68fSKristof Provostblock on fxp0 from <spam> to any
2203b3a8eb9SGleb Smirnoff.Ed
2213b3a8eb9SGleb Smirnoff.Pp
2223b3a8eb9SGleb SmirnoffThe files
2233b3a8eb9SGleb Smirnoff.Pa /etc/spammers
2243b3a8eb9SGleb Smirnoffand
2253b3a8eb9SGleb Smirnoff.Pa /etc/openrelays
2263b3a8eb9SGleb Smirnofflist IP addresses, one per line.
2273b3a8eb9SGleb SmirnoffAny lines beginning with a # are treated as comments and ignored.
2283b3a8eb9SGleb SmirnoffIn addition to being specified by IP address, hosts may also be
2293b3a8eb9SGleb Smirnoffspecified by their hostname.
2303b3a8eb9SGleb SmirnoffWhen the resolver is called to add a hostname to a table,
2313b3a8eb9SGleb Smirnoff.Em all
2323b3a8eb9SGleb Smirnoffresulting IPv4 and IPv6 addresses are placed into the table.
2333b3a8eb9SGleb SmirnoffIP addresses can also be entered in a table by specifying a valid interface
2343b3a8eb9SGleb Smirnoffname, a valid interface group or the
2353b3a8eb9SGleb Smirnoff.Em self
2363b3a8eb9SGleb Smirnoffkeyword, in which case all addresses assigned to the interface(s) will be
2373b3a8eb9SGleb Smirnoffadded to the table.
2383b3a8eb9SGleb Smirnoff.Sh OPTIONS
2393b3a8eb9SGleb Smirnoff.Xr pf 4
2403b3a8eb9SGleb Smirnoffmay be tuned for various situations using the
2413b3a8eb9SGleb Smirnoff.Ar set
2423b3a8eb9SGleb Smirnoffcommand.
2433b3a8eb9SGleb Smirnoff.Bl -tag -width xxxx
2443b3a8eb9SGleb Smirnoff.It Ar set timeout
2453b3a8eb9SGleb Smirnoff.Pp
2463b3a8eb9SGleb Smirnoff.Bl -tag -width "src.track" -compact
2473b3a8eb9SGleb Smirnoff.It Ar interval
2483b3a8eb9SGleb SmirnoffInterval between purging expired states and fragments.
2493b3a8eb9SGleb Smirnoff.It Ar frag
2503b3a8eb9SGleb SmirnoffSeconds before an unassembled fragment is expired.
2513b3a8eb9SGleb Smirnoff.It Ar src.track
2523b3a8eb9SGleb SmirnoffLength of time to retain a source tracking entry after the last state
2533b3a8eb9SGleb Smirnoffexpires.
2543b3a8eb9SGleb Smirnoff.El
2553b3a8eb9SGleb Smirnoff.Pp
2563b3a8eb9SGleb SmirnoffWhen a packet matches a stateful connection, the seconds to live for the
2573b3a8eb9SGleb Smirnoffconnection will be updated to that of the
2583b3a8eb9SGleb Smirnoff.Ar proto.modifier
2593b3a8eb9SGleb Smirnoffwhich corresponds to the connection state.
2603b3a8eb9SGleb SmirnoffEach packet which matches this state will reset the TTL.
2613b3a8eb9SGleb SmirnoffTuning these values may improve the performance of the
2623b3a8eb9SGleb Smirnofffirewall at the risk of dropping valid idle connections.
2633b3a8eb9SGleb Smirnoff.Pp
2643b3a8eb9SGleb Smirnoff.Bl -tag -width xxxx -compact
2653b3a8eb9SGleb Smirnoff.It Ar tcp.first
2663b3a8eb9SGleb SmirnoffThe state after the first packet.
2673b3a8eb9SGleb Smirnoff.It Ar tcp.opening
2680300b49aSKristof ProvostThe state after the second packet but before both endpoints have
2690300b49aSKristof Provostacknowledged the connection.
2703b3a8eb9SGleb Smirnoff.It Ar tcp.established
2713b3a8eb9SGleb SmirnoffThe fully established state.
2723b3a8eb9SGleb Smirnoff.It Ar tcp.closing
2733b3a8eb9SGleb SmirnoffThe state after the first FIN has been sent.
2743b3a8eb9SGleb Smirnoff.It Ar tcp.finwait
2753b3a8eb9SGleb SmirnoffThe state after both FINs have been exchanged and the connection is closed.
2763b3a8eb9SGleb SmirnoffSome hosts (notably web servers on Solaris) send TCP packets even after closing
2773b3a8eb9SGleb Smirnoffthe connection.
2783b3a8eb9SGleb SmirnoffIncreasing
2793b3a8eb9SGleb Smirnoff.Ar tcp.finwait
2803b3a8eb9SGleb Smirnoff(and possibly
2813b3a8eb9SGleb Smirnoff.Ar tcp.closing )
2823b3a8eb9SGleb Smirnoffcan prevent blocking of such packets.
2833b3a8eb9SGleb Smirnoff.It Ar tcp.closed
2843b3a8eb9SGleb SmirnoffThe state after one endpoint sends an RST.
2853b3a8eb9SGleb Smirnoff.El
2863b3a8eb9SGleb Smirnoff.Pp
287ca9dbde8SKristof ProvostSCTP timeout are handled similar to TCP, but with its own set of states:
288ca9dbde8SKristof Provost.Pp
289ca9dbde8SKristof Provost.Bl -tag -width xxxx -compact
290ca9dbde8SKristof Provost.It Ar sctp.first
291ca9dbde8SKristof ProvostThe state after the first packet.
292ca9dbde8SKristof Provost.It Ar sctp.opening
293ca9dbde8SKristof ProvostThe state before the destination host ever sends a packet.
294ca9dbde8SKristof Provost.It Ar sctp.established
295ca9dbde8SKristof ProvostThe fully established state.
296ca9dbde8SKristof Provost.It Ar sctp.closing
297ca9dbde8SKristof ProvostThe state after the first SHUTDOWN chunk has been sent.
298ca9dbde8SKristof Provost.It Ar sctp.closed
299ca9dbde8SKristof ProvostThe state after SHUTDOWN_ACK has been exchanged and the connection is closed.
300ca9dbde8SKristof Provost.El
301ca9dbde8SKristof Provost.Pp
3023b3a8eb9SGleb SmirnoffICMP and UDP are handled in a fashion similar to TCP, but with a much more
3033b3a8eb9SGleb Smirnofflimited set of states:
3043b3a8eb9SGleb Smirnoff.Pp
3053b3a8eb9SGleb Smirnoff.Bl -tag -width xxxx -compact
3063b3a8eb9SGleb Smirnoff.It Ar udp.first
3073b3a8eb9SGleb SmirnoffThe state after the first packet.
3083b3a8eb9SGleb Smirnoff.It Ar udp.single
3093b3a8eb9SGleb SmirnoffThe state if the source host sends more than one packet but the destination
3103b3a8eb9SGleb Smirnoffhost has never sent one back.
3113b3a8eb9SGleb Smirnoff.It Ar udp.multiple
3123b3a8eb9SGleb SmirnoffThe state if both hosts have sent packets.
3133b3a8eb9SGleb Smirnoff.It Ar icmp.first
3143b3a8eb9SGleb SmirnoffThe state after the first packet.
3153b3a8eb9SGleb Smirnoff.It Ar icmp.error
3163b3a8eb9SGleb SmirnoffThe state after an ICMP error came back in response to an ICMP packet.
3173b3a8eb9SGleb Smirnoff.El
3183b3a8eb9SGleb Smirnoff.Pp
3193b3a8eb9SGleb SmirnoffOther protocols are handled similarly to UDP:
3203b3a8eb9SGleb Smirnoff.Pp
3213b3a8eb9SGleb Smirnoff.Bl -tag -width xxxx -compact
3223b3a8eb9SGleb Smirnoff.It Ar other.first
3233b3a8eb9SGleb Smirnoff.It Ar other.single
3243b3a8eb9SGleb Smirnoff.It Ar other.multiple
3253b3a8eb9SGleb Smirnoff.El
3263b3a8eb9SGleb Smirnoff.Pp
3273b3a8eb9SGleb SmirnoffTimeout values can be reduced adaptively as the number of state table
3283b3a8eb9SGleb Smirnoffentries grows.
3293b3a8eb9SGleb Smirnoff.Pp
3303b3a8eb9SGleb Smirnoff.Bl -tag -width xxxx -compact
3313b3a8eb9SGleb Smirnoff.It Ar adaptive.start
3323b3a8eb9SGleb SmirnoffWhen the number of state entries exceeds this value, adaptive scaling
3333b3a8eb9SGleb Smirnoffbegins.
3343b3a8eb9SGleb SmirnoffAll timeout values are scaled linearly with factor
3353b3a8eb9SGleb Smirnoff(adaptive.end - number of states) / (adaptive.end - adaptive.start).
3363b3a8eb9SGleb Smirnoff.It Ar adaptive.end
3373b3a8eb9SGleb SmirnoffWhen reaching this number of state entries, all timeout values become
3383b3a8eb9SGleb Smirnoffzero, effectively purging all state entries immediately.
3393b3a8eb9SGleb SmirnoffThis value is used to define the scale factor, it should not actually
3403b3a8eb9SGleb Smirnoffbe reached (set a lower state limit, see below).
3413b3a8eb9SGleb Smirnoff.El
3423b3a8eb9SGleb Smirnoff.Pp
3433b3a8eb9SGleb SmirnoffAdaptive timeouts are enabled by default, with an adaptive.start value
3443b3a8eb9SGleb Smirnoffequal to 60% of the state limit, and an adaptive.end value equal to
3453b3a8eb9SGleb Smirnoff120% of the state limit.
3463b3a8eb9SGleb SmirnoffThey can be disabled by setting both adaptive.start and adaptive.end to 0.
3473b3a8eb9SGleb Smirnoff.Pp
3483b3a8eb9SGleb SmirnoffThe adaptive timeout values can be defined both globally and for each rule.
3493b3a8eb9SGleb SmirnoffWhen used on a per-rule basis, the values relate to the number of
3503b3a8eb9SGleb Smirnoffstates created by the rule, otherwise to the total number of
3513b3a8eb9SGleb Smirnoffstates.
3523b3a8eb9SGleb Smirnoff.Pp
3533b3a8eb9SGleb SmirnoffFor example:
3543b3a8eb9SGleb Smirnoff.Bd -literal -offset indent
3553b3a8eb9SGleb Smirnoffset timeout tcp.first 120
3563b3a8eb9SGleb Smirnoffset timeout tcp.established 86400
3573b3a8eb9SGleb Smirnoffset timeout { adaptive.start 6000, adaptive.end 12000 }
3583b3a8eb9SGleb Smirnoffset limit states 10000
3593b3a8eb9SGleb Smirnoff.Ed
3603b3a8eb9SGleb Smirnoff.Pp
3613b3a8eb9SGleb SmirnoffWith 9000 state table entries, the timeout values are scaled to 50%
3623b3a8eb9SGleb Smirnoff(tcp.first 60, tcp.established 43200).
3633b3a8eb9SGleb Smirnoff.It Ar set loginterface
3643b3a8eb9SGleb SmirnoffEnable collection of packet and byte count statistics for the given
3653b3a8eb9SGleb Smirnoffinterface or interface group.
3663b3a8eb9SGleb SmirnoffThese statistics can be viewed using
3673b3a8eb9SGleb Smirnoff.Bd -literal -offset indent
3683b3a8eb9SGleb Smirnoff# pfctl -s info
3693b3a8eb9SGleb Smirnoff.Ed
3703b3a8eb9SGleb Smirnoff.Pp
3713b3a8eb9SGleb SmirnoffIn this example
3723b3a8eb9SGleb Smirnoff.Xr pf 4
3733b3a8eb9SGleb Smirnoffcollects statistics on the interface named dc0:
3743b3a8eb9SGleb Smirnoff.Bd -literal -offset indent
3753b3a8eb9SGleb Smirnoffset loginterface dc0
3763b3a8eb9SGleb Smirnoff.Ed
3773b3a8eb9SGleb Smirnoff.Pp
3783b3a8eb9SGleb SmirnoffOne can disable the loginterface using:
3793b3a8eb9SGleb Smirnoff.Bd -literal -offset indent
3803b3a8eb9SGleb Smirnoffset loginterface none
3813b3a8eb9SGleb Smirnoff.Ed
3823b3a8eb9SGleb Smirnoff.It Ar set limit
3833b3a8eb9SGleb SmirnoffSets hard limits on the memory pools used by the packet filter.
3843b3a8eb9SGleb SmirnoffSee
3853b3a8eb9SGleb Smirnoff.Xr zone 9
3863b3a8eb9SGleb Smirnofffor an explanation of memory pools.
3873b3a8eb9SGleb Smirnoff.Pp
3883b3a8eb9SGleb SmirnoffFor example,
3893b3a8eb9SGleb Smirnoff.Bd -literal -offset indent
3903b3a8eb9SGleb Smirnoffset limit states 20000
3913b3a8eb9SGleb Smirnoff.Ed
3923b3a8eb9SGleb Smirnoff.Pp
3933b3a8eb9SGleb Smirnoffsets the maximum number of entries in the memory pool used by state table
3943b3a8eb9SGleb Smirnoffentries (generated by
3953b3a8eb9SGleb Smirnoff.Ar pass
3963b3a8eb9SGleb Smirnoffrules which do not specify
3973b3a8eb9SGleb Smirnoff.Ar no state )
3983b3a8eb9SGleb Smirnoffto 20000.
3993b3a8eb9SGleb SmirnoffUsing
4003b3a8eb9SGleb Smirnoff.Bd -literal -offset indent
4013b3a8eb9SGleb Smirnoffset limit frags 20000
4023b3a8eb9SGleb Smirnoff.Ed
4033b3a8eb9SGleb Smirnoff.Pp
4043b3a8eb9SGleb Smirnoffsets the maximum number of entries in the memory pool used for fragment
4055ed470bdSKajetan Staszkiewiczreassembly (generated by the
4065ed470bdSKajetan Staszkiewicz.Ar set reassemble
4075ed470bdSKajetan Staszkiewiczoption or
4083b3a8eb9SGleb Smirnoff.Ar scrub
4093b3a8eb9SGleb Smirnoffrules) to 20000.
4103b3a8eb9SGleb SmirnoffUsing
4113b3a8eb9SGleb Smirnoff.Bd -literal -offset indent
4123b3a8eb9SGleb Smirnoffset limit src-nodes 2000
4133b3a8eb9SGleb Smirnoff.Ed
4143b3a8eb9SGleb Smirnoff.Pp
4153b3a8eb9SGleb Smirnoffsets the maximum number of entries in the memory pool used for tracking
4163b3a8eb9SGleb Smirnoffsource IP addresses (generated by the
4173b3a8eb9SGleb Smirnoff.Ar sticky-address
4183b3a8eb9SGleb Smirnoffand
4193b3a8eb9SGleb Smirnoff.Ar src.track
4203b3a8eb9SGleb Smirnoffoptions) to 2000.
4213b3a8eb9SGleb SmirnoffUsing
4223b3a8eb9SGleb Smirnoff.Bd -literal -offset indent
4233b3a8eb9SGleb Smirnoffset limit table-entries 100000
4243b3a8eb9SGleb Smirnoff.Ed
4253b3a8eb9SGleb Smirnoff.Pp
426ea6d6addSKristof Provostsets the limit on the overall number of addresses that can be stored
4273b3a8eb9SGleb Smirnoffin tables to 100000.
4283b3a8eb9SGleb Smirnoff.Pp
4293b3a8eb9SGleb SmirnoffVarious limits can be combined on a single line:
4303b3a8eb9SGleb Smirnoff.Bd -literal -offset indent
4313b3a8eb9SGleb Smirnoffset limit { states 20000, frags 20000, src-nodes 2000 }
4323b3a8eb9SGleb Smirnoff.Ed
4333b3a8eb9SGleb Smirnoff.It Ar set ruleset-optimization
4343b3a8eb9SGleb Smirnoff.Bl -tag -width xxxxxxxx -compact
4353b3a8eb9SGleb Smirnoff.It Ar none
4363b3a8eb9SGleb SmirnoffDisable the ruleset optimizer.
4373b3a8eb9SGleb Smirnoff.It Ar basic
4383b3a8eb9SGleb SmirnoffEnable basic ruleset optimization.
4393b3a8eb9SGleb SmirnoffThis is the default behaviour.
4403b3a8eb9SGleb SmirnoffBasic ruleset optimization does four things to improve the
4413b3a8eb9SGleb Smirnoffperformance of ruleset evaluations:
4423b3a8eb9SGleb Smirnoff.Pp
4433b3a8eb9SGleb Smirnoff.Bl -enum -compact
4443b3a8eb9SGleb Smirnoff.It
4453b3a8eb9SGleb Smirnoffremove duplicate rules
4463b3a8eb9SGleb Smirnoff.It
4473b3a8eb9SGleb Smirnoffremove rules that are a subset of another rule
4483b3a8eb9SGleb Smirnoff.It
4493b3a8eb9SGleb Smirnoffcombine multiple rules into a table when advantageous
4503b3a8eb9SGleb Smirnoff.It
4513b3a8eb9SGleb Smirnoffre-order the rules to improve evaluation performance
4523b3a8eb9SGleb Smirnoff.El
4533b3a8eb9SGleb Smirnoff.Pp
4543b3a8eb9SGleb Smirnoff.It Ar profile
4553b3a8eb9SGleb SmirnoffUses the currently loaded ruleset as a feedback profile to tailor the
4563b3a8eb9SGleb Smirnoffordering of quick rules to actual network traffic.
4573b3a8eb9SGleb Smirnoff.El
4583b3a8eb9SGleb Smirnoff.Pp
4593b3a8eb9SGleb SmirnoffIt is important to note that the ruleset optimizer will modify the ruleset
4603b3a8eb9SGleb Smirnoffto improve performance.
4613b3a8eb9SGleb SmirnoffA side effect of the ruleset modification is that per-rule accounting
4623b3a8eb9SGleb Smirnoffstatistics will have different meanings than before.
4633b3a8eb9SGleb SmirnoffIf per-rule accounting is important for billing purposes or whatnot,
4643b3a8eb9SGleb Smirnoffeither the ruleset optimizer should not be used or a label field should
4653b3a8eb9SGleb Smirnoffbe added to all of the accounting rules to act as optimization barriers.
4663b3a8eb9SGleb Smirnoff.Pp
4673b3a8eb9SGleb SmirnoffOptimization can also be set as a command-line argument to
4683b3a8eb9SGleb Smirnoff.Xr pfctl 8 ,
4693b3a8eb9SGleb Smirnoffoverriding the settings in
4703b3a8eb9SGleb Smirnoff.Nm .
4713b3a8eb9SGleb Smirnoff.It Ar set optimization
4723b3a8eb9SGleb SmirnoffOptimize state timeouts for one of the following network environments:
4733b3a8eb9SGleb Smirnoff.Pp
4743b3a8eb9SGleb Smirnoff.Bl -tag -width xxxx -compact
4753b3a8eb9SGleb Smirnoff.It Ar normal
4763b3a8eb9SGleb SmirnoffA normal network environment.
4773b3a8eb9SGleb SmirnoffSuitable for almost all networks.
4783b3a8eb9SGleb Smirnoff.It Ar high-latency
4793b3a8eb9SGleb SmirnoffA high-latency environment (such as a satellite connection).
4803b3a8eb9SGleb Smirnoff.It Ar satellite
4813b3a8eb9SGleb SmirnoffAlias for
4823b3a8eb9SGleb Smirnoff.Ar high-latency .
4833b3a8eb9SGleb Smirnoff.It Ar aggressive
4843b3a8eb9SGleb SmirnoffAggressively expire connections.
4853b3a8eb9SGleb SmirnoffThis can greatly reduce the memory usage of the firewall at the cost of
4863b3a8eb9SGleb Smirnoffdropping idle connections early.
4873b3a8eb9SGleb Smirnoff.It Ar conservative
4883b3a8eb9SGleb SmirnoffExtremely conservative settings.
4893b3a8eb9SGleb SmirnoffAvoid dropping legitimate connections at the
4903b3a8eb9SGleb Smirnoffexpense of greater memory utilization (possibly much greater on a busy
4913b3a8eb9SGleb Smirnoffnetwork) and slightly increased processor utilization.
4923b3a8eb9SGleb Smirnoff.El
4933b3a8eb9SGleb Smirnoff.Pp
4943b3a8eb9SGleb SmirnoffFor example:
4953b3a8eb9SGleb Smirnoff.Bd -literal -offset indent
4963b3a8eb9SGleb Smirnoffset optimization aggressive
4973b3a8eb9SGleb Smirnoff.Ed
4985ed470bdSKajetan Staszkiewicz.It Ar set reassemble yes | no Op Cm no-df
4995ed470bdSKajetan StaszkiewiczThe
5005ed470bdSKajetan Staszkiewicz.Cm reassemble
5015ed470bdSKajetan Staszkiewiczoption is used to enable or disable the reassembly of fragmented packets,
5025ed470bdSKajetan Staszkiewiczand can be set to
5035ed470bdSKajetan Staszkiewicz.Cm yes
5045ed470bdSKajetan Staszkiewiczor
5055ed470bdSKajetan Staszkiewicz.Cm no .
5065ed470bdSKajetan StaszkiewiczIf
5075ed470bdSKajetan Staszkiewicz.Cm no-df
5085ed470bdSKajetan Staszkiewiczis also specified, fragments with the
5095ed470bdSKajetan Staszkiewicz.Dq dont-fragment
5105ed470bdSKajetan Staszkiewiczbit set are reassembled too,
5115ed470bdSKajetan Staszkiewiczinstead of being dropped;
5125ed470bdSKajetan Staszkiewiczthe reassembled packet will have the
5135ed470bdSKajetan Staszkiewicz.Dq dont-fragment
5145ed470bdSKajetan Staszkiewiczbit cleared.
5155ed470bdSKajetan StaszkiewiczThe default value is
5165ed470bdSKajetan Staszkiewicz.Cm no .
5175ed470bdSKajetan Staszkiewicz.Pp
5185ed470bdSKajetan StaszkiewiczThis option is ignored if there are pre-FreeBSD 14
5195ed470bdSKajetan Staszkiewicz.Cm scrub
5205ed470bdSKajetan Staszkiewiczrules present.
5213b3a8eb9SGleb Smirnoff.It Ar set block-policy
5223b3a8eb9SGleb SmirnoffThe
5233b3a8eb9SGleb Smirnoff.Ar block-policy
5243b3a8eb9SGleb Smirnoffoption sets the default behaviour for the packet
5253b3a8eb9SGleb Smirnoff.Ar block
5263b3a8eb9SGleb Smirnoffaction:
5273b3a8eb9SGleb Smirnoff.Pp
5283b3a8eb9SGleb Smirnoff.Bl -tag -width xxxxxxxx -compact
5293b3a8eb9SGleb Smirnoff.It Ar drop
5303b3a8eb9SGleb SmirnoffPacket is silently dropped.
5313b3a8eb9SGleb Smirnoff.It Ar return
5323b3a8eb9SGleb SmirnoffA TCP RST is returned for blocked TCP packets,
53347d0c1feSKristof Provostan SCTP ABORT chunk is returned for blocked SCTP packets,
5343b3a8eb9SGleb Smirnoffan ICMP UNREACHABLE is returned for blocked UDP packets,
5353b3a8eb9SGleb Smirnoffand all other packets are silently dropped.
5363b3a8eb9SGleb Smirnoff.El
5373b3a8eb9SGleb Smirnoff.Pp
5383b3a8eb9SGleb SmirnoffFor example:
5393b3a8eb9SGleb Smirnoff.Bd -literal -offset indent
5403b3a8eb9SGleb Smirnoffset block-policy return
5413b3a8eb9SGleb Smirnoff.Ed
542150182e3SKristof Provost.It Ar set fail-policy
543150182e3SKristof ProvostThe
544150182e3SKristof Provost.Ar fail-policy
54530a85ff3SGordon Berglingoption sets the behaviour of rules which should pass a packet but were
54630a85ff3SGordon Berglingunable to do so.
54730a85ff3SGordon BerglingThis might happen when a nat or route-to rule uses an empty table as list
548150182e3SKristof Provostof targets or if a rule fails to create state or source node.
549150182e3SKristof ProvostThe following
550150182e3SKristof Provost.Ar block
551150182e3SKristof Provostactions are possible:
552150182e3SKristof Provost.Pp
553150182e3SKristof Provost.Bl -tag -width xxxxxxxx -compact
554150182e3SKristof Provost.It Ar drop
555150182e3SKristof ProvostIncoming packet is silently dropped.
556150182e3SKristof Provost.It Ar return
557150182e3SKristof ProvostIncoming packet is dropped and TCP RST is returned for TCP packets,
55847d0c1feSKristof Provostan SCTP ABORT chunk is returned for blocked SCTP packets,
559150182e3SKristof Provostan ICMP UNREACHABLE is returned for UDP packets,
560150182e3SKristof Provostand no response is sent for other packets.
561150182e3SKristof Provost.El
562150182e3SKristof Provost.Pp
563150182e3SKristof ProvostFor example:
564150182e3SKristof Provost.Bd -literal -offset indent
565150182e3SKristof Provostset fail-policy return
566150182e3SKristof Provost.Ed
5673b3a8eb9SGleb Smirnoff.It Ar set state-policy
5683b3a8eb9SGleb SmirnoffThe
5693b3a8eb9SGleb Smirnoff.Ar state-policy
5703b3a8eb9SGleb Smirnoffoption sets the default behaviour for states:
5713b3a8eb9SGleb Smirnoff.Pp
5723b3a8eb9SGleb Smirnoff.Bl -tag -width group-bound -compact
5733b3a8eb9SGleb Smirnoff.It Ar if-bound
5743b3a8eb9SGleb SmirnoffStates are bound to interface.
5753b3a8eb9SGleb Smirnoff.It Ar floating
5763b3a8eb9SGleb SmirnoffStates can match packets on any interfaces (the default).
5773b3a8eb9SGleb Smirnoff.El
5783b3a8eb9SGleb Smirnoff.Pp
5793b3a8eb9SGleb SmirnoffFor example:
5803b3a8eb9SGleb Smirnoff.Bd -literal -offset indent
5813b3a8eb9SGleb Smirnoffset state-policy if-bound
5823b3a8eb9SGleb Smirnoff.Ed
58320f015f0SKristof Provost.It Ar set syncookies never | always | adaptive
58420f015f0SKristof ProvostWhen
58520f015f0SKristof Provost.Cm syncookies
58620f015f0SKristof Provostare active, pf will answer each incoming TCP SYN with a syncookie SYNACK,
58720f015f0SKristof Provostwithout allocating any resources.
58820f015f0SKristof ProvostUpon reception of the client's ACK in response to the syncookie
58920f015f0SKristof ProvostSYNACK, pf will evaluate the ruleset and create state if the ruleset
59020f015f0SKristof Provostpermits it, complete the three way handshake with the target host and
59120f015f0SKristof Provostcontinue the connection with synproxy in place.
59220f015f0SKristof ProvostThis allows pf to be resilient against large synflood attacks which would
59320f015f0SKristof Provostrun the state table against its limits otherwise.
59420f015f0SKristof ProvostDue to the blind answers to every incoming SYN syncookies share the caveats of
59520f015f0SKristof Provostsynproxy, namely seemingly accepting connections that will be dropped later on.
59620f015f0SKristof Provost.Pp
59720f015f0SKristof Provost.Bl -tag -width adaptive -compact
59820f015f0SKristof Provost.It Cm never
59920f015f0SKristof Provostpf will never send syncookie SYNACKs (the default).
60020f015f0SKristof Provost.It Cm always
60120f015f0SKristof Provostpf will always send syncookie SYNACKs.
60220f015f0SKristof Provost.It Cm adaptive
60320f015f0SKristof Provostpf will enable syncookie mode when a given percentage of the state table
60420f015f0SKristof Provostis used up by half-open TCP connections, as in, those that saw the initial
60520f015f0SKristof ProvostSYN but didn't finish the three way handshake.
60620f015f0SKristof ProvostThe thresholds for entering and leaving syncookie mode can be specified using
60720f015f0SKristof Provost.Bd -literal -offset indent
60820f015f0SKristof Provostset syncookies adaptive (start 25%, end 12%)
60920f015f0SKristof Provost.Ed
61020f015f0SKristof Provost.El
6113b3a8eb9SGleb Smirnoff.It Ar set state-defaults
6123b3a8eb9SGleb SmirnoffThe
6133b3a8eb9SGleb Smirnoff.Ar state-defaults
6143b3a8eb9SGleb Smirnoffoption sets the state options for states created from rules
6153b3a8eb9SGleb Smirnoffwithout an explicit
6163b3a8eb9SGleb Smirnoff.Ar keep state .
6173b3a8eb9SGleb SmirnoffFor example:
6183b3a8eb9SGleb Smirnoff.Bd -literal -offset indent
619e65e2095SKristof Provostset state-defaults no-sync
6203b3a8eb9SGleb Smirnoff.Ed
6213b3a8eb9SGleb Smirnoff.It Ar set hostid
6223b3a8eb9SGleb SmirnoffThe 32-bit
6233b3a8eb9SGleb Smirnoff.Ar hostid
6243b3a8eb9SGleb Smirnoffidentifies this firewall's state table entries to other firewalls
6253b3a8eb9SGleb Smirnoffin a
6263b3a8eb9SGleb Smirnoff.Xr pfsync 4
6273b3a8eb9SGleb Smirnofffailover cluster.
6283b3a8eb9SGleb SmirnoffBy default the hostid is set to a pseudo-random value, however it may be
6293b3a8eb9SGleb Smirnoffdesirable to manually configure it, for example to more easily identify the
6303b3a8eb9SGleb Smirnoffsource of state table entries.
6313b3a8eb9SGleb Smirnoff.Bd -literal -offset indent
6323b3a8eb9SGleb Smirnoffset hostid 1
6333b3a8eb9SGleb Smirnoff.Ed
6343b3a8eb9SGleb Smirnoff.Pp
6353b3a8eb9SGleb SmirnoffThe hostid may be specified in either decimal or hexadecimal.
6363b3a8eb9SGleb Smirnoff.It Ar set require-order
6373b3a8eb9SGleb SmirnoffBy default
6383b3a8eb9SGleb Smirnoff.Xr pfctl 8
6393b3a8eb9SGleb Smirnoffenforces an ordering of the statement types in the ruleset to:
6403b3a8eb9SGleb Smirnoff.Em options ,
6413b3a8eb9SGleb Smirnoff.Em normalization ,
6423b3a8eb9SGleb Smirnoff.Em queueing ,
6433b3a8eb9SGleb Smirnoff.Em translation ,
6443b3a8eb9SGleb Smirnoff.Em filtering .
6453b3a8eb9SGleb SmirnoffSetting this option to
6463b3a8eb9SGleb Smirnoff.Ar no
6473b3a8eb9SGleb Smirnoffdisables this enforcement.
6483b3a8eb9SGleb SmirnoffThere may be non-trivial and non-obvious implications to an out of
6493b3a8eb9SGleb Smirnofforder ruleset.
6503b3a8eb9SGleb SmirnoffConsider carefully before disabling the order enforcement.
6513b3a8eb9SGleb Smirnoff.It Ar set fingerprints
6523b3a8eb9SGleb SmirnoffLoad fingerprints of known operating systems from the given filename.
6533b3a8eb9SGleb SmirnoffBy default fingerprints of known operating systems are automatically
6543b3a8eb9SGleb Smirnoffloaded from
6553b3a8eb9SGleb Smirnoff.Xr pf.os 5
6563b3a8eb9SGleb Smirnoffin
6573b3a8eb9SGleb Smirnoff.Pa /etc
6583b3a8eb9SGleb Smirnoffbut can be overridden via this option.
6593b3a8eb9SGleb SmirnoffSetting this option may leave a small period of time where the fingerprints
6603b3a8eb9SGleb Smirnoffreferenced by the currently active ruleset are inconsistent until the new
6613b3a8eb9SGleb Smirnoffruleset finishes loading.
6623b3a8eb9SGleb Smirnoff.Pp
6633b3a8eb9SGleb SmirnoffFor example:
6643b3a8eb9SGleb Smirnoff.Pp
6653b3a8eb9SGleb Smirnoff.Dl set fingerprints \&"/etc/pf.os.devel\&"
6663b3a8eb9SGleb Smirnoff.It Ar set skip on Aq Ar ifspec
6673b3a8eb9SGleb SmirnoffList interfaces for which packets should not be filtered.
6683b3a8eb9SGleb SmirnoffPackets passing in or out on such interfaces are passed as if pf was
6693b3a8eb9SGleb Smirnoffdisabled, i.e. pf does not process them in any way.
6703b3a8eb9SGleb SmirnoffThis can be useful on loopback and other virtual interfaces, when
6713b3a8eb9SGleb Smirnoffpacket filtering is not desired and can have unexpected effects.
6723b3a8eb9SGleb SmirnoffFor example:
6733b3a8eb9SGleb Smirnoff.Pp
6743b3a8eb9SGleb Smirnoff.Dl set skip on lo0
6753b3a8eb9SGleb Smirnoff.It Ar set debug
6763b3a8eb9SGleb SmirnoffSet the debug
6773b3a8eb9SGleb Smirnoff.Ar level
6783b3a8eb9SGleb Smirnoffto one of the following:
6793b3a8eb9SGleb Smirnoff.Pp
6803b3a8eb9SGleb Smirnoff.Bl -tag -width xxxxxxxxxxxx -compact
6813b3a8eb9SGleb Smirnoff.It Ar none
6823b3a8eb9SGleb SmirnoffDon't generate debug messages.
6833b3a8eb9SGleb Smirnoff.It Ar urgent
6843b3a8eb9SGleb SmirnoffGenerate debug messages only for serious errors.
6853b3a8eb9SGleb Smirnoff.It Ar misc
6863b3a8eb9SGleb SmirnoffGenerate debug messages for various errors.
6873b3a8eb9SGleb Smirnoff.It Ar loud
6883b3a8eb9SGleb SmirnoffGenerate debug messages for common conditions.
6893b3a8eb9SGleb Smirnoff.El
69042ec75f8SKristof Provost.It Ar set keepcounters
69142ec75f8SKristof ProvostPreserve rule counters across rule updates.
69242ec75f8SKristof ProvostUsually rule counters are reset to zero on every update of the ruleset.
69342ec75f8SKristof ProvostWith
69442ec75f8SKristof Provost.Ar keepcounters
69542ec75f8SKristof Provostset pf will attempt to find matching rules between old and new rulesets
69642ec75f8SKristof Provostand preserve the rule counters.
6973b3a8eb9SGleb Smirnoff.El
698ab2886f0SKristof Provost.Sh ETHERNET FILTERING
699ab2886f0SKristof Provost.Xr pf 4
700ab2886f0SKristof Provosthas the ability to
701ab2886f0SKristof Provost.Ar block
702ab2886f0SKristof Provostand
703ab2886f0SKristof Provost.Ar pass
704ab2886f0SKristof Provostpackets based on attributes of their Ethernet (layer 2) header.
705ab2886f0SKristof Provost.Pp
706ab2886f0SKristof ProvostFor each packet processed by the packet filter, the filter rules are
707ab2886f0SKristof Provostevaluated in sequential order, from first to last.
708ab2886f0SKristof ProvostThe last matching rule decides what action is taken.
709ab2886f0SKristof ProvostIf no rule matches the packet, the default action is to pass
710cdf415ecSKristof Provostthe packet without creating a state.
711ab2886f0SKristof Provost.Pp
712bdb82431SMaxim KonovalovThe following actions can be used in the filter:
713ab2886f0SKristof Provost.Bl -tag -width xxxx
714ab2886f0SKristof Provost.It Ar block
715ab2886f0SKristof ProvostThe packet is blocked.
716ab2886f0SKristof ProvostUnlike for layer 3 traffic the packet is always silently dropped.
717ab2886f0SKristof Provost.It Ar pass
718ab2886f0SKristof ProvostThe packet is passed;
719ab2886f0SKristof Provostno state is created for layer 2 traffic.
720ab2886f0SKristof Provost.El
721ab2886f0SKristof Provost.Sh PARAMETERS
722ab2886f0SKristof ProvostThe rule parameters specify the packets to which a rule applies.
723ab2886f0SKristof ProvostA packet always comes in on, or goes out through, one interface.
724ab2886f0SKristof ProvostMost parameters are optional.
725ab2886f0SKristof ProvostIf a parameter is specified, the rule only applies to packets with
726ab2886f0SKristof Provostmatching attributes.
727ab2886f0SKristof ProvostCertain parameters can be expressed as lists, in which case
728ab2886f0SKristof Provost.Xr pfctl 8
729ab2886f0SKristof Provostgenerates all needed rule combinations.
730ab2886f0SKristof Provost.Bl -tag -width xxxx
731ab2886f0SKristof Provost.It Ar in No or Ar out
732ab2886f0SKristof ProvostThis rule applies to incoming or outgoing packets.
733ab2886f0SKristof ProvostIf neither
734ab2886f0SKristof Provost.Ar in
735ab2886f0SKristof Provostnor
736ab2886f0SKristof Provost.Ar out
737ab2886f0SKristof Provostare specified, the rule will match packets in both directions.
738ab2886f0SKristof Provost.It Ar quick
739ab2886f0SKristof ProvostIf a packet matches a rule which has the
740ab2886f0SKristof Provost.Ar quick
741ab2886f0SKristof Provostoption set, this rule
742ab2886f0SKristof Provostis considered the last matching rule, and evaluation of subsequent rules
743ab2886f0SKristof Provostis skipped.
7444bfffd8cSKristof Provost.It Ar on Aq Ar ifspec
745ab2886f0SKristof ProvostThis rule applies only to packets coming in on, or going out through, this
746ab2886f0SKristof Provostparticular interface or interface group.
747ab2886f0SKristof ProvostFor more information on interface groups,
748ab2886f0SKristof Provostsee the
749ab2886f0SKristof Provost.Ic group
750ab2886f0SKristof Provostkeyword in
751ab2886f0SKristof Provost.Xr ifconfig 8 .
752618a8766SKristof Provost.Ar any
753618a8766SKristof Provostwill match any existing interface except loopback ones.
7548a8af942SKristof Provost.It Ar bridge-to Aq interface
7558a8af942SKristof ProvostPackets matching this rule will be sent out of the specified interface without
756bdb82431SMaxim Konovalovfurther processing.
757ab2886f0SKristof Provost.It Ar proto Aq Ar protocol
758ab2886f0SKristof ProvostThis rule applies only to packets of this protocol.
759ab2886f0SKristof ProvostNote that Ethernet protocol numbers are different from those used in
760ab2886f0SKristof Provost.Xr ip 4
761ab2886f0SKristof Provostand
762ab2886f0SKristof Provost.Xr ip6 4 .
763ab2886f0SKristof Provost.It Xo
764ab2886f0SKristof Provost.Ar from Aq Ar source
765ab2886f0SKristof Provost.Ar to Aq Ar dest
766ab2886f0SKristof Provost.Xc
767ab2886f0SKristof ProvostThis rule applies only to packets with the specified source and destination
768ab2886f0SKristof ProvostMAC addresses.
769ab2886f0SKristof Provost.It Xo Ar queue Aq Ar queue
770ab2886f0SKristof Provost.Xc
771ab2886f0SKristof ProvostPackets matching this rule will be assigned to the specified queue.
772ab2886f0SKristof ProvostSee
773ab2886f0SKristof Provost.Sx QUEUEING
774ab2886f0SKristof Provostfor setup details.
775ab2886f0SKristof Provost.Pp
776ab2886f0SKristof Provost.It Ar tag Aq Ar string
777ab2886f0SKristof ProvostPackets matching this rule will be tagged with the
778ab2886f0SKristof Provostspecified string.
779ab2886f0SKristof ProvostThe tag acts as an internal marker that can be used to
780ab2886f0SKristof Provostidentify these packets later on.
781ab2886f0SKristof ProvostThis can be used, for example, to provide trust between
782ab2886f0SKristof Provostinterfaces and to determine if packets have been
783ab2886f0SKristof Provostprocessed by translation rules.
784ab2886f0SKristof ProvostTags are
785ab2886f0SKristof Provost.Qq sticky ,
786ab2886f0SKristof Provostmeaning that the packet will be tagged even if the rule
787ab2886f0SKristof Provostis not the last matching rule.
788ab2886f0SKristof ProvostFurther matching rules can replace the tag with a
789ab2886f0SKristof Provostnew one but will not remove a previously applied tag.
790ab2886f0SKristof ProvostA packet is only ever assigned one tag at a time.
7911f61367fSKristof Provost.It Ar tagged Aq Ar string
7921f61367fSKristof ProvostUsed to specify that packets must already be tagged with the given tag in order
7931f61367fSKristof Provostto match the rule.
7941f61367fSKristof ProvostInverse tag matching can also be done by specifying the !  operator before the
7951f61367fSKristof Provosttagged keyword.
7965ed470bdSKajetan Staszkiewicz.El
7973b3a8eb9SGleb Smirnoff.Sh TRAFFIC NORMALIZATION
7985ed470bdSKajetan StaszkiewiczTraffic normalization is a broad umbrella term
7995ed470bdSKajetan Staszkiewiczfor aspects of the packet filter which deal with
8005ed470bdSKajetan Staszkiewiczverifying packets, packet fragments, spoofed traffic,
8015ed470bdSKajetan Staszkiewiczand other irregularities.
8025ed470bdSKajetan Staszkiewicz.Ss Scrub
8035ed470bdSKajetan StaszkiewiczScrub involves sanitising packet content in such a way
8045ed470bdSKajetan Staszkiewiczthat there are no ambiguities in packet interpretation on the receiving side.
8055ed470bdSKajetan StaszkiewiczIt is invoked with the
8065ed470bdSKajetan Staszkiewicz.Cm scrub
8075ed470bdSKajetan Staszkiewiczoption, added to filter rules.
8083b3a8eb9SGleb Smirnoff.Pp
8095ed470bdSKajetan StaszkiewiczParameters are specified enclosed in parentheses.
8105ed470bdSKajetan StaszkiewiczAt least one of the following parameters must be specified:
8113b3a8eb9SGleb Smirnoff.Bl -tag -width xxxx
8123b3a8eb9SGleb Smirnoff.It Ar no-df
8133b3a8eb9SGleb SmirnoffClears the
8143b3a8eb9SGleb Smirnoff.Ar dont-fragment
8153b3a8eb9SGleb Smirnoffbit from a matching IP packet.
8163b3a8eb9SGleb SmirnoffSome operating systems are known to generate fragmented packets with the
8173b3a8eb9SGleb Smirnoff.Ar dont-fragment
8183b3a8eb9SGleb Smirnoffbit set.
8193b3a8eb9SGleb SmirnoffThis is particularly true with NFS.
8203b3a8eb9SGleb Smirnoff.Ar Scrub
8213b3a8eb9SGleb Smirnoffwill drop such fragmented
8223b3a8eb9SGleb Smirnoff.Ar dont-fragment
8233b3a8eb9SGleb Smirnoffpackets unless
8243b3a8eb9SGleb Smirnoff.Ar no-df
8253b3a8eb9SGleb Smirnoffis specified.
8263b3a8eb9SGleb Smirnoff.Pp
8273b3a8eb9SGleb SmirnoffUnfortunately some operating systems also generate their
8283b3a8eb9SGleb Smirnoff.Ar dont-fragment
8293b3a8eb9SGleb Smirnoffpackets with a zero IP identification field.
8303b3a8eb9SGleb SmirnoffClearing the
8313b3a8eb9SGleb Smirnoff.Ar dont-fragment
8323b3a8eb9SGleb Smirnoffbit on packets with a zero IP ID may cause deleterious results if an
8333b3a8eb9SGleb Smirnoffupstream router later fragments the packet.
8343b3a8eb9SGleb SmirnoffUsing the
8353b3a8eb9SGleb Smirnoff.Ar random-id
8363b3a8eb9SGleb Smirnoffmodifier (see below) is recommended in combination with the
8373b3a8eb9SGleb Smirnoff.Ar no-df
8383b3a8eb9SGleb Smirnoffmodifier to ensure unique IP identifiers.
8393b3a8eb9SGleb Smirnoff.It Ar min-ttl Aq Ar number
8403b3a8eb9SGleb SmirnoffEnforces a minimum TTL for matching IP packets.
8413b3a8eb9SGleb Smirnoff.It Ar max-mss Aq Ar number
8423b3a8eb9SGleb SmirnoffEnforces a maximum MSS for matching TCP packets.
8433b3a8eb9SGleb Smirnoff.It Xo Ar set-tos Aq Ar string
8443b3a8eb9SGleb Smirnoff.No \*(Ba Aq Ar number
8453b3a8eb9SGleb Smirnoff.Xc
8463b3a8eb9SGleb SmirnoffEnforces a
8473b3a8eb9SGleb Smirnoff.Em TOS
8483b3a8eb9SGleb Smirnofffor matching IP packets.
8493b3a8eb9SGleb Smirnoff.Em TOS
8503b3a8eb9SGleb Smirnoffmay be
8513b3a8eb9SGleb Smirnoffgiven as one of
8521f495578SKristof Provost.Ar critical ,
8531f495578SKristof Provost.Ar inetcontrol ,
8543b3a8eb9SGleb Smirnoff.Ar lowdelay ,
8551f495578SKristof Provost.Ar netcontrol ,
8563b3a8eb9SGleb Smirnoff.Ar throughput ,
8573b3a8eb9SGleb Smirnoff.Ar reliability ,
8581f495578SKristof Provostor one of the DiffServ Code Points:
8591f495578SKristof Provost.Ar ef ,
860b4e3f3c2SKristof Provost.Ar va ,
8611f495578SKristof Provost.Ar af11 No ... Ar af43 ,
8621f495578SKristof Provost.Ar cs0 No ... Ar cs7 ;
8633b3a8eb9SGleb Smirnoffor as either hex or decimal.
8643b3a8eb9SGleb Smirnoff.It Ar random-id
8653b3a8eb9SGleb SmirnoffReplaces the IP identification field with random values to compensate
8663b3a8eb9SGleb Smirnofffor predictable values generated by many hosts.
8673b3a8eb9SGleb SmirnoffThis option only applies to packets that are not fragmented
8683b3a8eb9SGleb Smirnoffafter the optional fragment reassembly.
8693b3a8eb9SGleb Smirnoff.It Ar reassemble tcp
8703b3a8eb9SGleb SmirnoffStatefully normalizes TCP connections.
8713b3a8eb9SGleb Smirnoff.Ar reassemble tcp
8723b3a8eb9SGleb Smirnoffperforms the following normalizations:
8733b3a8eb9SGleb Smirnoff.Pp
8743b3a8eb9SGleb Smirnoff.Bl -tag -width timeout -compact
8753b3a8eb9SGleb Smirnoff.It ttl
8763b3a8eb9SGleb SmirnoffNeither side of the connection is allowed to reduce their IP TTL.
8773b3a8eb9SGleb SmirnoffAn attacker may send a packet such that it reaches the firewall, affects
8783b3a8eb9SGleb Smirnoffthe firewall state, and expires before reaching the destination host.
8793b3a8eb9SGleb Smirnoff.Ar reassemble tcp
8803b3a8eb9SGleb Smirnoffwill raise the TTL of all packets back up to the highest value seen on
8813b3a8eb9SGleb Smirnoffthe connection.
8823b3a8eb9SGleb Smirnoff.It timestamp modulation
8833b3a8eb9SGleb SmirnoffModern TCP stacks will send a timestamp on every TCP packet and echo
8843b3a8eb9SGleb Smirnoffthe other endpoint's timestamp back to them.
8853b3a8eb9SGleb SmirnoffMany operating systems will merely start the timestamp at zero when
8863b3a8eb9SGleb Smirnofffirst booted, and increment it several times a second.
8873b3a8eb9SGleb SmirnoffThe uptime of the host can be deduced by reading the timestamp and multiplying
8883b3a8eb9SGleb Smirnoffby a constant.
8893b3a8eb9SGleb SmirnoffAlso observing several different timestamps can be used to count hosts
8903b3a8eb9SGleb Smirnoffbehind a NAT device.
8913b3a8eb9SGleb SmirnoffAnd spoofing TCP packets into a connection requires knowing or guessing
8923b3a8eb9SGleb Smirnoffvalid timestamps.
8933b3a8eb9SGleb SmirnoffTimestamps merely need to be monotonically increasing and not derived off a
8943b3a8eb9SGleb Smirnoffguessable base time.
8953b3a8eb9SGleb Smirnoff.Ar reassemble tcp
8963b3a8eb9SGleb Smirnoffwill cause
8973b3a8eb9SGleb Smirnoff.Ar scrub
8983b3a8eb9SGleb Smirnoffto modulate the TCP timestamps with a random number.
8993b3a8eb9SGleb Smirnoff.It extended PAWS checks
9003b3a8eb9SGleb SmirnoffThere is a problem with TCP on long fat pipes, in that a packet might get
9013b3a8eb9SGleb Smirnoffdelayed for longer than it takes the connection to wrap its 32-bit sequence
9023b3a8eb9SGleb Smirnoffspace.
9033b3a8eb9SGleb SmirnoffIn such an occurrence, the old packet would be indistinguishable from a
9043b3a8eb9SGleb Smirnoffnew packet and would be accepted as such.
9053b3a8eb9SGleb SmirnoffThe solution to this is called PAWS: Protection Against Wrapped Sequence
9063b3a8eb9SGleb Smirnoffnumbers.
9073b3a8eb9SGleb SmirnoffIt protects against it by making sure the timestamp on each packet does
9083b3a8eb9SGleb Smirnoffnot go backwards.
9093b3a8eb9SGleb Smirnoff.Ar reassemble tcp
9103b3a8eb9SGleb Smirnoffalso makes sure the timestamp on the packet does not go forward more
9113b3a8eb9SGleb Smirnoffthan the RFC allows.
9123b3a8eb9SGleb SmirnoffBy doing this,
9133b3a8eb9SGleb Smirnoff.Xr pf 4
9143b3a8eb9SGleb Smirnoffartificially extends the security of TCP sequence numbers by 10 to 18
9153b3a8eb9SGleb Smirnoffbits when the host uses appropriately randomized timestamps, since a
9163b3a8eb9SGleb Smirnoffblind attacker would have to guess the timestamp as well.
9173b3a8eb9SGleb Smirnoff.El
9183b3a8eb9SGleb Smirnoff.El
9193b3a8eb9SGleb Smirnoff.Pp
9203b3a8eb9SGleb SmirnoffFor example,
9213b3a8eb9SGleb Smirnoff.Bd -literal -offset indent
9225ed470bdSKajetan Staszkiewiczmatch in all scrub (no-df random-id max-mss 1440)
9235ed470bdSKajetan Staszkiewicz.Ed
9245ed470bdSKajetan Staszkiewicz.Ss Scrub ruleset (pre-FreeBSD 14)
9255ed470bdSKajetan StaszkiewiczIn order to maintain compatibility with older releases of FreeBSD
9265ed470bdSKajetan Staszkiewicz.Ar scrub
9275ed470bdSKajetan Staszkiewiczrules can also be specified in their own ruleset.
9285ed470bdSKajetan StaszkiewiczIn such case they are invoked with the
9295ed470bdSKajetan Staszkiewicz.Ar scrub
9305ed470bdSKajetan Staszkiewiczdirective.
9315ed470bdSKajetan StaszkiewiczIf there are such rules present they determine packet reassembly behaviour.
9325ed470bdSKajetan StaszkiewiczWhen no such rules are present the option
9335ed470bdSKajetan Staszkiewicz.Ar set reassembly
9345ed470bdSKajetan Staszkiewicztakes precedence.
9355ed470bdSKajetan StaszkiewiczThe
9365ed470bdSKajetan Staszkiewicz.Ar scrub
9375ed470bdSKajetan Staszkiewiczrules can take all parameters specified above for a
9385ed470bdSKajetan Staszkiewicz.Ar scrub
9395ed470bdSKajetan Staszkiewiczoption of filter rules and 2 more parameters controlling fragment reassembly:
9405ed470bdSKajetan Staszkiewicz.Bl -tag -width xxxx
9415ed470bdSKajetan Staszkiewicz.It Ar fragment reassemble
9425ed470bdSKajetan StaszkiewiczUsing
9435ed470bdSKajetan Staszkiewicz.Ar scrub
9445ed470bdSKajetan Staszkiewiczrules, fragments can be reassembled by normalization.
9455ed470bdSKajetan StaszkiewiczIn this case, fragments are buffered until they form a complete
9465ed470bdSKajetan Staszkiewiczpacket, and only the completed packet is passed on to the filter.
9475ed470bdSKajetan StaszkiewiczThe advantage is that filter rules have to deal only with complete
9485ed470bdSKajetan Staszkiewiczpackets, and can ignore fragments.
9495ed470bdSKajetan StaszkiewiczThe drawback of caching fragments is the additional memory cost.
9505ed470bdSKajetan StaszkiewiczThis is the default behaviour unless no fragment reassemble is specified.
9515ed470bdSKajetan Staszkiewicz.It Ar no fragment reassemble
9525ed470bdSKajetan StaszkiewiczDo not reassemble fragments.
9535ed470bdSKajetan Staszkiewicz.El
9545ed470bdSKajetan Staszkiewicz.Pp
9555ed470bdSKajetan StaszkiewiczFor example,
9565ed470bdSKajetan Staszkiewicz.Bd -literal -offset indent
9573b3a8eb9SGleb Smirnoffscrub in on $ext_if all fragment reassemble
9583b3a8eb9SGleb Smirnoff.Ed
9593b3a8eb9SGleb Smirnoff.Pp
9603b3a8eb9SGleb SmirnoffThe
9613b3a8eb9SGleb Smirnoff.Ar no
9623b3a8eb9SGleb Smirnoffoption prefixed to a scrub rule causes matching packets to remain unscrubbed,
9633b3a8eb9SGleb Smirnoffmuch in the same way as
9643b3a8eb9SGleb Smirnoff.Ar drop quick
9653b3a8eb9SGleb Smirnoffworks in the packet filter (see below).
9663b3a8eb9SGleb SmirnoffThis mechanism should be used when it is necessary to exclude specific packets
9673b3a8eb9SGleb Smirnofffrom broader scrub rules.
9685ed470bdSKajetan Staszkiewicz.Pp
9695ed470bdSKajetan Staszkiewicz.Ar scrub
9705ed470bdSKajetan Staszkiewiczrules in the
9715ed470bdSKajetan Staszkiewicz.Ar scrub
9725ed470bdSKajetan Staszkiewiczruleset are evaluated for every packet before stateful filtering.
9735ed470bdSKajetan StaszkiewiczThis means excessive usage of them will cause performance penalty.
9745ed470bdSKajetan Staszkiewicz.Ar scrub reassemble tcp
9755ed470bdSKajetan Staszkiewiczrules must not have the direction (in/out) specified.
97600a7a05bSKristof Provost.Sh QUEUEING with ALTQ
9773b3a8eb9SGleb SmirnoffThe ALTQ system is currently not available in the GENERIC kernel nor as
9783b3a8eb9SGleb Smirnoffloadable modules.
9793b3a8eb9SGleb SmirnoffIn order to use the herein after called queueing options one has to use a
9803b3a8eb9SGleb Smirnoffcustom built kernel.
9813b3a8eb9SGleb SmirnoffPlease refer to
9823b3a8eb9SGleb Smirnoff.Xr altq 4
9833b3a8eb9SGleb Smirnoffto learn about the related kernel options.
9843b3a8eb9SGleb Smirnoff.Pp
9853b3a8eb9SGleb SmirnoffPackets can be assigned to queues for the purpose of bandwidth
9863b3a8eb9SGleb Smirnoffcontrol.
9873b3a8eb9SGleb SmirnoffAt least two declarations are required to configure queues, and later
9883b3a8eb9SGleb Smirnoffany packet filtering rule can reference the defined queues by name.
9893b3a8eb9SGleb SmirnoffDuring the filtering component of
9903b3a8eb9SGleb Smirnoff.Nm pf.conf ,
9913b3a8eb9SGleb Smirnoffthe last referenced
9923b3a8eb9SGleb Smirnoff.Ar queue
9933b3a8eb9SGleb Smirnoffname is where any packets from
9943b3a8eb9SGleb Smirnoff.Ar pass
9953b3a8eb9SGleb Smirnoffrules will be queued, while for
9963b3a8eb9SGleb Smirnoff.Ar block
9973b3a8eb9SGleb Smirnoffrules it specifies where any resulting ICMP or TCP RST
9983b3a8eb9SGleb Smirnoffpackets should be queued.
9993b3a8eb9SGleb SmirnoffThe
10003b3a8eb9SGleb Smirnoff.Ar scheduler
10013b3a8eb9SGleb Smirnoffdefines the algorithm used to decide which packets get delayed, dropped, or
10023b3a8eb9SGleb Smirnoffsent out immediately.
10033b3a8eb9SGleb SmirnoffThere are three
10043b3a8eb9SGleb Smirnoff.Ar schedulers
10053b3a8eb9SGleb Smirnoffcurrently supported.
10063b3a8eb9SGleb Smirnoff.Bl -tag -width xxxx
10073b3a8eb9SGleb Smirnoff.It Ar cbq
10083b3a8eb9SGleb SmirnoffClass Based Queueing.
10093b3a8eb9SGleb Smirnoff.Ar Queues
10103b3a8eb9SGleb Smirnoffattached to an interface build a tree, thus each
10113b3a8eb9SGleb Smirnoff.Ar queue
10123b3a8eb9SGleb Smirnoffcan have further child
10133b3a8eb9SGleb Smirnoff.Ar queues .
10143b3a8eb9SGleb SmirnoffEach queue can have a
10153b3a8eb9SGleb Smirnoff.Ar priority
10163b3a8eb9SGleb Smirnoffand a
10173b3a8eb9SGleb Smirnoff.Ar bandwidth
10183b3a8eb9SGleb Smirnoffassigned.
10193b3a8eb9SGleb Smirnoff.Ar Priority
10203b3a8eb9SGleb Smirnoffmainly controls the time packets take to get sent out, while
10213b3a8eb9SGleb Smirnoff.Ar bandwidth
10223b3a8eb9SGleb Smirnoffhas primarily effects on throughput.
10233b3a8eb9SGleb Smirnoff.Ar cbq
10243b3a8eb9SGleb Smirnoffachieves both partitioning and sharing of link bandwidth
10253b3a8eb9SGleb Smirnoffby hierarchically structured classes.
10263b3a8eb9SGleb SmirnoffEach class has its own
10273b3a8eb9SGleb Smirnoff.Ar queue
10283b3a8eb9SGleb Smirnoffand is assigned its share of
10293b3a8eb9SGleb Smirnoff.Ar bandwidth .
10303b3a8eb9SGleb SmirnoffA child class can borrow bandwidth from its parent class
10313b3a8eb9SGleb Smirnoffas long as excess bandwidth is available
10323b3a8eb9SGleb Smirnoff(see the option
10333b3a8eb9SGleb Smirnoff.Ar borrow ,
10343b3a8eb9SGleb Smirnoffbelow).
10353b3a8eb9SGleb Smirnoff.It Ar priq
10363b3a8eb9SGleb SmirnoffPriority Queueing.
10373b3a8eb9SGleb Smirnoff.Ar Queues
10383b3a8eb9SGleb Smirnoffare flat attached to the interface, thus,
10393b3a8eb9SGleb Smirnoff.Ar queues
10403b3a8eb9SGleb Smirnoffcannot have further child
10413b3a8eb9SGleb Smirnoff.Ar queues .
10423b3a8eb9SGleb SmirnoffEach
10433b3a8eb9SGleb Smirnoff.Ar queue
10443b3a8eb9SGleb Smirnoffhas a unique
10453b3a8eb9SGleb Smirnoff.Ar priority
10463b3a8eb9SGleb Smirnoffassigned, ranging from 0 to 15.
10473b3a8eb9SGleb SmirnoffPackets in the
10483b3a8eb9SGleb Smirnoff.Ar queue
10493b3a8eb9SGleb Smirnoffwith the highest
10503b3a8eb9SGleb Smirnoff.Ar priority
10513b3a8eb9SGleb Smirnoffare processed first.
10523b3a8eb9SGleb Smirnoff.It Ar hfsc
10533b3a8eb9SGleb SmirnoffHierarchical Fair Service Curve.
10543b3a8eb9SGleb Smirnoff.Ar Queues
10553b3a8eb9SGleb Smirnoffattached to an interface build a tree, thus each
10563b3a8eb9SGleb Smirnoff.Ar queue
10573b3a8eb9SGleb Smirnoffcan have further child
10583b3a8eb9SGleb Smirnoff.Ar queues .
10593b3a8eb9SGleb SmirnoffEach queue can have a
10603b3a8eb9SGleb Smirnoff.Ar priority
10613b3a8eb9SGleb Smirnoffand a
10623b3a8eb9SGleb Smirnoff.Ar bandwidth
10633b3a8eb9SGleb Smirnoffassigned.
10643b3a8eb9SGleb Smirnoff.Ar Priority
10653b3a8eb9SGleb Smirnoffmainly controls the time packets take to get sent out, while
10663b3a8eb9SGleb Smirnoff.Ar bandwidth
10673b3a8eb9SGleb Smirnoffprimarily affects throughput.
10683b3a8eb9SGleb Smirnoff.Ar hfsc
10693b3a8eb9SGleb Smirnoffsupports both link-sharing and guaranteed real-time services.
10703b3a8eb9SGleb SmirnoffIt employs a service curve based QoS model,
10713b3a8eb9SGleb Smirnoffand its unique feature is an ability to decouple
10723b3a8eb9SGleb Smirnoff.Ar delay
10733b3a8eb9SGleb Smirnoffand
10743b3a8eb9SGleb Smirnoff.Ar bandwidth
10753b3a8eb9SGleb Smirnoffallocation.
10763b3a8eb9SGleb Smirnoff.El
10773b3a8eb9SGleb Smirnoff.Pp
10783b3a8eb9SGleb SmirnoffThe interfaces on which queueing should be activated are declared using
10793b3a8eb9SGleb Smirnoffthe
10803b3a8eb9SGleb Smirnoff.Ar altq on
10813b3a8eb9SGleb Smirnoffdeclaration.
10823b3a8eb9SGleb Smirnoff.Ar altq on
10833b3a8eb9SGleb Smirnoffhas the following keywords:
10843b3a8eb9SGleb Smirnoff.Bl -tag -width xxxx
10853b3a8eb9SGleb Smirnoff.It Aq Ar interface
10863b3a8eb9SGleb SmirnoffQueueing is enabled on the named interface.
10873b3a8eb9SGleb Smirnoff.It Aq Ar scheduler
10883b3a8eb9SGleb SmirnoffSpecifies which queueing scheduler to use.
10893b3a8eb9SGleb SmirnoffCurrently supported values
10903b3a8eb9SGleb Smirnoffare
10913b3a8eb9SGleb Smirnoff.Ar cbq
10923b3a8eb9SGleb Smirnofffor Class Based Queueing,
10933b3a8eb9SGleb Smirnoff.Ar priq
10943b3a8eb9SGleb Smirnofffor Priority Queueing and
10953b3a8eb9SGleb Smirnoff.Ar hfsc
10963b3a8eb9SGleb Smirnofffor the Hierarchical Fair Service Curve scheduler.
10973b3a8eb9SGleb Smirnoff.It Ar bandwidth Aq Ar bw
10983b3a8eb9SGleb SmirnoffThe maximum bitrate for all queues on an
10993b3a8eb9SGleb Smirnoffinterface may be specified using the
11003b3a8eb9SGleb Smirnoff.Ar bandwidth
11013b3a8eb9SGleb Smirnoffkeyword.
11023b3a8eb9SGleb SmirnoffThe value can be specified as an absolute value or as a
11033b3a8eb9SGleb Smirnoffpercentage of the interface bandwidth.
11043b3a8eb9SGleb SmirnoffWhen using an absolute value, the suffixes
11053b3a8eb9SGleb Smirnoff.Ar b ,
11063b3a8eb9SGleb Smirnoff.Ar Kb ,
11073b3a8eb9SGleb Smirnoff.Ar Mb ,
11083b3a8eb9SGleb Smirnoffand
11093b3a8eb9SGleb Smirnoff.Ar Gb
11103b3a8eb9SGleb Smirnoffare used to represent bits, kilobits, megabits, and
11113b3a8eb9SGleb Smirnoffgigabits per second, respectively.
11123b3a8eb9SGleb SmirnoffThe value must not exceed the interface bandwidth.
11133b3a8eb9SGleb SmirnoffIf
11143b3a8eb9SGleb Smirnoff.Ar bandwidth
11153b3a8eb9SGleb Smirnoffis not specified, the interface bandwidth is used
11163b3a8eb9SGleb Smirnoff(but take note that some interfaces do not know their bandwidth,
11173b3a8eb9SGleb Smirnoffor can adapt their bandwidth rates).
11183b3a8eb9SGleb Smirnoff.It Ar qlimit Aq Ar limit
11193b3a8eb9SGleb SmirnoffThe maximum number of packets held in the queue.
11203b3a8eb9SGleb SmirnoffThe default is 50.
11213b3a8eb9SGleb Smirnoff.It Ar tbrsize Aq Ar size
11223b3a8eb9SGleb SmirnoffAdjusts the size, in bytes, of the token bucket regulator.
11233b3a8eb9SGleb SmirnoffIf not specified, heuristics based on the
11243b3a8eb9SGleb Smirnoffinterface bandwidth are used to determine the size.
11253b3a8eb9SGleb Smirnoff.It Ar queue Aq Ar list
11263b3a8eb9SGleb SmirnoffDefines a list of subqueues to create on an interface.
11273b3a8eb9SGleb Smirnoff.El
11283b3a8eb9SGleb Smirnoff.Pp
11293b3a8eb9SGleb SmirnoffIn the following example, the interface dc0
11303b3a8eb9SGleb Smirnoffshould queue up to 5Mbps in four second-level queues using
11313b3a8eb9SGleb SmirnoffClass Based Queueing.
11323b3a8eb9SGleb SmirnoffThose four queues will be shown in a later example.
11333b3a8eb9SGleb Smirnoff.Bd -literal -offset indent
11343b3a8eb9SGleb Smirnoffaltq on dc0 cbq bandwidth 5Mb queue { std, http, mail, ssh }
11353b3a8eb9SGleb Smirnoff.Ed
11363b3a8eb9SGleb Smirnoff.Pp
11373b3a8eb9SGleb SmirnoffOnce interfaces are activated for queueing using the
11383b3a8eb9SGleb Smirnoff.Ar altq
11393b3a8eb9SGleb Smirnoffdirective, a sequence of
11403b3a8eb9SGleb Smirnoff.Ar queue
11413b3a8eb9SGleb Smirnoffdirectives may be defined.
11423b3a8eb9SGleb SmirnoffThe name associated with a
11433b3a8eb9SGleb Smirnoff.Ar queue
11443b3a8eb9SGleb Smirnoffmust match a queue defined in the
11453b3a8eb9SGleb Smirnoff.Ar altq
11463b3a8eb9SGleb Smirnoffdirective (e.g. mail), or, except for the
11473b3a8eb9SGleb Smirnoff.Ar priq
11483b3a8eb9SGleb Smirnoff.Ar scheduler ,
11493b3a8eb9SGleb Smirnoffin a parent
11503b3a8eb9SGleb Smirnoff.Ar queue
11513b3a8eb9SGleb Smirnoffdeclaration.
11523b3a8eb9SGleb SmirnoffThe following keywords can be used:
11533b3a8eb9SGleb Smirnoff.Bl -tag -width xxxx
11543b3a8eb9SGleb Smirnoff.It Ar on Aq Ar interface
11553b3a8eb9SGleb SmirnoffSpecifies the interface the queue operates on.
11563b3a8eb9SGleb SmirnoffIf not given, it operates on all matching interfaces.
11573b3a8eb9SGleb Smirnoff.It Ar bandwidth Aq Ar bw
11583b3a8eb9SGleb SmirnoffSpecifies the maximum bitrate to be processed by the queue.
11593b3a8eb9SGleb SmirnoffThis value must not exceed the value of the parent
11603b3a8eb9SGleb Smirnoff.Ar queue
11613b3a8eb9SGleb Smirnoffand can be specified as an absolute value or a percentage of the parent
11623b3a8eb9SGleb Smirnoffqueue's bandwidth.
11633b3a8eb9SGleb SmirnoffIf not specified, defaults to 100% of the parent queue's bandwidth.
11643b3a8eb9SGleb SmirnoffThe
11653b3a8eb9SGleb Smirnoff.Ar priq
11663b3a8eb9SGleb Smirnoffscheduler does not support bandwidth specification.
11673b3a8eb9SGleb Smirnoff.It Ar priority Aq Ar level
11683b3a8eb9SGleb SmirnoffBetween queues a priority level can be set.
11693b3a8eb9SGleb SmirnoffFor
11703b3a8eb9SGleb Smirnoff.Ar cbq
11713b3a8eb9SGleb Smirnoffand
11723b3a8eb9SGleb Smirnoff.Ar hfsc ,
11733b3a8eb9SGleb Smirnoffthe range is 0 to 7 and for
11743b3a8eb9SGleb Smirnoff.Ar priq ,
11753b3a8eb9SGleb Smirnoffthe range is 0 to 15.
11763b3a8eb9SGleb SmirnoffThe default for all is 1.
11773b3a8eb9SGleb Smirnoff.Ar Priq
11783b3a8eb9SGleb Smirnoffqueues with a higher priority are always served first.
11793b3a8eb9SGleb Smirnoff.Ar Cbq
11803b3a8eb9SGleb Smirnoffand
11813b3a8eb9SGleb Smirnoff.Ar Hfsc
11823b3a8eb9SGleb Smirnoffqueues with a higher priority are preferred in the case of overload.
11833b3a8eb9SGleb Smirnoff.It Ar qlimit Aq Ar limit
11843b3a8eb9SGleb SmirnoffThe maximum number of packets held in the queue.
11853b3a8eb9SGleb SmirnoffThe default is 50.
11863b3a8eb9SGleb Smirnoff.El
11873b3a8eb9SGleb Smirnoff.Pp
11883b3a8eb9SGleb SmirnoffThe
11893b3a8eb9SGleb Smirnoff.Ar scheduler
11903b3a8eb9SGleb Smirnoffcan get additional parameters with
11913b3a8eb9SGleb Smirnoff.Xo Aq Ar scheduler
11923b3a8eb9SGleb Smirnoff.Pf ( Aq Ar parameters ) .
11933b3a8eb9SGleb Smirnoff.Xc
11943b3a8eb9SGleb SmirnoffParameters are as follows:
11953b3a8eb9SGleb Smirnoff.Bl -tag -width Fl
11963b3a8eb9SGleb Smirnoff.It Ar default
11973b3a8eb9SGleb SmirnoffPackets not matched by another queue are assigned to this one.
11983b3a8eb9SGleb SmirnoffExactly one default queue is required.
11993b3a8eb9SGleb Smirnoff.It Ar red
12003b3a8eb9SGleb SmirnoffEnable RED (Random Early Detection) on this queue.
12013b3a8eb9SGleb SmirnoffRED drops packets with a probability proportional to the average
12023b3a8eb9SGleb Smirnoffqueue length.
12033b3a8eb9SGleb Smirnoff.It Ar rio
12043b3a8eb9SGleb SmirnoffEnables RIO on this queue.
12053b3a8eb9SGleb SmirnoffRIO is RED with IN/OUT, thus running
12063b3a8eb9SGleb SmirnoffRED two times more than RIO would achieve the same effect.
12073b3a8eb9SGleb SmirnoffRIO is currently not supported in the GENERIC kernel.
12083b3a8eb9SGleb Smirnoff.It Ar ecn
12093b3a8eb9SGleb SmirnoffEnables ECN (Explicit Congestion Notification) on this queue.
12103b3a8eb9SGleb SmirnoffECN implies RED.
12113b3a8eb9SGleb Smirnoff.El
12123b3a8eb9SGleb Smirnoff.Pp
12133b3a8eb9SGleb SmirnoffThe
12143b3a8eb9SGleb Smirnoff.Ar cbq
12153b3a8eb9SGleb Smirnoff.Ar scheduler
12163b3a8eb9SGleb Smirnoffsupports an additional option:
12173b3a8eb9SGleb Smirnoff.Bl -tag -width Fl
12183b3a8eb9SGleb Smirnoff.It Ar borrow
12193b3a8eb9SGleb SmirnoffThe queue can borrow bandwidth from the parent.
12203b3a8eb9SGleb Smirnoff.El
12213b3a8eb9SGleb Smirnoff.Pp
12223b3a8eb9SGleb SmirnoffThe
12233b3a8eb9SGleb Smirnoff.Ar hfsc
12243b3a8eb9SGleb Smirnoff.Ar scheduler
12253b3a8eb9SGleb Smirnoffsupports some additional options:
12263b3a8eb9SGleb Smirnoff.Bl -tag -width Fl
12273b3a8eb9SGleb Smirnoff.It Ar realtime Aq Ar sc
12283b3a8eb9SGleb SmirnoffThe minimum required bandwidth for the queue.
12293b3a8eb9SGleb Smirnoff.It Ar upperlimit Aq Ar sc
12303b3a8eb9SGleb SmirnoffThe maximum allowed bandwidth for the queue.
12313b3a8eb9SGleb Smirnoff.It Ar linkshare Aq Ar sc
12323b3a8eb9SGleb SmirnoffThe bandwidth share of a backlogged queue.
12333b3a8eb9SGleb Smirnoff.El
12343b3a8eb9SGleb Smirnoff.Pp
12353b3a8eb9SGleb Smirnoff.Aq Ar sc
12363b3a8eb9SGleb Smirnoffis an acronym for
12373b3a8eb9SGleb Smirnoff.Ar service curve .
12383b3a8eb9SGleb Smirnoff.Pp
12393b3a8eb9SGleb SmirnoffThe format for service curve specifications is
12403b3a8eb9SGleb Smirnoff.Ar ( m1 , d , m2 ) .
12413b3a8eb9SGleb Smirnoff.Ar m2
12423b3a8eb9SGleb Smirnoffcontrols the bandwidth assigned to the queue.
12433b3a8eb9SGleb Smirnoff.Ar m1
12443b3a8eb9SGleb Smirnoffand
12453b3a8eb9SGleb Smirnoff.Ar d
12463b3a8eb9SGleb Smirnoffare optional and can be used to control the initial bandwidth assignment.
12473b3a8eb9SGleb SmirnoffFor the first
12483b3a8eb9SGleb Smirnoff.Ar d
12493b3a8eb9SGleb Smirnoffmilliseconds the queue gets the bandwidth given as
12503b3a8eb9SGleb Smirnoff.Ar m1 ,
12513b3a8eb9SGleb Smirnoffafterwards the value given in
12523b3a8eb9SGleb Smirnoff.Ar m2 .
12533b3a8eb9SGleb Smirnoff.Pp
12543b3a8eb9SGleb SmirnoffFurthermore, with
12553b3a8eb9SGleb Smirnoff.Ar cbq
12563b3a8eb9SGleb Smirnoffand
12573b3a8eb9SGleb Smirnoff.Ar hfsc ,
12583b3a8eb9SGleb Smirnoffchild queues can be specified as in an
12593b3a8eb9SGleb Smirnoff.Ar altq
12603b3a8eb9SGleb Smirnoffdeclaration, thus building a tree of queues using a part of
12613b3a8eb9SGleb Smirnofftheir parent's bandwidth.
12623b3a8eb9SGleb Smirnoff.Pp
12633b3a8eb9SGleb SmirnoffPackets can be assigned to queues based on filter rules by using the
12643b3a8eb9SGleb Smirnoff.Ar queue
12653b3a8eb9SGleb Smirnoffkeyword.
12663b3a8eb9SGleb SmirnoffNormally only one
12673b3a8eb9SGleb Smirnoff.Ar queue
12683b3a8eb9SGleb Smirnoffis specified; when a second one is specified it will instead be used for
12693b3a8eb9SGleb Smirnoffpackets which have a
12703b3a8eb9SGleb Smirnoff.Em TOS
12713b3a8eb9SGleb Smirnoffof
12723b3a8eb9SGleb Smirnoff.Em lowdelay
12733b3a8eb9SGleb Smirnoffand for TCP ACKs with no data payload.
12743b3a8eb9SGleb Smirnoff.Pp
12753b3a8eb9SGleb SmirnoffTo continue the previous example, the examples below would specify the
12763b3a8eb9SGleb Smirnofffour referenced
12773b3a8eb9SGleb Smirnoffqueues, plus a few child queues.
12783b3a8eb9SGleb SmirnoffInteractive
12793b3a8eb9SGleb Smirnoff.Xr ssh 1
12803b3a8eb9SGleb Smirnoffsessions get priority over bulk transfers like
12813b3a8eb9SGleb Smirnoff.Xr scp 1
12823b3a8eb9SGleb Smirnoffand
12833b3a8eb9SGleb Smirnoff.Xr sftp 1 .
12843b3a8eb9SGleb SmirnoffThe queues may then be referenced by filtering rules (see
12853b3a8eb9SGleb Smirnoff.Sx PACKET FILTERING
12863b3a8eb9SGleb Smirnoffbelow).
12873b3a8eb9SGleb Smirnoff.Bd -literal
12883b3a8eb9SGleb Smirnoffqueue std bandwidth 10% cbq(default)
12893b3a8eb9SGleb Smirnoffqueue http bandwidth 60% priority 2 cbq(borrow red) \e
12903b3a8eb9SGleb Smirnoff      { employees, developers }
12913b3a8eb9SGleb Smirnoffqueue  developers bandwidth 75% cbq(borrow)
12923b3a8eb9SGleb Smirnoffqueue  employees bandwidth 15%
12933b3a8eb9SGleb Smirnoffqueue mail bandwidth 10% priority 0 cbq(borrow ecn)
12943b3a8eb9SGleb Smirnoffqueue ssh bandwidth 20% cbq(borrow) { ssh_interactive, ssh_bulk }
12953b3a8eb9SGleb Smirnoffqueue  ssh_interactive bandwidth 50% priority 7 cbq(borrow)
12963b3a8eb9SGleb Smirnoffqueue  ssh_bulk bandwidth 50% priority 0 cbq(borrow)
12973b3a8eb9SGleb Smirnoff
12983b3a8eb9SGleb Smirnoffblock return out on dc0 inet all queue std
12993b3a8eb9SGleb Smirnoffpass out on dc0 inet proto tcp from $developerhosts to any port 80 \e
13003b3a8eb9SGleb Smirnoff      queue developers
13013b3a8eb9SGleb Smirnoffpass out on dc0 inet proto tcp from $employeehosts to any port 80 \e
13023b3a8eb9SGleb Smirnoff      queue employees
13033b3a8eb9SGleb Smirnoffpass out on dc0 inet proto tcp from any to any port 22 \e
13043b3a8eb9SGleb Smirnoff      queue(ssh_bulk, ssh_interactive)
13053b3a8eb9SGleb Smirnoffpass out on dc0 inet proto tcp from any to any port 25 \e
13063b3a8eb9SGleb Smirnoff      queue mail
13073b3a8eb9SGleb Smirnoff.Ed
130800a7a05bSKristof Provost.Sh QUEUEING with dummynet
130900a7a05bSKristof ProvostQueueing can also be done with
131000a7a05bSKristof Provost.Xr dummynet 4 .
131100a7a05bSKristof ProvostQueues and pipes can be created with
131200a7a05bSKristof Provost.Xr dnctl 8 .
131300a7a05bSKristof Provost.Pp
131400a7a05bSKristof ProvostPackets can be assigned to queues and pipes using
131500a7a05bSKristof Provost.Ar dnqueue
131600a7a05bSKristof Provostand
131700a7a05bSKristof Provost.Ar dnpipe
131800a7a05bSKristof Provostrespectively.
131900a7a05bSKristof Provost.Pp
132000a7a05bSKristof ProvostBoth
132100a7a05bSKristof Provost.Ar dnqueue
132200a7a05bSKristof Provostand
132300a7a05bSKristof Provost.Ar dnpipe
132400a7a05bSKristof Provosttake either a single pipe or queue number or two numbers as arguments.
132500a7a05bSKristof ProvostThe first pipe or queue number will be used to shape the traffic in the rule
132600a7a05bSKristof Provostdirection, the second will be used to shape the traffic in the reverse
132700a7a05bSKristof Provostdirection.
132800a7a05bSKristof ProvostIf the rule does not specify a direction the first packet to create state will
132900a7a05bSKristof Provostbe shaped according to the first number, and the response traffic according to
133000a7a05bSKristof Provostthe second.
133100a7a05bSKristof Provost.Pp
133200a7a05bSKristof ProvostIf the
133300a7a05bSKristof Provost.Xr dummynet 4
133400a7a05bSKristof Provostmodule is not loaded any traffic sent into a queue or pipe will be dropped.
13353b3a8eb9SGleb Smirnoff.Sh TRANSLATION
13363b3a8eb9SGleb SmirnoffTranslation rules modify either the source or destination address of the
13373b3a8eb9SGleb Smirnoffpackets associated with a stateful connection.
13383b3a8eb9SGleb SmirnoffA stateful connection is automatically created to track packets matching
13393b3a8eb9SGleb Smirnoffsuch a rule as long as they are not blocked by the filtering section of
13403b3a8eb9SGleb Smirnoff.Nm pf.conf .
13413b3a8eb9SGleb SmirnoffThe translation engine modifies the specified address and/or port in the
134247d0c1feSKristof Provostpacket, recalculates IP, TCP and UDP checksums as necessary, and passes
134347d0c1feSKristof Provostit to the packet filter for evaluation.
13443b3a8eb9SGleb Smirnoff.Pp
13453b3a8eb9SGleb SmirnoffSince translation occurs before filtering the filter
13463b3a8eb9SGleb Smirnoffengine will see packets as they look after any
13473b3a8eb9SGleb Smirnoffaddresses and ports have been translated.
13483b3a8eb9SGleb SmirnoffFilter rules will therefore have to filter based on the translated
13493b3a8eb9SGleb Smirnoffaddress and port number.
13503b3a8eb9SGleb SmirnoffPackets that match a translation rule are only automatically passed if
13513b3a8eb9SGleb Smirnoffthe
13523b3a8eb9SGleb Smirnoff.Ar pass
13533b3a8eb9SGleb Smirnoffmodifier is given, otherwise they are
13543b3a8eb9SGleb Smirnoffstill subject to
13553b3a8eb9SGleb Smirnoff.Ar block
13563b3a8eb9SGleb Smirnoffand
13573b3a8eb9SGleb Smirnoff.Ar pass
13583b3a8eb9SGleb Smirnoffrules.
13593b3a8eb9SGleb Smirnoff.Pp
13603b3a8eb9SGleb SmirnoffThe state entry created permits
13613b3a8eb9SGleb Smirnoff.Xr pf 4
13623b3a8eb9SGleb Smirnoffto keep track of the original address for traffic associated with that state
13633b3a8eb9SGleb Smirnoffand correctly direct return traffic for that connection.
13643b3a8eb9SGleb Smirnoff.Pp
13653b3a8eb9SGleb SmirnoffVarious types of translation are possible with pf:
13663b3a8eb9SGleb Smirnoff.Bl -tag -width xxxx
1367eaf484fdSKristof Provost.It Ar af-to
1368eaf484fdSKristof ProvostTranslation between different address families (NAT64) is handled
1369eaf484fdSKristof Provostusing
1370eaf484fdSKristof Provost.Ar af-to
1371eaf484fdSKristof Provostrules.
1372eaf484fdSKristof ProvostBecause address family translation overrides the routing table, it's
1373eaf484fdSKristof Provostonly possible to use
1374eaf484fdSKristof Provost.Ar af-to
1375eaf484fdSKristof Provoston inbound rules, and a source address of the resulting translation
1376eaf484fdSKristof Provostmust always be specified.
1377eaf484fdSKristof Provost.Pp
1378eaf484fdSKristof ProvostThe optional second argument is the host or subnet the original
1379eaf484fdSKristof Provostaddresses are translated into for the destination.
1380eaf484fdSKristof ProvostThe lowest bits of the original destination address form the host
1381eaf484fdSKristof Provostpart of the new destination address according to the specified subnet.
1382eaf484fdSKristof ProvostIt is possible to embed a complete IPv4 address into an IPv6 address
1383eaf484fdSKristof Provostusing a network prefix of /96 or smaller.
1384eaf484fdSKristof Provost.Pp
1385eaf484fdSKristof ProvostWhen a destination address is not specified it is assumed that the host
1386eaf484fdSKristof Provostpart is 32-bit long.
1387eaf484fdSKristof ProvostFor IPv6 to IPv4 translation this would mean using only the lower 32
1388eaf484fdSKristof Provostbits of the original IPv6 destination address.
1389eaf484fdSKristof ProvostFor IPv4 to IPv6 translation the destination subnet defaults to the
1390eaf484fdSKristof Provostsubnet of the new IPv6 source address with a prefix length of /96.
1391eaf484fdSKristof ProvostSee RFC 6052 Section 2.2 for details on how the prefix determines the
1392eaf484fdSKristof Provostdestination address encoding.
1393eaf484fdSKristof Provost.Pp
1394eaf484fdSKristof ProvostFor example, the following rules are identical:
1395eaf484fdSKristof Provost.Bd -literal -offset indent
1396eaf484fdSKristof Provostpass in inet af-to inet6 from 2001:db8::1 to 2001:db8::/96
1397eaf484fdSKristof Provostpass in inet af-to inet6 from 2001:db8::1
1398eaf484fdSKristof Provost.Ed
1399eaf484fdSKristof Provost.Pp
1400eaf484fdSKristof ProvostIn the above example the matching IPv4 packets will be modified to
1401eaf484fdSKristof Provosthave a source address of 2001:db8::1 and a destination address will
1402eaf484fdSKristof Provostget prefixed with 2001:db8::/96, e.g. 198.51.100.100 will be
1403eaf484fdSKristof Provosttranslated to 2001:db8::c633:6464.
1404eaf484fdSKristof Provost.Pp
1405eaf484fdSKristof ProvostIn the reverse case the following rules are identical:
1406eaf484fdSKristof Provost.Bd -literal -offset indent
1407eaf484fdSKristof Provostpass in inet6 af-to inet from 198.51.100.1 to 0.0.0.0/0
1408eaf484fdSKristof Provostpass in inet6 af-to inet from 198.51.100.1
1409eaf484fdSKristof Provost.Ed
1410eaf484fdSKristof Provost.Pp
1411eaf484fdSKristof ProvostThe destination IPv4 address is assumed to be embedded inside the
1412eaf484fdSKristof Provostoriginal IPv6 destination address, e.g. 64:ff9b::c633:6464 will be
1413eaf484fdSKristof Provosttranslated to 198.51.100.100.
1414eaf484fdSKristof Provost.Pp
1415eaf484fdSKristof ProvostThe current implementation will only extract IPv4 addresses from the
1416eaf484fdSKristof ProvostIPv6 addresses with a prefix length of /96 and greater.
14173b3a8eb9SGleb Smirnoff.It Ar binat
14183b3a8eb9SGleb SmirnoffA
14193b3a8eb9SGleb Smirnoff.Ar binat
14203b3a8eb9SGleb Smirnoffrule specifies a bidirectional mapping between an external IP netblock
14213b3a8eb9SGleb Smirnoffand an internal IP netblock.
14223b3a8eb9SGleb Smirnoff.It Ar nat
14233b3a8eb9SGleb SmirnoffA
14243b3a8eb9SGleb Smirnoff.Ar nat
14253b3a8eb9SGleb Smirnoffrule specifies that IP addresses are to be changed as the packet
14263b3a8eb9SGleb Smirnofftraverses the given interface.
14273b3a8eb9SGleb SmirnoffThis technique allows one or more IP addresses
14283b3a8eb9SGleb Smirnoffon the translating host to support network traffic for a larger range of
14293b3a8eb9SGleb Smirnoffmachines on an "inside" network.
14303b3a8eb9SGleb SmirnoffAlthough in theory any IP address can be used on the inside, it is strongly
14313b3a8eb9SGleb Smirnoffrecommended that one of the address ranges defined by RFC 1918 be used.
14323b3a8eb9SGleb SmirnoffThese netblocks are:
14333b3a8eb9SGleb Smirnoff.Bd -literal
14343b3a8eb9SGleb Smirnoff10.0.0.0 - 10.255.255.255 (all of net 10, i.e., 10/8)
14353b3a8eb9SGleb Smirnoff172.16.0.0 - 172.31.255.255 (i.e., 172.16/12)
14363b3a8eb9SGleb Smirnoff192.168.0.0 - 192.168.255.255 (i.e., 192.168/16)
14373b3a8eb9SGleb Smirnoff.Ed
14383b3a8eb9SGleb Smirnoff.It Pa rdr
14393b3a8eb9SGleb SmirnoffThe packet is redirected to another destination and possibly a
14403b3a8eb9SGleb Smirnoffdifferent port.
14413b3a8eb9SGleb Smirnoff.Ar rdr
14423b3a8eb9SGleb Smirnoffrules can optionally specify port ranges instead of single ports.
144383f9b68fSKristof Provostrdr ... port 2000:2999 -> ... port 4000
14443b3a8eb9SGleb Smirnoffredirects ports 2000 to 2999 (inclusive) to port 4000.
144583f9b68fSKristof Provostrdr ... port 2000:2999 -> ... port 4000:*
14463b3a8eb9SGleb Smirnoffredirects port 2000 to 4000, 2001 to 4001, ..., 2999 to 4999.
14473b3a8eb9SGleb Smirnoff.El
14483b3a8eb9SGleb Smirnoff.Pp
14493b3a8eb9SGleb SmirnoffIn addition to modifying the address, some translation rules may modify
14503b3a8eb9SGleb Smirnoffsource or destination ports for
14513b3a8eb9SGleb Smirnoff.Xr tcp 4
14523b3a8eb9SGleb Smirnoffor
14533b3a8eb9SGleb Smirnoff.Xr udp 4
14543b3a8eb9SGleb Smirnoffconnections; implicitly in the case of
14553b3a8eb9SGleb Smirnoff.Ar nat
14569897a669SMark Johnstonrules and both implicitly and explicitly in the case of
14573b3a8eb9SGleb Smirnoff.Ar rdr
14583b3a8eb9SGleb Smirnoffrules.
14599897a669SMark JohnstonA
14609897a669SMark Johnston.Ar rdr
14619897a669SMark Johnstonrule may cause the source port to be modified if doing so avoids a conflict
14629897a669SMark Johnstonwith an existing connection.
1463339a1977SMark JohnstonA random source port in the range 50001-65535 is chosen in this case; to
1464339a1977SMark Johnstonavoid excessive CPU consumption, the number of searches for a free port is
1465339a1977SMark Johnstonlimited by the
1466339a1977SMark Johnston.Va net.pf.rdr_srcport_rewrite_tries
1467339a1977SMark Johnstonsysctl.
14683b3a8eb9SGleb SmirnoffPort numbers are never translated with a
14693b3a8eb9SGleb Smirnoff.Ar binat
14703b3a8eb9SGleb Smirnoffrule.
14713b3a8eb9SGleb Smirnoff.Pp
14723b3a8eb9SGleb SmirnoffEvaluation order of the translation rules is dependent on the type
14733b3a8eb9SGleb Smirnoffof the translation rules and of the direction of a packet.
14743b3a8eb9SGleb Smirnoff.Ar binat
14753b3a8eb9SGleb Smirnoffrules are always evaluated first.
14763b3a8eb9SGleb SmirnoffThen either the
14773b3a8eb9SGleb Smirnoff.Ar rdr
14783b3a8eb9SGleb Smirnoffrules are evaluated on an inbound packet or the
14793b3a8eb9SGleb Smirnoff.Ar nat
14803b3a8eb9SGleb Smirnoffrules on an outbound packet.
14813b3a8eb9SGleb SmirnoffRules of the same type are evaluated in the same order in which they
14823b3a8eb9SGleb Smirnoffappear in the ruleset.
14833b3a8eb9SGleb SmirnoffThe first matching rule decides what action is taken.
14843b3a8eb9SGleb Smirnoff.Pp
14853b3a8eb9SGleb SmirnoffThe
14863b3a8eb9SGleb Smirnoff.Ar no
14873b3a8eb9SGleb Smirnoffoption prefixed to a translation rule causes packets to remain untranslated,
14883b3a8eb9SGleb Smirnoffmuch in the same way as
14893b3a8eb9SGleb Smirnoff.Ar drop quick
14903b3a8eb9SGleb Smirnoffworks in the packet filter (see below).
14913b3a8eb9SGleb SmirnoffIf no rule matches the packet it is passed to the filter engine unmodified.
14923b3a8eb9SGleb Smirnoff.Pp
14933b3a8eb9SGleb SmirnoffTranslation rules apply only to packets that pass through
14943b3a8eb9SGleb Smirnoffthe specified interface, and if no interface is specified,
14953b3a8eb9SGleb Smirnofftranslation is applied to packets on all interfaces.
14963b3a8eb9SGleb SmirnoffFor instance, redirecting port 80 on an external interface to an internal
14973b3a8eb9SGleb Smirnoffweb server will only work for connections originating from the outside.
14983b3a8eb9SGleb SmirnoffConnections to the address of the external interface from local hosts will
14993b3a8eb9SGleb Smirnoffnot be redirected, since such packets do not actually pass through the
15003b3a8eb9SGleb Smirnoffexternal interface.
15013b3a8eb9SGleb SmirnoffRedirections cannot reflect packets back through the interface they arrive
15023b3a8eb9SGleb Smirnoffon, they can only be redirected to hosts connected to different interfaces
15033b3a8eb9SGleb Smirnoffor to the firewall itself.
15043b3a8eb9SGleb Smirnoff.Pp
15053b3a8eb9SGleb SmirnoffNote that redirecting external incoming connections to the loopback
15063b3a8eb9SGleb Smirnoffaddress, as in
15073b3a8eb9SGleb Smirnoff.Bd -literal -offset indent
150883f9b68fSKristof Provostrdr on ne3 inet proto tcp to port smtp -> 127.0.0.1 port spamd
15093b3a8eb9SGleb Smirnoff.Ed
15103b3a8eb9SGleb Smirnoff.Pp
15113b3a8eb9SGleb Smirnoffwill effectively allow an external host to connect to daemons
15123b3a8eb9SGleb Smirnoffbound solely to the loopback address, circumventing the traditional
15133b3a8eb9SGleb Smirnoffblocking of such connections on a real interface.
15143b3a8eb9SGleb SmirnoffUnless this effect is desired, any of the local non-loopback addresses
15153b3a8eb9SGleb Smirnoffshould be used as redirection target instead, which allows external
15163b3a8eb9SGleb Smirnoffconnections only to daemons bound to this address or not bound to
15173b3a8eb9SGleb Smirnoffany address.
15183b3a8eb9SGleb Smirnoff.Pp
15193b3a8eb9SGleb SmirnoffSee
15203b3a8eb9SGleb Smirnoff.Sx TRANSLATION EXAMPLES
15213b3a8eb9SGleb Smirnoffbelow.
15223b3a8eb9SGleb Smirnoff.Sh PACKET FILTERING
15233b3a8eb9SGleb Smirnoff.Xr pf 4
15243b3a8eb9SGleb Smirnoffhas the ability to
15253b3a8eb9SGleb Smirnoff.Ar block
15260351b987SKristof Provost,
15273b3a8eb9SGleb Smirnoff.Ar pass
15280351b987SKristof Provostand
15290351b987SKristof Provost.Ar match
15303b3a8eb9SGleb Smirnoffpackets based on attributes of their layer 3 (see
15313b3a8eb9SGleb Smirnoff.Xr ip 4
15323b3a8eb9SGleb Smirnoffand
15333b3a8eb9SGleb Smirnoff.Xr ip6 4 )
15343b3a8eb9SGleb Smirnoffand layer 4 (see
15353b3a8eb9SGleb Smirnoff.Xr icmp 4 ,
15363b3a8eb9SGleb Smirnoff.Xr icmp6 4 ,
15373b3a8eb9SGleb Smirnoff.Xr tcp 4 ,
153847d0c1feSKristof Provost.Xr sctp 4 ,
15393b3a8eb9SGleb Smirnoff.Xr udp 4 )
15403b3a8eb9SGleb Smirnoffheaders.
15413b3a8eb9SGleb SmirnoffIn addition, packets may also be
15423b3a8eb9SGleb Smirnoffassigned to queues for the purpose of bandwidth control.
15433b3a8eb9SGleb Smirnoff.Pp
15443b3a8eb9SGleb SmirnoffFor each packet processed by the packet filter, the filter rules are
15453b3a8eb9SGleb Smirnoffevaluated in sequential order, from first to last.
15460351b987SKristof ProvostFor
15470351b987SKristof Provost.Ar block
15480351b987SKristof Provostand
15490351b987SKristof Provost.Ar pass
15500351b987SKristof Provost, the last matching rule decides what action is taken.
15510351b987SKristof ProvostFor
15520351b987SKristof Provost.Ar match
1553bdb82431SMaxim Konovalov, rules are evaluated every time they match; the pass/block state of a packet
15540351b987SKristof Provostremains unchanged.
15553b3a8eb9SGleb SmirnoffIf no rule matches the packet, the default action is to pass
15563b3a8eb9SGleb Smirnoffthe packet.
15573b3a8eb9SGleb Smirnoff.Pp
15583b3a8eb9SGleb SmirnoffThe following actions can be used in the filter:
15593b3a8eb9SGleb Smirnoff.Bl -tag -width xxxx
15603b3a8eb9SGleb Smirnoff.It Ar block
15613b3a8eb9SGleb SmirnoffThe packet is blocked.
15623b3a8eb9SGleb SmirnoffThere are a number of ways in which a
15633b3a8eb9SGleb Smirnoff.Ar block
15643b3a8eb9SGleb Smirnoffrule can behave when blocking a packet.
15653b3a8eb9SGleb SmirnoffThe default behaviour is to
15663b3a8eb9SGleb Smirnoff.Ar drop
15673b3a8eb9SGleb Smirnoffpackets silently, however this can be overridden or made
15683b3a8eb9SGleb Smirnoffexplicit either globally, by setting the
15693b3a8eb9SGleb Smirnoff.Ar block-policy
15703b3a8eb9SGleb Smirnoffoption, or on a per-rule basis with one of the following options:
15713b3a8eb9SGleb Smirnoff.Pp
15723b3a8eb9SGleb Smirnoff.Bl -tag -width xxxx -compact
15733b3a8eb9SGleb Smirnoff.It Ar drop
15743b3a8eb9SGleb SmirnoffThe packet is silently dropped.
15753b3a8eb9SGleb Smirnoff.It Ar return-rst
15763b3a8eb9SGleb SmirnoffThis applies only to
15773b3a8eb9SGleb Smirnoff.Xr tcp 4
15783b3a8eb9SGleb Smirnoffpackets, and issues a TCP RST which closes the
15793b3a8eb9SGleb Smirnoffconnection.
15803b3a8eb9SGleb Smirnoff.It Ar return-icmp
15813b3a8eb9SGleb Smirnoff.It Ar return-icmp6
15823b3a8eb9SGleb SmirnoffThis causes ICMP messages to be returned for packets which match the rule.
15833b3a8eb9SGleb SmirnoffBy default this is an ICMP UNREACHABLE message, however this
15843b3a8eb9SGleb Smirnoffcan be overridden by specifying a message as a code or number.
15853b3a8eb9SGleb Smirnoff.It Ar return
15863b3a8eb9SGleb SmirnoffThis causes a TCP RST to be returned for
15873b3a8eb9SGleb Smirnoff.Xr tcp 4
158847d0c1feSKristof Provostpackets, an SCTP ABORT for SCTP
158947d0c1feSKristof Provostand an ICMP UNREACHABLE for UDP and other packets.
15903b3a8eb9SGleb Smirnoff.El
15913b3a8eb9SGleb Smirnoff.Pp
15923b3a8eb9SGleb SmirnoffOptions returning ICMP packets currently have no effect if
15933b3a8eb9SGleb Smirnoff.Xr pf 4
15943b3a8eb9SGleb Smirnoffoperates on a
15953b3a8eb9SGleb Smirnoff.Xr if_bridge 4 ,
15963b3a8eb9SGleb Smirnoffas the code to support this feature has not yet been implemented.
15973b3a8eb9SGleb Smirnoff.Pp
15983b3a8eb9SGleb SmirnoffThe simplest mechanism to block everything by default and only pass
15993b3a8eb9SGleb Smirnoffpackets that match explicit rules is specify a first filter rule of:
16003b3a8eb9SGleb Smirnoff.Bd -literal -offset indent
16013b3a8eb9SGleb Smirnoffblock all
16023b3a8eb9SGleb Smirnoff.Ed
16030351b987SKristof Provost.It Ar match
16040351b987SKristof ProvostThe packet is matched.
16050351b987SKristof ProvostThis mechanism is used to provide fine grained filtering without altering the
16060351b987SKristof Provostblock/pass state of a packet.
16070351b987SKristof Provost.Ar match
16080351b987SKristof Provostrules differ from
16090351b987SKristof Provost.Ar block
16100351b987SKristof Provostand
16110351b987SKristof Provost.Ar pass
16125ed470bdSKajetan Staszkiewiczrules in that parameters are set for every rule a packet matches, not only
16130351b987SKristof Provoston the last matching rule.
16140351b987SKristof ProvostFor the following parameters, this means that the parameter effectively becomes
16150351b987SKristof Provost"sticky" until explicitly overridden:
161600a7a05bSKristof Provost.Ar queue ,
161700a7a05bSKristof Provost.Ar dnpipe ,
16185ed470bdSKajetan Staszkiewicz.Ar dnqueue ,
16195ed470bdSKajetan Staszkiewicz.Ar rtable ,
16205ed470bdSKajetan Staszkiewicz.Ar scrub
16210351b987SKristof Provost.
16223b3a8eb9SGleb Smirnoff.It Ar pass
16233b3a8eb9SGleb SmirnoffThe packet is passed;
16243b3a8eb9SGleb Smirnoffstate is created unless the
16253b3a8eb9SGleb Smirnoff.Ar no state
16263b3a8eb9SGleb Smirnoffoption is specified.
16273b3a8eb9SGleb Smirnoff.El
16283b3a8eb9SGleb Smirnoff.Pp
16293b3a8eb9SGleb SmirnoffBy default
16303b3a8eb9SGleb Smirnoff.Xr pf 4
16313b3a8eb9SGleb Smirnofffilters packets statefully; the first time a packet matches a
16323b3a8eb9SGleb Smirnoff.Ar pass
16333b3a8eb9SGleb Smirnoffrule, a state entry is created; for subsequent packets the filter checks
16343b3a8eb9SGleb Smirnoffwhether the packet matches any state.
16353b3a8eb9SGleb SmirnoffIf it does, the packet is passed without evaluation of any rules.
16363b3a8eb9SGleb SmirnoffAfter the connection is closed or times out, the state entry is automatically
16373b3a8eb9SGleb Smirnoffremoved.
16383b3a8eb9SGleb Smirnoff.Pp
16393b3a8eb9SGleb SmirnoffThis has several advantages.
16403b3a8eb9SGleb SmirnoffFor TCP connections, comparing a packet to a state involves checking
16413b3a8eb9SGleb Smirnoffits sequence numbers, as well as TCP timestamps if a
16423b3a8eb9SGleb Smirnoff.Ar scrub reassemble tcp
16433b3a8eb9SGleb Smirnoffrule applies to the connection.
16443b3a8eb9SGleb SmirnoffIf these values are outside the narrow windows of expected
16453b3a8eb9SGleb Smirnoffvalues, the packet is dropped.
16463b3a8eb9SGleb SmirnoffThis prevents spoofing attacks, such as when an attacker sends packets with
16473b3a8eb9SGleb Smirnoffa fake source address/port but does not know the connection's sequence
16483b3a8eb9SGleb Smirnoffnumbers.
16493b3a8eb9SGleb SmirnoffSimilarly,
16503b3a8eb9SGleb Smirnoff.Xr pf 4
16513b3a8eb9SGleb Smirnoffknows how to match ICMP replies to states.
16523b3a8eb9SGleb SmirnoffFor example,
16533b3a8eb9SGleb Smirnoff.Bd -literal -offset indent
16543b3a8eb9SGleb Smirnoffpass out inet proto icmp all icmp-type echoreq
16553b3a8eb9SGleb Smirnoff.Ed
16563b3a8eb9SGleb Smirnoff.Pp
16573b3a8eb9SGleb Smirnoffallows echo requests (such as those created by
16583b3a8eb9SGleb Smirnoff.Xr ping 8 )
16593b3a8eb9SGleb Smirnoffout statefully, and matches incoming echo replies correctly to states.
16603b3a8eb9SGleb Smirnoff.Pp
16613b3a8eb9SGleb SmirnoffAlso, looking up states is usually faster than evaluating rules.
16623b3a8eb9SGleb SmirnoffIf there are 50 rules, all of them are evaluated sequentially in O(n).
16633b3a8eb9SGleb SmirnoffEven with 50000 states, only 16 comparisons are needed to match a
16643b3a8eb9SGleb Smirnoffstate, since states are stored in a binary search tree that allows
16653b3a8eb9SGleb Smirnoffsearches in O(log2 n).
16663b3a8eb9SGleb Smirnoff.Pp
16673b3a8eb9SGleb SmirnoffFurthermore, correct handling of ICMP error messages is critical to
16683b3a8eb9SGleb Smirnoffmany protocols, particularly TCP.
16693b3a8eb9SGleb Smirnoff.Xr pf 4
16703b3a8eb9SGleb Smirnoffmatches ICMP error messages to the correct connection, checks them against
16713b3a8eb9SGleb Smirnoffconnection parameters, and passes them if appropriate.
16723b3a8eb9SGleb SmirnoffFor example if an ICMP source quench message referring to a stateful TCP
16733b3a8eb9SGleb Smirnoffconnection arrives, it will be matched to the state and get passed.
16743b3a8eb9SGleb Smirnoff.Pp
16753b3a8eb9SGleb SmirnoffFinally, state tracking is required for
16763b3a8eb9SGleb Smirnoff.Ar nat , binat No and Ar rdr
16773b3a8eb9SGleb Smirnoffrules, in order to track address and port translations and reverse the
16783b3a8eb9SGleb Smirnofftranslation on returning packets.
16793b3a8eb9SGleb Smirnoff.Pp
16803b3a8eb9SGleb Smirnoff.Xr pf 4
16813b3a8eb9SGleb Smirnoffwill also create state for other protocols which are effectively stateless by
16823b3a8eb9SGleb Smirnoffnature.
16833b3a8eb9SGleb SmirnoffUDP packets are matched to states using only host addresses and ports,
16843b3a8eb9SGleb Smirnoffand other protocols are matched to states using only the host addresses.
16853b3a8eb9SGleb Smirnoff.Pp
16863b3a8eb9SGleb SmirnoffIf stateless filtering of individual packets is desired,
16873b3a8eb9SGleb Smirnoffthe
16883b3a8eb9SGleb Smirnoff.Ar no state
16893b3a8eb9SGleb Smirnoffkeyword can be used to specify that state will not be created
16903b3a8eb9SGleb Smirnoffif this is the last matching rule.
16913b3a8eb9SGleb SmirnoffA number of parameters can also be set to affect how
16923b3a8eb9SGleb Smirnoff.Xr pf 4
16933b3a8eb9SGleb Smirnoffhandles state tracking.
16943b3a8eb9SGleb SmirnoffSee
16953b3a8eb9SGleb Smirnoff.Sx STATEFUL TRACKING OPTIONS
16963b3a8eb9SGleb Smirnoffbelow for further details.
16973b3a8eb9SGleb Smirnoff.Sh PARAMETERS
16983b3a8eb9SGleb SmirnoffThe rule parameters specify the packets to which a rule applies.
16993b3a8eb9SGleb SmirnoffA packet always comes in on, or goes out through, one interface.
17003b3a8eb9SGleb SmirnoffMost parameters are optional.
17013b3a8eb9SGleb SmirnoffIf a parameter is specified, the rule only applies to packets with
17023b3a8eb9SGleb Smirnoffmatching attributes.
17033b3a8eb9SGleb SmirnoffCertain parameters can be expressed as lists, in which case
17043b3a8eb9SGleb Smirnoff.Xr pfctl 8
17053b3a8eb9SGleb Smirnoffgenerates all needed rule combinations.
17063b3a8eb9SGleb Smirnoff.Bl -tag -width xxxx
17073b3a8eb9SGleb Smirnoff.It Ar in No or Ar out
17083b3a8eb9SGleb SmirnoffThis rule applies to incoming or outgoing packets.
17093b3a8eb9SGleb SmirnoffIf neither
17103b3a8eb9SGleb Smirnoff.Ar in
17113b3a8eb9SGleb Smirnoffnor
17123b3a8eb9SGleb Smirnoff.Ar out
17133b3a8eb9SGleb Smirnoffare specified, the rule will match packets in both directions.
1714*3c0a0de2SKristof Provost.It Ar log Pq Cm all | matches | to Ao Ar interface Ac | Cm user
1715*3c0a0de2SKristof ProvostIn addition to any action specified,
1716*3c0a0de2SKristof Provostlog the packet.
17173b3a8eb9SGleb SmirnoffOnly the packet that establishes the state is logged,
17183b3a8eb9SGleb Smirnoffunless the
17193b3a8eb9SGleb Smirnoff.Ar no state
17203b3a8eb9SGleb Smirnoffoption is specified.
17213b3a8eb9SGleb SmirnoffThe logged packets are sent to a
17223b3a8eb9SGleb Smirnoff.Xr pflog 4
1723*3c0a0de2SKristof Provostinterface, by default pflog0;
1724*3c0a0de2SKristof Provostpflog0 is monitored by the
17253b3a8eb9SGleb Smirnoff.Xr pflogd 8
1726*3c0a0de2SKristof Provostlogging daemon which logs to the file
17273b3a8eb9SGleb Smirnoff.Pa /var/log/pflog
17283b3a8eb9SGleb Smirnoffin
17293b3a8eb9SGleb Smirnoff.Xr pcap 3
17303b3a8eb9SGleb Smirnoffbinary format.
1731*3c0a0de2SKristof Provost.Pp
1732*3c0a0de2SKristof ProvostThe keywords
1733*3c0a0de2SKristof Provost.Cm all , matches , to ,
1734*3c0a0de2SKristof Provostand
1735*3c0a0de2SKristof Provost.Cm user
1736*3c0a0de2SKristof Provostare all optional,
1737*3c0a0de2SKristof Provostand can be combined using commas.
1738*3c0a0de2SKristof Provost.Pp
1739*3c0a0de2SKristof ProvostUse
1740*3c0a0de2SKristof Provost.Cm all
1741*3c0a0de2SKristof Provostto force logging of all packets for a connection.
17423b3a8eb9SGleb SmirnoffThis is not necessary when
17433b3a8eb9SGleb Smirnoff.Ar no state
17443b3a8eb9SGleb Smirnoffis explicitly specified.
1745*3c0a0de2SKristof Provost.Pp
1746*3c0a0de2SKristof ProvostIf
1747*3c0a0de2SKristof Provost.Cm matches
1748*3c0a0de2SKristof Provostis specified,
1749*3c0a0de2SKristof Provostit logs the packet on all subsequent matching rules.
1750*3c0a0de2SKristof ProvostIt is often combined with
1751*3c0a0de2SKristof Provost.Cm to Aq Ar interface
1752*3c0a0de2SKristof Provostto avoid adding noise to the default log file.
1753*3c0a0de2SKristof Provost.Pp
1754*3c0a0de2SKristof ProvostThe keyword
1755*3c0a0de2SKristof Provost.Cm user
1756*3c0a0de2SKristof Provostlogs the
17573b3a8eb9SGleb Smirnoff.Ux
17583b3a8eb9SGleb Smirnoffuser ID of the user that owns the socket and the PID of the process that
17593b3a8eb9SGleb Smirnoffhas the socket open where the packet is sourced from or destined to
17603b3a8eb9SGleb Smirnoff(depending on which socket is local).
17613b3a8eb9SGleb SmirnoffThis is in addition to the normal information logged.
17623b3a8eb9SGleb Smirnoff.Pp
17633b3a8eb9SGleb SmirnoffOnly the first packet
17643b3a8eb9SGleb Smirnofflogged via
17653b3a8eb9SGleb Smirnoff.Ar log (all, user)
17663b3a8eb9SGleb Smirnoffwill have the user credentials logged when using stateful matching.
1767*3c0a0de2SKristof Provost.Pp
1768*3c0a0de2SKristof ProvostTo specify a logging interface other than pflog0,
1769*3c0a0de2SKristof Provostuse the syntax
1770*3c0a0de2SKristof Provost.Cm to Aq Ar interface .
17713b3a8eb9SGleb Smirnoff.It Ar quick
17723b3a8eb9SGleb SmirnoffIf a packet matches a rule which has the
17733b3a8eb9SGleb Smirnoff.Ar quick
17743b3a8eb9SGleb Smirnoffoption set, this rule
17753b3a8eb9SGleb Smirnoffis considered the last matching rule, and evaluation of subsequent rules
17763b3a8eb9SGleb Smirnoffis skipped.
17773b3a8eb9SGleb Smirnoff.It Ar on Aq Ar interface
17783b3a8eb9SGleb SmirnoffThis rule applies only to packets coming in on, or going out through, this
17793b3a8eb9SGleb Smirnoffparticular interface or interface group.
17803b3a8eb9SGleb SmirnoffFor more information on interface groups,
17813b3a8eb9SGleb Smirnoffsee the
17823b3a8eb9SGleb Smirnoff.Ic group
17833b3a8eb9SGleb Smirnoffkeyword in
17843b3a8eb9SGleb Smirnoff.Xr ifconfig 8 .
1785618a8766SKristof Provost.Ar any
1786618a8766SKristof Provostwill match any existing interface except loopback ones.
17873b3a8eb9SGleb Smirnoff.It Aq Ar af
17883b3a8eb9SGleb SmirnoffThis rule applies only to packets of this address family.
17893b3a8eb9SGleb SmirnoffSupported values are
17903b3a8eb9SGleb Smirnoff.Ar inet
17913b3a8eb9SGleb Smirnoffand
17923b3a8eb9SGleb Smirnoff.Ar inet6 .
17933b3a8eb9SGleb Smirnoff.It Ar proto Aq Ar protocol
17943b3a8eb9SGleb SmirnoffThis rule applies only to packets of this protocol.
17953b3a8eb9SGleb SmirnoffCommon protocols are
17963b3a8eb9SGleb Smirnoff.Xr icmp 4 ,
17973b3a8eb9SGleb Smirnoff.Xr icmp6 4 ,
17983b3a8eb9SGleb Smirnoff.Xr tcp 4 ,
179947d0c1feSKristof Provost.Xr sctp 4 ,
18003b3a8eb9SGleb Smirnoffand
18013b3a8eb9SGleb Smirnoff.Xr udp 4 .
18023b3a8eb9SGleb SmirnoffFor a list of all the protocol name to number mappings used by
18033b3a8eb9SGleb Smirnoff.Xr pfctl 8 ,
18043b3a8eb9SGleb Smirnoffsee the file
180537b983c0SJoel Dahl.Pa /etc/protocols .
18063b3a8eb9SGleb Smirnoff.It Xo
18073b3a8eb9SGleb Smirnoff.Ar from Aq Ar source
18083b3a8eb9SGleb Smirnoff.Ar port Aq Ar source
18093b3a8eb9SGleb Smirnoff.Ar os Aq Ar source
18103b3a8eb9SGleb Smirnoff.Ar to Aq Ar dest
18113b3a8eb9SGleb Smirnoff.Ar port Aq Ar dest
18123b3a8eb9SGleb Smirnoff.Xc
18133b3a8eb9SGleb SmirnoffThis rule applies only to packets with the specified source and destination
18143b3a8eb9SGleb Smirnoffaddresses and ports.
18153b3a8eb9SGleb Smirnoff.Pp
18163b3a8eb9SGleb SmirnoffAddresses can be specified in CIDR notation (matching netblocks), as
18173b3a8eb9SGleb Smirnoffsymbolic host names, interface names or interface group names, or as any
18183b3a8eb9SGleb Smirnoffof the following keywords:
18193b3a8eb9SGleb Smirnoff.Pp
18203b3a8eb9SGleb Smirnoff.Bl -tag -width xxxxxxxxxxxxxx -compact
18213b3a8eb9SGleb Smirnoff.It Ar any
18223b3a8eb9SGleb SmirnoffAny address.
18233b3a8eb9SGleb Smirnoff.It Ar no-route
18243b3a8eb9SGleb SmirnoffAny address which is not currently routable.
18253b3a8eb9SGleb Smirnoff.It Ar urpf-failed
18263b3a8eb9SGleb SmirnoffAny source address that fails a unicast reverse path forwarding (URPF)
18273b3a8eb9SGleb Smirnoffcheck, i.e. packets coming in on an interface other than that which holds
18283b3a8eb9SGleb Smirnoffthe route back to the packet's source address.
1829b6a5e221SKristof Provost.It Ar self
1830b6a5e221SKristof ProvostExpands to all addresses assigned to all interfaces.
18313b3a8eb9SGleb Smirnoff.It Aq Ar table
18323b3a8eb9SGleb SmirnoffAny address that matches the given table.
18333b3a8eb9SGleb Smirnoff.El
18343b3a8eb9SGleb Smirnoff.Pp
18353b3a8eb9SGleb SmirnoffRanges of addresses are specified by using the
18363b3a8eb9SGleb Smirnoff.Sq -
18373b3a8eb9SGleb Smirnoffoperator.
18383b3a8eb9SGleb SmirnoffFor instance:
18393b3a8eb9SGleb Smirnoff.Dq 10.1.1.10 - 10.1.1.12
18403b3a8eb9SGleb Smirnoffmeans all addresses from 10.1.1.10 to 10.1.1.12,
18413b3a8eb9SGleb Smirnoffhence addresses 10.1.1.10, 10.1.1.11, and 10.1.1.12.
18423b3a8eb9SGleb Smirnoff.Pp
1843b6a5e221SKristof ProvostInterface names and interface group names, and
1844b6a5e221SKristof Provost.Ar self
1845b6a5e221SKristof Provostcan have modifiers appended:
18463b3a8eb9SGleb Smirnoff.Pp
18473b3a8eb9SGleb Smirnoff.Bl -tag -width xxxxxxxxxxxx -compact
18483b3a8eb9SGleb Smirnoff.It Ar :network
18493b3a8eb9SGleb SmirnoffTranslates to the network(s) attached to the interface.
18503b3a8eb9SGleb Smirnoff.It Ar :broadcast
18513b3a8eb9SGleb SmirnoffTranslates to the interface's broadcast address(es).
18523b3a8eb9SGleb Smirnoff.It Ar :peer
18533b3a8eb9SGleb SmirnoffTranslates to the point-to-point interface's peer address(es).
18543b3a8eb9SGleb Smirnoff.It Ar :0
18553b3a8eb9SGleb SmirnoffDo not include interface aliases.
18563b3a8eb9SGleb Smirnoff.El
18573b3a8eb9SGleb Smirnoff.Pp
18583b3a8eb9SGleb SmirnoffHost names may also have the
18593b3a8eb9SGleb Smirnoff.Ar :0
18603b3a8eb9SGleb Smirnoffoption appended to restrict the name resolution to the first of each
186199eb0055SKristof Provostv4 and non-link-local v6 address found.
18623b3a8eb9SGleb Smirnoff.Pp
18633b3a8eb9SGleb SmirnoffHost name resolution and interface to address translation are done at
18643b3a8eb9SGleb Smirnoffruleset load-time.
18653b3a8eb9SGleb SmirnoffWhen the address of an interface (or host name) changes (under DHCP or PPP,
18663b3a8eb9SGleb Smirnofffor instance), the ruleset must be reloaded for the change to be reflected
18673b3a8eb9SGleb Smirnoffin the kernel.
18683b3a8eb9SGleb SmirnoffSurrounding the interface name (and optional modifiers) in parentheses
18693b3a8eb9SGleb Smirnoffchanges this behaviour.
18703b3a8eb9SGleb SmirnoffWhen the interface name is surrounded by parentheses, the rule is
18713b3a8eb9SGleb Smirnoffautomatically updated whenever the interface changes its address.
18723b3a8eb9SGleb SmirnoffThe ruleset does not need to be reloaded.
18733b3a8eb9SGleb SmirnoffThis is especially useful with
18743b3a8eb9SGleb Smirnoff.Ar nat .
18753b3a8eb9SGleb Smirnoff.Pp
18763b3a8eb9SGleb SmirnoffPorts can be specified either by number or by name.
18773b3a8eb9SGleb SmirnoffFor example, port 80 can be specified as
18783b3a8eb9SGleb Smirnoff.Em www .
18793b3a8eb9SGleb SmirnoffFor a list of all port name to number mappings used by
18803b3a8eb9SGleb Smirnoff.Xr pfctl 8 ,
18813b3a8eb9SGleb Smirnoffsee the file
18823b3a8eb9SGleb Smirnoff.Pa /etc/services .
18833b3a8eb9SGleb Smirnoff.Pp
18843b3a8eb9SGleb SmirnoffPorts and ranges of ports are specified by using these operators:
18853b3a8eb9SGleb Smirnoff.Bd -literal -offset indent
18863b3a8eb9SGleb Smirnoff=	(equal)
18873b3a8eb9SGleb Smirnoff!=	(unequal)
188883f9b68fSKristof Provost<	(less than)
188985c333a9SKristof Provost<=	(less than or equal)
189083f9b68fSKristof Provost>	(greater than)
189185c333a9SKristof Provost>=	(greater than or equal)
18923b3a8eb9SGleb Smirnoff:	(range including boundaries)
189383f9b68fSKristof Provost><	(range excluding boundaries)
189483f9b68fSKristof Provost<>	(except range)
18953b3a8eb9SGleb Smirnoff.Ed
18963b3a8eb9SGleb Smirnoff.Pp
189783f9b68fSKristof Provost.Sq >< ,
189883f9b68fSKristof Provost.Sq <>
18993b3a8eb9SGleb Smirnoffand
19003b3a8eb9SGleb Smirnoff.Sq \&:
19013b3a8eb9SGleb Smirnoffare binary operators (they take two arguments).
19023b3a8eb9SGleb SmirnoffFor instance:
19033b3a8eb9SGleb Smirnoff.Bl -tag -width Fl
19043b3a8eb9SGleb Smirnoff.It Ar port 2000:2004
19053b3a8eb9SGleb Smirnoffmeans
190683f9b68fSKristof Provost.Sq all ports >= 2000 and <= 2004 ,
19073b3a8eb9SGleb Smirnoffhence ports 2000, 2001, 2002, 2003 and 2004.
190883f9b68fSKristof Provost.It Ar port 2000 >< 2004
19093b3a8eb9SGleb Smirnoffmeans
191083f9b68fSKristof Provost.Sq all ports > 2000 and < 2004 ,
19113b3a8eb9SGleb Smirnoffhence ports 2001, 2002 and 2003.
191283f9b68fSKristof Provost.It Ar port 2000 <> 2004
19133b3a8eb9SGleb Smirnoffmeans
191483f9b68fSKristof Provost.Sq all ports < 2000 or > 2004 ,
19153b3a8eb9SGleb Smirnoffhence ports 1-1999 and 2005-65535.
19163b3a8eb9SGleb Smirnoff.El
19173b3a8eb9SGleb Smirnoff.Pp
19183b3a8eb9SGleb SmirnoffThe operating system of the source host can be specified in the case of TCP
19193b3a8eb9SGleb Smirnoffrules with the
19203b3a8eb9SGleb Smirnoff.Ar OS
19213b3a8eb9SGleb Smirnoffmodifier.
19223b3a8eb9SGleb SmirnoffSee the
19233b3a8eb9SGleb Smirnoff.Sx OPERATING SYSTEM FINGERPRINTING
19243b3a8eb9SGleb Smirnoffsection for more information.
19253b3a8eb9SGleb Smirnoff.Pp
19263b3a8eb9SGleb SmirnoffThe host, port and OS specifications are optional, as in the following examples:
19273b3a8eb9SGleb Smirnoff.Bd -literal -offset indent
19283b3a8eb9SGleb Smirnoffpass in all
19293b3a8eb9SGleb Smirnoffpass in from any to any
193083f9b68fSKristof Provostpass in proto tcp from any port < 1024 to any
19313b3a8eb9SGleb Smirnoffpass in proto tcp from any to any port 25
193285c333a9SKristof Provostpass in proto tcp from 10.0.0.0/8 port >= 1024 \e
19333b3a8eb9SGleb Smirnoff      to ! 10.1.2.3 port != ssh
19343b3a8eb9SGleb Smirnoffpass in proto tcp from any os "OpenBSD"
19353b3a8eb9SGleb Smirnoff.Ed
19363b3a8eb9SGleb Smirnoff.It Ar all
19373b3a8eb9SGleb SmirnoffThis is equivalent to "from any to any".
19383b3a8eb9SGleb Smirnoff.It Ar group Aq Ar group
19393b3a8eb9SGleb SmirnoffSimilar to
19403b3a8eb9SGleb Smirnoff.Ar user ,
19413b3a8eb9SGleb Smirnoffthis rule only applies to packets of sockets owned by the specified group.
19423b3a8eb9SGleb Smirnoff.It Ar user Aq Ar user
19433b3a8eb9SGleb SmirnoffThis rule only applies to packets of sockets owned by the specified user.
19443b3a8eb9SGleb SmirnoffFor outgoing connections initiated from the firewall, this is the user
19453b3a8eb9SGleb Smirnoffthat opened the connection.
19463b3a8eb9SGleb SmirnoffFor incoming connections to the firewall itself, this is the user that
19473b3a8eb9SGleb Smirnofflistens on the destination port.
19483b3a8eb9SGleb SmirnoffFor forwarded connections, where the firewall is not a connection endpoint,
19493b3a8eb9SGleb Smirnoffthe user and group are
19503b3a8eb9SGleb Smirnoff.Em unknown .
19513b3a8eb9SGleb Smirnoff.Pp
19523b3a8eb9SGleb SmirnoffAll packets, both outgoing and incoming, of one connection are associated
19533b3a8eb9SGleb Smirnoffwith the same user and group.
19543b3a8eb9SGleb SmirnoffOnly TCP and UDP packets can be associated with users; for other protocols
19553b3a8eb9SGleb Smirnoffthese parameters are ignored.
19563b3a8eb9SGleb Smirnoff.Pp
19573b3a8eb9SGleb SmirnoffUser and group refer to the effective (as opposed to the real) IDs, in
19583b3a8eb9SGleb Smirnoffcase the socket is created by a setuid/setgid process.
19593b3a8eb9SGleb SmirnoffUser and group IDs are stored when a socket is created;
19603b3a8eb9SGleb Smirnoffwhen a process creates a listening socket as root (for instance, by
19613b3a8eb9SGleb Smirnoffbinding to a privileged port) and subsequently changes to another
19623b3a8eb9SGleb Smirnoffuser ID (to drop privileges), the credentials will remain root.
19633b3a8eb9SGleb Smirnoff.Pp
19643b3a8eb9SGleb SmirnoffUser and group IDs can be specified as either numbers or names.
19653b3a8eb9SGleb SmirnoffThe syntax is similar to the one for ports.
19663b3a8eb9SGleb SmirnoffThe value
19673b3a8eb9SGleb Smirnoff.Em unknown
19683b3a8eb9SGleb Smirnoffmatches packets of forwarded connections.
19693b3a8eb9SGleb Smirnoff.Em unknown
19703b3a8eb9SGleb Smirnoffcan only be used with the operators
19713b3a8eb9SGleb Smirnoff.Cm =
19723b3a8eb9SGleb Smirnoffand
19733b3a8eb9SGleb Smirnoff.Cm != .
19743b3a8eb9SGleb SmirnoffOther constructs like
19753b3a8eb9SGleb Smirnoff.Cm user \*(Ge unknown
19763b3a8eb9SGleb Smirnoffare invalid.
19773b3a8eb9SGleb SmirnoffForwarded packets with unknown user and group ID match only rules
19783b3a8eb9SGleb Smirnoffthat explicitly compare against
19793b3a8eb9SGleb Smirnoff.Em unknown
19803b3a8eb9SGleb Smirnoffwith the operators
19813b3a8eb9SGleb Smirnoff.Cm =
19823b3a8eb9SGleb Smirnoffor
19833b3a8eb9SGleb Smirnoff.Cm != .
19843b3a8eb9SGleb SmirnoffFor instance
19853b3a8eb9SGleb Smirnoff.Cm user \*(Ge 0
19863b3a8eb9SGleb Smirnoffdoes not match forwarded packets.
19873b3a8eb9SGleb SmirnoffThe following example allows only selected users to open outgoing
19883b3a8eb9SGleb Smirnoffconnections:
19893b3a8eb9SGleb Smirnoff.Bd -literal -offset indent
19903b3a8eb9SGleb Smirnoffblock out proto { tcp, udp } all
199183f9b68fSKristof Provostpass  out proto { tcp, udp } all user { < 1000, dhartmei }
19923b3a8eb9SGleb Smirnoff.Ed
19933b3a8eb9SGleb Smirnoff.It Xo Ar flags Aq Ar a
19943b3a8eb9SGleb Smirnoff.Pf / Ns Aq Ar b
19953b3a8eb9SGleb Smirnoff.No \*(Ba / Ns Aq Ar b
19963b3a8eb9SGleb Smirnoff.No \*(Ba any
19973b3a8eb9SGleb Smirnoff.Xc
19983b3a8eb9SGleb SmirnoffThis rule only applies to TCP packets that have the flags
19993b3a8eb9SGleb Smirnoff.Aq Ar a
20003b3a8eb9SGleb Smirnoffset out of set
20013b3a8eb9SGleb Smirnoff.Aq Ar b .
20023b3a8eb9SGleb SmirnoffFlags not specified in
20033b3a8eb9SGleb Smirnoff.Aq Ar b
20043b3a8eb9SGleb Smirnoffare ignored.
20053b3a8eb9SGleb SmirnoffFor stateful connections, the default is
20063b3a8eb9SGleb Smirnoff.Ar flags S/SA .
20073b3a8eb9SGleb SmirnoffTo indicate that flags should not be checked at all, specify
20083b3a8eb9SGleb Smirnoff.Ar flags any .
20093b3a8eb9SGleb SmirnoffThe flags are: (F)IN, (S)YN, (R)ST, (P)USH, (A)CK, (U)RG, (E)CE, and C(W)R.
20103b3a8eb9SGleb Smirnoff.Bl -tag -width Fl
20113b3a8eb9SGleb Smirnoff.It Ar flags S/S
20123b3a8eb9SGleb SmirnoffFlag SYN is set.
20133b3a8eb9SGleb SmirnoffThe other flags are ignored.
20143b3a8eb9SGleb Smirnoff.It Ar flags S/SA
20153b3a8eb9SGleb SmirnoffThis is the default setting for stateful connections.
20163b3a8eb9SGleb SmirnoffOut of SYN and ACK, exactly SYN may be set.
20173b3a8eb9SGleb SmirnoffSYN, SYN+PSH and SYN+RST match, but SYN+ACK, ACK and ACK+RST do not.
20183b3a8eb9SGleb SmirnoffThis is more restrictive than the previous example.
20193b3a8eb9SGleb Smirnoff.It Ar flags /SFRA
20203b3a8eb9SGleb SmirnoffIf the first set is not specified, it defaults to none.
20213b3a8eb9SGleb SmirnoffAll of SYN, FIN, RST and ACK must be unset.
20223b3a8eb9SGleb Smirnoff.El
20233b3a8eb9SGleb Smirnoff.Pp
20243b3a8eb9SGleb SmirnoffBecause
20253b3a8eb9SGleb Smirnoff.Ar flags S/SA
20263b3a8eb9SGleb Smirnoffis applied by default (unless
20273b3a8eb9SGleb Smirnoff.Ar no state
20283b3a8eb9SGleb Smirnoffis specified), only the initial SYN packet of a TCP handshake will create
20293b3a8eb9SGleb Smirnoffa state for a TCP connection.
20303b3a8eb9SGleb SmirnoffIt is possible to be less restrictive, and allow state creation from
20313b3a8eb9SGleb Smirnoffintermediate
20323b3a8eb9SGleb Smirnoff.Pq non-SYN
20333b3a8eb9SGleb Smirnoffpackets, by specifying
20343b3a8eb9SGleb Smirnoff.Ar flags any .
20353b3a8eb9SGleb SmirnoffThis will cause
20363b3a8eb9SGleb Smirnoff.Xr pf 4
20373b3a8eb9SGleb Smirnoffto synchronize to existing connections, for instance
20383b3a8eb9SGleb Smirnoffif one flushes the state table.
20393b3a8eb9SGleb SmirnoffHowever, states created from such intermediate packets may be missing
20403b3a8eb9SGleb Smirnoffconnection details such as the TCP window scaling factor.
20413b3a8eb9SGleb SmirnoffStates which modify the packet flow, such as those affected by
2042eaf484fdSKristof Provost.Ar af-to,
2043eaf484fdSKristof Provost.Ar nat,
2044eaf484fdSKristof Provost.Ar binat or
2045eaf484fdSKristof Provost.Ar rdr
20463b3a8eb9SGleb Smirnoffrules,
20473b3a8eb9SGleb Smirnoff.Ar modulate No or Ar synproxy state
20483b3a8eb9SGleb Smirnoffoptions, or scrubbed with
20493b3a8eb9SGleb Smirnoff.Ar reassemble tcp
20503b3a8eb9SGleb Smirnoffwill also not be recoverable from intermediate packets.
20513b3a8eb9SGleb SmirnoffSuch connections will stall and time out.
20523b3a8eb9SGleb Smirnoff.It Xo Ar icmp-type Aq Ar type
20533b3a8eb9SGleb Smirnoff.Ar code Aq Ar code
20543b3a8eb9SGleb Smirnoff.Xc
20553b3a8eb9SGleb Smirnoff.It Xo Ar icmp6-type Aq Ar type
20563b3a8eb9SGleb Smirnoff.Ar code Aq Ar code
20573b3a8eb9SGleb Smirnoff.Xc
20583b3a8eb9SGleb SmirnoffThis rule only applies to ICMP or ICMPv6 packets with the specified type
20593b3a8eb9SGleb Smirnoffand code.
20603b3a8eb9SGleb SmirnoffText names for ICMP types and codes are listed in
20613b3a8eb9SGleb Smirnoff.Xr icmp 4
20623b3a8eb9SGleb Smirnoffand
20633b3a8eb9SGleb Smirnoff.Xr icmp6 4 .
20643b3a8eb9SGleb SmirnoffThis parameter is only valid for rules that cover protocols ICMP or
20653b3a8eb9SGleb SmirnoffICMP6.
20663b3a8eb9SGleb SmirnoffThe protocol and the ICMP type indicator
20673b3a8eb9SGleb Smirnoff.Po
20683b3a8eb9SGleb Smirnoff.Ar icmp-type
20693b3a8eb9SGleb Smirnoffor
20703b3a8eb9SGleb Smirnoff.Ar icmp6-type
20713b3a8eb9SGleb Smirnoff.Pc
20723b3a8eb9SGleb Smirnoffmust match.
20733b3a8eb9SGleb Smirnoff.It Xo Ar tos Aq Ar string
20743b3a8eb9SGleb Smirnoff.No \*(Ba Aq Ar number
20753b3a8eb9SGleb Smirnoff.Xc
20763b3a8eb9SGleb SmirnoffThis rule applies to packets with the specified
20773b3a8eb9SGleb Smirnoff.Em TOS
20783b3a8eb9SGleb Smirnoffbits set.
20793b3a8eb9SGleb Smirnoff.Em TOS
20803b3a8eb9SGleb Smirnoffmay be
20813b3a8eb9SGleb Smirnoffgiven as one of
20821f495578SKristof Provost.Ar critical ,
20831f495578SKristof Provost.Ar inetcontrol ,
20843b3a8eb9SGleb Smirnoff.Ar lowdelay ,
20851f495578SKristof Provost.Ar netcontrol ,
20863b3a8eb9SGleb Smirnoff.Ar throughput ,
20873b3a8eb9SGleb Smirnoff.Ar reliability ,
20881f495578SKristof Provostor one of the DiffServ Code Points:
20891f495578SKristof Provost.Ar ef ,
2090b4e3f3c2SKristof Provost.Ar va ,
20911f495578SKristof Provost.Ar af11 No ... Ar af43 ,
20921f495578SKristof Provost.Ar cs0 No ... Ar cs7 ;
20933b3a8eb9SGleb Smirnoffor as either hex or decimal.
20943b3a8eb9SGleb Smirnoff.Pp
20953b3a8eb9SGleb SmirnoffFor example, the following rules are identical:
20963b3a8eb9SGleb Smirnoff.Bd -literal -offset indent
20973b3a8eb9SGleb Smirnoffpass all tos lowdelay
20983b3a8eb9SGleb Smirnoffpass all tos 0x10
20993b3a8eb9SGleb Smirnoffpass all tos 16
21003b3a8eb9SGleb Smirnoff.Ed
21013b3a8eb9SGleb Smirnoff.It Ar allow-opts
21023b3a8eb9SGleb SmirnoffBy default, IPv4 packets with IP options or IPv6 packets with routing
21033b3a8eb9SGleb Smirnoffextension headers are blocked.
21043b3a8eb9SGleb SmirnoffWhen
21053b3a8eb9SGleb Smirnoff.Ar allow-opts
21063b3a8eb9SGleb Smirnoffis specified for a
21073b3a8eb9SGleb Smirnoff.Ar pass
21083b3a8eb9SGleb Smirnoffrule, packets that pass the filter based on that rule (last matching)
21093b3a8eb9SGleb Smirnoffdo so even if they contain IP options or routing extension headers.
21103b3a8eb9SGleb SmirnoffFor packets that match state, the rule that initially created the
21113b3a8eb9SGleb Smirnoffstate is used.
21123b3a8eb9SGleb SmirnoffThe implicit
21133b3a8eb9SGleb Smirnoff.Ar pass
21143b3a8eb9SGleb Smirnoffrule that is used when a packet does not match any rules does not
21153b3a8eb9SGleb Smirnoffallow IP options.
21163b3a8eb9SGleb Smirnoff.It Ar label Aq Ar string
21173b3a8eb9SGleb SmirnoffAdds a label (name) to the rule, which can be used to identify the rule.
21183b3a8eb9SGleb SmirnoffFor instance,
21193b3a8eb9SGleb Smirnoffpfctl -s labels
21203b3a8eb9SGleb Smirnoffshows per-rule statistics for rules that have labels.
21213b3a8eb9SGleb Smirnoff.Pp
21223b3a8eb9SGleb SmirnoffThe following macros can be used in labels:
21233b3a8eb9SGleb Smirnoff.Pp
21243b3a8eb9SGleb Smirnoff.Bl -tag -width $srcaddr -compact -offset indent
21253b3a8eb9SGleb Smirnoff.It Ar $if
21263b3a8eb9SGleb SmirnoffThe interface.
21273b3a8eb9SGleb Smirnoff.It Ar $srcaddr
21283b3a8eb9SGleb SmirnoffThe source IP address.
21293b3a8eb9SGleb Smirnoff.It Ar $dstaddr
21303b3a8eb9SGleb SmirnoffThe destination IP address.
21313b3a8eb9SGleb Smirnoff.It Ar $srcport
21323b3a8eb9SGleb SmirnoffThe source port specification.
21333b3a8eb9SGleb Smirnoff.It Ar $dstport
21343b3a8eb9SGleb SmirnoffThe destination port specification.
21353b3a8eb9SGleb Smirnoff.It Ar $proto
21363b3a8eb9SGleb SmirnoffThe protocol name.
21373b3a8eb9SGleb Smirnoff.It Ar $nr
21383b3a8eb9SGleb SmirnoffThe rule number.
21393b3a8eb9SGleb Smirnoff.El
21403b3a8eb9SGleb Smirnoff.Pp
21413b3a8eb9SGleb SmirnoffFor example:
21423b3a8eb9SGleb Smirnoff.Bd -literal -offset indent
21433b3a8eb9SGleb Smirnoffips = \&"{ 1.2.3.4, 1.2.3.5 }\&"
21443b3a8eb9SGleb Smirnoffpass in proto tcp from any to $ips \e
214583f9b68fSKristof Provost      port > 1023 label \&"$dstaddr:$dstport\&"
21463b3a8eb9SGleb Smirnoff.Ed
21473b3a8eb9SGleb Smirnoff.Pp
21483b3a8eb9SGleb Smirnoffexpands to
21493b3a8eb9SGleb Smirnoff.Bd -literal -offset indent
21503b3a8eb9SGleb Smirnoffpass in inet proto tcp from any to 1.2.3.4 \e
215183f9b68fSKristof Provost      port > 1023 label \&"1.2.3.4:>1023\&"
21523b3a8eb9SGleb Smirnoffpass in inet proto tcp from any to 1.2.3.5 \e
215383f9b68fSKristof Provost      port > 1023 label \&"1.2.3.5:>1023\&"
21543b3a8eb9SGleb Smirnoff.Ed
21553b3a8eb9SGleb Smirnoff.Pp
21563b3a8eb9SGleb SmirnoffThe macro expansion for the
21573b3a8eb9SGleb Smirnoff.Ar label
21583b3a8eb9SGleb Smirnoffdirective occurs only at configuration file parse time, not during runtime.
215976c5eeccSKristof Provost.It Ar ridentifier Aq Ar number
216076c5eeccSKristof ProvostAdd an identifier (number) to the rule, which can be used to correlate the rule
216176c5eeccSKristof Provostto pflog entries, even after ruleset updates.
21623b3a8eb9SGleb Smirnoff.It Xo Ar queue Aq Ar queue
21633b3a8eb9SGleb Smirnoff.No \*(Ba ( Aq Ar queue ,
21643b3a8eb9SGleb Smirnoff.Aq Ar queue )
21653b3a8eb9SGleb Smirnoff.Xc
21663b3a8eb9SGleb SmirnoffPackets matching this rule will be assigned to the specified queue.
21673b3a8eb9SGleb SmirnoffIf two queues are given, packets which have a
21683b3a8eb9SGleb Smirnoff.Em TOS
21693b3a8eb9SGleb Smirnoffof
21703b3a8eb9SGleb Smirnoff.Em lowdelay
21713b3a8eb9SGleb Smirnoffand TCP ACKs with no data payload will be assigned to the second one.
21723b3a8eb9SGleb SmirnoffSee
21733b3a8eb9SGleb Smirnoff.Sx QUEUEING
21743b3a8eb9SGleb Smirnofffor setup details.
21753b3a8eb9SGleb Smirnoff.Pp
21763b3a8eb9SGleb SmirnoffFor example:
21773b3a8eb9SGleb Smirnoff.Bd -literal -offset indent
21783b3a8eb9SGleb Smirnoffpass in proto tcp to port 25 queue mail
21793b3a8eb9SGleb Smirnoffpass in proto tcp to port 22 queue(ssh_bulk, ssh_prio)
21803b3a8eb9SGleb Smirnoff.Ed
21813e248e0fSKristof Provost.It Cm set prio Ar priority | Pq Ar priority , priority
21823e248e0fSKristof ProvostPackets matching this rule will be assigned a specific queueing priority.
21833e248e0fSKristof ProvostPriorities are assigned as integers 0 through 7.
21843e248e0fSKristof ProvostIf the packet is transmitted on a
21853e248e0fSKristof Provost.Xr vlan 4
21863e248e0fSKristof Provostinterface, the queueing priority will be written as the priority
21873e248e0fSKristof Provostcode point in the 802.1Q VLAN header.
21883e248e0fSKristof ProvostIf two priorities are given, packets which have a TOS of
21893e248e0fSKristof Provost.Cm lowdelay
21903e248e0fSKristof Provostand TCP ACKs with no data payload will be assigned to the second one.
21913e248e0fSKristof Provost.Pp
21923e248e0fSKristof ProvostFor example:
21933e248e0fSKristof Provost.Bd -literal -offset indent
21943e248e0fSKristof Provostpass in proto tcp to port 25 set prio 2
21953e248e0fSKristof Provostpass in proto tcp to port 22 set prio (2, 5)
21963e248e0fSKristof Provost.Ed
2197e80f2a10SKristof Provost.It Ar received-on Aq Ar interface
2198e80f2a10SKristof ProvostOnly match packets which were received on the specified
2199e80f2a10SKristof Provost.Ar interface
2200e80f2a10SKristof Provost(or interface group).
2201618a8766SKristof Provost.Ar any
2202618a8766SKristof Provostwill match any existing interface except loopback ones.
22033b3a8eb9SGleb Smirnoff.It Ar tag Aq Ar string
22043b3a8eb9SGleb SmirnoffPackets matching this rule will be tagged with the
22053b3a8eb9SGleb Smirnoffspecified string.
22063b3a8eb9SGleb SmirnoffThe tag acts as an internal marker that can be used to
22073b3a8eb9SGleb Smirnoffidentify these packets later on.
22083b3a8eb9SGleb SmirnoffThis can be used, for example, to provide trust between
22093b3a8eb9SGleb Smirnoffinterfaces and to determine if packets have been
22103b3a8eb9SGleb Smirnoffprocessed by translation rules.
22113b3a8eb9SGleb SmirnoffTags are
22123b3a8eb9SGleb Smirnoff.Qq sticky ,
22133b3a8eb9SGleb Smirnoffmeaning that the packet will be tagged even if the rule
22143b3a8eb9SGleb Smirnoffis not the last matching rule.
22153b3a8eb9SGleb SmirnoffFurther matching rules can replace the tag with a
22163b3a8eb9SGleb Smirnoffnew one but will not remove a previously applied tag.
22173b3a8eb9SGleb SmirnoffA packet is only ever assigned one tag at a time.
22183b3a8eb9SGleb SmirnoffPacket tagging can be done during
22193b3a8eb9SGleb Smirnoff.Ar nat ,
22203b3a8eb9SGleb Smirnoff.Ar rdr ,
22213b3a8eb9SGleb Smirnoff.Ar binat
2222ab2886f0SKristof Provostor
2223ab2886f0SKristof Provost.Ar ether
22243b3a8eb9SGleb Smirnoffrules in addition to filter rules.
22253b3a8eb9SGleb SmirnoffTags take the same macros as labels (see above).
22263b3a8eb9SGleb Smirnoff.It Ar tagged Aq Ar string
22273b3a8eb9SGleb SmirnoffUsed with filter, translation or scrub rules
22283b3a8eb9SGleb Smirnoffto specify that packets must already
22293b3a8eb9SGleb Smirnoffbe tagged with the given tag in order to match the rule.
22303b3a8eb9SGleb SmirnoffInverse tag matching can also be done
22313b3a8eb9SGleb Smirnoffby specifying the
22323b3a8eb9SGleb Smirnoff.Cm !\&
22333b3a8eb9SGleb Smirnoffoperator before the
22343b3a8eb9SGleb Smirnoff.Ar tagged
22353b3a8eb9SGleb Smirnoffkeyword.
22363b3a8eb9SGleb Smirnoff.It Ar rtable Aq Ar number
22373b3a8eb9SGleb SmirnoffUsed to select an alternate routing table for the routing lookup.
22383b3a8eb9SGleb SmirnoffOnly effective before the route lookup happened, i.e. when filtering inbound.
22393b3a8eb9SGleb Smirnoff.It Xo Ar divert-to Aq Ar host
22403b3a8eb9SGleb Smirnoff.Ar port Aq Ar port
22413b3a8eb9SGleb Smirnoff.Xc
22427e1affa2SIgor OstapenkoUsed to
22437e1affa2SIgor Ostapenko.Xr divert 4
22447e1affa2SIgor Ostapenkopackets to the given divert
22453b3a8eb9SGleb Smirnoff.Ar port .
22467e1affa2SIgor OstapenkoHistorically
22477e1affa2SIgor Ostapenko.Ox pf has another meaning for this, and
22487e1affa2SIgor Ostapenko.Fx pf uses
22497e1affa2SIgor Ostapenkothis syntax to support
22507e1affa2SIgor Ostapenko.Xr divert 4 instead. Hence,
22517e1affa2SIgor Ostapenko.Ar host
22527e1affa2SIgor Ostapenkohas no meaning and can be set to anything like 127.0.0.1.
22537e1affa2SIgor OstapenkoIf a packet is re-injected and does not change direction then it will not be
22547e1affa2SIgor Ostapenkore-diverted.
22553b3a8eb9SGleb Smirnoff.It Ar divert-reply
22567e1affa2SIgor OstapenkoIt has no meaning in
22577e1affa2SIgor Ostapenko.Fx pf .
22583b3a8eb9SGleb Smirnoff.It Ar probability Aq Ar number
22593b3a8eb9SGleb SmirnoffA probability attribute can be attached to a rule, with a value set between
22603b3a8eb9SGleb Smirnoff0 and 1, bounds not included.
22613b3a8eb9SGleb SmirnoffIn that case, the rule will be honoured using the given probability value
22623b3a8eb9SGleb Smirnoffonly.
22633b3a8eb9SGleb SmirnoffFor example, the following rule will drop 20% of incoming ICMP packets:
22643b3a8eb9SGleb Smirnoff.Bd -literal -offset indent
22653b3a8eb9SGleb Smirnoffblock in proto icmp probability 20%
22663b3a8eb9SGleb Smirnoff.Ed
22673e248e0fSKristof Provost.It Ar prio Aq Ar number
22683e248e0fSKristof ProvostOnly match packets which have the given queueing priority assigned.
22693b3a8eb9SGleb Smirnoff.El
22703b3a8eb9SGleb Smirnoff.Sh ROUTING
22713b3a8eb9SGleb SmirnoffIf a packet matches a rule with a route option set, the packet filter will
22723b3a8eb9SGleb Smirnoffroute the packet according to the type of route option.
22733b3a8eb9SGleb SmirnoffWhen such a rule creates state, the route option is also applied to all
22743b3a8eb9SGleb Smirnoffpackets matching the same connection.
22753b3a8eb9SGleb Smirnoff.Bl -tag -width xxxx
22763b3a8eb9SGleb Smirnoff.It Ar route-to
22773b3a8eb9SGleb SmirnoffThe
22783b3a8eb9SGleb Smirnoff.Ar route-to
22793b3a8eb9SGleb Smirnoffoption routes the packet to the specified interface with an optional address
22803b3a8eb9SGleb Smirnofffor the next hop.
22813b3a8eb9SGleb SmirnoffWhen a
22823b3a8eb9SGleb Smirnoff.Ar route-to
22833b3a8eb9SGleb Smirnoffrule creates state, only packets that pass in the same direction as the
22843b3a8eb9SGleb Smirnofffilter rule specifies will be routed in this way.
22853b3a8eb9SGleb SmirnoffPackets passing in the opposite direction (replies) are not affected
22863b3a8eb9SGleb Smirnoffand are routed normally.
22873b3a8eb9SGleb Smirnoff.It Ar reply-to
22883b3a8eb9SGleb SmirnoffThe
22893b3a8eb9SGleb Smirnoff.Ar reply-to
22903b3a8eb9SGleb Smirnoffoption is similar to
22913b3a8eb9SGleb Smirnoff.Ar route-to ,
22923b3a8eb9SGleb Smirnoffbut routes packets that pass in the opposite direction (replies) to the
22933b3a8eb9SGleb Smirnoffspecified interface.
22943b3a8eb9SGleb SmirnoffOpposite direction is only defined in the context of a state entry, and
22953b3a8eb9SGleb Smirnoff.Ar reply-to
22963b3a8eb9SGleb Smirnoffis useful only in rules that create state.
22973b3a8eb9SGleb SmirnoffIt can be used on systems with multiple external connections to
22983b3a8eb9SGleb Smirnoffroute all outgoing packets of a connection through the interface
22993b3a8eb9SGleb Smirnoffthe incoming connection arrived through (symmetric routing enforcement).
23003b3a8eb9SGleb Smirnoff.It Ar dup-to
23013b3a8eb9SGleb SmirnoffThe
23023b3a8eb9SGleb Smirnoff.Ar dup-to
23033b3a8eb9SGleb Smirnoffoption creates a duplicate of the packet and routes it like
23043b3a8eb9SGleb Smirnoff.Ar route-to .
23053b3a8eb9SGleb SmirnoffThe original packet gets routed as it normally would.
23063b3a8eb9SGleb Smirnoff.El
23073b3a8eb9SGleb Smirnoff.Sh POOL OPTIONS
23083b3a8eb9SGleb SmirnoffFor
23093b3a8eb9SGleb Smirnoff.Ar nat
23103b3a8eb9SGleb Smirnoffand
23113b3a8eb9SGleb Smirnoff.Ar rdr
23123b3a8eb9SGleb Smirnoffrules, (as well as for the
23133b3a8eb9SGleb Smirnoff.Ar route-to ,
23143b3a8eb9SGleb Smirnoff.Ar reply-to
23153b3a8eb9SGleb Smirnoffand
23163b3a8eb9SGleb Smirnoff.Ar dup-to
23173b3a8eb9SGleb Smirnoffrule options) for which there is a single redirection address which has a
23183b3a8eb9SGleb Smirnoffsubnet mask smaller than 32 for IPv4 or 128 for IPv6 (more than one IP
23193b3a8eb9SGleb Smirnoffaddress), a variety of different methods for assigning this address can be
23203b3a8eb9SGleb Smirnoffused:
23213b3a8eb9SGleb Smirnoff.Bl -tag -width xxxx
23223b3a8eb9SGleb Smirnoff.It Ar bitmask
23233b3a8eb9SGleb SmirnoffThe
23243b3a8eb9SGleb Smirnoff.Ar bitmask
23253b3a8eb9SGleb Smirnoffoption applies the network portion of the redirection address to the address
23263b3a8eb9SGleb Smirnoffto be modified (source with
23273b3a8eb9SGleb Smirnoff.Ar nat ,
23283b3a8eb9SGleb Smirnoffdestination with
23293b3a8eb9SGleb Smirnoff.Ar rdr ) .
23303b3a8eb9SGleb Smirnoff.It Ar random
23313b3a8eb9SGleb SmirnoffThe
23323b3a8eb9SGleb Smirnoff.Ar random
23333b3a8eb9SGleb Smirnoffoption selects an address at random within the defined block of addresses.
23343b3a8eb9SGleb Smirnoff.It Ar source-hash
23353b3a8eb9SGleb SmirnoffThe
23363b3a8eb9SGleb Smirnoff.Ar source-hash
23373b3a8eb9SGleb Smirnoffoption uses a hash of the source address to determine the redirection address,
23383b3a8eb9SGleb Smirnoffensuring that the redirection address is always the same for a given source.
23393b3a8eb9SGleb SmirnoffAn optional key can be specified after this keyword either in hex or as a
23403b3a8eb9SGleb Smirnoffstring; by default
23413b3a8eb9SGleb Smirnoff.Xr pfctl 8
23423b3a8eb9SGleb Smirnoffrandomly generates a key for source-hash every time the
23433b3a8eb9SGleb Smirnoffruleset is reloaded.
23443b3a8eb9SGleb Smirnoff.It Ar round-robin
23453b3a8eb9SGleb SmirnoffThe
23463b3a8eb9SGleb Smirnoff.Ar round-robin
23473b3a8eb9SGleb Smirnoffoption loops through the redirection address(es).
23483b3a8eb9SGleb Smirnoff.Pp
23493b3a8eb9SGleb SmirnoffWhen more than one redirection address is specified,
2350c2346c3dSKristof Provost.Ar bitmask
2351c2346c3dSKristof Provostis not permitted as a pool type.
23523b3a8eb9SGleb Smirnoff.It Ar static-port
23533b3a8eb9SGleb SmirnoffWith
23543b3a8eb9SGleb Smirnoff.Ar nat
23553b3a8eb9SGleb Smirnoffrules, the
23563b3a8eb9SGleb Smirnoff.Ar static-port
23573b3a8eb9SGleb Smirnoffoption prevents
23583b3a8eb9SGleb Smirnoff.Xr pf 4
23593b3a8eb9SGleb Smirnofffrom modifying the source port on TCP and UDP packets.
23602aa21096SKurosawa Takahiro.It Xo Ar map-e-portset Aq Ar psid-offset
23612aa21096SKurosawa Takahiro.No / Aq Ar psid-len
23622aa21096SKurosawa Takahiro.No / Aq Ar psid
23632aa21096SKurosawa Takahiro.Xc
23642aa21096SKurosawa TakahiroWith
23652aa21096SKurosawa Takahiro.Ar nat
23662aa21096SKurosawa Takahirorules, the
23672aa21096SKurosawa Takahiro.Ar map-e-portset
23682aa21096SKurosawa Takahirooption enables the source port translation of MAP-E (RFC 7597) Customer Edge.
23692aa21096SKurosawa TakahiroIn order to make the host act as a MAP-E Customer Edge, setting up a tunneling
23702aa21096SKurosawa Takahirointerface and pass rules for encapsulated packets are required in addition
23712aa21096SKurosawa Takahiroto the map-e-portset nat rule.
23722aa21096SKurosawa Takahiro.Pp
23732aa21096SKurosawa TakahiroFor example:
23742aa21096SKurosawa Takahiro.Bd -literal -offset indent
23752aa21096SKurosawa Takahironat on $gif_mape_if from $int_if:network to any \e
23762aa21096SKurosawa Takahiro      -> $ipv4_mape_src map-e-portset 6/8/0x34
23772aa21096SKurosawa Takahiro.Ed
23782aa21096SKurosawa Takahiro.Pp
23792aa21096SKurosawa Takahirosets PSID offset 6, PSID length 8, PSID 0x34.
2380725003daSEd Maste.It Ar endpoint-independent
2381725003daSEd MasteWith
2382725003daSEd Maste.Ar nat
2383725003daSEd Masterules, the
2384725003daSEd Maste.Ar endpoint-independent
2385725003daSEd Masteoption caues
2386725003daSEd Maste.Xr pf 4
2387725003daSEd Masteto always map connections from a UDP source address and port to the same
2388725003daSEd MasteNAT address and port.
2389725003daSEd MasteThis feature implements "full-cone" NAT behavior.
23903b3a8eb9SGleb Smirnoff.El
23913b3a8eb9SGleb Smirnoff.Pp
23923b3a8eb9SGleb SmirnoffAdditionally, the
23933b3a8eb9SGleb Smirnoff.Ar sticky-address
23943b3a8eb9SGleb Smirnoffoption can be specified to help ensure that multiple connections from the
23953b3a8eb9SGleb Smirnoffsame source are mapped to the same redirection address.
23963b3a8eb9SGleb SmirnoffThis option can be used with the
23973b3a8eb9SGleb Smirnoff.Ar random
23983b3a8eb9SGleb Smirnoffand
23993b3a8eb9SGleb Smirnoff.Ar round-robin
24003b3a8eb9SGleb Smirnoffpool options.
24013b3a8eb9SGleb SmirnoffNote that by default these associations are destroyed as soon as there are
24023b3a8eb9SGleb Smirnoffno longer states which refer to them; in order to make the mappings last
24033b3a8eb9SGleb Smirnoffbeyond the lifetime of the states, increase the global options with
24043b3a8eb9SGleb Smirnoff.Ar set timeout src.track .
24053b3a8eb9SGleb SmirnoffSee
24063b3a8eb9SGleb Smirnoff.Sx STATEFUL TRACKING OPTIONS
24073b3a8eb9SGleb Smirnofffor more ways to control the source tracking.
24083b3a8eb9SGleb Smirnoff.Sh STATE MODULATION
24093b3a8eb9SGleb SmirnoffMuch of the security derived from TCP is attributable to how well the
24103b3a8eb9SGleb Smirnoffinitial sequence numbers (ISNs) are chosen.
24113b3a8eb9SGleb SmirnoffSome popular stack implementations choose
24123b3a8eb9SGleb Smirnoff.Em very
24133b3a8eb9SGleb Smirnoffpoor ISNs and thus are normally susceptible to ISN prediction exploits.
24143b3a8eb9SGleb SmirnoffBy applying a
24153b3a8eb9SGleb Smirnoff.Ar modulate state
24163b3a8eb9SGleb Smirnoffrule to a TCP connection,
24173b3a8eb9SGleb Smirnoff.Xr pf 4
24183b3a8eb9SGleb Smirnoffwill create a high quality random sequence number for each connection
24193b3a8eb9SGleb Smirnoffendpoint.
24203b3a8eb9SGleb Smirnoff.Pp
24213b3a8eb9SGleb SmirnoffThe
24223b3a8eb9SGleb Smirnoff.Ar modulate state
24233b3a8eb9SGleb Smirnoffdirective implicitly keeps state on the rule and is
24243b3a8eb9SGleb Smirnoffonly applicable to TCP connections.
24253b3a8eb9SGleb Smirnoff.Pp
24263b3a8eb9SGleb SmirnoffFor instance:
24273b3a8eb9SGleb Smirnoff.Bd -literal -offset indent
24283b3a8eb9SGleb Smirnoffblock all
24293b3a8eb9SGleb Smirnoffpass out proto tcp from any to any modulate state
24303b3a8eb9SGleb Smirnoffpass in  proto tcp from any to any port 25 flags S/SFRA modulate state
24313b3a8eb9SGleb Smirnoff.Ed
24323b3a8eb9SGleb Smirnoff.Pp
24333b3a8eb9SGleb SmirnoffNote that modulated connections will not recover when the state table
24343b3a8eb9SGleb Smirnoffis lost (firewall reboot, flushing the state table, etc...).
24353b3a8eb9SGleb Smirnoff.Xr pf 4
24363b3a8eb9SGleb Smirnoffwill not be able to infer a connection again after the state table flushes
24373b3a8eb9SGleb Smirnoffthe connection's modulator.
24383b3a8eb9SGleb SmirnoffWhen the state is lost, the connection may be left dangling until the
24393b3a8eb9SGleb Smirnoffrespective endpoints time out the connection.
24403b3a8eb9SGleb SmirnoffIt is possible on a fast local network for the endpoints to start an ACK
24413b3a8eb9SGleb Smirnoffstorm while trying to resynchronize after the loss of the modulator.
24423b3a8eb9SGleb SmirnoffThe default
24433b3a8eb9SGleb Smirnoff.Ar flags
24443b3a8eb9SGleb Smirnoffsettings (or a more strict equivalent) should be used on
24453b3a8eb9SGleb Smirnoff.Ar modulate state
24463b3a8eb9SGleb Smirnoffrules to prevent ACK storms.
24473b3a8eb9SGleb Smirnoff.Pp
24483b3a8eb9SGleb SmirnoffNote that alternative methods are available
24493b3a8eb9SGleb Smirnoffto prevent loss of the state table
24503b3a8eb9SGleb Smirnoffand allow for firewall failover.
24513b3a8eb9SGleb SmirnoffSee
24523b3a8eb9SGleb Smirnoff.Xr carp 4
24533b3a8eb9SGleb Smirnoffand
24543b3a8eb9SGleb Smirnoff.Xr pfsync 4
24553b3a8eb9SGleb Smirnofffor further information.
24563b3a8eb9SGleb Smirnoff.Sh SYN PROXY
24573b3a8eb9SGleb SmirnoffBy default,
24583b3a8eb9SGleb Smirnoff.Xr pf 4
24593b3a8eb9SGleb Smirnoffpasses packets that are part of a
24603b3a8eb9SGleb Smirnoff.Xr tcp 4
24613b3a8eb9SGleb Smirnoffhandshake between the endpoints.
24623b3a8eb9SGleb SmirnoffThe
24633b3a8eb9SGleb Smirnoff.Ar synproxy state
24643b3a8eb9SGleb Smirnoffoption can be used to cause
24653b3a8eb9SGleb Smirnoff.Xr pf 4
24663b3a8eb9SGleb Smirnoffitself to complete the handshake with the active endpoint, perform a handshake
24673b3a8eb9SGleb Smirnoffwith the passive endpoint, and then forward packets between the endpoints.
24683b3a8eb9SGleb Smirnoff.Pp
24693b3a8eb9SGleb SmirnoffNo packets are sent to the passive endpoint before the active endpoint has
24703b3a8eb9SGleb Smirnoffcompleted the handshake, hence so-called SYN floods with spoofed source
24713b3a8eb9SGleb Smirnoffaddresses will not reach the passive endpoint, as the sender can't complete the
24723b3a8eb9SGleb Smirnoffhandshake.
24733b3a8eb9SGleb Smirnoff.Pp
24743b3a8eb9SGleb SmirnoffThe proxy is transparent to both endpoints, they each see a single
24753b3a8eb9SGleb Smirnoffconnection from/to the other endpoint.
24763b3a8eb9SGleb Smirnoff.Xr pf 4
24773b3a8eb9SGleb Smirnoffchooses random initial sequence numbers for both handshakes.
24783b3a8eb9SGleb SmirnoffOnce the handshakes are completed, the sequence number modulators
24793b3a8eb9SGleb Smirnoff(see previous section) are used to translate further packets of the
24803b3a8eb9SGleb Smirnoffconnection.
24813b3a8eb9SGleb Smirnoff.Ar synproxy state
24823b3a8eb9SGleb Smirnoffincludes
24833b3a8eb9SGleb Smirnoff.Ar modulate state .
24843b3a8eb9SGleb Smirnoff.Pp
24853b3a8eb9SGleb SmirnoffRules with
24863b3a8eb9SGleb Smirnoff.Ar synproxy
24873b3a8eb9SGleb Smirnoffwill not work if
24883b3a8eb9SGleb Smirnoff.Xr pf 4
24893b3a8eb9SGleb Smirnoffoperates on a
24903b3a8eb9SGleb Smirnoff.Xr bridge 4 .
24913b3a8eb9SGleb Smirnoff.Pp
24923b3a8eb9SGleb SmirnoffExample:
24933b3a8eb9SGleb Smirnoff.Bd -literal -offset indent
24943b3a8eb9SGleb Smirnoffpass in proto tcp from any to any port www synproxy state
24953b3a8eb9SGleb Smirnoff.Ed
24963b3a8eb9SGleb Smirnoff.Sh STATEFUL TRACKING OPTIONS
24973b3a8eb9SGleb SmirnoffA number of options related to stateful tracking can be applied on a
24983b3a8eb9SGleb Smirnoffper-rule basis.
24993b3a8eb9SGleb Smirnoff.Ar keep state ,
25003b3a8eb9SGleb Smirnoff.Ar modulate state
25013b3a8eb9SGleb Smirnoffand
25023b3a8eb9SGleb Smirnoff.Ar synproxy state
25033b3a8eb9SGleb Smirnoffsupport these options, and
25043b3a8eb9SGleb Smirnoff.Ar keep state
25053b3a8eb9SGleb Smirnoffmust be specified explicitly to apply options to a rule.
25063b3a8eb9SGleb Smirnoff.Pp
25073b3a8eb9SGleb Smirnoff.Bl -tag -width xxxx -compact
25083b3a8eb9SGleb Smirnoff.It Ar max Aq Ar number
25093b3a8eb9SGleb SmirnoffLimits the number of concurrent states the rule may create.
25103b3a8eb9SGleb SmirnoffWhen this limit is reached, further packets that would create
2511d01949e8SKristof Provoststate are dropped until existing states time out.
25123b3a8eb9SGleb Smirnoff.It Ar no-sync
25133b3a8eb9SGleb SmirnoffPrevent state changes for states created by this rule from appearing on the
25143b3a8eb9SGleb Smirnoff.Xr pfsync 4
25153b3a8eb9SGleb Smirnoffinterface.
25163b3a8eb9SGleb Smirnoff.It Xo Aq Ar timeout
25173b3a8eb9SGleb Smirnoff.Aq Ar seconds
25183b3a8eb9SGleb Smirnoff.Xc
25193b3a8eb9SGleb SmirnoffChanges the timeout values used for states created by this rule.
25203b3a8eb9SGleb SmirnoffFor a list of all valid timeout names, see
25213b3a8eb9SGleb Smirnoff.Sx OPTIONS
25223b3a8eb9SGleb Smirnoffabove.
25233b3a8eb9SGleb Smirnoff.It Ar sloppy
25243b3a8eb9SGleb SmirnoffUses a sloppy TCP connection tracker that does not check sequence
25253b3a8eb9SGleb Smirnoffnumbers at all, which makes insertion and ICMP teardown attacks way
25263b3a8eb9SGleb Smirnoffeasier.
25273b3a8eb9SGleb SmirnoffThis is intended to be used in situations where one does not see all
25283b3a8eb9SGleb Smirnoffpackets of a connection, e.g. in asymmetric routing situations.
25293b3a8eb9SGleb SmirnoffCannot be used with modulate or synproxy state.
2530baf9b6d0SKristof Provost.It Ar pflow
2531baf9b6d0SKristof ProvostStates created by this rule are exported on the
2532baf9b6d0SKristof Provost.Xr pflow 4
2533baf9b6d0SKristof Provostinterface.
2534e4f2733dSKristof Provost.It Ar allow-related
2535e4f2733dSKristof ProvostAutomatically allow connections related to this one, regardless of rules that
2536e4f2733dSKristof Provostmight otherwise affect them.
2537e4f2733dSKristof ProvostThis currently only applies to SCTP multihomed connection.
25383b3a8eb9SGleb Smirnoff.El
25393b3a8eb9SGleb Smirnoff.Pp
25403b3a8eb9SGleb SmirnoffMultiple options can be specified, separated by commas:
25413b3a8eb9SGleb Smirnoff.Bd -literal -offset indent
25423b3a8eb9SGleb Smirnoffpass in proto tcp from any to any \e
25433b3a8eb9SGleb Smirnoff      port www keep state \e
25443b3a8eb9SGleb Smirnoff      (max 100, source-track rule, max-src-nodes 75, \e
25453b3a8eb9SGleb Smirnoff      max-src-states 3, tcp.established 60, tcp.closing 5)
25463b3a8eb9SGleb Smirnoff.Ed
25473b3a8eb9SGleb Smirnoff.Pp
25483b3a8eb9SGleb SmirnoffWhen the
25493b3a8eb9SGleb Smirnoff.Ar source-track
25503b3a8eb9SGleb Smirnoffkeyword is specified, the number of states per source IP is tracked.
25513b3a8eb9SGleb Smirnoff.Pp
25523b3a8eb9SGleb Smirnoff.Bl -tag -width xxxx -compact
25533b3a8eb9SGleb Smirnoff.It Ar source-track rule
25543b3a8eb9SGleb SmirnoffThe maximum number of states created by this rule is limited by the rule's
25553b3a8eb9SGleb Smirnoff.Ar max-src-nodes
25563b3a8eb9SGleb Smirnoffand
25573b3a8eb9SGleb Smirnoff.Ar max-src-states
25583b3a8eb9SGleb Smirnoffoptions.
25593b3a8eb9SGleb SmirnoffOnly state entries created by this particular rule count toward the rule's
25603b3a8eb9SGleb Smirnofflimits.
25613b3a8eb9SGleb Smirnoff.It Ar source-track global
25623b3a8eb9SGleb SmirnoffThe number of states created by all rules that use this option is limited.
25633b3a8eb9SGleb SmirnoffEach rule can specify different
25643b3a8eb9SGleb Smirnoff.Ar max-src-nodes
25653b3a8eb9SGleb Smirnoffand
25663b3a8eb9SGleb Smirnoff.Ar max-src-states
25673b3a8eb9SGleb Smirnoffoptions, however state entries created by any participating rule count towards
25683b3a8eb9SGleb Smirnoffeach individual rule's limits.
25693b3a8eb9SGleb Smirnoff.El
25703b3a8eb9SGleb Smirnoff.Pp
25713b3a8eb9SGleb SmirnoffThe following limits can be set:
25723b3a8eb9SGleb Smirnoff.Pp
25733b3a8eb9SGleb Smirnoff.Bl -tag -width xxxx -compact
25743b3a8eb9SGleb Smirnoff.It Ar max-src-nodes Aq Ar number
25753b3a8eb9SGleb SmirnoffLimits the maximum number of source addresses which can simultaneously
25763b3a8eb9SGleb Smirnoffhave state table entries.
25773b3a8eb9SGleb Smirnoff.It Ar max-src-states Aq Ar number
25783b3a8eb9SGleb SmirnoffLimits the maximum number of simultaneous state entries that a single
25793b3a8eb9SGleb Smirnoffsource address can create with this rule.
25803b3a8eb9SGleb Smirnoff.El
25813b3a8eb9SGleb Smirnoff.Pp
25823b3a8eb9SGleb SmirnoffFor stateful TCP connections, limits on established connections (connections
25833b3a8eb9SGleb Smirnoffwhich have completed the TCP 3-way handshake) can also be enforced
25843b3a8eb9SGleb Smirnoffper source IP.
25853b3a8eb9SGleb Smirnoff.Pp
25863b3a8eb9SGleb Smirnoff.Bl -tag -width xxxx -compact
25873b3a8eb9SGleb Smirnoff.It Ar max-src-conn Aq Ar number
25883b3a8eb9SGleb SmirnoffLimits the maximum number of simultaneous TCP connections which have
25893b3a8eb9SGleb Smirnoffcompleted the 3-way handshake that a single host can make.
25903b3a8eb9SGleb Smirnoff.It Xo Ar max-src-conn-rate Aq Ar number
25913b3a8eb9SGleb Smirnoff.No / Aq Ar seconds
25923b3a8eb9SGleb Smirnoff.Xc
25933b3a8eb9SGleb SmirnoffLimit the rate of new connections over a time interval.
25943b3a8eb9SGleb SmirnoffThe connection rate is an approximation calculated as a moving average.
25953b3a8eb9SGleb Smirnoff.El
25963b3a8eb9SGleb Smirnoff.Pp
2597d01949e8SKristof ProvostWhen one of these limits is reached, further packets that would create
2598d01949e8SKristof Provoststate are dropped until existing states time out.
2599d01949e8SKristof Provost.Pp
26003b3a8eb9SGleb SmirnoffBecause the 3-way handshake ensures that the source address is not being
26013b3a8eb9SGleb Smirnoffspoofed, more aggressive action can be taken based on these limits.
26023b3a8eb9SGleb SmirnoffWith the
26033b3a8eb9SGleb Smirnoff.Ar overload Aq Ar table
26043b3a8eb9SGleb Smirnoffstate option, source IP addresses which hit either of the limits on
26053b3a8eb9SGleb Smirnoffestablished connections will be added to the named table.
26063b3a8eb9SGleb SmirnoffThis table can be used in the ruleset to block further activity from
26073b3a8eb9SGleb Smirnoffthe offending host, redirect it to a tarpit process, or restrict its
26083b3a8eb9SGleb Smirnoffbandwidth.
26093b3a8eb9SGleb Smirnoff.Pp
26103b3a8eb9SGleb SmirnoffThe optional
26113b3a8eb9SGleb Smirnoff.Ar flush
26123b3a8eb9SGleb Smirnoffkeyword kills all states created by the matching rule which originate
26133b3a8eb9SGleb Smirnofffrom the host which exceeds these limits.
26143b3a8eb9SGleb SmirnoffThe
26153b3a8eb9SGleb Smirnoff.Ar global
26163b3a8eb9SGleb Smirnoffmodifier to the flush command kills all states originating from the
26173b3a8eb9SGleb Smirnoffoffending host, regardless of which rule created the state.
26183b3a8eb9SGleb Smirnoff.Pp
26193b3a8eb9SGleb SmirnoffFor example, the following rules will protect the webserver against
26203b3a8eb9SGleb Smirnoffhosts making more than 100 connections in 10 seconds.
26213b3a8eb9SGleb SmirnoffAny host which connects faster than this rate will have its address added
26223b3a8eb9SGleb Smirnoffto the
26233b3a8eb9SGleb Smirnoff.Aq bad_hosts
26243b3a8eb9SGleb Smirnofftable and have all states originating from it flushed.
26253b3a8eb9SGleb SmirnoffAny new packets arriving from this host will be dropped unconditionally
26263b3a8eb9SGleb Smirnoffby the block rule.
26273b3a8eb9SGleb Smirnoff.Bd -literal -offset indent
262883f9b68fSKristof Provostblock quick from <bad_hosts>
26293b3a8eb9SGleb Smirnoffpass in on $ext_if proto tcp to $webserver port www keep state \e
263083f9b68fSKristof Provost	(max-src-conn-rate 100/10, overload <bad_hosts> flush global)
26313b3a8eb9SGleb Smirnoff.Ed
26323b3a8eb9SGleb Smirnoff.Sh OPERATING SYSTEM FINGERPRINTING
26333b3a8eb9SGleb SmirnoffPassive OS Fingerprinting is a mechanism to inspect nuances of a TCP
26343b3a8eb9SGleb Smirnoffconnection's initial SYN packet and guess at the host's operating system.
26353b3a8eb9SGleb SmirnoffUnfortunately these nuances are easily spoofed by an attacker so the
26363b3a8eb9SGleb Smirnofffingerprint is not useful in making security decisions.
26373b3a8eb9SGleb SmirnoffBut the fingerprint is typically accurate enough to make policy decisions
26383b3a8eb9SGleb Smirnoffupon.
26393b3a8eb9SGleb Smirnoff.Pp
26403b3a8eb9SGleb SmirnoffThe fingerprints may be specified by operating system class, by
26413b3a8eb9SGleb Smirnoffversion, or by subtype/patchlevel.
26423b3a8eb9SGleb SmirnoffThe class of an operating system is typically the vendor or genre
26433b3a8eb9SGleb Smirnoffand would be
26443b3a8eb9SGleb Smirnoff.Ox
26453b3a8eb9SGleb Smirnofffor the
26463b3a8eb9SGleb Smirnoff.Xr pf 4
26473b3a8eb9SGleb Smirnofffirewall itself.
26483b3a8eb9SGleb SmirnoffThe version of the oldest available
26493b3a8eb9SGleb Smirnoff.Ox
26503b3a8eb9SGleb Smirnoffrelease on the main FTP site
26513b3a8eb9SGleb Smirnoffwould be 2.6 and the fingerprint would be written
26523b3a8eb9SGleb Smirnoff.Pp
26533b3a8eb9SGleb Smirnoff.Dl \&"OpenBSD 2.6\&"
26543b3a8eb9SGleb Smirnoff.Pp
26553b3a8eb9SGleb SmirnoffThe subtype of an operating system is typically used to describe the
26563b3a8eb9SGleb Smirnoffpatchlevel if that patch led to changes in the TCP stack behavior.
26573b3a8eb9SGleb SmirnoffIn the case of
26583b3a8eb9SGleb Smirnoff.Ox ,
26593b3a8eb9SGleb Smirnoffthe only subtype is for a fingerprint that was
26603b3a8eb9SGleb Smirnoffnormalized by the
26613b3a8eb9SGleb Smirnoff.Ar no-df
26623b3a8eb9SGleb Smirnoffscrub option and would be specified as
26633b3a8eb9SGleb Smirnoff.Pp
26643b3a8eb9SGleb Smirnoff.Dl \&"OpenBSD 3.3 no-df\&"
26653b3a8eb9SGleb Smirnoff.Pp
26663b3a8eb9SGleb SmirnoffFingerprints for most popular operating systems are provided by
26673b3a8eb9SGleb Smirnoff.Xr pf.os 5 .
26683b3a8eb9SGleb SmirnoffOnce
26693b3a8eb9SGleb Smirnoff.Xr pf 4
26703b3a8eb9SGleb Smirnoffis running, a complete list of known operating system fingerprints may
26713b3a8eb9SGleb Smirnoffbe listed by running:
26723b3a8eb9SGleb Smirnoff.Pp
26733b3a8eb9SGleb Smirnoff.Dl # pfctl -so
26743b3a8eb9SGleb Smirnoff.Pp
26753b3a8eb9SGleb SmirnoffFilter rules can enforce policy at any level of operating system specification
26763b3a8eb9SGleb Smirnoffassuming a fingerprint is present.
26773b3a8eb9SGleb SmirnoffPolicy could limit traffic to approved operating systems or even ban traffic
26783b3a8eb9SGleb Smirnofffrom hosts that aren't at the latest service pack.
26793b3a8eb9SGleb Smirnoff.Pp
26803b3a8eb9SGleb SmirnoffThe
26813b3a8eb9SGleb Smirnoff.Ar unknown
26823b3a8eb9SGleb Smirnoffclass can also be used as the fingerprint which will match packets for
26833b3a8eb9SGleb Smirnoffwhich no operating system fingerprint is known.
26843b3a8eb9SGleb Smirnoff.Pp
26853b3a8eb9SGleb SmirnoffExamples:
26863b3a8eb9SGleb Smirnoff.Bd -literal -offset indent
26873b3a8eb9SGleb Smirnoffpass  out proto tcp from any os OpenBSD
26883b3a8eb9SGleb Smirnoffblock out proto tcp from any os Doors
26893b3a8eb9SGleb Smirnoffblock out proto tcp from any os "Doors PT"
26903b3a8eb9SGleb Smirnoffblock out proto tcp from any os "Doors PT SP3"
26913b3a8eb9SGleb Smirnoffblock out from any os "unknown"
26923b3a8eb9SGleb Smirnoffpass on lo0 proto tcp from any os "OpenBSD 3.3 lo0"
26933b3a8eb9SGleb Smirnoff.Ed
26943b3a8eb9SGleb Smirnoff.Pp
26953b3a8eb9SGleb SmirnoffOperating system fingerprinting is limited only to the TCP SYN packet.
26963b3a8eb9SGleb SmirnoffThis means that it will not work on other protocols and will not match
26973b3a8eb9SGleb Smirnoffa currently established connection.
26983b3a8eb9SGleb Smirnoff.Pp
26993b3a8eb9SGleb SmirnoffCaveat: operating system fingerprints are occasionally wrong.
27003b3a8eb9SGleb SmirnoffThere are three problems: an attacker can trivially craft his packets to
27013b3a8eb9SGleb Smirnoffappear as any operating system he chooses;
27023b3a8eb9SGleb Smirnoffan operating system patch could change the stack behavior and no fingerprints
27033b3a8eb9SGleb Smirnoffwill match it until the database is updated;
27043b3a8eb9SGleb Smirnoffand multiple operating systems may have the same fingerprint.
27053b3a8eb9SGleb Smirnoff.Sh BLOCKING SPOOFED TRAFFIC
27063b3a8eb9SGleb Smirnoff"Spoofing" is the faking of IP addresses, typically for malicious
27073b3a8eb9SGleb Smirnoffpurposes.
27083b3a8eb9SGleb SmirnoffThe
27093b3a8eb9SGleb Smirnoff.Ar antispoof
27103b3a8eb9SGleb Smirnoffdirective expands to a set of filter rules which will block all
27113b3a8eb9SGleb Smirnofftraffic with a source IP from the network(s) directly connected
27123b3a8eb9SGleb Smirnoffto the specified interface(s) from entering the system through
27133b3a8eb9SGleb Smirnoffany other interface.
27143b3a8eb9SGleb Smirnoff.Pp
27153b3a8eb9SGleb SmirnoffFor example, the line
27163b3a8eb9SGleb Smirnoff.Bd -literal -offset indent
27173b3a8eb9SGleb Smirnoffantispoof for lo0
27183b3a8eb9SGleb Smirnoff.Ed
27193b3a8eb9SGleb Smirnoff.Pp
27203b3a8eb9SGleb Smirnoffexpands to
27213b3a8eb9SGleb Smirnoff.Bd -literal -offset indent
27223b3a8eb9SGleb Smirnoffblock drop in on ! lo0 inet from 127.0.0.1/8 to any
27233b3a8eb9SGleb Smirnoffblock drop in on ! lo0 inet6 from ::1 to any
27243b3a8eb9SGleb Smirnoff.Ed
27253b3a8eb9SGleb Smirnoff.Pp
27263b3a8eb9SGleb SmirnoffFor non-loopback interfaces, there are additional rules to block incoming
27273b3a8eb9SGleb Smirnoffpackets with a source IP address identical to the interface's IP(s).
27283b3a8eb9SGleb SmirnoffFor example, assuming the interface wi0 had an IP address of 10.0.0.1 and a
27293b3a8eb9SGleb Smirnoffnetmask of 255.255.255.0,
27303b3a8eb9SGleb Smirnoffthe line
27313b3a8eb9SGleb Smirnoff.Bd -literal -offset indent
27323b3a8eb9SGleb Smirnoffantispoof for wi0 inet
27333b3a8eb9SGleb Smirnoff.Ed
27343b3a8eb9SGleb Smirnoff.Pp
27353b3a8eb9SGleb Smirnoffexpands to
27363b3a8eb9SGleb Smirnoff.Bd -literal -offset indent
27373b3a8eb9SGleb Smirnoffblock drop in on ! wi0 inet from 10.0.0.0/24 to any
27383b3a8eb9SGleb Smirnoffblock drop in inet from 10.0.0.1 to any
27393b3a8eb9SGleb Smirnoff.Ed
27403b3a8eb9SGleb Smirnoff.Pp
27413b3a8eb9SGleb SmirnoffCaveat: Rules created by the
27423b3a8eb9SGleb Smirnoff.Ar antispoof
27433b3a8eb9SGleb Smirnoffdirective interfere with packets sent over loopback interfaces
27443b3a8eb9SGleb Smirnoffto local addresses.
27453b3a8eb9SGleb SmirnoffOne should pass these explicitly.
27463b3a8eb9SGleb Smirnoff.Sh FRAGMENT HANDLING
27473b3a8eb9SGleb SmirnoffThe size of IP datagrams (packets) can be significantly larger than the
27483b3a8eb9SGleb Smirnoffmaximum transmission unit (MTU) of the network.
27493b3a8eb9SGleb SmirnoffIn cases when it is necessary or more efficient to send such large packets,
27503b3a8eb9SGleb Smirnoffthe large packet will be fragmented into many smaller packets that will each
27513b3a8eb9SGleb Smirnofffit onto the wire.
27523b3a8eb9SGleb SmirnoffUnfortunately for a firewalling device, only the first logical fragment will
27533b3a8eb9SGleb Smirnoffcontain the necessary header information for the subprotocol that allows
27543b3a8eb9SGleb Smirnoff.Xr pf 4
27553b3a8eb9SGleb Smirnoffto filter on things such as TCP ports or to perform NAT.
27563b3a8eb9SGleb Smirnoff.Pp
27573b3a8eb9SGleb SmirnoffBesides the use of
27585ed470bdSKajetan Staszkiewicz.Ar set reassemble
27595ed470bdSKajetan Staszkiewiczoption or
27603b3a8eb9SGleb Smirnoff.Ar scrub
27613b3a8eb9SGleb Smirnoffrules as described in
27623b3a8eb9SGleb Smirnoff.Sx TRAFFIC NORMALIZATION
27633b3a8eb9SGleb Smirnoffabove, there are three options for handling fragments in the packet filter.
27643b3a8eb9SGleb Smirnoff.Pp
27653b3a8eb9SGleb SmirnoffOne alternative is to filter individual fragments with filter rules.
27663b3a8eb9SGleb SmirnoffIf no
27673b3a8eb9SGleb Smirnoff.Ar scrub
27685ed470bdSKajetan Staszkiewiczrule applies to a fragment or
27695ed470bdSKajetan Staszkiewicz.Ar set reassemble
27705ed470bdSKajetan Staszkiewiczis set to
27715ed470bdSKajetan Staszkiewicz.Cm no
27725ed470bdSKajetan Staszkiewicz, it is passed to the filter.
27733b3a8eb9SGleb SmirnoffFilter rules with matching IP header parameters decide whether the
27743b3a8eb9SGleb Smirnofffragment is passed or blocked, in the same way as complete packets
27753b3a8eb9SGleb Smirnoffare filtered.
27763b3a8eb9SGleb SmirnoffWithout reassembly, fragments can only be filtered based on IP header
27773b3a8eb9SGleb Smirnofffields (source/destination address, protocol), since subprotocol header
27783b3a8eb9SGleb Smirnofffields are not available (TCP/UDP port numbers, ICMP code/type).
27793b3a8eb9SGleb SmirnoffThe
27803b3a8eb9SGleb Smirnoff.Ar fragment
27813b3a8eb9SGleb Smirnoffoption can be used to restrict filter rules to apply only to
27823b3a8eb9SGleb Smirnofffragments, but not complete packets.
27833b3a8eb9SGleb SmirnoffFilter rules without the
27843b3a8eb9SGleb Smirnoff.Ar fragment
27853b3a8eb9SGleb Smirnoffoption still apply to fragments, if they only specify IP header fields.
27863b3a8eb9SGleb SmirnoffFor instance, the rule
27873b3a8eb9SGleb Smirnoff.Bd -literal -offset indent
27883b3a8eb9SGleb Smirnoffpass in proto tcp from any to any port 80
27893b3a8eb9SGleb Smirnoff.Ed
27903b3a8eb9SGleb Smirnoff.Pp
27913b3a8eb9SGleb Smirnoffnever applies to a fragment, even if the fragment is part of a TCP
27923b3a8eb9SGleb Smirnoffpacket with destination port 80, because without reassembly this information
27933b3a8eb9SGleb Smirnoffis not available for each fragment.
27943b3a8eb9SGleb SmirnoffThis also means that fragments cannot create new or match existing
27953b3a8eb9SGleb Smirnoffstate table entries, which makes stateful filtering and address
27963b3a8eb9SGleb Smirnofftranslation (NAT, redirection) for fragments impossible.
27973b3a8eb9SGleb Smirnoff.Pp
27983b3a8eb9SGleb SmirnoffIt's also possible to reassemble only certain fragments by specifying
27993b3a8eb9SGleb Smirnoffsource or destination addresses or protocols as parameters in
28003b3a8eb9SGleb Smirnoff.Ar scrub
28013b3a8eb9SGleb Smirnoffrules.
28023b3a8eb9SGleb Smirnoff.Pp
28033b3a8eb9SGleb SmirnoffIn most cases, the benefits of reassembly outweigh the additional
28043b3a8eb9SGleb Smirnoffmemory cost, and it's recommended to use
28055ed470bdSKajetan Staszkiewicz.Ar set reassemble
28065ed470bdSKajetan Staszkiewiczoption or
28073b3a8eb9SGleb Smirnoff.Ar scrub
28085ed470bdSKajetan Staszkiewiczrules with the
28093b3a8eb9SGleb Smirnoff.Ar fragment reassemble
28105ed470bdSKajetan Staszkiewiczmodifier to reassemble
28115ed470bdSKajetan Staszkiewiczall fragments.
28123b3a8eb9SGleb Smirnoff.Pp
28133b3a8eb9SGleb SmirnoffThe memory allocated for fragment caching can be limited using
28143b3a8eb9SGleb Smirnoff.Xr pfctl 8 .
28153b3a8eb9SGleb SmirnoffOnce this limit is reached, fragments that would have to be cached
28163b3a8eb9SGleb Smirnoffare dropped until other entries time out.
28173b3a8eb9SGleb SmirnoffThe timeout value can also be adjusted.
28183b3a8eb9SGleb Smirnoff.Pp
2819e600320bSKristof ProvostWhen forwarding reassembled IPv6 packets, pf refragments them with
2820e600320bSKristof Provostthe original maximum fragment size.
2821e600320bSKristof ProvostThis allows the sender to determine the optimal fragment size by
2822e600320bSKristof Provostpath MTU discovery.
28233b3a8eb9SGleb Smirnoff.Sh ANCHORS
28243b3a8eb9SGleb SmirnoffBesides the main ruleset,
28253b3a8eb9SGleb Smirnoff.Xr pfctl 8
28263b3a8eb9SGleb Smirnoffcan load rulesets into
28273b3a8eb9SGleb Smirnoff.Ar anchor
28283b3a8eb9SGleb Smirnoffattachment points.
28293b3a8eb9SGleb SmirnoffAn
28303b3a8eb9SGleb Smirnoff.Ar anchor
28313b3a8eb9SGleb Smirnoffis a container that can hold rules, address tables, and other anchors.
28323b3a8eb9SGleb Smirnoff.Pp
28333b3a8eb9SGleb SmirnoffAn
28343b3a8eb9SGleb Smirnoff.Ar anchor
28353b3a8eb9SGleb Smirnoffhas a name which specifies the path where
28363b3a8eb9SGleb Smirnoff.Xr pfctl 8
28373b3a8eb9SGleb Smirnoffcan be used to access the anchor to perform operations on it, such as
28383b3a8eb9SGleb Smirnoffattaching child anchors to it or loading rules into it.
28393b3a8eb9SGleb SmirnoffAnchors may be nested, with components separated by
28403b3a8eb9SGleb Smirnoff.Sq /
28413b3a8eb9SGleb Smirnoffcharacters, similar to how file system hierarchies are laid out.
28423b3a8eb9SGleb SmirnoffThe main ruleset is actually the default anchor, so filter and
28433b3a8eb9SGleb Smirnofftranslation rules, for example, may also be contained in any anchor.
28443b3a8eb9SGleb Smirnoff.Pp
28453b3a8eb9SGleb SmirnoffAn anchor can reference another
28463b3a8eb9SGleb Smirnoff.Ar anchor
28473b3a8eb9SGleb Smirnoffattachment point
28483b3a8eb9SGleb Smirnoffusing the following kinds
28493b3a8eb9SGleb Smirnoffof rules:
28503b3a8eb9SGleb Smirnoff.Bl -tag -width xxxx
28513b3a8eb9SGleb Smirnoff.It Ar nat-anchor Aq Ar name
28523b3a8eb9SGleb SmirnoffEvaluates the
28533b3a8eb9SGleb Smirnoff.Ar nat
28543b3a8eb9SGleb Smirnoffrules in the specified
28553b3a8eb9SGleb Smirnoff.Ar anchor .
28563b3a8eb9SGleb Smirnoff.It Ar rdr-anchor Aq Ar name
28573b3a8eb9SGleb SmirnoffEvaluates the
28583b3a8eb9SGleb Smirnoff.Ar rdr
28593b3a8eb9SGleb Smirnoffrules in the specified
28603b3a8eb9SGleb Smirnoff.Ar anchor .
28613b3a8eb9SGleb Smirnoff.It Ar binat-anchor Aq Ar name
28623b3a8eb9SGleb SmirnoffEvaluates the
28633b3a8eb9SGleb Smirnoff.Ar binat
28643b3a8eb9SGleb Smirnoffrules in the specified
28653b3a8eb9SGleb Smirnoff.Ar anchor .
28663b3a8eb9SGleb Smirnoff.It Ar anchor Aq Ar name
28673b3a8eb9SGleb SmirnoffEvaluates the filter rules in the specified
28683b3a8eb9SGleb Smirnoff.Ar anchor .
28693b3a8eb9SGleb Smirnoff.It Xo Ar load anchor
28703b3a8eb9SGleb Smirnoff.Aq Ar name
28713b3a8eb9SGleb Smirnoff.Ar from Aq Ar file
28723b3a8eb9SGleb Smirnoff.Xc
28733b3a8eb9SGleb SmirnoffLoads the rules from the specified file into the
28743b3a8eb9SGleb Smirnoffanchor
28753b3a8eb9SGleb Smirnoff.Ar name .
28763b3a8eb9SGleb Smirnoff.El
28773b3a8eb9SGleb Smirnoff.Pp
28783b3a8eb9SGleb SmirnoffWhen evaluation of the main ruleset reaches an
28793b3a8eb9SGleb Smirnoff.Ar anchor
28803b3a8eb9SGleb Smirnoffrule,
28813b3a8eb9SGleb Smirnoff.Xr pf 4
28823b3a8eb9SGleb Smirnoffwill proceed to evaluate all rules specified in that anchor.
28833b3a8eb9SGleb Smirnoff.Pp
28843b3a8eb9SGleb SmirnoffMatching filter and translation rules marked with the
28853b3a8eb9SGleb Smirnoff.Ar quick
28863b3a8eb9SGleb Smirnoffoption are final and abort the evaluation of the rules in other
28873b3a8eb9SGleb Smirnoffanchors and the main ruleset.
28883b3a8eb9SGleb SmirnoffIf the
28893b3a8eb9SGleb Smirnoff.Ar anchor
28903b3a8eb9SGleb Smirnoffitself is marked with the
28913b3a8eb9SGleb Smirnoff.Ar quick
28923b3a8eb9SGleb Smirnoffoption,
28933b3a8eb9SGleb Smirnoffruleset evaluation will terminate when the anchor is exited if the packet is
28943b3a8eb9SGleb Smirnoffmatched by any rule within the anchor.
28953b3a8eb9SGleb Smirnoff.Pp
28963b3a8eb9SGleb Smirnoff.Ar anchor
28973b3a8eb9SGleb Smirnoffrules are evaluated relative to the anchor in which they are contained.
28983b3a8eb9SGleb SmirnoffFor example, all
28993b3a8eb9SGleb Smirnoff.Ar anchor
29003b3a8eb9SGleb Smirnoffrules specified in the main ruleset will reference anchor
29013b3a8eb9SGleb Smirnoffattachment points underneath the main ruleset, and
29023b3a8eb9SGleb Smirnoff.Ar anchor
29033b3a8eb9SGleb Smirnoffrules specified in a file loaded from a
29043b3a8eb9SGleb Smirnoff.Ar load anchor
29053b3a8eb9SGleb Smirnoffrule will be attached under that anchor point.
29063b3a8eb9SGleb Smirnoff.Pp
29073b3a8eb9SGleb SmirnoffRules may be contained in
29083b3a8eb9SGleb Smirnoff.Ar anchor
29093b3a8eb9SGleb Smirnoffattachment points which do not contain any rules when the main ruleset
29103b3a8eb9SGleb Smirnoffis loaded, and later such anchors can be manipulated through
29113b3a8eb9SGleb Smirnoff.Xr pfctl 8
29123b3a8eb9SGleb Smirnoffwithout reloading the main ruleset or other anchors.
29133b3a8eb9SGleb SmirnoffFor example,
29143b3a8eb9SGleb Smirnoff.Bd -literal -offset indent
29153b3a8eb9SGleb Smirnoffext_if = \&"kue0\&"
29163b3a8eb9SGleb Smirnoffblock on $ext_if all
29173b3a8eb9SGleb Smirnoffanchor spam
29183b3a8eb9SGleb Smirnoffpass out on $ext_if all
29193b3a8eb9SGleb Smirnoffpass in on $ext_if proto tcp from any \e
29203b3a8eb9SGleb Smirnoff      to $ext_if port smtp
29213b3a8eb9SGleb Smirnoff.Ed
29223b3a8eb9SGleb Smirnoff.Pp
29233b3a8eb9SGleb Smirnoffblocks all packets on the external interface by default, then evaluates
29243b3a8eb9SGleb Smirnoffall rules in the
29253b3a8eb9SGleb Smirnoff.Ar anchor
29263b3a8eb9SGleb Smirnoffnamed "spam", and finally passes all outgoing connections and
29273b3a8eb9SGleb Smirnoffincoming connections to port 25.
29283b3a8eb9SGleb Smirnoff.Bd -literal -offset indent
29293b3a8eb9SGleb Smirnoff# echo \&"block in quick from 1.2.3.4 to any\&" \&| \e
29303b3a8eb9SGleb Smirnoff      pfctl -a spam -f -
29313b3a8eb9SGleb Smirnoff.Ed
29323b3a8eb9SGleb Smirnoff.Pp
29333b3a8eb9SGleb SmirnoffThis loads a single rule into the
29343b3a8eb9SGleb Smirnoff.Ar anchor ,
29353b3a8eb9SGleb Smirnoffwhich blocks all packets from a specific address.
29363b3a8eb9SGleb Smirnoff.Pp
29373b3a8eb9SGleb SmirnoffThe anchor can also be populated by adding a
29383b3a8eb9SGleb Smirnoff.Ar load anchor
29393b3a8eb9SGleb Smirnoffrule after the
29403b3a8eb9SGleb Smirnoff.Ar anchor
29413b3a8eb9SGleb Smirnoffrule:
29423b3a8eb9SGleb Smirnoff.Bd -literal -offset indent
29433b3a8eb9SGleb Smirnoffanchor spam
29443b3a8eb9SGleb Smirnoffload anchor spam from "/etc/pf-spam.conf"
29453b3a8eb9SGleb Smirnoff.Ed
29463b3a8eb9SGleb Smirnoff.Pp
29473b3a8eb9SGleb SmirnoffWhen
29483b3a8eb9SGleb Smirnoff.Xr pfctl 8
29493b3a8eb9SGleb Smirnoffloads
29503b3a8eb9SGleb Smirnoff.Nm pf.conf ,
29513b3a8eb9SGleb Smirnoffit will also load all the rules from the file
29523b3a8eb9SGleb Smirnoff.Pa /etc/pf-spam.conf
29533b3a8eb9SGleb Smirnoffinto the anchor.
29543b3a8eb9SGleb Smirnoff.Pp
29553b3a8eb9SGleb SmirnoffOptionally,
29563b3a8eb9SGleb Smirnoff.Ar anchor
29573b3a8eb9SGleb Smirnoffrules can specify packet filtering parameters using the same syntax as
29583b3a8eb9SGleb Smirnofffilter rules.
29593b3a8eb9SGleb SmirnoffWhen parameters are used, the
29603b3a8eb9SGleb Smirnoff.Ar anchor
29613b3a8eb9SGleb Smirnoffrule is only evaluated for matching packets.
29623b3a8eb9SGleb SmirnoffThis allows conditional evaluation of anchors, like:
29633b3a8eb9SGleb Smirnoff.Bd -literal -offset indent
29643b3a8eb9SGleb Smirnoffblock on $ext_if all
29653b3a8eb9SGleb Smirnoffanchor spam proto tcp from any to any port smtp
29663b3a8eb9SGleb Smirnoffpass out on $ext_if all
29673b3a8eb9SGleb Smirnoffpass in on $ext_if proto tcp from any to $ext_if port smtp
29683b3a8eb9SGleb Smirnoff.Ed
29693b3a8eb9SGleb Smirnoff.Pp
29703b3a8eb9SGleb SmirnoffThe rules inside
29713b3a8eb9SGleb Smirnoff.Ar anchor
29723b3a8eb9SGleb Smirnoffspam are only evaluated for
29733b3a8eb9SGleb Smirnoff.Ar tcp
29743b3a8eb9SGleb Smirnoffpackets with destination port 25.
29753b3a8eb9SGleb SmirnoffHence,
29763b3a8eb9SGleb Smirnoff.Bd -literal -offset indent
29773b3a8eb9SGleb Smirnoff# echo \&"block in quick from 1.2.3.4 to any" \&| \e
29783b3a8eb9SGleb Smirnoff      pfctl -a spam -f -
29793b3a8eb9SGleb Smirnoff.Ed
29803b3a8eb9SGleb Smirnoff.Pp
29813b3a8eb9SGleb Smirnoffwill only block connections from 1.2.3.4 to port 25.
29823b3a8eb9SGleb Smirnoff.Pp
29833b3a8eb9SGleb SmirnoffAnchors may end with the asterisk
29843b3a8eb9SGleb Smirnoff.Pq Sq *
29853b3a8eb9SGleb Smirnoffcharacter, which signifies that all anchors attached at that point
29863b3a8eb9SGleb Smirnoffshould be evaluated in the alphabetical ordering of their anchor name.
29873b3a8eb9SGleb SmirnoffFor example,
29883b3a8eb9SGleb Smirnoff.Bd -literal -offset indent
29893b3a8eb9SGleb Smirnoffanchor "spam/*"
29903b3a8eb9SGleb Smirnoff.Ed
29913b3a8eb9SGleb Smirnoff.Pp
29923b3a8eb9SGleb Smirnoffwill evaluate each rule in each anchor attached to the
29933b3a8eb9SGleb Smirnoff.Li spam
29943b3a8eb9SGleb Smirnoffanchor.
29953b3a8eb9SGleb SmirnoffNote that it will only evaluate anchors that are directly attached to the
29963b3a8eb9SGleb Smirnoff.Li spam
29973b3a8eb9SGleb Smirnoffanchor, and will not descend to evaluate anchors recursively.
29983b3a8eb9SGleb Smirnoff.Pp
29993b3a8eb9SGleb SmirnoffSince anchors are evaluated relative to the anchor in which they are
30003b3a8eb9SGleb Smirnoffcontained, there is a mechanism for accessing the parent and ancestor
30013b3a8eb9SGleb Smirnoffanchors of a given anchor.
30023b3a8eb9SGleb SmirnoffSimilar to file system path name resolution, if the sequence
30033b3a8eb9SGleb Smirnoff.Dq ..
30043b3a8eb9SGleb Smirnoffappears as an anchor path component, the parent anchor of the current
30053b3a8eb9SGleb Smirnoffanchor in the path evaluation at that point will become the new current
30063b3a8eb9SGleb Smirnoffanchor.
30073b3a8eb9SGleb SmirnoffAs an example, consider the following:
30083b3a8eb9SGleb Smirnoff.Bd -literal -offset indent
30093b3a8eb9SGleb Smirnoff# echo ' anchor "spam/allowed" ' | pfctl -f -
30103b3a8eb9SGleb Smirnoff# echo -e ' anchor "../banned" \en pass' | \e
30113b3a8eb9SGleb Smirnoff      pfctl -a spam/allowed -f -
30123b3a8eb9SGleb Smirnoff.Ed
30133b3a8eb9SGleb Smirnoff.Pp
30143b3a8eb9SGleb SmirnoffEvaluation of the main ruleset will lead into the
30153b3a8eb9SGleb Smirnoff.Li spam/allowed
30163b3a8eb9SGleb Smirnoffanchor, which will evaluate the rules in the
30173b3a8eb9SGleb Smirnoff.Li spam/banned
30183b3a8eb9SGleb Smirnoffanchor, if any, before finally evaluating the
30193b3a8eb9SGleb Smirnoff.Ar pass
30203b3a8eb9SGleb Smirnoffrule.
30213b3a8eb9SGleb Smirnoff.Pp
30223b3a8eb9SGleb SmirnoffFilter rule
30233b3a8eb9SGleb Smirnoff.Ar anchors
30243b3a8eb9SGleb Smirnoffcan also be loaded inline in the ruleset within a brace ('{' '}') delimited
30253b3a8eb9SGleb Smirnoffblock.
30263b3a8eb9SGleb SmirnoffBrace delimited blocks may contain rules or other brace-delimited blocks.
30273b3a8eb9SGleb SmirnoffWhen anchors are loaded this way the anchor name becomes optional.
30283b3a8eb9SGleb Smirnoff.Bd -literal -offset indent
302998730c7fSKristof Provostanchor "external" on $ext_if {
30303b3a8eb9SGleb Smirnoff	block
30313b3a8eb9SGleb Smirnoff	anchor out {
30323b3a8eb9SGleb Smirnoff		pass proto tcp from any to port { 25, 80, 443 }
30333b3a8eb9SGleb Smirnoff	}
30343b3a8eb9SGleb Smirnoff	pass in proto tcp to any port 22
30353b3a8eb9SGleb Smirnoff}
30363b3a8eb9SGleb Smirnoff.Ed
30373b3a8eb9SGleb Smirnoff.Pp
30383b3a8eb9SGleb SmirnoffSince the parser specification for anchor names is a string, any
30393b3a8eb9SGleb Smirnoffreference to an anchor name containing
30403b3a8eb9SGleb Smirnoff.Sq /
30413b3a8eb9SGleb Smirnoffcharacters will require double quote
30423b3a8eb9SGleb Smirnoff.Pq Sq \&"
30433b3a8eb9SGleb Smirnoffcharacters around the anchor name.
304447d0c1feSKristof Provost.Sh SCTP CONSIDERATIONS
304547d0c1feSKristof Provost.Xr pf 4
304647d0c1feSKristof Provostsupports
304747d0c1feSKristof Provost.Xr sctp 4
304847d0c1feSKristof Provostconnections.
304947d0c1feSKristof ProvostIt can match ports, track state and NAT SCTP traffic.
305047d0c1feSKristof ProvostHowever, it will not alter port numbers during nat or rdr translations.
305147d0c1feSKristof ProvostDoing so would break SCTP multihoming.
30523b3a8eb9SGleb Smirnoff.Sh TRANSLATION EXAMPLES
30533b3a8eb9SGleb SmirnoffThis example maps incoming requests on port 80 to port 8080, on
30543b3a8eb9SGleb Smirnoffwhich a daemon is running (because, for example, it is not run as root,
30553b3a8eb9SGleb Smirnoffand therefore lacks permission to bind to port 80).
30563b3a8eb9SGleb Smirnoff.Bd -literal
30573b3a8eb9SGleb Smirnoff# use a macro for the interface name, so it can be changed easily
30583b3a8eb9SGleb Smirnoffext_if = \&"ne3\&"
30593b3a8eb9SGleb Smirnoff
30603b3a8eb9SGleb Smirnoff# map daemon on 8080 to appear to be on 80
306183f9b68fSKristof Provostrdr on $ext_if proto tcp from any to any port 80 -> 127.0.0.1 port 8080
30623b3a8eb9SGleb Smirnoff.Ed
30633b3a8eb9SGleb Smirnoff.Pp
30643b3a8eb9SGleb SmirnoffIf the
30653b3a8eb9SGleb Smirnoff.Ar pass
30663b3a8eb9SGleb Smirnoffmodifier is given, packets matching the translation rule are passed without
30673b3a8eb9SGleb Smirnoffinspecting the filter rules:
30683b3a8eb9SGleb Smirnoff.Bd -literal
306983f9b68fSKristof Provostrdr pass on $ext_if proto tcp from any to any port 80 -> 127.0.0.1 \e
30703b3a8eb9SGleb Smirnoff      port 8080
30713b3a8eb9SGleb Smirnoff.Ed
30723b3a8eb9SGleb Smirnoff.Pp
30733b3a8eb9SGleb SmirnoffIn the example below, vlan12 is configured as 192.168.168.1;
30743b3a8eb9SGleb Smirnoffthe machine translates all packets coming from 192.168.168.0/24 to 204.92.77.111
30753b3a8eb9SGleb Smirnoffwhen they are going out any interface except vlan12.
30763b3a8eb9SGleb SmirnoffThis has the net effect of making traffic from the 192.168.168.0/24
30773b3a8eb9SGleb Smirnoffnetwork appear as though it is the Internet routable address
30783b3a8eb9SGleb Smirnoff204.92.77.111 to nodes behind any interface on the router except
30793b3a8eb9SGleb Smirnofffor the nodes on vlan12.
30803b3a8eb9SGleb Smirnoff(Thus, 192.168.168.1 can talk to the 192.168.168.0/24 nodes.)
30813b3a8eb9SGleb Smirnoff.Bd -literal
308283f9b68fSKristof Provostnat on ! vlan12 from 192.168.168.0/24 to any -> 204.92.77.111
30833b3a8eb9SGleb Smirnoff.Ed
30843b3a8eb9SGleb Smirnoff.Pp
30853b3a8eb9SGleb SmirnoffIn the example below, the machine sits between a fake internal 144.19.74.*
30863b3a8eb9SGleb Smirnoffnetwork, and a routable external IP of 204.92.77.100.
30873b3a8eb9SGleb SmirnoffThe
30883b3a8eb9SGleb Smirnoff.Ar no nat
30893b3a8eb9SGleb Smirnoffrule excludes protocol AH from being translated.
30903b3a8eb9SGleb Smirnoff.Bd -literal
30913b3a8eb9SGleb Smirnoff# NO NAT
30923b3a8eb9SGleb Smirnoffno nat on $ext_if proto ah from 144.19.74.0/24 to any
309383f9b68fSKristof Provostnat on $ext_if from 144.19.74.0/24 to any -> 204.92.77.100
30943b3a8eb9SGleb Smirnoff.Ed
30953b3a8eb9SGleb Smirnoff.Pp
30963b3a8eb9SGleb SmirnoffIn the example below, packets bound for one specific server, as well as those
30973b3a8eb9SGleb Smirnoffgenerated by the sysadmins are not proxied; all other connections are.
30983b3a8eb9SGleb Smirnoff.Bd -literal
30993b3a8eb9SGleb Smirnoff# NO RDR
31003b3a8eb9SGleb Smirnoffno rdr on $int_if proto { tcp, udp } from any to $server port 80
31013b3a8eb9SGleb Smirnoffno rdr on $int_if proto { tcp, udp } from $sysadmins to any port 80
310283f9b68fSKristof Provostrdr on $int_if proto { tcp, udp } from any to any port 80 -> 127.0.0.1 \e
31033b3a8eb9SGleb Smirnoff      port 80
31043b3a8eb9SGleb Smirnoff.Ed
31053b3a8eb9SGleb Smirnoff.Pp
31063b3a8eb9SGleb SmirnoffThis longer example uses both a NAT and a redirection.
31073b3a8eb9SGleb SmirnoffThe external interface has the address 157.161.48.183.
31083b3a8eb9SGleb SmirnoffOn localhost, we are running
31093b3a8eb9SGleb Smirnoff.Xr ftp-proxy 8 ,
31103b3a8eb9SGleb Smirnoffwaiting for FTP sessions to be redirected to it.
31113b3a8eb9SGleb SmirnoffThe three mandatory anchors for
31123b3a8eb9SGleb Smirnoff.Xr ftp-proxy 8
31133b3a8eb9SGleb Smirnoffare omitted from this example; see the
31143b3a8eb9SGleb Smirnoff.Xr ftp-proxy 8
31153b3a8eb9SGleb Smirnoffmanpage.
31163b3a8eb9SGleb Smirnoff.Bd -literal
31173b3a8eb9SGleb Smirnoff# NAT
31183b3a8eb9SGleb Smirnoff# Translate outgoing packets' source addresses (any protocol).
31193b3a8eb9SGleb Smirnoff# In this case, any address but the gateway's external address is mapped.
312083f9b68fSKristof Provostnat on $ext_if inet from ! ($ext_if) to any -> ($ext_if)
31213b3a8eb9SGleb Smirnoff
31223b3a8eb9SGleb Smirnoff# NAT PROXYING
31233b3a8eb9SGleb Smirnoff# Map outgoing packets' source port to an assigned proxy port instead of
31243b3a8eb9SGleb Smirnoff# an arbitrary port.
31253b3a8eb9SGleb Smirnoff# In this case, proxy outgoing isakmp with port 500 on the gateway.
312683f9b68fSKristof Provostnat on $ext_if inet proto udp from any port = isakmp to any -> ($ext_if) \e
31273b3a8eb9SGleb Smirnoff      port 500
31283b3a8eb9SGleb Smirnoff
31293b3a8eb9SGleb Smirnoff# BINAT
31303b3a8eb9SGleb Smirnoff# Translate outgoing packets' source address (any protocol).
31313b3a8eb9SGleb Smirnoff# Translate incoming packets' destination address to an internal machine
31323b3a8eb9SGleb Smirnoff# (bidirectional).
313383f9b68fSKristof Provostbinat on $ext_if from 10.1.2.150 to any -> $ext_if
31343b3a8eb9SGleb Smirnoff
31352da12891SPoul-Henning Kamp# Translate packets arriving on $peer_if addressed to 172.22.16.0/20
31362da12891SPoul-Henning Kamp# to the corresponding address in 172.21.16.0/20 (bidirectional).
31372da12891SPoul-Henning Kampbinat on $peer_if from 172.21.16.0/20 to any -> 172.22.16.0/20
31382da12891SPoul-Henning Kamp
31393b3a8eb9SGleb Smirnoff# RDR
31403b3a8eb9SGleb Smirnoff# Translate incoming packets' destination addresses.
31413b3a8eb9SGleb Smirnoff# As an example, redirect a TCP and UDP port to an internal machine.
31423b3a8eb9SGleb Smirnoffrdr on $ext_if inet proto tcp from any to ($ext_if) port 8080 \e
314383f9b68fSKristof Provost      -> 10.1.2.151 port 22
31443b3a8eb9SGleb Smirnoffrdr on $ext_if inet proto udp from any to ($ext_if) port 8080 \e
314583f9b68fSKristof Provost      -> 10.1.2.151 port 53
31463b3a8eb9SGleb Smirnoff
31473b3a8eb9SGleb Smirnoff# RDR
31483b3a8eb9SGleb Smirnoff# Translate outgoing ftp control connections to send them to localhost
31493b3a8eb9SGleb Smirnoff# for proxying with ftp-proxy(8) running on port 8021.
315083f9b68fSKristof Provostrdr on $int_if proto tcp from any to any port 21 -> 127.0.0.1 port 8021
31513b3a8eb9SGleb Smirnoff.Ed
31523b3a8eb9SGleb Smirnoff.Pp
31533b3a8eb9SGleb SmirnoffIn this example, a NAT gateway is set up to translate internal addresses
31543b3a8eb9SGleb Smirnoffusing a pool of public addresses (192.0.2.16/28) and to redirect
31553b3a8eb9SGleb Smirnoffincoming web server connections to a group of web servers on the internal
31563b3a8eb9SGleb Smirnoffnetwork.
31573b3a8eb9SGleb Smirnoff.Bd -literal
31583b3a8eb9SGleb Smirnoff# NAT LOAD BALANCE
31593b3a8eb9SGleb Smirnoff# Translate outgoing packets' source addresses using an address pool.
31603b3a8eb9SGleb Smirnoff# A given source address is always translated to the same pool address by
31613b3a8eb9SGleb Smirnoff# using the source-hash keyword.
316283f9b68fSKristof Provostnat on $ext_if inet from any to any -> 192.0.2.16/28 source-hash
31633b3a8eb9SGleb Smirnoff
31643b3a8eb9SGleb Smirnoff# RDR ROUND ROBIN
31653b3a8eb9SGleb Smirnoff# Translate incoming web server connections to a group of web servers on
31663b3a8eb9SGleb Smirnoff# the internal network.
31673b3a8eb9SGleb Smirnoffrdr on $ext_if proto tcp from any to any port 80 \e
316883f9b68fSKristof Provost      -> { 10.1.2.155, 10.1.2.160, 10.1.2.161 } round-robin
31693b3a8eb9SGleb Smirnoff.Ed
31703b3a8eb9SGleb Smirnoff.Sh FILTER EXAMPLES
31713b3a8eb9SGleb Smirnoff.Bd -literal
31723b3a8eb9SGleb Smirnoff# The external interface is kue0
31733b3a8eb9SGleb Smirnoff# (157.161.48.183, the only routable address)
31743b3a8eb9SGleb Smirnoff# and the private network is 10.0.0.0/8, for which we are doing NAT.
31753b3a8eb9SGleb Smirnoff
31765ed470bdSKajetan Staszkiewicz# Reassemble incoming traffic
31775ed470bdSKajetan Staszkiewiczset reassemble yes
31785ed470bdSKajetan Staszkiewicz
31793b3a8eb9SGleb Smirnoff# use a macro for the interface name, so it can be changed easily
31803b3a8eb9SGleb Smirnoffext_if = \&"kue0\&"
31813b3a8eb9SGleb Smirnoff
31823b3a8eb9SGleb Smirnoff# block and log everything by default
31833b3a8eb9SGleb Smirnoffblock return log on $ext_if all
31843b3a8eb9SGleb Smirnoff
31853b3a8eb9SGleb Smirnoff# block anything coming from source we have no back routes for
31863b3a8eb9SGleb Smirnoffblock in from no-route to any
31873b3a8eb9SGleb Smirnoff
31883b3a8eb9SGleb Smirnoff# block packets whose ingress interface does not match the one in
31893b3a8eb9SGleb Smirnoff# the route back to their source address
31903b3a8eb9SGleb Smirnoffblock in from urpf-failed to any
31913b3a8eb9SGleb Smirnoff
31923b3a8eb9SGleb Smirnoff# block and log outgoing packets that do not have our address as source,
31933b3a8eb9SGleb Smirnoff# they are either spoofed or something is misconfigured (NAT disabled,
31943b3a8eb9SGleb Smirnoff# for instance), we want to be nice and do not send out garbage.
31953b3a8eb9SGleb Smirnoffblock out log quick on $ext_if from ! 157.161.48.183 to any
31963b3a8eb9SGleb Smirnoff
31973b3a8eb9SGleb Smirnoff# silently drop broadcasts (cable modem noise)
31983b3a8eb9SGleb Smirnoffblock in quick on $ext_if from any to 255.255.255.255
31993b3a8eb9SGleb Smirnoff
32003b3a8eb9SGleb Smirnoff# block and log incoming packets from reserved address space and invalid
32013b3a8eb9SGleb Smirnoff# addresses, they are either spoofed or misconfigured, we cannot reply to
32023b3a8eb9SGleb Smirnoff# them anyway (hence, no return-rst).
32033b3a8eb9SGleb Smirnoffblock in log quick on $ext_if from { 10.0.0.0/8, 172.16.0.0/12, \e
32043b3a8eb9SGleb Smirnoff      192.168.0.0/16, 255.255.255.255/32 } to any
32053b3a8eb9SGleb Smirnoff
32063b3a8eb9SGleb Smirnoff# ICMP
32073b3a8eb9SGleb Smirnoff
32083b3a8eb9SGleb Smirnoff# pass out/in certain ICMP queries and keep state (ping)
32093b3a8eb9SGleb Smirnoff# state matching is done on host addresses and ICMP id (not type/code),
32103b3a8eb9SGleb Smirnoff# so replies (like 0/0 for 8/0) will match queries
32113b3a8eb9SGleb Smirnoff# ICMP error messages (which always refer to a TCP/UDP packet) are
32123b3a8eb9SGleb Smirnoff# handled by the TCP/UDP states
32133b3a8eb9SGleb Smirnoffpass on $ext_if inet proto icmp all icmp-type 8 code 0
32143b3a8eb9SGleb Smirnoff
32153b3a8eb9SGleb Smirnoff# UDP
32163b3a8eb9SGleb Smirnoff
32173b3a8eb9SGleb Smirnoff# pass out all UDP connections and keep state
32183b3a8eb9SGleb Smirnoffpass out on $ext_if proto udp all
32193b3a8eb9SGleb Smirnoff
32203b3a8eb9SGleb Smirnoff# pass in certain UDP connections and keep state (DNS)
32213b3a8eb9SGleb Smirnoffpass in on $ext_if proto udp from any to any port domain
32223b3a8eb9SGleb Smirnoff
32233b3a8eb9SGleb Smirnoff# TCP
32243b3a8eb9SGleb Smirnoff
32253b3a8eb9SGleb Smirnoff# pass out all TCP connections and modulate state
32263b3a8eb9SGleb Smirnoffpass out on $ext_if proto tcp all modulate state
32273b3a8eb9SGleb Smirnoff
32283b3a8eb9SGleb Smirnoff# pass in certain TCP connections and keep state (SSH, SMTP, DNS, IDENT)
32293b3a8eb9SGleb Smirnoffpass in on $ext_if proto tcp from any to any port { ssh, smtp, domain, \e
32303b3a8eb9SGleb Smirnoff      auth }
32313b3a8eb9SGleb Smirnoff
32323b3a8eb9SGleb Smirnoff# Do not allow Windows 9x SMTP connections since they are typically
32333b3a8eb9SGleb Smirnoff# a viral worm. Alternately we could limit these OSes to 1 connection each.
32343b3a8eb9SGleb Smirnoffblock in on $ext_if proto tcp from any os {"Windows 95", "Windows 98"} \e
32353b3a8eb9SGleb Smirnoff      to any port smtp
32363b3a8eb9SGleb Smirnoff
32373b3a8eb9SGleb Smirnoff# IPv6
32383b3a8eb9SGleb Smirnoff# pass in/out all IPv6 traffic: note that we have to enable this in two
32393b3a8eb9SGleb Smirnoff# different ways, on both our physical interface and our tunnel
32403b3a8eb9SGleb Smirnoffpass quick on gif0 inet6
32413b3a8eb9SGleb Smirnoffpass quick on $ext_if proto ipv6
32423b3a8eb9SGleb Smirnoff
32433b3a8eb9SGleb Smirnoff# Packet Tagging
32443b3a8eb9SGleb Smirnoff
32453b3a8eb9SGleb Smirnoff# three interfaces: $int_if, $ext_if, and $wifi_if (wireless). NAT is
32463b3a8eb9SGleb Smirnoff# being done on $ext_if for all outgoing packets. tag packets in on
32473b3a8eb9SGleb Smirnoff# $int_if and pass those tagged packets out on $ext_if.  all other
32483b3a8eb9SGleb Smirnoff# outgoing packets (i.e., packets from the wireless network) are only
32493b3a8eb9SGleb Smirnoff# permitted to access port 80.
32503b3a8eb9SGleb Smirnoff
32513b3a8eb9SGleb Smirnoffpass in on $int_if from any to any tag INTNET
32523b3a8eb9SGleb Smirnoffpass in on $wifi_if from any to any
32533b3a8eb9SGleb Smirnoff
32543b3a8eb9SGleb Smirnoffblock out on $ext_if from any to any
32553b3a8eb9SGleb Smirnoffpass out quick on $ext_if tagged INTNET
32563b3a8eb9SGleb Smirnoffpass out on $ext_if proto tcp from any to any port 80
32573b3a8eb9SGleb Smirnoff
32583b3a8eb9SGleb Smirnoff# tag incoming packets as they are redirected to spamd(8). use the tag
32593b3a8eb9SGleb Smirnoff# to pass those packets through the packet filter.
32603b3a8eb9SGleb Smirnoff
326183f9b68fSKristof Provostrdr on $ext_if inet proto tcp from <spammers> to port smtp \e
326283f9b68fSKristof Provost	tag SPAMD -> 127.0.0.1 port spamd
32633b3a8eb9SGleb Smirnoff
32643b3a8eb9SGleb Smirnoffblock in on $ext_if
32653b3a8eb9SGleb Smirnoffpass in on $ext_if inet proto tcp tagged SPAMD
32663b3a8eb9SGleb Smirnoff.Ed
3267eaf484fdSKristof Provost.Pp
3268eaf484fdSKristof ProvostIn the example below, a router handling both address families
3269eaf484fdSKristof Provosttranslates an internal IPv4 subnet to IPv6 using the well-known
3270eaf484fdSKristof Provost64:ff9b::/96 prefix:
3271eaf484fdSKristof Provost.Bd -literal -offset 4n
3272eaf484fdSKristof Provostpass in on $v4_if inet af-to inet6 from ($v6_if) to 64:ff9b::/96
3273eaf484fdSKristof Provost.Ed
3274eaf484fdSKristof Provost.Pp
3275eaf484fdSKristof ProvostPaired with the example above, the example below can be used on
3276eaf484fdSKristof Provostanother router handling both address families to translate back
3277eaf484fdSKristof Provostto IPv4:
3278eaf484fdSKristof Provost.Bd -literal -offset 4n
3279eaf484fdSKristof Provostpass in on $v6_if inet6 to 64:ff9b::/96 af-to inet from ($v4_if)
3280eaf484fdSKristof Provost.Ed
32813b3a8eb9SGleb Smirnoff.Sh GRAMMAR
32823b3a8eb9SGleb SmirnoffSyntax for
32833b3a8eb9SGleb Smirnoff.Nm
32843b3a8eb9SGleb Smirnoffin BNF:
32853b3a8eb9SGleb Smirnoff.Bd -literal
3286ab2886f0SKristof Provostline           = ( option | ether-rule | pf-rule | nat-rule | binat-rule |
3287ab2886f0SKristof Provost                 rdr-rule | antispoof-rule | altq-rule | queue-rule |
3288ab2886f0SKristof Provost                 trans-anchors | anchor-rule | anchor-close | load-anchor |
3289ab2886f0SKristof Provost                 table-rule | include )
32903b3a8eb9SGleb Smirnoff
32913b3a8eb9SGleb Smirnoffoption         = "set" ( [ "timeout" ( timeout | "{" timeout-list "}" ) ] |
32923b3a8eb9SGleb Smirnoff                 [ "ruleset-optimization" [ "none" | "basic" | "profile" ]] |
32933b3a8eb9SGleb Smirnoff                 [ "optimization" [ "default" | "normal" |
32943b3a8eb9SGleb Smirnoff                 "high-latency" | "satellite" |
32953b3a8eb9SGleb Smirnoff                 "aggressive" | "conservative" ] ]
32963b3a8eb9SGleb Smirnoff                 [ "limit" ( limit-item | "{" limit-list "}" ) ] |
32973b3a8eb9SGleb Smirnoff                 [ "loginterface" ( interface-name | "none" ) ] |
32983b3a8eb9SGleb Smirnoff                 [ "block-policy" ( "drop" | "return" ) ] |
32993b3a8eb9SGleb Smirnoff                 [ "state-policy" ( "if-bound" | "floating" ) ]
33003b3a8eb9SGleb Smirnoff                 [ "state-defaults" state-opts ]
33013b3a8eb9SGleb Smirnoff                 [ "require-order" ( "yes" | "no" ) ]
33023b3a8eb9SGleb Smirnoff                 [ "fingerprints" filename ] |
33033b3a8eb9SGleb Smirnoff                 [ "skip on" ifspec ] |
330442ec75f8SKristof Provost                 [ "debug" ( "none" | "urgent" | "misc" | "loud" ) ]
330542ec75f8SKristof Provost                 [ "keepcounters" ] )
33063b3a8eb9SGleb Smirnoff
3307ab2886f0SKristof Provostether-rule     = "ether" etheraction [ ( "in" | "out" ) ]
33088a8af942SKristof Provost                 [ "quick" ] [ "on" ifspec ] [ "bridge-to" interface-name ]
33098a8af942SKristof Provost                 [ etherprotospec ] etherhosts [ "l3" hosts ]
33108a8af942SKristof Provost                 [ etherfilteropt-list ]
3311ab2886f0SKristof Provost
33123b3a8eb9SGleb Smirnoffpf-rule        = action [ ( "in" | "out" ) ]
33133b3a8eb9SGleb Smirnoff                 [ "log" [ "(" logopts ")"] ] [ "quick" ]
3314813196a1SKristof Provost                 [ "on" ifspec ] [ route ] [ af ] [ protospec ]
33153b3a8eb9SGleb Smirnoff                 hosts [ filteropt-list ]
33163b3a8eb9SGleb Smirnoff
33173b3a8eb9SGleb Smirnofflogopts        = logopt [ "," logopts ]
3318f3ab00c2SKristof Provostlogopt         = "all" | "matches" | "user" | "to" interface-name
33193b3a8eb9SGleb Smirnoff
3320ab2886f0SKristof Provostetherfilteropt-list = etherfilteropt-list etherfilteropt | etherfilteropt
3321ef661d4aSChristian McDonaldetherfilteropt = "tag" string | "tagged" string | "queue" ( string ) |
3322ef661d4aSChristian McDonald                 "ridentifier" number | "label" string
3323ab2886f0SKristof Provost
33243b3a8eb9SGleb Smirnofffilteropt-list = filteropt-list filteropt | filteropt
33253b3a8eb9SGleb Smirnofffilteropt      = user | group | flags | icmp-type | icmp6-type | "tos" tos |
3326eaf484fdSKristof Provost                 "af-to" af "from" ( redirhost | "{" redirhost-list "}" )
3327eaf484fdSKristof Provost                 [ "to" ( redirhost | "{" redirhost-list "}" ) ] |
33283b3a8eb9SGleb Smirnoff                 ( "no" | "keep" | "modulate" | "synproxy" ) "state"
33293b3a8eb9SGleb Smirnoff                 [ "(" state-opts ")" ] |
33303b3a8eb9SGleb Smirnoff                 "fragment" | "no-df" | "min-ttl" number | "set-tos" tos |
33313b3a8eb9SGleb Smirnoff                 "max-mss" number | "random-id" | "reassemble tcp" |
33323b3a8eb9SGleb Smirnoff                 fragmentation | "allow-opts" |
33333b3a8eb9SGleb Smirnoff                 "label" string | "tag" string | [ ! ] "tagged" string |
33343e248e0fSKristof Provost                 "set prio" ( number | "(" number [ [ "," ] number ] ")" ) |
33353b3a8eb9SGleb Smirnoff                 "queue" ( string | "(" string [ [ "," ] string ] ")" ) |
333600a7a05bSKristof Provost                 "rtable" number | "probability" number"%" | "prio" number |
333700a7a05bSKristof Provost                 "dnpipe" ( number | "(" number "," number ")" ) |
333876c5eeccSKristof Provost                 "dnqueue" ( number | "(" number "," number ")" ) |
3339e80f2a10SKristof Provost                 "ridentifier" number |
33408b5cee40SKristof Provost                 [ ! ] "received-on" ( interface-name | interface-group )
33413b3a8eb9SGleb Smirnoff
33423b3a8eb9SGleb Smirnoffnat-rule       = [ "no" ] "nat" [ "pass" [ "log" [ "(" logopts ")" ] ] ]
33433b3a8eb9SGleb Smirnoff                 [ "on" ifspec ] [ af ]
33443b3a8eb9SGleb Smirnoff                 [ protospec ] hosts [ "tag" string ] [ "tagged" string ]
334583f9b68fSKristof Provost                 [ "->" ( redirhost | "{" redirhost-list "}" )
33462aa21096SKurosawa Takahiro                 [ portspec ] [ pooltype ] [ "static-port" ]
33472aa21096SKurosawa Takahiro                 [ "map-e-portset" number "/" number "/" number ] ]
33483b3a8eb9SGleb Smirnoff
33493b3a8eb9SGleb Smirnoffbinat-rule     = [ "no" ] "binat" [ "pass" [ "log" [ "(" logopts ")" ] ] ]
33503b3a8eb9SGleb Smirnoff                 [ "on" interface-name ] [ af ]
33513b3a8eb9SGleb Smirnoff                 [ "proto" ( proto-name | proto-number ) ]
33523b3a8eb9SGleb Smirnoff                 "from" address [ "/" mask-bits ] "to" ipspec
33533b3a8eb9SGleb Smirnoff                 [ "tag" string ] [ "tagged" string ]
335483f9b68fSKristof Provost                 [ "->" address [ "/" mask-bits ] ]
33553b3a8eb9SGleb Smirnoff
33563b3a8eb9SGleb Smirnoffrdr-rule       = [ "no" ] "rdr" [ "pass" [ "log" [ "(" logopts ")" ] ] ]
33573b3a8eb9SGleb Smirnoff                 [ "on" ifspec ] [ af ]
33583b3a8eb9SGleb Smirnoff                 [ protospec ] hosts [ "tag" string ] [ "tagged" string ]
335983f9b68fSKristof Provost                 [ "->" ( redirhost | "{" redirhost-list "}" )
33603b3a8eb9SGleb Smirnoff                 [ portspec ] [ pooltype ] ]
33613b3a8eb9SGleb Smirnoff
33623b3a8eb9SGleb Smirnoffantispoof-rule = "antispoof" [ "log" ] [ "quick" ]
33633b3a8eb9SGleb Smirnoff                 "for" ifspec [ af ] [ "label" string ]
336476c5eeccSKristof Provost                 [ "ridentifier" number ]
33653b3a8eb9SGleb Smirnoff
336683f9b68fSKristof Provosttable-rule     = "table" "<" string ">" [ tableopts-list ]
33673b3a8eb9SGleb Smirnofftableopts-list = tableopts-list tableopts | tableopts
33683b3a8eb9SGleb Smirnofftableopts      = "persist" | "const" | "counters" | "file" string |
33693b3a8eb9SGleb Smirnoff                 "{" [ tableaddr-list ] "}"
33703b3a8eb9SGleb Smirnofftableaddr-list = tableaddr-list [ "," ] tableaddr-spec | tableaddr-spec
33713b3a8eb9SGleb Smirnofftableaddr-spec = [ "!" ] tableaddr [ "/" mask-bits ]
33723b3a8eb9SGleb Smirnofftableaddr      = hostname | ifspec | "self" |
33733b3a8eb9SGleb Smirnoff                 ipv4-dotted-quad | ipv6-coloned-hex
33743b3a8eb9SGleb Smirnoff
33753b3a8eb9SGleb Smirnoffaltq-rule      = "altq on" interface-name queueopts-list
33763b3a8eb9SGleb Smirnoff                 "queue" subqueue
33773b3a8eb9SGleb Smirnoffqueue-rule     = "queue" string [ "on" interface-name ] queueopts-list
33783b3a8eb9SGleb Smirnoff                 subqueue
33793b3a8eb9SGleb Smirnoff
33803b3a8eb9SGleb Smirnoffanchor-rule    = "anchor" [ string ] [ ( "in" | "out" ) ] [ "on" ifspec ]
33813b3a8eb9SGleb Smirnoff                 [ af ] [ protospec ] [ hosts ] [ filteropt-list ] [ "{" ]
33823b3a8eb9SGleb Smirnoff
33833b3a8eb9SGleb Smirnoffanchor-close   = "}"
33843b3a8eb9SGleb Smirnoff
33853b3a8eb9SGleb Smirnofftrans-anchors  = ( "nat-anchor" | "rdr-anchor" | "binat-anchor" ) string
33863b3a8eb9SGleb Smirnoff                 [ "on" ifspec ] [ af ] [ "proto" ] [ protospec ] [ hosts ]
33873b3a8eb9SGleb Smirnoff
33883b3a8eb9SGleb Smirnoffload-anchor    = "load anchor" string "from" filename
33893b3a8eb9SGleb Smirnoff
33903b3a8eb9SGleb Smirnoffqueueopts-list = queueopts-list queueopts | queueopts
33913b3a8eb9SGleb Smirnoffqueueopts      = [ "bandwidth" bandwidth-spec ] |
33923b3a8eb9SGleb Smirnoff                 [ "qlimit" number ] | [ "tbrsize" number ] |
33933b3a8eb9SGleb Smirnoff                 [ "priority" number ] | [ schedulers ]
33943b3a8eb9SGleb Smirnoffschedulers     = ( cbq-def | priq-def | hfsc-def )
33953b3a8eb9SGleb Smirnoffbandwidth-spec = "number" ( "b" | "Kb" | "Mb" | "Gb" | "%" )
33963b3a8eb9SGleb Smirnoff
3397ab2886f0SKristof Provostetheraction    = "pass" | "block"
339839282ef3SKajetan Staszkiewiczaction         = "pass" | "match" | "block" [ return ] | [ "no" ] "scrub"
33993b3a8eb9SGleb Smirnoffreturn         = "drop" | "return" | "return-rst" [ "( ttl" number ")" ] |
34003b3a8eb9SGleb Smirnoff                 "return-icmp" [ "(" icmpcode [ [ "," ] icmp6code ] ")" ] |
34013b3a8eb9SGleb Smirnoff                 "return-icmp6" [ "(" icmp6code ")" ]
34023b3a8eb9SGleb Smirnofficmpcode       = ( icmp-code-name | icmp-code-number )
34033b3a8eb9SGleb Smirnofficmp6code      = ( icmp6-code-name | icmp6-code-number )
34043b3a8eb9SGleb Smirnoff
34053b3a8eb9SGleb Smirnoffifspec         = ( [ "!" ] ( interface-name | interface-group ) ) |
34063b3a8eb9SGleb Smirnoff                 "{" interface-list "}"
34073b3a8eb9SGleb Smirnoffinterface-list = [ "!" ] ( interface-name | interface-group )
34083b3a8eb9SGleb Smirnoff                 [ [ "," ] interface-list ]
34093b3a8eb9SGleb Smirnoffroute          = ( "route-to" | "reply-to" | "dup-to" )
34103b3a8eb9SGleb Smirnoff                 ( routehost | "{" routehost-list "}" )
34113b3a8eb9SGleb Smirnoff                 [ pooltype ]
34123b3a8eb9SGleb Smirnoffaf             = "inet" | "inet6"
34133b3a8eb9SGleb Smirnoff
34144bfffd8cSKristof Provostetherprotospec = "proto" ( proto-number | "{" etherproto-list "}" )
34154bfffd8cSKristof Provostetherproto-list	= proto-number [ [ "," ] etherproto-list ]
34163b3a8eb9SGleb Smirnoffprotospec      = "proto" ( proto-name | proto-number |
34173b3a8eb9SGleb Smirnoff                 "{" proto-list "}" )
34183b3a8eb9SGleb Smirnoffproto-list     = ( proto-name | proto-number ) [ [ "," ] proto-list ]
34193b3a8eb9SGleb Smirnoff
3420ab2886f0SKristof Provostetherhosts     = "from" macaddress "to" macaddress
3421b590f17aSKristof Provostmacaddress     = mac | mac "/" masklen | mac "&" mask
3422b590f17aSKristof Provost
34233b3a8eb9SGleb Smirnoffhosts          = "all" |
34243b3a8eb9SGleb Smirnoff                 "from" ( "any" | "no-route" | "urpf-failed" | "self" | host |
34253b3a8eb9SGleb Smirnoff                 "{" host-list "}" ) [ port ] [ os ]
34263b3a8eb9SGleb Smirnoff                 "to"   ( "any" | "no-route" | "self" | host |
34273b3a8eb9SGleb Smirnoff                 "{" host-list "}" ) [ port ]
34283b3a8eb9SGleb Smirnoff
34293b3a8eb9SGleb Smirnoffipspec         = "any" | host | "{" host-list "}"
343083f9b68fSKristof Provosthost           = [ "!" ] ( address [ "/" mask-bits ] | "<" string ">" )
34313b3a8eb9SGleb Smirnoffredirhost      = address [ "/" mask-bits ]
34323b3a8eb9SGleb Smirnoffroutehost      = "(" interface-name [ address [ "/" mask-bits ] ] ")"
34333b3a8eb9SGleb Smirnoffaddress        = ( interface-name | interface-group |
34343b3a8eb9SGleb Smirnoff                 "(" ( interface-name | interface-group ) ")" |
34353b3a8eb9SGleb Smirnoff                 hostname | ipv4-dotted-quad | ipv6-coloned-hex )
34363b3a8eb9SGleb Smirnoffhost-list      = host [ [ "," ] host-list ]
34373b3a8eb9SGleb Smirnoffredirhost-list = redirhost [ [ "," ] redirhost-list ]
34383b3a8eb9SGleb Smirnoffroutehost-list = routehost [ [ "," ] routehost-list ]
34393b3a8eb9SGleb Smirnoff
34403b3a8eb9SGleb Smirnoffport           = "port" ( unary-op | binary-op | "{" op-list "}" )
34413b3a8eb9SGleb Smirnoffportspec       = "port" ( number | name ) [ ":" ( "*" | number | name ) ]
34423b3a8eb9SGleb Smirnoffos             = "os"  ( os-name | "{" os-list "}" )
34433b3a8eb9SGleb Smirnoffuser           = "user" ( unary-op | binary-op | "{" op-list "}" )
34443b3a8eb9SGleb Smirnoffgroup          = "group" ( unary-op | binary-op | "{" op-list "}" )
34453b3a8eb9SGleb Smirnoff
344683f9b68fSKristof Provostunary-op       = [ "=" | "!=" | "<" | "<=" | ">" | ">=" ]
34473b3a8eb9SGleb Smirnoff                 ( name | number )
344883f9b68fSKristof Provostbinary-op      = number ( "<>" | "><" | ":" ) number
34493b3a8eb9SGleb Smirnoffop-list        = ( unary-op | binary-op ) [ [ "," ] op-list ]
34503b3a8eb9SGleb Smirnoff
34513b3a8eb9SGleb Smirnoffos-name        = operating-system-name
34523b3a8eb9SGleb Smirnoffos-list        = os-name [ [ "," ] os-list ]
34533b3a8eb9SGleb Smirnoff
34543b3a8eb9SGleb Smirnoffflags          = "flags" ( [ flag-set ] "/"  flag-set | "any" )
34553b3a8eb9SGleb Smirnoffflag-set       = [ "F" ] [ "S" ] [ "R" ] [ "P" ] [ "A" ] [ "U" ] [ "E" ]
34563b3a8eb9SGleb Smirnoff                 [ "W" ]
34573b3a8eb9SGleb Smirnoff
34583b3a8eb9SGleb Smirnofficmp-type      = "icmp-type" ( icmp-type-code | "{" icmp-list "}" )
34593b3a8eb9SGleb Smirnofficmp6-type     = "icmp6-type" ( icmp-type-code | "{" icmp-list "}" )
34603b3a8eb9SGleb Smirnofficmp-type-code = ( icmp-type-name | icmp-type-number )
34613b3a8eb9SGleb Smirnoff                 [ "code" ( icmp-code-name | icmp-code-number ) ]
34623b3a8eb9SGleb Smirnofficmp-list      = icmp-type-code [ [ "," ] icmp-list ]
34633b3a8eb9SGleb Smirnoff
34643b3a8eb9SGleb Smirnofftos            = ( "lowdelay" | "throughput" | "reliability" |
34653b3a8eb9SGleb Smirnoff                 [ "0x" ] number )
34663b3a8eb9SGleb Smirnoff
34673b3a8eb9SGleb Smirnoffstate-opts     = state-opt [ [ "," ] state-opts ]
3468e65e2095SKristof Provoststate-opt      = ( "max" number | "no-sync" | timeout | "sloppy" |
34693b3a8eb9SGleb Smirnoff                 "source-track" [ ( "rule" | "global" ) ] |
34703b3a8eb9SGleb Smirnoff                 "max-src-nodes" number | "max-src-states" number |
34713b3a8eb9SGleb Smirnoff                 "max-src-conn" number |
34723b3a8eb9SGleb Smirnoff                 "max-src-conn-rate" number "/" number |
347383f9b68fSKristof Provost                 "overload" "<" string ">" [ "flush" ] |
3474baf9b6d0SKristof Provost                 "if-bound" | "floating" | "pflow" )
34753b3a8eb9SGleb Smirnoff
347664b3b4d6SKristof Provostfragmentation  = [ "fragment reassemble" ]
34773b3a8eb9SGleb Smirnoff
34783b3a8eb9SGleb Smirnofftimeout-list   = timeout [ [ "," ] timeout-list ]
34793b3a8eb9SGleb Smirnofftimeout        = ( "tcp.first" | "tcp.opening" | "tcp.established" |
34803b3a8eb9SGleb Smirnoff                 "tcp.closing" | "tcp.finwait" | "tcp.closed" |
3481ca9dbde8SKristof Provost                 "sctp.first" | "sctp.opening" | "sctp.established" |
3482ca9dbde8SKristof Provost                 "sctp.closing" | "sctp.closed" |
34833b3a8eb9SGleb Smirnoff                 "udp.first" | "udp.single" | "udp.multiple" |
34843b3a8eb9SGleb Smirnoff                 "icmp.first" | "icmp.error" |
34853b3a8eb9SGleb Smirnoff                 "other.first" | "other.single" | "other.multiple" |
34863b3a8eb9SGleb Smirnoff                 "frag" | "interval" | "src.track" |
34873b3a8eb9SGleb Smirnoff                 "adaptive.start" | "adaptive.end" ) number
34883b3a8eb9SGleb Smirnoff
34893b3a8eb9SGleb Smirnofflimit-list     = limit-item [ [ "," ] limit-list ]
34903b3a8eb9SGleb Smirnofflimit-item     = ( "states" | "frags" | "src-nodes" ) number
34913b3a8eb9SGleb Smirnoff
34923b3a8eb9SGleb Smirnoffpooltype       = ( "bitmask" | "random" |
34933b3a8eb9SGleb Smirnoff                 "source-hash" [ ( hex-key | string-key ) ] |
34943b3a8eb9SGleb Smirnoff                 "round-robin" ) [ sticky-address ]
34953b3a8eb9SGleb Smirnoff
34963b3a8eb9SGleb Smirnoffsubqueue       = string | "{" queue-list "}"
34973b3a8eb9SGleb Smirnoffqueue-list     = string [ [ "," ] string ]
34983b3a8eb9SGleb Smirnoffcbq-def        = "cbq" [ "(" cbq-opt [ [ "," ] cbq-opt ] ")" ]
34993b3a8eb9SGleb Smirnoffpriq-def       = "priq" [ "(" priq-opt [ [ "," ] priq-opt ] ")" ]
35003b3a8eb9SGleb Smirnoffhfsc-def       = "hfsc" [ "(" hfsc-opt [ [ "," ] hfsc-opt ] ")" ]
35013b3a8eb9SGleb Smirnoffcbq-opt        = ( "default" | "borrow" | "red" | "ecn" | "rio" )
35023b3a8eb9SGleb Smirnoffpriq-opt       = ( "default" | "red" | "ecn" | "rio" )
35033b3a8eb9SGleb Smirnoffhfsc-opt       = ( "default" | "red" | "ecn" | "rio" |
35043b3a8eb9SGleb Smirnoff                 linkshare-sc | realtime-sc | upperlimit-sc )
35053b3a8eb9SGleb Smirnofflinkshare-sc   = "linkshare" sc-spec
35063b3a8eb9SGleb Smirnoffrealtime-sc    = "realtime" sc-spec
35073b3a8eb9SGleb Smirnoffupperlimit-sc  = "upperlimit" sc-spec
35083b3a8eb9SGleb Smirnoffsc-spec        = ( bandwidth-spec |
35093b3a8eb9SGleb Smirnoff                 "(" bandwidth-spec number bandwidth-spec ")" )
35103b3a8eb9SGleb Smirnoffinclude        = "include" filename
35113b3a8eb9SGleb Smirnoff.Ed
35123b3a8eb9SGleb Smirnoff.Sh FILES
35133b3a8eb9SGleb Smirnoff.Bl -tag -width "/etc/protocols" -compact
35143b3a8eb9SGleb Smirnoff.It Pa /etc/hosts
35153b3a8eb9SGleb SmirnoffHost name database.
35163b3a8eb9SGleb Smirnoff.It Pa /etc/pf.conf
35173b3a8eb9SGleb SmirnoffDefault location of the ruleset file.
35181b35da5aSBenedict ReuschlingThe file has to be created manually as it is not installed with a
35191b35da5aSBenedict Reuschlingstandard installation.
35203b3a8eb9SGleb Smirnoff.It Pa /etc/pf.os
35213b3a8eb9SGleb SmirnoffDefault location of OS fingerprints.
35223b3a8eb9SGleb Smirnoff.It Pa /etc/protocols
35233b3a8eb9SGleb SmirnoffProtocol name database.
35243b3a8eb9SGleb Smirnoff.It Pa /etc/services
35253b3a8eb9SGleb SmirnoffService name database.
35263b3a8eb9SGleb Smirnoff.El
35273b3a8eb9SGleb Smirnoff.Sh SEE ALSO
35283b3a8eb9SGleb Smirnoff.Xr altq 4 ,
35293b3a8eb9SGleb Smirnoff.Xr carp 4 ,
35303b3a8eb9SGleb Smirnoff.Xr icmp 4 ,
35313b3a8eb9SGleb Smirnoff.Xr icmp6 4 ,
35323b3a8eb9SGleb Smirnoff.Xr ip 4 ,
35333b3a8eb9SGleb Smirnoff.Xr ip6 4 ,
35343b3a8eb9SGleb Smirnoff.Xr pf 4 ,
3535baf9b6d0SKristof Provost.Xr pflow 4 ,
35363b3a8eb9SGleb Smirnoff.Xr pfsync 4 ,
353747d0c1feSKristof Provost.Xr sctp 4 ,
35386e1fc011SGraham Percival.Xr tcp 4 ,
35393b3a8eb9SGleb Smirnoff.Xr udp 4 ,
35403b3a8eb9SGleb Smirnoff.Xr hosts 5 ,
35413b3a8eb9SGleb Smirnoff.Xr pf.os 5 ,
35423b3a8eb9SGleb Smirnoff.Xr protocols 5 ,
35433b3a8eb9SGleb Smirnoff.Xr services 5 ,
35443b3a8eb9SGleb Smirnoff.Xr ftp-proxy 8 ,
35453b3a8eb9SGleb Smirnoff.Xr pfctl 8 ,
3546a5e1109aSGlen Barber.Xr pflogd 8
35473b3a8eb9SGleb Smirnoff.Sh HISTORY
35483b3a8eb9SGleb SmirnoffThe
35493b3a8eb9SGleb Smirnoff.Nm
35503b3a8eb9SGleb Smirnofffile format first appeared in
35513b3a8eb9SGleb Smirnoff.Ox 3.0 .
3552