hack(6): Update gethdate().
[dragonfly.git] / usr.sbin / pfctl / pfctl.8
blob3dc3ed36b9001f8298872552ebfedfb660c46527
1 .\" $OpenBSD: pfctl.8,v 1.139 2008/06/11 07:23:36 jmc Exp $
2 .\"
3 .\" Copyright (c) 2001 Kjell Wooding.  All rights reserved.
4 .\"
5 .\" Redistribution and use in source and binary forms, with or without
6 .\" modification, are permitted provided that the following conditions
7 .\" are met:
8 .\" 1. Redistributions of source code must retain the above copyright
9 .\"    notice, this list of conditions and the following disclaimer.
10 .\" 2. Redistributions in binary form must reproduce the above copyright
11 .\"    notice, this list of conditions and the following disclaimer in the
12 .\"    documentation and/or other materials provided with the distribution.
13 .\" 3. The name of the author may not be used to endorse or promote products
14 .\"    derived from this software without specific prior written permission.
15 .\"
16 .\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17 .\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18 .\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19 .\" IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20 .\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
21 .\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22 .\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23 .\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25 .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 .\"
27 .Dd November 11, 2010
28 .Dt PFCTL 8
29 .Os
30 .Sh NAME
31 .Nm pfctl
32 .Nd control the packet filter (PF) device
33 .Sh SYNOPSIS
34 .Nm
35 .Bk -words
36 .Op Fl AdeghmNnOqRrvz
37 .Op Fl a Ar anchor
38 .Oo Fl D Ar macro Ns =
39 .Ar value Oc
40 .Op Fl F Ar modifier
41 .Op Fl f Ar file
42 .Op Fl i Ar interface
43 .Op Fl K Ar host | network
44 .Xo
45 .Oo Fl k
46 .Ar host | network | label | id
47 .Oc Xc
48 .Op Fl o Ar level
49 .Op Fl p Ar device
50 .Op Fl s Ar modifier
51 .Xo
52 .Oo Fl t Ar table
53 .Fl T Ar command
54 .Op Ar address ...
55 .Oc Xc
56 .Op Fl x Ar level
57 .Ek
58 .Sh DESCRIPTION
59 The
60 .Nm
61 utility communicates with the packet filter device using the
62 ioctl interface described in
63 .Xr pf 4 .
64 It allows ruleset and parameter configuration and retrieval of status
65 information from the packet filter.
66 .Pp
67 Packet filtering restricts the types of packets that pass through
68 network interfaces entering or leaving the host based on filter
69 rules as described in
70 .Xr pf.conf 5 .
71 The packet filter can also replace addresses and ports of packets.
72 Replacing source addresses and ports of outgoing packets is called
73 NAT (Network Address Translation) and is used to connect an internal
74 network (usually reserved address space) to an external one (the
75 Internet) by making all connections to external hosts appear to
76 come from the gateway.
77 Replacing destination addresses and ports of incoming packets
78 is used to redirect connections to different hosts and/or ports.
79 A combination of both translations, bidirectional NAT, is also
80 supported.
81 Translation rules are described in
82 .Xr pf.conf 5 .
83 .Pp
84 When the variable
85 .Va pf
86 is set to
87 .Dv YES
89 .Xr rc.conf 5 ,
90 the rule file specified with the variable
91 .Va pf_rules
92 is loaded automatically by the
93 .Xr rc 8
94 scripts and the packet filter is enabled.
95 .Pp
96 The packet filter does not itself forward packets between interfaces.
97 Forwarding can be enabled by setting the
98 .Xr sysctl 8
99 variables
100 .Em net.inet.ip.forwarding
101 and/or
102 .Em net.inet6.ip6.forwarding
103 to 1.
104 Set them permanently in
105 .Xr sysctl.conf 5 .
109 utility provides several commands.
110 The options are as follows:
111 .Bl -tag -width Ds
112 .It Fl A
113 Load only the queue rules present in the rule file.
114 Other rules and options are ignored.
115 .It Fl a Ar anchor
116 Apply flags
117 .Fl f ,
118 .Fl F ,
120 .Fl s
121 only to the rules in the specified
122 .Ar anchor .
123 In addition to the main ruleset,
125 can load and manipulate additional rulesets by name,
126 called anchors.
127 The main ruleset is the default anchor.
129 Anchors are referenced by name and may be nested,
130 with the various components of the anchor path separated by
131 .Sq /
132 characters, similar to how file system hierarchies are laid out.
133 The last component of the anchor path is where ruleset operations are
134 performed.
136 Evaluation of
137 .Ar anchor
138 rules from the main ruleset is described in
139 .Xr pf.conf 5 .
141 For example, the following will show all filter rules (see the
142 .Fl s
143 flag below) inside the anchor
144 .Dq authpf/smith(1234) ,
145 which would have been created for user
146 .Dq smith
148 .Xr authpf 8 ,
149 PID 1234:
150 .Bd -literal -offset indent
151 # pfctl -a "authpf/smith(1234)" -s rules
154 Private tables can also be put inside anchors, either by having table
155 statements in the
156 .Xr pf.conf 5
157 file that is loaded in the anchor, or by using regular table commands, as in:
158 .Bd -literal -offset indent
159 # pfctl -a foo/bar -t mytable -T add 1.2.3.4 5.6.7.8
162 When a rule referring to a table is loaded in an anchor, the rule will use the
163 private table if one is defined, and then fall back to the table defined in the
164 main ruleset, if there is one.
165 This is similar to C rules for variable scope.
166 It is possible to create distinct tables with the same name in the global
167 ruleset and in an anchor, but this is often bad design and a warning will be
168 issued in that case.
170 By default, recursive inline printing of anchors applies only to unnamed
171 anchors specified inline in the ruleset.
172 If the anchor name is terminated with a
173 .Sq *
174 character, the
175 .Fl s
176 flag will recursively print all anchors in a brace delimited block.
177 For example the following will print the
178 .Dq authpf
179 ruleset recursively:
180 .Bd -literal -offset indent
181 # pfctl -a 'authpf/*' -sr
184 To print the main ruleset recursively, specify only
185 .Sq *
186 as the anchor name:
187 .Bd -literal -offset indent
188 # pfctl -a '*' -sr
190 .It Fl D Ar macro Ns = Ns Ar value
191 Define
192 .Ar macro
193 to be set to
194 .Ar value
195 on the command line.
196 Overrides the definition of
197 .Ar macro
198 in the ruleset.
199 .It Fl d
200 Disable the packet filter.
201 .It Fl e
202 Enable the packet filter.
203 .It Fl F Ar modifier
204 Flush the filter parameters specified by
205 .Ar modifier
206 (may be abbreviated):
208 .Bl -tag -width xxxxxxxxxxxx -compact
209 .It Fl F Cm nat
210 Flush the NAT rules.
211 .It Fl F Cm queue
212 Flush the queue rules.
213 .It Fl F Cm rules
214 Flush the filter rules.
215 .It Fl F Cm states
216 Flush the state table (NAT and filter).
217 .It Fl F Cm Sources
218 Flush the source tracking table.
219 .It Fl F Cm info
220 Flush the filter information (statistics that are not bound to rules).
221 .It Fl F Cm Tables
222 Flush the tables.
223 .It Fl F Cm osfp
224 Flush the passive operating system fingerprints.
225 .It Fl F Cm all
226 Flush all of the above.
228 .It Fl f Ar file
229 Load the rules contained in
230 .Ar file .
231 This
232 .Ar file
233 may contain macros, tables, options, and normalization, queueing,
234 translation, and filtering rules.
235 With the exception of macros and tables, the statements must appear in that
236 order.
237 .It Fl g
238 Include output helpful for debugging.
239 .It Fl h
240 Help.
241 .It Fl i Ar interface
242 Restrict the operation to the given
243 .Ar interface .
244 .It Fl K Ar host | network
245 Kill all of the source tracking entries originating from the specified
246 .Ar host
248 .Ar network .
249 A second
250 .Fl K Ar host
252 .Fl K Ar network
253 option may be specified, which will kill all the source tracking
254 entries from the first host/network to the second.
255 .It Xo
256 .Fl k
257 .Ar host | network | label | id
259 Kill all of the state entries matching the specified
260 .Ar host ,
261 .Ar network ,
262 .Ar label ,
264 .Ar id .
266 For example, to kill all of the state entries originating from
267 .Dq host :
269 .Dl # pfctl -k host
271 A second
272 .Fl k Ar host
274 .Fl k Ar network
275 option may be specified, which will kill all the state entries
276 from the first host/network to the second.
277 To kill all of the state entries from
278 .Dq host1
280 .Dq host2 :
282 .Dl # pfctl -k host1 -k host2
284 To kill all states originating from 192.168.1.0/24 to 172.16.0.0/16:
286 .Dl # pfctl -k 192.168.1.0/24 -k 172.16.0.0/16
288 A network prefix length of 0 can be used as a wildcard.
289 To kill all states with the target
290 .Dq host2 :
292 .Dl # pfctl -k 0.0.0.0/0 -k host2
294 It is also possible to kill states by rule label or state ID.
295 In this mode the first
296 .Fl k
297 argument is used to specify the type
298 of the second argument.
299 The following command would kill all states that have been created
300 from rules carrying the label
301 .Dq foobar :
303 .Dl # pfctl -k label -k foobar
305 To kill one specific state by its unique state ID
306 (as shown by pfctl -s state -vv),
307 use the
308 .Ar id
309 modifier and as a second argument the state ID and optional creator ID.
310 To kill a state with ID 4823e84500000003 use:
312 .Dl # pfctl -k id -k 4823e84500000003
314 To kill a state with ID 4823e84500000018 created from a backup
315 firewall with hostid 00000002 use:
317 .Dl # pfctl -k id -k 4823e84500000018/2
318 .It Fl m
319 Merge in explicitly given options without resetting those
320 which are omitted.
321 Allows single options to be modified without disturbing the others:
322 .Bd -literal -offset indent
323 # echo "set loginterface fxp0" | pfctl -mf -
325 .It Fl N
326 Load only the NAT rules present in the rule file.
327 Other rules and options are ignored.
328 .It Fl n
329 Do not actually load rules, just parse them.
330 .It Fl O
331 Load only the options present in the rule file.
332 Other rules and options are ignored.
333 .It Fl o Ar level
334 Control the ruleset optimizer, overriding any rule file settings.
336 .Bl -tag -width xxxxxxxxxxxx -compact
337 .It Fl o Cm none
338 Disable the ruleset optimizer.
339 .It Fl o Cm basic
340 Enable basic ruleset optimizations.
341 This is the default behaviour.
342 .It Fl o Cm profile
343 Enable basic ruleset optimizations with profiling.
345 For further information on the ruleset optimizer, see
346 .Xr pf.conf 5 .
347 .It Fl p Ar device
348 Use the device file
349 .Ar device
350 instead of the default
351 .Pa /dev/pf .
352 .It Fl q
353 Only print errors and warnings.
354 .It Fl R
355 Load only the filter rules present in the rule file.
356 Other rules and options are ignored.
357 .It Fl r
358 Perform reverse DNS lookups on states when displaying them.
359 .It Fl s Ar modifier
360 Show the filter parameters specified by
361 .Ar modifier
362 (may be abbreviated):
364 .Bl -tag -width xxxxxxxxxxxxx -compact
365 .It Fl s Cm nat
366 Show the currently loaded NAT rules.
367 .It Fl s Cm queue
368 Show the currently loaded queue rules.
369 When used together with
370 .Fl v ,
371 per-queue statistics are also shown.
372 When used together with
373 .Fl v v ,
375 will loop and show updated queue statistics every five seconds, including
376 measured bandwidth and packets per second.
377 .It Fl s Cm rules
378 Show the currently loaded filter rules.
379 When used together with
380 .Fl v ,
381 the per-rule statistics (number of evaluations,
382 packets and bytes) are also shown.
383 Note that the
384 .Dq skip step
385 optimization done automatically by the kernel
386 will skip evaluation of rules where possible.
387 Packets passed statefully are counted in the rule that created the state
388 (even though the rule isn't evaluated more than once for the entire
389 connection).
390 .It Fl s Cm Anchors
391 Show the currently loaded anchors directly attached to the main ruleset.
393 .Fl a Ar anchor
394 is specified as well, the anchors loaded directly below the given
395 .Ar anchor
396 are shown instead.
398 .Fl v
399 is specified, all anchors attached under the target anchor will be
400 displayed recursively.
401 .It Fl s Cm states
402 Show the contents of the state table.
403 .It Fl s Cm Sources
404 Show the contents of the source tracking table.
405 .It Fl s Cm info
406 Show filter information (statistics and counters).
407 When used together with
408 .Fl v ,
409 source tracking statistics are also shown.
410 .It Fl s Cm labels
411 Show per-rule statistics (label, evaluations, packets total, bytes total,
412 packets in, bytes in, packets out, bytes out, state creations) of
413 filter rules with labels, useful for accounting.
414 .It Fl s Cm timeouts
415 Show the current global timeouts.
416 .It Fl s Cm memory
417 Show the current pool memory hard limits.
418 .It Fl s Cm Tables
419 Show the list of tables.
420 .It Fl s Cm osfp
421 Show the list of operating system fingerprints.
422 .It Fl s Cm Interfaces
423 Show the list of interfaces and interface drivers available to PF.
424 When used together with
425 .Fl v ,
426 it additionally lists which interfaces have skip rules activated.
427 When used together with
428 .Fl vv ,
429 interface statistics are also shown.
430 .Fl i
431 can be used to select an interface or a group of interfaces.
432 .It Fl s Cm all
433 Show all of the above, except for the lists of interfaces and operating
434 system fingerprints.
436 .It Fl T Ar command Op Ar address ...
437 Specify the
438 .Ar command
439 (may be abbreviated) to apply to the table.
440 Commands include:
442 .Bl -tag -width xxxxxxxxxxxx -compact
443 .It Fl T Cm kill
444 Kill a table.
445 .It Fl T Cm flush
446 Flush all addresses of a table.
447 .It Fl T Cm add
448 Add one or more addresses in a table.
449 Automatically create a nonexisting table.
450 .It Fl T Cm delete
451 Delete one or more addresses from a table.
452 .It Fl T Cm expire Ar number
453 Delete addresses which had their statistics cleared more than
454 .Ar number
455 seconds ago.
456 For entries which have never had their statistics cleared,
457 .Ar number
458 refers to the time they were added to the table.
459 .It Fl T Cm replace
460 Replace the addresses of the table.
461 Automatically create a nonexisting table.
462 .It Fl T Cm show
463 Show the content (addresses) of a table.
464 .It Fl T Cm test
465 Test if the given addresses match a table.
466 .It Fl T Cm zero
467 Clear all the statistics of a table.
468 .It Fl T Cm load
469 Load only the table definitions from
470 .Xr pf.conf 5 .
471 This is used in conjunction with the
472 .Fl f
473 flag, as in:
474 .Bd -literal -offset indent
475 # pfctl -Tl -f pf.conf
479 For the
480 .Cm add ,
481 .Cm delete ,
482 .Cm replace ,
484 .Cm test
485 commands, the list of addresses can be specified either directly on the command
486 line and/or in an unformatted text file, using the
487 .Fl f
488 flag.
489 Comments starting with a
490 .Sq #
491 are allowed in the text file.
492 With these commands, the
493 .Fl v
494 flag can also be used once or twice, in which case
496 will print the
497 detailed result of the operation for each individual address, prefixed by
498 one of the following letters:
500 .Bl -tag -width XXX -compact
501 .It A
502 The address/network has been added.
503 .It C
504 The address/network has been changed (negated).
505 .It D
506 The address/network has been deleted.
507 .It M
508 The address matches
510 .Cm test
511 operation only
512 .Pc .
513 .It X
514 The address/network is duplicated and therefore ignored.
515 .It Y
516 The address/network cannot be added/deleted due to conflicting
517 .Sq \&!
518 attributes.
519 .It Z
520 The address/network has been cleared (statistics).
523 Each table can maintain a set of counters that can be retrieved using the
524 .Fl v
525 flag of
526 .Nm .
527 For example, the following commands define a wide open firewall which will keep
528 track of packets going to or coming from the
530 FTP server.
531 The following commands configure the firewall and send 10 pings to the FTP
532 server:
533 .Bd -literal -offset indent
534 # printf "table <test> counters { ftp.openbsd.org }\en \e
535     pass out to <test>\en" | pfctl -f-
536 # ping -qc10 ftp.openbsd.org
539 We can now use the table
540 .Cm show
541 command to output, for each address and packet direction, the number of packets
542 and bytes that are being passed or blocked by rules referencing the table.
543 The time at which the current accounting started is also shown with the
544 .Dq Cleared
545 line.
546 .Bd -literal -offset indent
547 # pfctl -t test -vTshow
548    129.128.5.191
549     Cleared:     Thu Feb 13 18:55:18 2003
550     In/Block:    [ Packets: 0        Bytes: 0        ]
551     In/Pass:     [ Packets: 10       Bytes: 840      ]
552     Out/Block:   [ Packets: 0        Bytes: 0        ]
553     Out/Pass:    [ Packets: 10       Bytes: 840      ]
556 Similarly, it is possible to view global information about the tables
557 by using the
558 .Fl v
559 modifier twice and the
560 .Fl s
561 .Cm Tables
562 command.
563 This will display the number of addresses on each table,
564 the number of rules which reference the table, and the global
565 packet statistics for the whole table:
566 .Bd -literal -offset indent
567 # pfctl -vvsTables
568 --a-r-C test
569     Addresses:   1
570     Cleared:     Thu Feb 13 18:55:18 2003
571     References:  [ Anchors: 0        Rules: 1        ]
572     Evaluations: [ NoMatch: 3496     Match: 1        ]
573     In/Block:    [ Packets: 0        Bytes: 0        ]
574     In/Pass:     [ Packets: 10       Bytes: 840      ]
575     In/XPass:    [ Packets: 0        Bytes: 0        ]
576     Out/Block:   [ Packets: 0        Bytes: 0        ]
577     Out/Pass:    [ Packets: 10       Bytes: 840      ]
578     Out/XPass:   [ Packets: 0        Bytes: 0        ]
581 As we can see here, only one packet \- the initial ping request \- matched the
582 table, but all packets passing as the result of the state are correctly
583 accounted for.
584 Reloading the table(s) or ruleset will not affect packet accounting in any way.
585 The two
586 .Dq XPass
587 counters are incremented instead of the
588 .Dq Pass
589 counters when a
590 .Dq stateful
591 packet is passed but doesn't match the table anymore.
592 This will happen in our example if someone flushes the table while the
593 .Xr ping 8
594 command is running.
596 When used with a single
597 .Fl v ,
599 will only display the first line containing the table flags and name.
600 The flags are defined as follows:
602 .Bl -tag -width XXX -compact
603 .It c
604 For constant tables, which cannot be altered outside
605 .Xr pf.conf 5 .
606 .It p
607 For persistent tables, which don't get automatically killed when no rules
608 refer to them.
609 .It a
610 For tables which are part of the
611 .Em active
612 tableset.
613 Tables without this flag do not really exist, cannot contain addresses, and are
614 only listed if the
615 .Fl g
616 flag is given.
617 .It i
618 For tables which are part of the
619 .Em inactive
620 tableset.
621 This flag can only be witnessed briefly during the loading of
622 .Xr pf.conf 5 .
623 .It r
624 For tables which are referenced (used) by rules.
625 .It h
626 This flag is set when a table in the main ruleset is hidden by one or more
627 tables of the same name from anchors attached below it.
628 .It C
629 This flag is set when per-address counters are enabled on the table.
631 .It Fl t Ar table
632 Specify the name of the table.
633 .It Fl v
634 Produce more verbose output.
635 A second use of
636 .Fl v
637 will produce even more verbose output including ruleset warnings.
638 See the previous section for its effect on table commands.
639 .It Fl x Ar level
640 Set the debug
641 .Ar level
642 (may be abbreviated) to one of the following:
644 .Bl -tag -width xxxxxxxxxxxx -compact
645 .It Fl x Cm none
646 Don't generate debug messages.
647 .It Fl x Cm urgent
648 Generate debug messages only for serious errors.
649 .It Fl x Cm misc
650 Generate debug messages for various errors.
651 .It Fl x Cm loud
652 Generate debug messages for common conditions.
654 .It Fl z
655 Clear per-rule statistics.
657 .Sh FILES
658 .Bl -tag -width "/etc/pf.conf" -compact
659 .It Pa /etc/pf.conf
660 Packet filter rules file.
661 .It Pa /etc/pf.os
662 Passive operating system fingerprint database.
664 .Sh SEE ALSO
665 .Xr pf 4 ,
666 .Xr pf.conf 5 ,
667 .Xr pf.os 5 ,
668 .Xr rc.conf 5 ,
669 .Xr sysctl.conf 5 ,
670 .Xr authpf 8 ,
671 .Xr ftp-proxy 8 ,
672 .Xr rc 8 ,
673 .Xr sysctl 8
674 .Sh HISTORY
677 program and the
678 .Xr pf 4
679 filter mechanism first appeared in
680 .Ox 3.0 .