Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
IPFW(8)			    System Manager's Manual		       IPFW(8)

NAME
       ipfw,  dnctl  --	 User  interface  for firewall,	traffic	shaper,	packet
       scheduler, in-kernel NAT.

SYNOPSIS
   FIREWALL CONFIGURATION
       ipfw [-cq] add rule
       ipfw [-acdefnNStT] [set N] {list	| show}	[rule |	first-last ...]
       ipfw [-f	| -q] [set N] flush
       ipfw [-q] [set N] {delete | zero	| resetlog} [number ...]

       ipfw set	[disable number	...] [enable number ...]
       ipfw set	move [rule] number to number
       ipfw set	swap number number
       ipfw set	show

   SYSCTL SHORTCUTS
       ipfw								enable
	    {firewall|altq|one_pass|debug|verbose|dyn_keepalive| skipto_cache}
       ipfw							       disable
	    {firewall|altq|one_pass|debug|verbose|dyn_keepalive| skipto_cache}

   LOOKUP TABLES
       ipfw [set N] table name create create-options
       ipfw [set N] table {name	| all} destroy
       ipfw [set N] table name modify modify-options
       ipfw [set N] table name swap name
       ipfw [set N] table name add table-key [value]
       ipfw [set N] table name add [table-key value ...]
       ipfw [set N] table name atomic add [table-key value ...]
       ipfw [set N] table name delete [table-key ...]
       ipfw [set N] table name lookup addr
       ipfw [set N] table name lock
       ipfw [set N] table name unlock
       ipfw [set N] table {name	| all} list
       ipfw [set N] table {name	| all} info
       ipfw [set N] table {name	| all} detail
       ipfw [set N] table {name	| all} flush

   DUMMYNET CONFIGURATION (TRAFFIC SHAPER AND PACKET SCHEDULER)
       dnctl {pipe | queue | sched} number config config-options
       dnctl [-s [field]] {pipe	| queue	 |  sched}  {delete  |	list  |	 show}
	    [number ...]

   IN-KERNEL NAT
       ipfw [-q] nat number config config-options
       ipfw [-q] nat number delete
       ipfw nat	number show {config | log}

   STATEFUL IPv6/IPv4 NETWORK ADDRESS AND PROTOCOL TRANSLATION
       ipfw [set N] nat64lsn name create create-options
       ipfw [set N] nat64lsn name config config-options
       ipfw [set N] nat64lsn {name | all} {list	| show}	[states]
       ipfw [set N] nat64lsn {name | all} destroy
       ipfw [set N] nat64lsn name stats	[reset]

   STATELESS IPv6/IPv4 NETWORK ADDRESS AND PROTOCOL TRANSLATION
       ipfw [set N] nat64stl name create create-options
       ipfw [set N] nat64stl name config config-options
       ipfw [set N] nat64stl {name | all} {list	| show}
       ipfw [set N] nat64stl {name | all} destroy
       ipfw [set N] nat64stl name stats	[reset]

   XLAT464 CLAT	IPv6/IPv4 NETWORK ADDRESS AND PROTOCOL TRANSLATION
       ipfw [set N] nat64clat name create create-options
       ipfw [set N] nat64clat name config config-options
       ipfw [set N] nat64clat {name | all} {list | show}
       ipfw [set N] nat64clat {name | all} destroy
       ipfw [set N] nat64clat name stats [reset]

   IPv6-to-IPv6	NETWORK	PREFIX TRANSLATION
       ipfw [set N] nptv6 name create create-options
       ipfw [set N] nptv6 {name	| all} {list | show}
       ipfw [set N] nptv6 {name	| all} destroy
       ipfw [set N] nptv6 name stats [reset]

   INTERNAL DIAGNOSTICS
       ipfw internal iflist
       ipfw internal monitor [filter-comment]
       ipfw internal talist
       ipfw internal vlist

   LIST	OF RULES AND PREPROCESSING
       ipfw [-cfnNqS] [-p preproc [preproc-flags]] pathname

DESCRIPTION
       The  ipfw  utility  is  the  user interface for controlling the ipfw(4)
       firewall, the dummynet(4) traffic shaper/packet scheduler, and the  in-
       kernel NAT services.

       A  firewall  configuration, or ruleset, is made of a list of rules num-
       bered from 1 to 65535.  Packets are passed to the firewall from a  num-
       ber  of different places	in the protocol	stack (depending on the	source
       and destination of the packet, it is possible for the  firewall	to  be
       invoked	multiple  times	on the same packet).  The packet passed	to the
       firewall	is compared against each of the	rules in the ruleset, in rule-
       number order (multiple rules with the same  number  are	permitted,  in
       which  case they	are processed in order of insertion).  When a match is
       found, the action corresponding to the matching rule is performed.

       Depending on the	action and certain system  settings,  packets  can  be
       reinjected  into	 the  firewall at some rule after the matching one for
       further processing.

       A ruleset always	includes a default rule	(numbered 65535) which	cannot
       be modified or deleted, and matches all packets.	 The action associated
       with  the default rule can be either deny or allow depending on how the
       kernel is configured.

       If the  ruleset	includes  one  or  more	 rules	with  the  keep-state,
       record-state,  limit  or	 set-limit  option,  the  firewall will	have a
       stateful	behaviour, i.e., upon a	match it will  create  dynamic	rules,
       i.e.,  rules that match packets with the	same 5-tuple (protocol,	source
       and destination addresses and ports) as the packet which	 caused	 their
       creation.  Dynamic rules, which have a limited lifetime,	are checked at
       the  first  occurrence  of a check-state, keep-state or limit rule, and
       are typically used to open the firewall on-demand to legitimate traffic
       only.   Please  note,  that  keep-state	and   limit   imply   implicit
       check-state  for	 all  packets (not only	these matched by the rule) but
       record-state and	set-limit  have	 no  implicit  check-state.   See  the
       "STATEFUL  FIREWALL" and	"EXAMPLES" Sections below for more information
       on the stateful behaviour of ipfw.

       All rules (including dynamic ones) have a few  associated  counters:  a
       packet  count, a	byte count, a log count	and a timestamp	indicating the
       time of the last	match.	Counters can be	displayed or reset  with  ipfw
       commands.

       Each rule belongs to one	of 32 different	sets , and there are ipfw com-
       mands  to  atomically  manipulate  sets,	 such as enable, disable, swap
       sets, move all rules in a set to	another	one, delete  all  rules	 in  a
       set.   These  can  be useful to install temporary configurations, or to
       test them.  See Section "SETS OF	RULES" for more	information on sets.

       Rules can be added with the add command;	 deleted  individually	or  in
       groups  with  the delete	command, and globally (except those in set 31)
       with the	flush command; displayed, optionally with the content  of  the
       counters,  using	 the show and list commands.  Finally, counters	can be
       reset with the zero and resetlog	commands.

   COMMAND OPTIONS
       The following general options are available when	invoking ipfw:

       -a      Show counter values when	listing	rules.	The show  command  im-
	       plies this option.

       -b      Only  show  the action and the comment, not the body of a rule.
	       Implies -c.

       -c      When entering or	showing	rules, print  them  in	compact	 form,
	       i.e.,  omitting	the "ip	from any to any" string	when this does
	       not carry any additional	information.

       -d      When listing, show dynamic rules	in addition to static ones.

       -D      When listing, show only dynamic states.	When deleting,	delete
	       only dynamic states.

       -f      Run  without  prompting	for confirmation for commands that can
	       cause problems if misused, i.e.,	flush.	If there is no tty as-
	       sociated	with the process, this is implied.  The	delete command
	       with this flag ignores possible errors, i.e., nonexistent  rule
	       number.	 And for batched commands execution continues with the
	       next command.

       -i      When listing a table (see the "LOOKUP TABLES" section below for
	       more information	on lookup tables), format  values  as  IP  ad-
	       dresses.	 By default, values are	shown as integers.

       -n      Only  check  syntax  of	the  command strings, without actually
	       passing them to the kernel.

       -N      Try to resolve addresses	and service names in output.

       -q      Be quiet	when executing the add,	nat, zero, resetlog  or	 flush
	       commands;  (implies -f).	 This is useful	when updating rulesets
	       by  executing  multiple	ipfw  commands	in  a  script	(e.g.,
	       `sh /etc/rc.firewall'),	or by processing a file	with many ipfw
	       rules across a remote login session.  It	also stops a table add
	       or delete from failing if the entry already exists  or  is  not
	       present.

	       The reason why this option may be important is that for some of
	       these  actions, ipfw may	print a	message; if the	action results
	       in blocking the traffic to the remote client, the remote	 login
	       session	will be	closed and the rest of the ruleset will	not be
	       processed.  Access to the console would then be required	to re-
	       cover.

       -S      When listing rules, show	the set	each rule belongs to.  If this
	       flag is not specified, disabled rules will not be listed.

       -s [field]
	       When listing pipes, sort	according to one of the	four  counters
	       (total or current packets or bytes).

       -t      When listing, show last match timestamp converted with ctime().

       -T      When  listing,  show  last  match timestamp as seconds from the
	       epoch.  This form can be	more convenient	for postprocessing  by
	       scripts.

   LIST	OF RULES AND PREPROCESSING
       To  ease	configuration, rules can be put	into a file which is processed
       using ipfw as shown in the last synopsis	line.	An  absolute  pathname
       must  be	used.  The file	will be	read line by line and applied as argu-
       ments to	the ipfw utility.

       Optionally, a preprocessor can be  specified  using  -p	preproc	 where
       pathname	 is  to	be piped through.  Useful preprocessors	include	cpp(1)
       and m4(1).  If preproc does not start with a slash (`/')	as  its	 first
       character,  the	usual  PATH  name search is performed.	Care should be
       taken with this in environments where not all file systems are  mounted
       (yet)  by  the  time ipfw is being run (e.g. when they are mounted over
       NFS).  Once -p has been specified, any additional arguments are	passed
       on  to  the  preprocessor for interpretation.  This allows for flexible
       configuration files (like conditionalizing them on the local  hostname)
       and  the	use of macros to centralize frequently required	arguments like
       IP addresses.

   TRAFFIC SHAPER CONFIGURATION
       The dnctl pipe, queue and sched commands	 are  used  to	configure  the
       traffic	 shaper	  and  packet  scheduler.   See	 the  "TRAFFIC	SHAPER
       (DUMMYNET) CONFIGURATION" Section below for details.

       If the world and	the kernel get out of sync the	ipfw  ABI  may	break,
       preventing  you	from  being able to add	any rules.  This can adversely
       affect the booting process.  You	can use	ipfw disable firewall to  tem-
       porarily	disable	the firewall to	regain access to the network, allowing
       you to fix the problem.

PACKET FLOW
       A  packet  is  checked against the active ruleset in multiple places in
       the protocol stack, under control of several sysctl  variables.	 These
       places  and variables are shown below, and it is	important to have this
       picture in mind in order	to design a correct ruleset.

		    ^	 to upper layers    V
		    |			    |
		    +----------->-----------+
		    ^			    V
	      [ip(6)_input]	      [ip(6)_output]	 net.inet(6).ip(6).fw.enable=1
		    |			    |
		    ^			    V
	      [ether_demux]	   [ether_output_frame]	 net.link.ether.ipfw=1
		    |			    |
		    +-->--[bdg_forward]-->--+		 net.link.bridge.ipfw=1
		    ^			    V
		    |	   to devices	    |

       The number of times the same packet goes	through	the firewall can  vary
       between	0 and 4	depending on packet source and destination, and	system
       configuration.

       Note that as packets flow through the stack, headers can	be stripped or
       added to	it, and	so they	may or may not be  available  for  inspection.
       E.g., incoming packets will include the MAC header when ipfw is invoked
       from  ether_demux(),  but  the  same  packets  will have	the MAC	header
       stripped	off when ipfw is invoked from ip_input() or ip6_input().

       Also note that each packet is always checked against the	complete rule-
       set, irrespective of the	place where the	check occurs, or the source of
       the packet.  If a rule contains some match patterns  or	actions	 which
       are  not	 valid for the place of	invocation (e.g. trying	to match a MAC
       header within ip_input or ip6_input  ),	the  match  pattern  will  not
       match, but a not	operator in front of such patterns will	cause the pat-
       tern  to	 always	match on those packets.	 It is thus the	responsibility
       of the programmer, if necessary,	to write a suitable ruleset to differ-
       entiate among the possible places.  skipto rules	can be useful here, as
       an example:

	     # packets from ether_demux	or bdg_forward
	     ipfw add 10 skipto	1000 all from any to any layer2	in
	     # packets from ip_input
	     ipfw add 10 skipto	2000 all from any to any not layer2 in
	     # packets from ip_output
	     ipfw add 10 skipto	3000 all from any to any not layer2 out
	     # packets from ether_output_frame
	     ipfw add 10 skipto	4000 all from any to any layer2	out

       (yes, at	the moment there is no way to differentiate between  ether_de-
       mux and bdg_forward).

       Also note that only actions allow, deny,	netgraph, ngtee	and related to
       dummynet	 are  processed	for layer2 frames and all other	actions	act as
       if they were allow for such frames.  Full set of	actions	 is  supported
       for IP packets without layer2 headers only.  For	example, divert	action
       does not	divert layer2 frames.

SYNTAX
       In  general,  each  keyword  or argument	must be	provided as a separate
       command line argument, with no leading or  trailing  spaces.   Keywords
       are  case-sensitive, whereas arguments may or may not be	case-sensitive
       depending on their nature (e.g. uid's are, hostnames are	not).

       Some arguments (e.g., port or address lists) are	comma-separated	 lists
       of  values.   In	this case, spaces after	commas ',' are allowed to make
       the line	more readable.	You can	also put the entire command (including
       flags) into a single argument.  E.g., the following forms  are  equiva-
       lent:

	     ipfw -q add deny src-ip 10.0.0.0/24,127.0.0.1/8
	     ipfw -q add deny src-ip 10.0.0.0/24, 127.0.0.1/8
	     ipfw "-q add deny src-ip 10.0.0.0/24, 127.0.0.1/8"

RULE FORMAT
       The format of firewall rules is the following:

	     [rule_number] [set	set_number] [prob match_probability] action
	     [log [log_opts]] [altq queue] [{tag | untag} number] body

       where the body of the rule specifies which information is used for fil-
       tering packets, among the following:

	  Layer2 header	fields			When available
	  IPv4 and IPv6	Protocol		SCTP, TCP, UDP,	ICMP, etc.
	  Source and dest. addresses and ports
	  Direction				See Section "PACKET FLOW"
	  Transmit and receive interface	By name	or address
	  Misc.	IP header fields		Version,   type	  of  service,
						datagram  length,  identifica-
						tion,	fragmentation	flags,
						Time To	Live
	  IP options
	  IPv6 Extension headers		Fragmentation, Hop-by-Hop  op-
						tions, Routing Headers,	Source
						routing	 rthdr0,  Mobile  IPv6
						rthdr2,	IPSec options.
	  IPv6 Flow-ID
	  Misc.	TCP header fields		TCP flags (SYN,	FIN, ACK, RST,
						etc.),	sequence  number,  ac-
						knowledgment number, window
	  TCP options
	  ICMP types				for ICMP packets
	  ICMP6	types				for ICMP6 packets
	  User/group ID				When the packet	can be associ-
						ated with a local socket.
	  Divert status				Whether	 a  packet came	from a
						divert socket (e.g., natd(8)).
	  Fib annotation state			Whether	 a  packet  has	  been
						tagged	for  using  a specific
						FIB (routing table) in	future
						forwarding decisions.

       Note  that  some	 of  the  above	information, e.g. source MAC or	IP ad-
       dresses and TCP/UDP ports, can be easily	spoofed, so filtering on those
       fields alone might not guarantee	the desired results.

       rule_number
	       Each rule  is  associated  with	a  rule_number	in  the	 range
	       1..65535, with the latter reserved for the default rule.	 Rules
	       are  checked  sequentially  by rule number.  Multiple rules can
	       have the	same number, in	 which	case  they  are	 checked  (and
	       listed)	according  to the order	in which they have been	added.
	       If a rule is entered without specifying a  number,  the	kernel
	       will  assign  one  in such a way	that the rule becomes the last
	       one before the default rule.  Automatic rule  numbers  are  as-
	       signed  by incrementing the last	non-default rule number	by the
	       value of	the sysctl variable net.inet.ip.fw.autoinc_step	 which
	       defaults	 to  100.   If	this  is not possible (e.g. because we
	       would go	beyond the maximum allowed rule	number), the number of
	       the last	non-default value is used instead.

       set set_number
	       Each rule is associated with a set_number in the	 range	0..31.
	       Sets  can be individually disabled and enabled, so this parame-
	       ter is of fundamental importance	for atomic  ruleset  manipula-
	       tion.   It  can	be also	used to	simplify deletion of groups of
	       rules.  If a rule is entered without specifying a  set  number,
	       set 0 will be used.
	       Set  31	is special in that it cannot be	disabled, and rules in
	       set 31 are not deleted by the ipfw flush	command	(but  you  can
	       delete  them  with  the ipfw delete set 31 command).  Set 31 is
	       also used for the default rule.

       prob match_probability
	       A match is only declared	with the specified probability (float-
	       ing point number	between	0 and 1).  This	can be	useful	for  a
	       number  of  applications	such as	random packet drop or (in con-
	       junction	with dummynet) to  simulate  the  effect  of  multiple
	       paths leading to	out-of-order packet delivery.

	       Note: this condition is checked before any other	condition, in-
	       cluding ones such as keep-state or check-state which might have
	       side effects.

       log [logamount number]
	       Packets	matching  a  rule  with	 the  log keyword will be made
	       available for logging.	Unless	per-rule  log  destination  is
	       specified by logdst logdst_spec option (see below), packets are
	       logged	 in    two    ways:    if    the    sysctl    variable
	       net.inet.ip.fw.verbose is set  to  0  (default),	 one  can  use
	       bpf(4) attached to the ipfw0 pseudo interface.  This pseudo in-
	       terface	can  be	 created manually after	a system boot by using
	       the following command:

		     # ifconfig	ipfw0 create

	       Or, automatically at boot time by adding	the following line  to
	       the rc.conf(5) file:

		     firewall_logif="YES"

	       There is	zero overhead when no bpf(4) is	attached to the	pseudo
	       interface.

	       If  net.inet.ip.fw.verbose  is set to 1,	packets	will be	logged
	       to syslogd(8) with a LOG_SECURITY facility up to	a  maximum  of
	       logamount  packets.  If no logamount is specified, the limit is
	       taken from the  sysctl  variable	 net.inet.ip.fw.verbose_limit.
	       In both cases, a	value of 0 means unlimited logging.

	       Once  the limit is reached, logging can be re-enabled by	clear-
	       ing the logging counter or the packet counter for  that	entry,
	       see the resetlog	command.

	       Note:  logging  is  done	after all other	packet matching	condi-
	       tions have been successfully verified,  and  before  performing
	       the final action	(accept, deny, etc.) on	the packet.

       log [logamount number] logdst logdst_spec
	       logdst_spec  is	a comma-separated list of log destinations for
	       logging packets matching	the rule.  Destinations	supported are:

	       syslog  Logs a packet to	syslogd(8) with	a LOG_SECURITY	facil-
		       ity.

	       ipfw0   Logs a packet to	the ipfw0 pseudo interface.

	       rtsock  Logs a packet to	the route(4) socket.  See the comments
		       of  ipfw_log_rtsock()  in ipfw source code for more in-
		       formation on the	message's structure.

	       Note: logamount limits a	number of logging events  rather  than
	       packets being logged.  I.e. A packet matching a rule with

		      ...  log logamount 100 logdst syslog,ipfw0 ...

	       will log	upto 50	packets.

       tag number
	       When  a packet matches a	rule with the tag keyword, the numeric
	       tag for the given number	in the range 1..65534 will be attached
	       to the packet.  The tag acts as an internal marker (it  is  not
	       sent  out  over	the  wire)  that can be	used to	identify these
	       packets later on.  This can be used, for	 example,  to  provide
	       trust  between  interfaces and to start doing policy-based fil-
	       tering.	A packet can have multiple  tags  at  the  same	 time.
	       Tags are	"sticky", meaning once a tag is	applied	to a packet by
	       a  matching  rule  it  exists until explicit removal.  Tags are
	       kept with the packet everywhere within the kernel, but are lost
	       when the	packet leaves the kernel, for example, on transmitting
	       packet out to the network or  sending  packet  to  a  divert(4)
	       socket.

	       To  check  for previously applied tags, use the tagged rule op-
	       tion.  To delete	previously applied tag,	use the	untag keyword.

	       Note: since tags	are kept with the packet everywhere in kernel-
	       space, they can be set and unset	anywhere in the	kernel network
	       subsystem (using	the mbuf_tags(9) facility), not	only by	 means
	       of  the ipfw(4) tag and untag keywords.	For example, there can
	       be a specialized	netgraph(4) node doing traffic	analyzing  and
	       tagging for later inspecting in firewall.

       untag number
	       When  a	packet	matches	a rule with the	untag keyword, the tag
	       with the	number number is searched among	the tags  attached  to
	       this  packet  and, if found, removed from it.  Other tags bound
	       to packet, if present, are left untouched.

       setmark value | tablearg
	       When a packet matches a rule with the setmark keyword, a	32-bit
	       numeric mark is assigned	to the packet.	The mark is an	exten-
	       sion  to	the tags.  The mark is preserved for a packet within a
	       single ipfw ruleset traversal and is lost when  the  packet  is
	       checked against the active ruleset next time (see "PACKET FLOW"
	       section)	 or  leaves  ipfw  context  (e.g.  accepted, diverted,
	       bridged or routed).  Unlike tags, mark  can  be	matched	 as  a
	       lookup  table key or compared with bitwise mask applied against
	       another value.  Each packet can have only one mark, so  setmark
	       always overwrites the previous mark value.

	       The  initial mark value is 0.  To check the current mark	value,
	       use the mark rule option.  Mark value can be entered as decimal
	       or hexadecimal (if prefixed by 0x), and they are	always printed
	       as hexadecimal.

       altq queue
	       When a packet matches a rule with the altq  keyword,  the  ALTQ
	       identifier  for the given queue (see altq(4)) will be attached.
	       Note that this ALTQ tag is only meaningful  for	packets	 going
	       "out"  of IPFW, and not being rejected or going to divert sock-
	       ets.  Note that if there	is insufficient	memory at the time the
	       packet is processed, it will not	be tagged, so it  is  wise  to
	       make  your  ALTQ	 "default"  queue policy account for this.  If
	       multiple	altq rules match a single packet, only the  first  one
	       adds  the ALTQ classification tag.  In doing so,	traffic	may be
	       shaped by using count altq queue	rules for classification early
	       in the ruleset, then later  applying  the  filtering  decision.
	       For  example,  check-state  and keep-state rules	may come later
	       and provide the actual filtering	decisions in addition  to  the
	       fallback	ALTQ tag.

	       You  must run pfctl(8) to set up	the queues before IPFW will be
	       able to look them up by name, and if the	ALTQ  disciplines  are
	       rearranged,  the	 rules	in containing the queue	identifiers in
	       the kernel will likely have gone	stale and need to be reloaded.
	       Stale queue identifiers will probably result in	misclassifica-
	       tion.

	       All  system  ALTQ  processing  can be turned on or off via ipfw
	       enable  altq   and   ipfw   disable   altq.    The   usage   of
	       net.inet.ip.fw.one_pass	is irrelevant to ALTQ traffic shaping,
	       as the actual rule action is followed always  after  adding  an
	       ALTQ tag.

   RULE	ACTIONS
       A  rule can be associated with one of the following actions, which will
       be executed when	the packet matches the body of the rule.

       allow | accept |	pass | permit
	       Allow packets that match	rule.  The search terminates.

       check-state [:flowname |	:any]
	       Checks the packet against the dynamic ruleset.  If a  match  is
	       found, execute the action associated with the rule which	gener-
	       ated this dynamic rule, otherwise move to the next rule.
	       Check-state  rules  do not have a body.	If no check-state rule
	       is  found,  the	dynamic	 ruleset  is  checked  at  the	 first
	       keep-state  or  limit rule.  The	:flowname is symbolic name as-
	       signed to dynamic rule by keep-state opcode.  The special flow-
	       name :any can be	used to	ignore states flowname when  matching.
	       The  :default  keyword  is  special name	used for compatibility
	       with old	rulesets.

       count   Update counters for all packets that match  rule.   The	search
	       continues with the next rule.

       deny | drop
	       Discard packets that match this rule.  The search terminates.

       divert port
	       Divert  packets	that  match  this rule to the divert(4)	socket
	       bound to	port port.  The	search terminates.

       fwd | forward ipaddr | tablearg[,port]
	       Change the next-hop on matching packets to ipaddr, which	can be
	       an IP address or	a host name.  The next hop can	also  be  sup-
	       plied  by  the last table looked	up for the packet by using the
	       tablearg	keyword	instead	of an explicit	address.   The	search
	       terminates if this rule matches.

	       If  ipaddr  is  a  local	address, then matching packets will be
	       forwarded to port (or the port number in	the packet if  one  is
	       not specified in	the rule) on the local machine.
	       If  ipaddr  is  not  a  local address, then the port number (if
	       specified) is ignored, and the packet will be forwarded to  the
	       remote  address,	 using the route as found in the local routing
	       table for that IP.
	       A fwd rule will not match layer2	 packets  (those  received  on
	       ether_input, ether_output, or bridged).
	       The  fwd	 action	 does not change the contents of the packet at
	       all.  In	particular, the	destination  address  remains  unmodi-
	       fied,  so  packets  forwarded to	another	system will usually be
	       rejected	by that	system unless there is a matching rule on that
	       system to capture them.	For packets forwarded locally, the lo-
	       cal address of the socket will be set to	the original  destina-
	       tion  address  of  the packet.  This makes the netstat(1) entry
	       look rather weird but is	 intended  for	use  with  transparent
	       proxy servers.

       nat nat_nr | global | tablearg
	       Pass packet to a	nat instance (for network address translation,
	       address	redirect,  etc.): see the "NETWORK ADDRESS TRANSLATION
	       (NAT)" Section for further information.

       nat64lsn	name
	       Pass packet to a	stateful NAT64 instance	(for IPv6/IPv4 network
	       address and protocol translation): see the  "IPv6/IPv4  NETWORK
	       ADDRESS	AND PROTOCOL TRANSLATION" Section for further informa-
	       tion.

       nat64stl	name
	       Pass packet to a	stateless NAT64	instance (for  IPv6/IPv4  net-
	       work  address  and  protocol  translation):  see	the "IPv6/IPv4
	       NETWORK ADDRESS AND PROTOCOL TRANSLATION" Section  for  further
	       information.

       nat64clat name
	       Pass packet to a	CLAT NAT64 instance (for client-side IPv6/IPv4
	       network	address	 and protocol translation): see	the "IPv6/IPv4
	       NETWORK ADDRESS AND PROTOCOL TRANSLATION" Section  for  further
	       information.

       nptv6 name
	       Pass  packet to a NPTv6 instance	(for IPv6-to-IPv6 network pre-
	       fix  translation):  see	the   "IPv6-to-IPv6   NETWORK	PREFIX
	       TRANSLATION (NPTv6)" Section for	further	information.

       pipe pipe_nr
	       Pass packet to a	dummynet "pipe"	(for bandwidth limitation, de-
	       lay,  etc.).  See the "TRAFFIC SHAPER (DUMMYNET)	CONFIGURATION"
	       Section for further information.	 The search  terminates;  how-
	       ever,  on  exit	from  the  pipe	 and if	the sysctl(8) variable
	       net.inet.ip.fw.one_pass is not set, the packet is passed	 again
	       to the firewall code starting from the next rule.

       queue queue_nr
	       Pass packet to a	dummynet "queue" (for bandwidth	limitation us-
	       ing WF2Q+).

       reject  (Deprecated).  Synonym for unreach host.

       reset   Discard	packets	 that  match this rule,	and if the packet is a
	       TCP packet, try to send a TCP reset (RST) notice.   The	search
	       terminates.

       reset6  Discard	packets	 that  match this rule,	and if the packet is a
	       TCP packet, try to send a TCP reset (RST) notice.   The	search
	       terminates.

       skipto number | tablearg
	       Skip  all  subsequent  rules  numbered  less  than number.  The
	       search continues	with the first rule numbered number or higher.
	       It is possible to use the tablearg keyword with a skipto	for  a
	       computed	 skipto.   Skipto  may	work either in O(log(N)) or in
	       O(1) depending on amount	of  memory  and/or  sysctl  variables.
	       See the "SYSCTL VARIABLES" section for more details.

       call number | tablearg
	       The  current  rule  number  is  saved in	the internal stack and
	       ruleset processing  continues  with  the	 first	rule  numbered
	       number  or  higher.   If	later a	rule with the return action is
	       encountered, the	processing returns to the first	rule with num-
	       ber of this call	rule plus one or higher	(the same behaviour as
	       with packets returning from divert(4) socket after a divert ac-
	       tion).  This could be used to make somewhat  like  an  assembly
	       language	 "subroutine"  calls  to  rules	with common checks for
	       different interfaces, etc.

	       Rule with any number could be called, not just forward jumps as
	       with skipto.  So, to prevent endless loops in case of mistakes,
	       both call and return actions don't do any jumps and  simply  go
	       to  the	next rule if memory cannot be allocated	or stack over-
	       flowed/underflowed.

	       Internally  stack  for  rule  numbers  is   implemented	 using
	       mbuf_tags(9) facility and currently has size of 16 entries.  As
	       mbuf tags are lost when packet leaves the kernel, divert	should
	       not be used in subroutines to avoid endless loops and other un-
	       desired effects.

       return  Takes  rule number saved	to internal stack by the last call ac-
	       tion and	returns	ruleset	processing to the first	rule with num-
	       ber greater than	number of corresponding	call  rule.   See  de-
	       scription of the	call action for	more details.

	       Note  that return rules usually end a "subroutine" and thus are
	       unconditional, but ipfw command-line utility currently requires
	       every action except check-state to  have	 body.	 While	it  is
	       sometimes  useful  to  return only on some packets, usually you
	       want to print just "return" for readability.  A workaround  for
	       this is to use new syntax and -c	switch:

		     # Add a rule without actual body
		     ipfw add 2999 return via any

		     # List rules without "from	any to any" part
		     ipfw -c list

	       This cosmetic annoyance may be fixed in future releases.

       tee port
	       Send  a	copy  of  packets  matching this rule to the divert(4)
	       socket bound to port port.  The search continues	with the  next
	       rule.

       unreach code [mtu]
	       Discard	packets	 that match this rule, and try to send an ICMP
	       unreachable notice with code code, where	code is	a number  from
	       0  to  255, or one of these aliases: net, host, protocol, port,
	       needfrag,   srcfail,   net-unknown,   host-unknown,   isolated,
	       net-prohib,   host-prohib,   tosnet,   toshost,	filter-prohib,
	       host-precedence or precedence-cutoff.  The  needfrag  code  may
	       have  an	 optional  mtu parameter.  If specified, the MTU value
	       will be put into	generated ICMP packet.	The search terminates.

       unreach6	code
	       Discard packets that match this rule, and try to	send an	ICMPv6
	       unreachable notice with code code, where	code is	a number  from
	       0,  1, 3	or 4, or one of	these aliases: no-route, admin-prohib,
	       address or port.	 The search terminates.

       netgraph	cookie
	       Divert packet into netgraph with	given cookie.  The search ter-
	       minates.	 If packet is later returned from netgraph it  is  ei-
	       ther  accepted  or  continues  with the next rule, depending on
	       net.inet.ip.fw.one_pass sysctl variable.

       ngtee cookie
	       A copy of packet	is diverted  into  netgraph,  original	packet
	       continues with the next rule.  See ng_ipfw(4) for more informa-
	       tion on netgraph	and ngtee actions.

       setfib fibnum | tablearg
	       The  packet  is	tagged	so  as	to use the FIB (routing	table)
	       fibnum in any subsequent	forwarding decisions.  In the  current
	       implementation, this is limited to the values 0 through 15, see
	       setfib(2).   Processing continues at the	next rule.  It is pos-
	       sible to	use the	tablearg keyword with setfib.  If the tablearg
	       value is	not within the compiled	range of  fibs,	 the  packet's
	       fib is set to 0.

       setdscp DSCP | number | tablearg
	       Set specified DiffServ codepoint	for an IPv4/IPv6 packet.  Pro-
	       cessing continues at the	next rule.  Supported values are:

	       cs0  (000000),  cs1  (001000),  cs2 (010000), cs3 (011000), cs4
	       (100000),  cs5  (101000),  cs6  (110000),  cs7  (111000),  af11
	       (001010),  af12	(001100),  af13	 (001110), af21	(010010), af22
	       (010100), af23 (010110),	af31  (011010),	 af32  (011100),  af33
	       (011110),  af41	(100010),  af42	 (100100),  af43  (100110), va
	       (101100), ef (101110), be (000000).  Additionally,  DSCP	 value
	       can be specified	by number (0..63).  It is also possible	to use
	       the  tablearg  keyword  with setdscp.  If the tablearg value is
	       not within the 0..63 range, lower 6 bits	of supplied value  are
	       used.

       tcp-setmss mss
	       Set  the	Maximum	Segment	Size (MSS) in the TCP segment to value
	       mss.  The kernel	module ipfw_pmod should	be  loaded  or	kernel
	       should have options IPFIREWALL_PMOD to be able use this action.
	       This  command does not change a packet if original MSS value is
	       lower than specified value.  Both TCP over IPv4 and  over  IPv6
	       are  supported.	 Regardless  of	matched	a packet or not	by the
	       tcp-setmss rule,	the search continues with the next rule.

       reass   Queue and reassemble IPv4 fragments.   If  the  packet  is  not
	       fragmented,  counters are updated and processing	continues with
	       the next	rule.  If the packet is	the last logical fragment, the
	       packet is reassembled and, if net.inet.ip.fw.one_pass is	set to
	       0, processing continues with the	 next  rule.   Otherwise,  the
	       packet  is  allowed  to pass and	the search terminates.	If the
	       packet is a fragment in the middle of a logical group of	 frag-
	       ments, it is consumed and processing stops immediately.

	       Fragment	 handling  can be tuned	via net.inet.ip.maxfragpackets
	       and net.inet.ip.maxfragsperpacket  which	 limit,	 respectively,
	       the  maximum number of processable fragments (default: 800) and
	       the maximum number of fragments per packet (default: 16).

	       NOTA BENE: since	fragments do not contain  port	numbers,  they
	       should  be  avoided with	the reass rule.	 Alternatively,	direc-
	       tion-based (like	in / out ) and source-based (like via )	 match
	       patterns	can be used to select fragments.

	       Usually a simple	rule like:

		     # reassemble incoming fragments
		     ipfw add reass all	from any to any	in

	       is all you need at the beginning	of your	ruleset.

       abort   Discard	packets	 that match this rule, and if the packet is an
	       SCTP packet, try	to send	an SCTP	 packet	 containing  an	 ABORT
	       chunk.  The search terminates.

       abort6  Discard	packets	 that match this rule, and if the packet is an
	       SCTP packet, try	to send	an SCTP	 packet	 containing  an	 ABORT
	       chunk.  The search terminates.

   RULE	BODY
       The  body  of  a	 rule contains zero or more patterns (such as specific
       source and destination addresses	or ports, protocol  options,  incoming
       or  outgoing  interfaces, etc.)	that the packet	must match in order to
       be recognised.  In general, the patterns	are  connected	by  (implicit)
       and  operators  -- i.e.,	all must match in order	for the	rule to	match.
       Individual patterns can be prefixed by the not operator to reverse  the
       result of the match, as in

	     ipfw add 100 allow	ip from	not 1.2.3.4 to any

       Additionally,  sets  of	alternative  match patterns (or-blocks)	can be
       constructed by putting the patterns in lists enclosed between parenthe-
       ses ( ) or braces { }, and using	the or operator	as follows:

	     ipfw add 100 allow	ip from	{ x or not y or	z } to any

       Only one	level of parentheses is	allowed.  Beware that most shells have
       special meanings	for parentheses	or braces, so it is advisable to put a
       backslash \ in front of them to prevent such interpretations.

       The body	of a rule must in general include a source and destination ad-
       dress specifier.	 The keyword any can be	 used  in  various  places  to
       specify that the	content	of a required field is irrelevant.

       The rule	body has the following format:

	     [proto from src to	dst] [options]

       The  first  part	 (proto	from src to dst) is for	backward compatibility
       with earlier versions of	FreeBSD.  In modern FreeBSD any	match  pattern
       (including MAC headers, IP protocols, addresses and ports) can be spec-
       ified in	the options section.

       Rule fields have	the following meaning:

       proto: protocol | { protocol or ... }

       protocol: [not] protocol-name | protocol-number
	       An IP protocol specified	by number or name (for a complete list
	       see /etc/protocols), or one of the following keywords:

	       ip4 | ipv4
		       Matches IPv4 packets.

	       ip6 | ipv6
		       Matches IPv6 packets.

	       ip | all
		       Matches any packet.

	       The  ipv6  in  proto  option will be treated as inner protocol.
	       And, the	ipv4 is	not available in proto option.

	       The { protocol or ... } format (an or-block)  is	 provided  for
	       convenience only	but its	use is deprecated.

       src and dst: {addr | { addr or ... }} [[not] ports]
	       An  address (or a list, see below) optionally followed by ports
	       specifiers.

	       The second format (or-block with	multiple  addresses)  is  pro-
	       vided for convenience only and its use is discouraged.

       addr: [not] {any	| me | me6 | table-ref | addr-list | addr-set}

	       any     Matches any IP address.

	       me      Matches	any  IP	 address configured on an interface in
		       the system.

	       me6     Matches any IPv6	address	configured on an interface  in
		       the  system.  The address list is evaluated at the time
		       the packet is analysed.

       table-ref:
	       A table lookup can be specified in one of the following ways:

	       table(name)
		       Matches any IPv4	or IPv6	address	for which an entry ex-
		       ists in the lookup table	number.

	       table(name,value)
		       Matches any IPv4	or IPv6	address	for which an entry ex-
		       ists in the lookup table	 number	 and  32-bit  unsigned
		       value specified matchess	entry value.

	       table(name,value-type=value)
		       Matches any IPv4	or IPv6	address	for which an entry ex-
		       ists  in	 the  lookup  table number and 32-bit unsigned
		       value specified matches corresponding value-type	 field
		       for the record found.

	       See  the	 "LOOKUP TABLES" section below for more	information on
	       lookup tables.

       addr-list: ip-addr[,addr-list]

       ip-addr:
	       A host or subnet	address	specified  in  one  of	the  following
	       ways:

	       numeric-ip | hostname
		       Matches a single	IPv4 address, specified	as dotted-quad
		       or  a hostname.	Hostnames are resolved at the time the
		       rule is added to	the firewall list.

	       addr/masklen
		       Matches all addresses with base addr (specified	as  an
		       IP  address,  a network number, or a hostname) and mask
		       width of	masklen	bits.  As an  example,	1.2.3.4/25  or
		       1.2.3.0/25  will	 match	all IP numbers from 1.2.3.0 to
		       1.2.3.127 .

	       addr:mask
		       Matches all addresses with base addr (specified	as  an
		       IP  address,  a	network	number,	or a hostname) and the
		       mask of mask, specified as a dotted quad.  As an	 exam-
		       ple,  1.2.3.4:255.0.255.0  or  1.0.3.0:255.0.255.0 will
		       match 1.*.3.*.  This form is advised only for  non-con-
		       tiguous	 masks.	   It  is  better  to  resort  to  the
		       addr/masklen format for contiguous masks, which is more
		       compact and less	error-prone.

       addr-set: addr[/masklen]{list}

       list: {num | num-num}[,list]
	       Matches all addresses with base address addr (specified	as  an
	       IP  address,  a	network	 number, or a hostname)	and whose last
	       byte is in the list between braces { } .	 Note that there  must
	       be  no  spaces  between braces and numbers (spaces after	commas
	       are allowed).  Elements of the list can be specified as	single
	       entries or ranges.  The masklen field is	used to	limit the size
	       of  the set of addresses, and can have any value	between	24 and
	       32.  If not specified, it will be assumed as 24.
	       This format is particularly useful  to  handle  sparse  address
	       sets within a single rule.  Because the matching	occurs using a
	       bitmask,	 it  takes  constant time and dramatically reduces the
	       complexity of rulesets.
	       As an example, an address specified as 1.2.3.4/24{128,35-55,89}
	       or 1.2.3.0/24{128,35-55,89} will	match  the  following  IP  ad-
	       dresses:
	       1.2.3.128, 1.2.3.35 to 1.2.3.55,	1.2.3.89 .

       addr6-list: ip6-addr[,addr6-list]

       ip6-addr:
	       A host or subnet	specified one of the following ways:

	       numeric-ip | hostname
		       Matches	 a   single   IPv6   address   as  allowed  by
		       inet_pton(3) or a hostname.  Hostnames are resolved  at
		       the time	the rule is added to the firewall list.

	       addr/masklen
		       Matches all IPv6	addresses with base addr (specified as
		       allowed	by  inet_pton(3) or a hostname)	and mask width
		       of masklen bits.

	       addr/mask
		       Matches all IPv6	addresses with base addr (specified as
		       allowed by inet_pton(3) or a hostname) and the mask  of
		       mask,  specified	as allowed by inet_pton(3).  As	an ex-
		       ample,	fe::640:0:0/ffff::ffff:ffff:0:0	  will	 match
		       fe:*:*:*:0:640:*:*.  This form is advised only for non-
		       contiguous  masks.   It	is  better  to	resort	to the
		       addr/masklen format for contiguous masks, which is more
		       compact and less	error-prone.

	       No support for sets of IPv6 addresses is	provided because  IPv6
	       addresses are typically random past the initial prefix.

       ports: {port | port-port}[,ports]
	       For protocols which support port	numbers	(such as SCTP, TCP and
	       UDP),  optional	ports may be specified as one or more ports or
	       port ranges, separated by commas	but no spaces, and an optional
	       not operator.  The `-' notation specifies a range of ports (in-
	       cluding boundaries).

	       Service names (from /etc/services) may be used instead  of  nu-
	       meric  port  values.  The length	of the port list is limited to
	       30 ports	or ranges, though one can specify larger ranges	by us-
	       ing an or-block in the options section of the rule.

	       A backslash (`\') can be	used to	escape the dash	(`-')  charac-
	       ter  in	a  service  name  (from	a shell, the backslash must be
	       typed twice to avoid the	shell itself interpreting it as	an es-
	       cape character).

		     ipfw add count tcp	from any ftp\\-data-ftp	to any

	       Fragmented packets which	have a non-zero	offset (i.e., not  the
	       first  fragment)	 will never match a rule which has one or more
	       port specifications.  See the frag option for details on	match-
	       ing fragmented packets.

   RULE	OPTIONS	(MATCH PATTERNS)
       Additional match	patterns can be	used within rules.  Zero  or  more  of
       these  so-called	 options can be	present	in a rule, optionally prefixed
       by the not operand, and possibly	grouped	into or-blocks.

       The following match patterns can	be used	(listed	 in  alphabetical  or-
       der):

       // this is a comment.
	       Inserts	the  specified	text as	a comment in the rule.	Every-
	       thing following // is considered	as a comment and stored	in the
	       rule.  You can have comment-only	rules,	which  are  listed  as
	       having a	count action followed by the comment.

       bridged
	       Alias for layer2.

       defer-immediate-action |	defer-action
	       A  rule	with this option will not perform normal action	upon a
	       match.  This option is intended to be used with record-state or
	       keep-state as the dynamic rule, created but ignored  on	match,
	       will  work  as  intended.   Rules  with	both  record-state and
	       defer-immediate-action create a dynamic rule and	continue  with
	       the  next  rule	without	actually performing the	action part of
	       this rule.  When	the rule is later activated via	the state  ta-
	       ble, the	action is performed as usual.

       diverted
	       Matches only packets generated by a divert socket.

       diverted-loopback
	       Matches	only packets coming from a divert socket back into the
	       IP stack	input for delivery.

       diverted-output
	       Matches only packets going from a divert	socket back outward to
	       the IP stack output for delivery.

       dst-ip ip-address
	       Matches IPv4 packets whose destination IP is  one  of  the  ad-
	       dress(es) specified as argument.

       {dst-ip6	| dst-ipv6} ip6-address
	       Matches	IPv6  packets  whose  destination IP is	one of the ad-
	       dress(es) specified as argument.

       dst-port	ports
	       Matches IP packets whose	destination port is one	of the port(s)
	       specified as argument.

       established
	       Matches TCP packets that	have the RST or	ACK bits set.

       ext6hdr header
	       Matches IPv6 packets containing the extended  header  given  by
	       header.	Supported headers are:

	       Fragment,  (frag),  Hop-to-hop  options	(hopopt),  any type of
	       Routing Header (route), Source routing Routing  Header  Type  0
	       (rthdr0),  Mobile IPv6 Routing Header Type 2 (rthdr2), Destina-
	       tion options (dstopt), IPSec authentication headers  (ah),  and
	       IPsec encapsulating security payload headers (esp).

       fib fibnum
	       Matches	a  packet  that	 has  been tagged to use the given FIB
	       (routing	table) number.

       flow table-ref
	       Search  for  the	 flow  entry  in  lookup  table	 specified  by
	       table-ref.   If	not  found,  the  match	fails.	Otherwise, the
	       match succeeds and tablearg is set to the value extracted  from
	       the table.

	       This  option can	be useful to quickly dispatch traffic based on
	       certain packet fields.  See the "LOOKUP TABLES"	section	 below
	       for more	information on lookup tables.

       flow-id labels
	       Matches IPv6 packets containing any of the flow labels given in
	       labels.	 labels	 is a comma separated list of numeric flow la-
	       bels.

       dst-mac table-ref
	       Search for the destination MAC address entry  in	 lookup	 table
	       specified by table-ref.	If not found, the match	fails.	Other-
	       wise,  the  match succeeds and tablearg is set to the value ex-
	       tracted from the	table.

       src-mac table-ref
	       Search for the source MAC address entry in lookup table	speci-
	       fied  by	table-ref.  If not found, the match fails.  Otherwise,
	       the match succeeds and tablearg is set to the  value  extracted
	       from the	table.

       frag spec
	       Matches IPv4 packets whose ip_off field contains	the comma sep-
	       arated  list  of	 IPv4 fragmentation options specified in spec.
	       The recognized options  are:  df	 (don't	 fragment),  mf	 (more
	       fragments),   rf	  (reserved  fragment  bit)  offset  (non-zero
	       fragment	offset).  The absence of a particular options  may  be
	       denoted with a `!'.

	       Empty list of options defaults to matching on non-zero fragment
	       offset.	Such rule would	match all not the first	fragment data-
	       grams,  both  IPv4  and IPv6.  This is a	backward compatibility
	       with older rulesets.

       gid group
	       Matches all TCP or UDP packets sent by or received for a	group.
	       A group may be specified	by name	or number.

       jail jail
	       Matches all TCP or UDP packets sent by or received for the jail
	       whose ID	or name	is jail.

       icmptypes types
	       Matches ICMP packets whose ICMP type is in the list types.  The
	       list may	be specified as	any combination	 of  individual	 types
	       (numeric)  separated  by	 commas.  Ranges are not allowed.  The
	       supported ICMP types are:

	       echo reply (0), destination unreachable (3), source quench (4),
	       redirect	(5),  echo  request  (8),  router  advertisement  (9),
	       router solicitation (10), time-to-live exceeded (11), IP	header
	       bad  (12), timestamp request (13), timestamp reply (14),	infor-
	       mation request (15), information	reply (16), address  mask  re-
	       quest (17) and address mask reply (18).

       icmp6types types
	       Matches ICMP6 packets whose ICMP6 type is in the	list of	types.
	       The  list  may  be  specified  as any combination of individual
	       types (numeric) separated by commas.  Ranges are	not allowed.

       in | out
	       Matches incoming	or outgoing packets, respectively.  in and out
	       are mutually exclusive (in fact,	out is implemented as not in).

       ipid id-list
	       Matches IPv4 packets whose ip_id	field has  value  included  in
	       id-list,	 which is either a single value	or a list of values or
	       ranges specified	in the same way	as ports.

       iplen len-list
	       Matches IP packets whose	total  length,	including  header  and
	       data, is	in the set len-list, which is either a single value or
	       a list of values	or ranges specified in the same	way as ports.

       ipoptions spec
	       Matches	packets	whose IPv4 header contains the comma separated
	       list of options specified in spec.  The	supported  IP  options
	       are:

	       ssrr  (strict  source  route),  lsrr  (loose  source route), rr
	       (record packet route) and ts (timestamp).   The	absence	 of  a
	       particular option may be	denoted	with a `!'.

       ipprecedence precedence
	       Matches	IPv4  packets  whose  precedence  field	 is  equal  to
	       precedence.

       ipsec   Matches packets that have IPSEC history	associated  with  them
	       (i.e.,  the  packet comes encapsulated in IPSEC,	the kernel has
	       IPSEC support, and can correctly	decapsulate it).

	       Note that specifying ipsec is different from  specifying	 proto
	       ipsec  as the latter will only look at the specific IP protocol
	       field, irrespective of IPSEC kernel support and the validity of
	       the IPSEC data.

	       Further note that this flag  is	silently  ignored  in  kernels
	       without IPSEC support.  It does not affect rule processing when
	       given and the rules are handled as if with no ipsec flag.

       iptos spec
	       Matches	IPv4  packets whose tos	field contains the comma sepa-
	       rated list of service types specified in	spec.	The  supported
	       IP types	of service are:

	       lowdelay	  (IPTOS_LOWDELAY),   throughput   (IPTOS_THROUGHPUT),
	       reliability   (IPTOS_RELIABILITY),   mincost   (IPTOS_MINCOST),
	       congestion  (IPTOS_ECN_CE).   The  absence of a particular type
	       may be denoted with a `!'.

       dscp spec[,spec]
	       Matches IPv4/IPv6 packets whose DS field	value is contained  in
	       spec mask.  Multiple values can be specified via	the comma sep-
	       arated  list.  Value can	be one of keywords used	in setdscp ac-
	       tion or exact number.

       ipttl ttl-list
	       Matches	IPv4  packets  whose  time  to	live  is  included  in
	       ttl-list, which is either a single value	or a list of values or
	       ranges specified	in the same way	as ports.

       ipversion ver
	       Matches IP packets whose	IP version field is ver.

       keep-state [:flowname]
	       Upon  a	match,	the firewall will create a dynamic rule, whose
	       default behaviour is to	match  bidirectional  traffic  between
	       source  and  destination	 IP/port using the same	protocol.  The
	       rule has	a limited lifetime (controlled by a set	 of  sysctl(8)
	       variables), and the lifetime is refreshed every time a matching
	       packet is found.	 The :flowname is used to assign additional to
	       addresses,  ports  and  protocol	parameter to dynamic rule.  It
	       can be used for more accurate  matching	by  check-state	 rule.
	       The  :default  keyword  is  special name	used for compatibility
	       with old	rulesets.

       layer2  Matches only layer2 packets, i.e., those	passed	to  ipfw  from
	       ether_demux() and ether_output_frame().

       limit {src-addr | src-port | dst-addr | dst-port} N [:flowname]
	       The firewall will only allow N connections with the same	set of
	       parameters as specified in the rule.  One or more of source and
	       destination addresses and ports can be specified.

       lookup  {dst-ip	|  dst-ip4  |  dst-ip6 | dst-port | dst-mac | src-ip |
	       src-ip4 | src-ip6 | src-port | src-mac |	uid | jail  |  dscp  |
	       mark | rulenum}[:bitmask] name
	       Search  an  entry  in  lookup table name	that matches the field
	       specified as argument.  If not found, the match fails.	Other-
	       wise,  the  match succeeds and tablearg is set to the value ex-
	       tracted from the	table.

	       If an optional bitmask is specified, value of the field is  al-
	       tered  by bitwize AND with bitmask and resulting	value is being
	       searched	instead	of the original	one.  The bitmask is  accepted
	       in the following	formats:

	       1.      In a dotted-quad	form, e.g. 127.88.34.0.	 This form can
		       be  used	 for  IPv4  lookups as well as for all numeric
		       lookup types.

	       2.      As a 32-bit number, e.g.	0xf00baa1 or 255.   This  form
		       can be used for IPv4 lookups as well as for all numeric
		       lookup types.

	       3.      As  an IPv6 address when	specified alongwith dst-ip6 or
		       src-ip6 field.  If used,	the rule will match IPv6 pack-
		       ets	     only.	      Example:		  src-
		       ip6:afff:ff00:ffff:ffff:0:0:0:0f0f.

	       4.      As  a  Ethernet	mac  address  when specified alongwith
		       dst-mac or src-mac field. E.g. 00:11:22:33:44:55.

	       The bitmask can not be specified	for dst-ip or src-ip as	 these
	       field specifiers	lookup both IPv4 and IPv6 addresses.

	       This  option can	be useful to quickly dispatch traffic based on
	       certain packet fields.  The bitmask allows to  implement	 wild-
	       card  lookups by	inserting into table masked prefix and appying
	       bitmask upon each lookup.

	       See the "LOOKUP TABLES" section below for more  information  on
	       lookup tables.

       { MAC | mac } dst-mac src-mac
	       Match packets with a given dst-mac and src-mac addresses, spec-
	       ified  as  the  any  keyword (matching any MAC address),	or six
	       groups of hex digits separated by colons, and  optionally  fol-
	       lowed  by a mask	indicating the significant bits.  The mask may
	       be specified using either of the	following methods:

	       1.      A slash (/) followed by the number of significant bits.
		       For example, an address with 33 significant bits	 could
		       be specified as:

			     MAC 10:20:30:40:50:60/33 any

	       2.      An ampersand (&)	followed by a bitmask specified	as six
		       groups of hex digits separated by colons.  For example,
		       an  address  in	which the last 16 bits are significant
		       could be	specified as:

			     MAC 10:20:30:40:50:60&00:00:00:00:ff:ff any

		       Note that the ampersand character has a special meaning
		       in many shells and should generally be escaped.
	       Note that the order of MAC addresses (destination first,	source
	       second) is the same as on the wire, but the opposite of the one
	       used for	IP addresses.

       mac-type	mac-type
	       Matches packets whose Ethernet Type field corresponds to	one of
	       those specified as argument.  mac-type is specified in the same
	       way as port numbers (i.e., one or more  comma-separated	single
	       values or ranges).  You can use symbolic	names for known	values
	       such  as	vlan, ipv4, ipv6.  Values can be entered as decimal or
	       hexadecimal (if prefixed	by 0x),	and they are always printed as
	       hexadecimal (unless the -N option is used, in which  case  sym-
	       bolic resolution	will be	attempted).

       proto protocol
	       Matches packets with the	corresponding IP protocol.

       record-state
	       Upon  a	match,	the  firewall will create a dynamic rule as if
	       keep-state was specified.  However, this	option	doesn't	 imply
	       an implicit check-state in contrast to keep-state.

       recv | xmit | via {ifX |	ifmask | table-ref | ipno | any}
	       Matches packets received, transmitted or	going through, respec-
	       tively,	the interface specified	by exact name (ifX), by	device
	       mask (ifmask), by IP address, or	through	some interface.

	       Interface name may be matched against  ifmask  with  fnmatch(3)
	       according to the	rules used by the shell	(f.e. tun*).  See also
	       the "EXAMPLES" section.

	       A  lookup table specified by table-ref may be used to match in-
	       terface by its kernel ifindex.  See the "LOOKUP TABLES" section
	       below for more information on lookup tables.

	       The via keyword causes the interface to always be checked.   If
	       recv  or	 xmit is used instead of via, then only	the receive or
	       transmit	interface (respectively) is  checked.	By  specifying
	       both, it	is possible to match packets based on both receive and
	       transmit	interface, e.g.:

		     ipfw add deny ip from any to any out recv ed0 xmit	ed1

	       The recv	interface can be tested	on either incoming or outgoing
	       packets,	 while the xmit	interface can only be tested on	outgo-
	       ing packets.  So	out is required	(and in	is  invalid)  whenever
	       xmit is used.

	       A  packet might not have	a receive or transmit interface: pack-
	       ets originating from the	local host have	no receive  interface,
	       while  packets destined for the local host have no transmit in-
	       terface.

       set-limit {src-addr | src-port |	dst-addr | dst-port} N
	       Works like limit	but does not have an implicit check-state  at-
	       tached to it.

       setup   Matches	TCP  packets that have the SYN bit set but no ACK bit.
	       This is the short form of "tcpflags syn,!ack".

       sockarg
	       Matches packets that are	associated to a	local socket  and  for
	       which  the  SO_USER_COOKIE socket option	has been set to	a non-
	       zero value.  As a side effect, the value	of the option is  made
	       available  as  tablearg	value,	which  in  turn	can be used as
	       skipto or pipe number.

       src-ip ip-address
	       Matches IPv4 packets whose source IP is one of the  address(es)
	       specified as an argument.

       src-ip6 ip6-address
	       Matches	IPv6 packets whose source IP is	one of the address(es)
	       specified as an argument.

       src-port	ports
	       Matches IP packets whose	source port  is	 one  of  the  port(s)
	       specified as argument.

       tagged tag-list
	       Matches	packets	 whose tags are	included in tag-list, which is
	       either a	single value or	a list of values or  ranges  specified
	       in  the	same  way as ports.  Tags can be applied to the	packet
	       using tag rule action parameter (see it's description  for  de-
	       tails on	tags).

       mark value[:bitmask] | tablearg[:bitmask]
	       Matches	packets	 whose	mark  is  equal	to value with optional
	       bitmask applied to it.  tablearg	can also be used instead of an
	       explicit	value to match a value	supplied  by  the  last	 table
	       lookup.

	       Both value and bitmask can be entered as	decimal	or hexadecimal
	       (if  prefixed  by 0x), and they are always printed as hexadeci-
	       mal.

       tcpack ack
	       TCP packets only.  Match	if the TCP header acknowledgment  num-
	       ber field is set	to ack.

       tcpdatalen tcpdatalen-list
	       Matches	 TCP   packets	 whose	 length	  of   TCP   data   is
	       tcpdatalen-list,	which is either	a single value or  a  list  of
	       values or ranges	specified in the same way as ports.

       tcpflags	spec
	       TCP  packets  only.  Match if the TCP header contains the comma
	       separated list of flags specified in spec.  The	supported  TCP
	       flags are:

	       fin,  syn,  rst,	psh, ack and urg.  The absence of a particular
	       flag may	be denoted with	 a  `!'.   A  rule  which  contains  a
	       tcpflags	 specification	can  never  match  a fragmented	packet
	       which has a non-zero offset.  See the frag option  for  details
	       on matching fragmented packets.

       tcpmss tcpmss-list
	       Matches	TCP  packets whose MSS (maximum	segment	size) value is
	       set to tcpmss-list, which is either a single value or a list of
	       values or ranges	specified in the same way as ports.

       tcpseq seq
	       TCP packets only.  Match	if  the	 TCP  header  sequence	number
	       field is	set to seq.

       tcpwin tcpwin-list
	       Matches	TCP  packets  whose   header  window  field  is	set to
	       tcpwin-list, which is either a single value or a	list of	values
	       or ranges specified in the same way as ports.

       tcpoptions spec
	       TCP packets only.  Match	if the TCP header contains  the	 comma
	       separated list of options specified in spec.  The supported TCP
	       options are:

	       mss  (maximum segment size), window (tcp	window advertisement),
	       sack (selective ack), ts	(rfc1323 timestamp)  and  cc  (rfc1644
	       t/tcp  connection  count).   The	absence	of a particular	option
	       may be denoted with a `!'.

       uid user
	       Match all TCP or	UDP packets sent by or received	for a user.  A
	       user may	be matched by name or identification number.

       verrevpath
	       For incoming packets, a routing table lookup  is	 done  on  the
	       packet's	 source	address.  If the interface on which the	packet
	       entered the system  matches  the	 outgoing  interface  for  the
	       route,  the packet matches.  If the interfaces do not match up,
	       the packet does not match.  All	outgoing  packets  or  packets
	       with no incoming	interface match.

	       The name	and functionality of the option	is intentionally simi-
	       lar to the Cisco	IOS command:

		     ip	verify unicast reverse-path

	       This  option  can be used to make anti-spoofing rules to	reject
	       all packets with	source addresses not from this interface.  See
	       also the	option antispoof.

       versrcreach
	       For incoming packets, a routing table lookup  is	 done  on  the
	       packet's	 source	address.  If a route to	the source address ex-
	       ists, but not the default route or  a  blackhole/reject	route,
	       the packet matches.  Otherwise, the packet does not match.  All
	       outgoing	packets	match.

	       The name	and functionality of the option	is intentionally simi-
	       lar to the Cisco	IOS command:

		     ip	verify unicast source reachable-via any

	       This  option  can be used to make anti-spoofing rules to	reject
	       all packets whose source	address	is unreachable.

       antispoof
	       For incoming packets, the packet's source address is checked if
	       it belongs to a directly	connected network.  If the network  is
	       directly	connected, then	the interface the packet came on in is
	       compared	 to  the  interface the	network	is connected to.  When
	       incoming	interface and directly connected interface are not the
	       same, the packet	does not match.	 Otherwise,  the  packet  does
	       match.  All outgoing packets match.

	       This  option  can be used to make anti-spoofing rules to	reject
	       all packets that	pretend	to be from a directly  connected  net-
	       work but	do not come in through that interface.	This option is
	       similar	to  but	more restricted	than verrevpath	because	it en-
	       gages only on packets with source addresses  of	directly  con-
	       nected networks instead of all source addresses.

LOOKUP TABLES
       Lookup  tables  are  useful to handle large sparse sets of addresses or
       other search keys (e.g.,	ports, jail IDs,  interface  names).   In  the
       rest of this section we will use	the term ``key''.  Table name needs to
       match the following spec: table-name.  Tables with the same name	can be
       created	in different sets.  However, rule links	to the tables in set 0
       by    default.	  This	  behavior    can     be     controlled	    by
       net.inet.ip.fw.tables_sets  variable.   See the "SETS OF	RULES" section
       for more	information.  There may	be up to 65535	different  lookup  ta-
       bles.

       The following table types are supported:

       table-type: addr	| iface	| number | flow	| mac

       table-key: addr[/masklen] | iface-name |	number | flow-spec

       flow-spec: flow-field[,flow-spec]

       flow-field: src-ip | proto | src-port | dst-ip |	dst-port

       addr    Matches	IPv4 or	IPv6 address.  Each entry is represented by an
	       addr[/masklen] and will match  all  addresses  with  base  addr
	       (specified  as  an  IPv4/IPv6  address, or a hostname) and mask
	       width of	masklen	bits.  If masklen is  not  specified,  it  de-
	       faults  to 32 for IPv4 and 128 for IPv6.	 When looking up an IP
	       address in a table, the most specific entry will	match.

       iface   Matches interface names.	 Each entry is represented  by	string
	       treated as interface name.  Wildcards are not supported.

       number  Matches	protocol  ports, uids/gids or jail IDs.	 Each entry is
	       represented by 32-bit unsigned integer.	Ranges	are  not  sup-
	       ported.

       flow    Matches	packet	fields	specified by flow type suboptions with
	       table entries.

       mac     Matches	MAC  address.	Each  entry  is	 represented   by   an
	       addr[/masklen]  and will	match all addresses with base addr and
	       mask width of masklen bits.  If masklen is  not	specified,  it
	       defaults	to 48.	When looking up	an MAC address in a table, the
	       most specific entry will	match.

       Tables require explicit creation	via create before use.

       The following creation options are supported:

       create-options: create-option | create-options

       create-option: type table-type |	valtype	value-mask | algo algo-desc |
	       limit number | locked | missing | or-flush

       type    Table key type.

       valtype
	       Table value mask.

       algo    Table algorithm to use (see below).

       limit   Maximum number of items that may	be inserted into table.

       locked  Restrict	any table modifications.

       missing
	       Do  not	fail  if table already exists and has exactly same op-
	       tions as	new one.

       or-flush
	       Flush existing table with same name instead of returning	error.
	       Implies missing so existing table must be compatible  with  new
	       one.

       Some  of	 these	options	may be modified	later via modify keyword.  The
       following options can be	changed:

       modify-options: modify-option | modify-options

       modify-option: limit number

       limit   Alter maximum number of items that may be inserted into table.

       Additionally, table can be locked or unlocked using lock	or unlock com-
       mands.

       Tables of the same type can be swapped with each	other using swap  name
       command.	  Swap	may  fail  if  tables limits are set and data exchange
       would result in limits hit.  Operation is performed atomically.

       One or more entries can be added	to a table at once using add  command.
       Addition	 of  all items are performed atomically.  By default, error in
       addition	of one entry does not influence	 addition  of  other  entries.
       However,	 non-zero error	code is	returned in that case.	Special	atomic
       keyword may be specified	before add to  indicate	 all-or-none  add  re-
       quest.

       One  or	more  entries can be removed from a table at once using	delete
       command.	 By default, error in removal of one entry does	not  influence
       removing	of other entries.  However, non-zero error code	is returned in
       that case.

       It  may	be  possible  to  check	what entry will	be found on particular
       table-key using lookup table-key	command.  This	functionality  is  op-
       tional and may be unsupported in	some algorithms.

       The following operations	can be performed on one	or all tables:

       list    List all	entries.

       flush   Removes all entries.

       info    Shows generic table information.

       detail  Shows generic table information and algo-specific data.

       The following lookup algorithms are supported:

       algo-desc: algo-name | algo-name	algo-data

       algo-name:  addr:  radix	 | addr: hash |	iface: array | number: array |
	       flow: hash | mac: radix

       addr: radix
	       Separate	Radix trees for	IPv4 and IPv6, the  same  way  as  the
	       routing table (see route(4)).  Default choice for addr type.

       addr:hash
	       Separate	 auto-growing  hashes  for IPv4	and IPv6.  Accepts en-
	       tries  with  the	 same  mask  length  specified	initially  via
	       addr:hash masks=/v4,/v6 algorithm creation options.  Assume /32
	       and /128	masks by default.  Search removes host bits (according
	       to  mask) from supplied address and checks resulting key	in ap-
	       propriate hash.	Mostly optimized for /64 and byte-ranged  IPv6
	       masks.

       iface:array
	       Array storing sorted indexes for	entries	which are presented in
	       the system.  Optimized for very fast lookup.

       number:array
	       Array storing sorted u32	numbers.

       flow:hash
	       Auto-growing hash storing flow entries.	Search calculates hash
	       on  required packet fields and searches for matching entries in
	       selected	bucket.

       mac: radix
	       Radix tree for MAC address

       The tablearg feature provides the ability to use	a value, looked	up  in
       the  table, as the argument for a rule action, action parameter or rule
       option.	This can significantly reduce number of	rules in some configu-
       rations.	 If two	tables are used	in a rule, the result  of  the	second
       (destination) is	used.

       Each  record may	hold one or more values	according to value-mask.  This
       mask is set on table creation via valtype option.  The following	 value
       types are supported:

       value-mask: value-type[,value-mask]

       value-type: skipto | pipe | fib | nat | dscp | tag | divert |
	       netgraph	| limit	| ipv4 | ipv6 |	mark

       skipto  rule number to jump to.

       pipe    Pipe number to use.

       fib     fib number to match/set.

       nat     nat number to jump to.

       dscp    dscp value to match/set.

       tag     tag number to match/set.

       divert  port number to divert traffic to.

       netgraph
	       hook number to move packet to.

       limit   maximum number of connections.

       ipv4    IPv4 nexthop to fwd packets to.

       ipv6    IPv6 nexthop to fwd packets to.

       mark    mark value to match/set.

       The  tablearg  argument	can  be	 used with the following actions: nat,
       pipe,  queue,  divert,  tee,  netgraph,	ngtee,	fwd,  skipto,  setfib,
       setmark,	 action	 parameters:  tag, untag, rule options:	limit, tagged,
       mark.

       When used with the skipto action, the user should  be  aware  that  the
       code  will  walk	 the ruleset up	to a rule equal	to, or past, the given
       number.

       See the "EXAMPLES" Section for example usage of tables and the tablearg
       keyword.

SETS OF	RULES
       Each rule or table belongs to one of 32 different sets ,	numbered 0  to
       31.  Set	31 is reserved for the default rule.

       By  default, rules or tables are	put in set 0, unless you use the set N
       attribute when adding a new rule	or table.  Sets	 can  be  individually
       and  atomically	enabled	or disabled, so	this mechanism permits an easy
       way to store multiple configurations of the firewall and	 quickly  (and
       atomically) switch between them.

       By  default, tables from	set 0 are referenced when adding rule with ta-
       ble opcodes regardless of rule set.  This behavior can  be  changed  by
       setting net.inet.ip.fw.tables_sets variable to 1.  Rule's set will then
       be used for table references.

       The command to enable/disable sets is

	     ipfw set [disable number ...] [enable number ...]

       where  multiple	enable	or disable sections can	be specified.  Command
       execution is atomic on all the sets specified in	the command.   By  de-
       fault, all sets are enabled.

       When you	disable	a set, its rules behave	as if they do not exist	in the
       firewall	configuration, with only one exception:

	     dynamic rules created from	a rule before it had been disabled
	     will still	be active until	they expire.  In order to delete dy-
	     namic rules you have to explicitly	delete the parent rule which
	     generated them.

       The set number of rules can be changed with the command

	     ipfw set move {rule rule-number | old-set}	to new-set

       Also, you can atomically	swap two rulesets with the command

	     ipfw set swap first-set second-set

       See the "EXAMPLES" Section on some possible uses	of sets	of rules.

STATEFUL FIREWALL
       Stateful	 operation  is	a  way	for the	firewall to dynamically	create
       rules for specific flows	when packets that match	a  given  pattern  are
       detected.    Support   for   stateful   operation   comes  through  the
       check-state, keep-state,	record-state, limit and	set-limit  options  of
       rules.

       Dynamic	 rules	are  created  when  a  packet  matches	a  keep-state,
       record-state, limit or  set-limit  rule,	 causing  the  creation	 of  a
       dynamic	rule  which  will  match  all  and  only  packets with a given
       protocol	between	a src-ip/src-port dst-ip/dst-port  pair	 of  addresses
       (src  and dst are used here only	to denote the initial match addresses,
       but they	are  completely	 equivalent  afterwards).   Rules  created  by
       keep-state  option  also	 have a	:flowname taken	from it.  This name is
       used in matching	together with addresses, ports and protocol.   Dynamic
       rules will be checked at	the first check-state, keep-state or limit oc-
       currence,  and the action performed upon	a match	will be	the same as in
       the parent rule.

       Note that no additional attributes other	than protocol and IP addresses
       and ports and :flowname are checked on dynamic rules.

       The typical use of dynamic rules	is to keep a closed firewall  configu-
       ration,	but  let  the first TCP	SYN packet from	the inside network in-
       stall a dynamic rule for	the flow so that  packets  belonging  to  that
       session will be allowed through the firewall:

	     ipfw add check-state :OUTBOUND
	     ipfw  add	allow  tcp  from  my-subnet  to	 any  setup keep-state
	     :OUTBOUND
	     ipfw add deny tcp from any	to any

       A similar approach can be used for UDP, where an	UDP packet coming from
       the inside will install a dynamic rule to let the response through  the
       firewall:

	     ipfw add check-state :OUTBOUND
	     ipfw add allow udp	from my-subnet to any keep-state :OUTBOUND
	     ipfw add deny udp from any	to any

       Dynamic	rules  expire  after some time,	which depends on the status of
       the flow	and the	setting	of some	sysctl variables.  See Section "SYSCTL
       VARIABLES" for more details.  For TCP sessions, dynamic	rules  can  be
       instructed  to periodically send	keepalive packets to refresh the state
       of the rule when	it is about to expire.

       See Section "EXAMPLES" for more examples	on how to use dynamic rules.

TRAFFIC	SHAPER (DUMMYNET) CONFIGURATION
       ipfw is also the	user interface for the dummynet	traffic	shaper,	packet
       scheduler and network  emulator,	 a  subsystem  that  can  artificially
       queue, delay or drop packets emulating the behaviour of certain network
       links or	queueing systems.

       dummynet	 operates  by first using the firewall to select packets using
       any match pattern that can be used in ipfw rules.  Matching packets are
       then passed to either of	two different  objects,	 which	implement  the
       traffic regulation:

	   pipe	   A pipe emulates a link with given bandwidth and propagation
		   delay,  driven  by a	FIFO scheduler and a single queue with
		   programmable	queue size and packet loss rate.  Packets  are
		   appended  to	the queue as they come out from	ipfw, and then
		   transferred in FIFO order to	the link at the	desired	rate.

	   queue   A queue is an abstraction used to implement packet schedul-
		   ing using one  of  several  packet  scheduling  algorithms.
		   Packets  sent  to  a	queue are first	grouped	into flows ac-
		   cording to a	mask on	the 5-tuple.  Flows are	then passed to
		   the scheduler associated to the queue, and each  flow  uses
		   scheduling  parameters (weight and others) as configured in
		   the queue itself.  A	scheduler in turn is connected	to  an
		   emulated  link,  and	 arbitrates the	link's bandwidth among
		   backlogged flows according to weights and to	 the  features
		   of the scheduling algorithm in use.

       In practice, pipes can be used to set hard limits to the	bandwidth that
       a  flow	can use, whereas queues	can be used to determine how different
       flows share the available bandwidth.

       A graphical representation of the binding of queues, flows,  schedulers
       and links is below.

			      (flow_mask|sched_mask)  sched_mask
		      +---------+   weight Wx  +-------------+
		      |		|->-[flow]-->--|	     |-+
		 -->--|	QUEUE x	|   ...	       |	     | |
		      |		|->-[flow]-->--| SCHEDuler N | |
		      +---------+	       |	     | |
			  ...		       |	     +--[LINK N]-->--
		      +---------+   weight Wy  |	     | +--[LINK	N]-->--
		      |		|->-[flow]-->--|	     | |
		 -->--|	QUEUE y	|   ...	       |	     | |
		      |		|->-[flow]-->--|	     | |
		      +---------+	       +-------------+ |
						 +-------------+
       It is important to understand the role of the SCHED_MASK	and FLOW_MASK,
       which are configured through the	commands
	     ipfw sched	N config mask SCHED_MASK ...
       and
	     ipfw queue	X config mask FLOW_MASK	....

       The  SCHED_MASK	is  used  to assign flows to one or more scheduler in-
       stances,	one for	each value of  the  packet's  5-tuple  after  applying
       SCHED_MASK.  As an example, using ``src-ip 0xffffff00'' creates one in-
       stance for each /24 destination subnet.

       The  FLOW_MASK,	together with the SCHED_MASK, is used to split packets
       into flows.  As an example, using ``src-ip 0x000000ff''	together  with
       the  previous  SCHED_MASK  makes	 a flow	for each individual source ad-
       dress.  In turn,	flows for each /24 subnet will be  sent	 to  the  same
       scheduler instance.

       The  above diagram holds	even for the pipe case,	with the only restric-
       tion that a pipe	only supports a	SCHED_MASK, and	forces the  use	 of  a
       FIFO  scheduler (these are for backward compatibility reasons; in fact,
       internally, a dummynet's	pipe is	implemented exactly as above).

       There are two modes of dummynet operation: "normal"  and	 "fast".   The
       "normal"	 mode tries to emulate a real link: the	dummynet scheduler en-
       sures that the packet will not leave the	pipe faster than it  would  on
       the  real  link with a given bandwidth.	The "fast" mode	allows certain
       packets to bypass the dummynet scheduler	(if packet flow	does  not  ex-
       ceed  pipe's  bandwidth).   This	 is the	reason why the "fast" mode re-
       quires less CPU cycles per packet (on average) and packet  latency  can
       be significantly	lower in comparison to a real link with	the same band-
       width.	The  default mode is "normal".	The "fast" mode	can be enabled
       by setting the net.inet.ip.dummynet.io_fast  sysctl(8)  variable	 to  a
       non-zero	value.

   PIPE, QUEUE AND SCHEDULER CONFIGURATION
       The pipe, queue and scheduler configuration commands are	the following:

	     pipe number config	pipe-configuration

	     queue number config queue-configuration

	     sched number config sched-configuration

       The following parameters	can be configured for a	pipe:

       bw bandwidth | device
	       Bandwidth, measured in [K|M|G]{bit/s|Byte/s}.

	       A  value	 of  0	(default) means	unlimited bandwidth.  The unit
	       must immediately	follow the number, as in

		     dnctl pipe	1 config bw 300Kbit/s

	       If a device name	is specified instead of	a numeric value, as in

		     dnctl pipe	1 config bw tun0

	       then the	transmit clock is supplied by  the  specified  device.
	       At  the moment only the tun(4) device supports this functional-
	       ity, for	use in conjunction with	ppp(8).

       delay ms-delay
	       Propagation delay, measured  in	milliseconds.	The  value  is
	       rounded to the next multiple of the clock tick (typically 10ms,
	       but it is a good	practice to run	kernels	with "options HZ=1000"
	       to  reduce  the granularity to 1ms or less).  The default value
	       is 0, meaning no	delay.

       burst size
	       If the data to be sent exceeds the pipe's bandwidth limit  (and
	       the pipe	was previously idle), up to size bytes of data are al-
	       lowed  to  bypass  the  dummynet	scheduler, and will be sent as
	       fast as the physical link allows.  Any additional data will  be
	       transmitted  at	the rate specified by the pipe bandwidth.  The
	       burst size depends on how long the pipe has been	idle; the  ef-
	       fective	burst  size is calculated as follows: MAX( size	, bw *
	       pipe_idle_time).

       profile filename
	       A file specifying  the  additional  overhead  incurred  in  the
	       transmission of a packet	on the link.

	       Some link types introduce extra delays in the transmission of a
	       packet,	e.g.,  because of MAC level framing, contention	on the
	       use of the channel, MAC level retransmissions and so on.	  From
	       our  point  of view, the	channel	is effectively unavailable for
	       this extra time,	which is constant or variable depending	on the
	       link type.  Additionally, packets may  be  dropped  after  this
	       time (e.g., on a	wireless link after too	many retransmissions).
	       We  can model the additional delay with an empirical curve that
	       represents its distribution.

			   cumulative probability
			   1.0 ^
			       |
			   L   +-- loss-level	       x
			       |		 ******
			       |		*
			       |	   *****
			       |	  *
			       |	**
			       |       *
			       +-------*------------------->
					   delay
	       The empirical curve  may	 have  both  vertical  and  horizontal
	       lines.	Vertical lines represent constant delay	for a range of
	       probabilities.  Horizontal lines	correspond to a	 discontinuity
	       in  the delay distribution: the pipe will use the largest delay
	       for a given probability.

	       The file	format is the following, with whitespace acting	 as  a
	       separator and '#' indicating the	beginning a comment:

	       name identifier
		       optional	name (listed by	"dnctl pipe show") to identify
		       the delay distribution;

	       bw value
		       the  bandwidth  used  for  the  pipe.  If not specified
		       here, it	must be	present	explicitly as a	 configuration
		       parameter for the pipe;

	       loss-level L
		       the  probability	above which packets are	lost.  (0.0 <=
		       L <= 1.0, default 1.0 i.e., no loss);

	       samples N
		       the number of samples used in the internal  representa-
		       tion of the curve (2..1024; default 100);

	       delay prob | prob delay
		       One  of	these  two  lines is mandatory and defines the
		       format of the following lines with data points.

	       XXX YYY
		       2 or more lines representing points in the curve,  with
		       either  delay  or  probability  first, according	to the
		       chosen format.  The unit	 for  delay  is	 milliseconds.
		       Data points do not need to be sorted.  Also, the	number
		       of  actual lines	can be different from the value	of the
		       "samples" parameter: ipfw utility will sort and	inter-
		       polate the curve	as needed.

	       Example of a profile file:

		     name    bla_bla_bla
		     samples 100
		     loss-level	   0.86
		     prob    delay
		     0	     200     # minimum overhead	is 200ms
		     0.5     200
		     0.5     300
		     0.8     1000
		     0.9     1300
		     1	     1300
		     #configuration file end

       The following parameters	can be configured for a	queue:

       pipe pipe_nr
	       Connects	 a queue to the	specified pipe.	 Multiple queues (with
	       the same	or different weights) can be  connected	 to  the  same
	       pipe, which specifies the aggregate rate	for the	set of queues.

       weight weight
	       Specifies  the weight to	be used	for flows matching this	queue.
	       The weight must be in the range 1..100, and defaults to 1.

       The following case-insensitive  parameters  can	be  configured	for  a
       scheduler:

       type {fifo | wf2q+ | rr | qfq | fq_codel	| fq_pie}
	       specifies the scheduling	algorithm to use.
	       fifo    is  just	a FIFO scheduler (which	means that all packets
		       are stored in the same queue  as	 they  arrive  to  the
		       scheduler).   FIFO has O(1) per-packet time complexity,
		       with very low constants (estimate  60-80ns  on  a  2GHz
		       desktop machine)	but gives no service guarantees.
	       wf2q+   implements  the	WF2Q+  algorithm,  which is a Weighted
		       Fair Queueing algorithm which permits  flows  to	 share
		       bandwidth   according  to  their	 weights.   Note  that
		       weights are not priorities; even	a flow with  a	minus-
		       cule weight will	never starve.  WF2Q+ has O(log N) per-
		       packet processing cost, where N is the number of	flows,
		       and  is the default algorithm used by previous versions
		       dummynet's queues.
	       rr      implements the Deficit Round Robin algorithm, which has
		       O(1) processing costs (roughly, 100-150ns  per  packet)
		       and  permits bandwidth allocation according to weights,
		       but with	poor service guarantees.
	       qfq     implements the QFQ algorithm,  which  is	 a  very  fast
		       variant	of  WF2Q+, with	similar	service	guarantees and
		       O(1) processing costs (roughly, 200-250ns per packet).
	       fq_codel
		       implements the FQ-CoDel (FlowQueue-CoDel) scheduler/AQM
		       algorithm, which	uses a modified	 Deficit  Round	 Robin
		       scheduler  to  manage two lists of sub-queues (old sub-
		       queues and new sub-queues) for providing	brief  periods
		       of  priority  to	 lightweight or	short burst flows.  By
		       default,	the total number of sub-queues is  1024.   FQ-
		       CoDel's	internal,  dynamically	created	sub-queues are
		       controlled by separate instances	of CoDel AQM.
	       fq_pie  implements the FQ-PIE (FlowQueue-PIE) scheduler/AQM al-
		       gorithm,	which similar to fq_codel but  uses  per  sub-
		       queue PIE AQM instance to control the queue delay.

	       fq_codel	 inherits  AQM	parameters and options from codel (see
	       below), and fq_pie inherits AQM parameters and options from pie
	       (see below).  Additionally, both	of fq_codel  and  fq_pie  have
	       shared scheduler	parameters which are:

	       quantum
		       m  specifies  the quantum (credit) of the scheduler.  m
		       is the number of	bytes a	queue can serve	 before	 being
		       moved  to  the tail of old queues list.	The default is
		       1514 bytes, and the maximum acceptable  value  is  9000
		       bytes.

	       limit   m specifies the hard size limit (in unit	of packets) of
		       all  queues  managed  by	 an instance of	the scheduler.
		       The default value of m is 10240 packets,	and the	 maxi-
		       mum acceptable value is 20480 packets.

	       flows   m  specifies  the  total	 number	 of  flow queues (sub-
		       queues) that fq_* creates  and  manages.	  By  default,
		       1024  sub-queues	 are  created  when an instance	of the
		       fq_{codel/pie} scheduler	is created.  The  maximum  ac-
		       ceptable	value is 65536.

	       Note  that  any	token after fq_codel or	fq_pie is considered a
	       parameter for fq_{codel/pie}.  So, ensure all scheduler config-
	       uration options not related to fq_{codel/pie} are  written  be-
	       fore fq_codel/fq_pie tokens.

       In  addition to the type, all parameters	allowed	for a pipe can also be
       specified for a scheduler.

       Finally,	the following parameters can be	configured for both pipes  and
       queues:

       buckets hash-table-size
	     Specifies the size	of the hash table used for storing the various
	     queues.  Default value is 64 controlled by	the sysctl(8) variable
	     net.inet.ip.dummynet.hash_size, allowed range is 16 to 65536.

       mask mask-specifier
	     Packets sent to a given pipe or queue by an ipfw rule can be fur-
	     ther  classified  into multiple flows, each of which is then sent
	     to	a different dynamic pipe or queue.  A flow identifier is  con-
	     structed by masking the IP	addresses, ports and protocol types as
	     specified	with the mask options in the configuration of the pipe
	     or	queue.	For each different flow	 identifier,  a	 new  pipe  or
	     queue is created with the same parameters as the original object,
	     and matching packets are sent to it.

	     Thus,  when  dynamic  pipes are used, each	flow will get the same
	     bandwidth as defined by the pipe, whereas when dynamic queues are
	     used, each	flow will share	the  parent's  pipe  bandwidth	evenly
	     with  other  flows	 generated  by the same	queue (note that other
	     queues with different weights might  be  connected	 to  the  same
	     pipe).
	     Available mask specifiers are a combination of one	or more	of the
	     following:

	     dst-ip  mask,  dst-ip6  mask, src-ip mask,	src-ip6	mask, dst-port
	     mask, src-port mask, flow-id mask,	proto mask or all,

	     where the latter means all	bits in	all fields are significant.

       noerror
	     When a packet is dropped by a dummynet queue or pipe,  the	 error
	     is	 normally reported to the caller routine in the	kernel,	in the
	     same way as it happens when a device  queue  fills	 up.   Setting
	     this  option  reports the packet as successfully delivered, which
	     can be needed for some experimental setups	where you want to sim-
	     ulate loss	or congestion at a remote router.

       plr packet-loss-rate
       plr K,p,H,r
	     Packet loss rate.	Argument packet-loss-rate is a	floating-point
	     number  between  0	 and 1,	with 0 meaning no loss,	1 meaning 100%
	     loss.

	     When invoked with	four  arguments,  the  simple  Gilbert-Elliott
	     channel model with	two states (Good and Bad) is used.

					   r
				  .----------------.
				  v		   |
			    .------------.   .------------.
			    |	  G	 |   |	   B	  |
			    |  drop (K)	 |   |	drop (H)  |
			    '------------'   '------------'
				  |		   ^
				  '----------------'
					   p

	     This  has	the  associated	 probabilities	(K and H) for the loss
	     probability.  This	is different from the literature,  where  this
	     model  is described with probabilities of successful transmission
	     k and h.  However,	converting from	literature is easy:

	     K = 1 - k ; H = 1 - h

	     This is to	retain consistency within the interface	and allow  the
	     quick  re-use of loss probability when giving only	a single argu-
	     ment.  In addition	the state change probabilities (p and  r)  are
	     given.  All of the	above probabilities are	internally represented
	     on	31 bits.

       queue {slots | sizeKbytes}
	     Queue size, in slots or KBytes.  Default value is 50 slots, which
	     is	 the  typical  queue size for Ethernet devices.	 Note that for
	     slow speed	links you should keep the queue	 size  short  or  your
	     traffic might be affected by a significant	queueing delay.	 E.g.,
	     50	max-sized Ethernet packets (1500 bytes)	mean 600Kbit or	20s of
	     queue  on	a 30Kbit/s pipe.  Even worse effects can result	if you
	     get packets from an interface with	a much larger  MTU,  e.g.  the
	     loopback  interface  with	its 16KB packets.  The sysctl(8) vari-
	     ables	    net.inet.ip.dummynet.pipe_byte_limit	   and
	     net.inet.ip.dummynet.pipe_slot_limit  control the maximum lengths
	     that can be specified.

       red | gred w_q/min_th/max_th/max_p
	     [ecn] Make	use of the RED (Random Early Detection)	queue  manage-
	     ment algorithm.  w_q and max_p are	floating point numbers between
	     0	and 1 (inclusive), while min_th	and max_th are integer numbers
	     specifying	thresholds for queue management	(thresholds  are  com-
	     puted  in	bytes if the queue has been defined in bytes, in slots
	     otherwise).  The two parameters can also be of the	same value  if
	     needed.  The dummynet also	supports the gentle RED	variant	(gred)
	     and  ECN  (Explicit  Congestion Notification) as optional.	 Three
	     sysctl(8) variables can be	used to	control	the RED	behaviour:

	     net.inet.ip.dummynet.red_lookup_depth
		     specifies the accuracy in	computing  the	average	 queue
		     when  the	link is	idle (defaults to 256, must be greater
		     than zero)

	     net.inet.ip.dummynet.red_avg_pkt_size
		     specifies the expected average packet size	 (defaults  to
		     512, must be greater than zero)

	     net.inet.ip.dummynet.red_max_pkt_size
		     specifies	the  expected  maximum	packet size, only used
		     when queue	thresholds are in  bytes  (defaults  to	 1500,
		     must be greater than zero).

       codel [target time] [interval time] [ecn	| noecn]
	     Make  use	of the CoDel (Controlled-Delay)	queue management algo-
	     rithm.  time is interpreted as milliseconds by default  but  sec-
	     onds (s), milliseconds (ms) or microseconds (us) can be specified
	     instead.	CoDel drops or marks (ECN) packets depending on	packet
	     sojourn time in the queue.	 target	time (5ms by default)  is  the
	     minimum  acceptable  persistent  queue  delay  that CoDel allows.
	     CoDel does	not drop packets directly after	packets	 sojourn  time
	     becomes  higher  than  target  time  but  waits for interval time
	     (100ms default) before dropping.  interval	time should be set  to
	     maximum  RTT for all expected connections.	 ecn enables (disabled
	     by	default) packet	marking	(instead of dropping) for  ECN-enabled
	     TCP flows when queue delay	becomes	high.

	     Note  that	 any  token  after codel is considered a parameter for
	     CoDel.  So, ensure	all pipe/queue configuration options are writ-
	     ten before	codel token.

	     The  sysctl(8)  variables	net.inet.ip.dummynet.codel.target  and
	     net.inet.ip.dummynet.codel.interval  can be used to set CoDel de-
	     fault parameters.

       pie [target time] [tupdate time]	[alpha n] [beta	 n]  [max_burst	 time]
	     [max_ecnth	 n]  [ecn  |  noecn]  [capdrop	|  nocapdrop] [drand |
	     nodrand] [onoff] [dre | ts]
	     Make use of the PIE (Proportional Integral	 controller  Enhanced)
	     queue management algorithm.  PIE drops or marks packets depending
	     on	 a  calculated	drop probability during	en-queue process, with
	     the aim of	achieving high throughput while	 keeping  queue	 delay
	     low.  At regular time intervals of	tupdate	time (15ms by default)
	     a	background  process  (re)calculates  the  probability based on
	     queue delay deviations from target	time  (15ms  by	 default)  and
	     queue  delay trends.  PIE approximates current queue delay	by us-
	     ing a departure rate estimation method, or	(optionally) by	 using
	     a	packet timestamp method	similar	to CoDel.  time	is interpreted
	     as	milliseconds by	default	but seconds (s), milliseconds (ms)  or
	     microseconds  (us)	can be specified instead.  The other PIE para-
	     meters and	options	are as follows:

	     alpha n
		     n is a floating point number between 0 and	7 which	speci-
		     fies the weight of	queue delay deviations that is used in
		     drop probability calculation.  0.125 is the default.

	     beta n  n is a floating point number between 0 and	7 which	speci-
		     fies is the weight	of queue delay trend that is  used  in
		     drop probability calculation.  1.25 is the	default.

	     max_burst time
		     The  maximum  period  of time that	PIE does not drop/mark
		     packets.  150ms is	the default and	 10s  is  the  maximum
		     value.

	     max_ecnth n
		     Even  when	 ECN  is enabled, PIE drops packets instead of
		     marking them when drop probability	 becomes  higher  than
		     ECN  probability  threshold  max_ecnth n ,	the default is
		     0.1 (i.e 10%) and 1 is the	maximum	value.

	     ecn | noecn
		     enable or disable ECN marking for ECN-enabled TCP	flows.
		     Disabled by default.

	     capdrop | nocapdrop
		     enable  or	disable	cap drop adjustment.  Cap drop adjust-
		     ment is enabled by	default.

	     drand | nodrand
		     enable or disable drop probability	de-randomisation.  De-
		     randomisation eliminates the problem of dropping  packets
		     too close or too far.  De-randomisation is	enabled	by de-
		     fault.

	     onoff   enable  turning  PIE  on and off depending	on queue load.
		     If	this option is enabled,	PIE turns on when over 1/3  of
		     queue becomes full.  This option is disabled by default.

	     dre | ts
		     Calculate queue delay using departure rate	estimation dre
		     or	timestamps ts.	dre is used by default.

	     Note  that	any token after	pie is considered a parameter for PIE.
	     So	ensure all pipe/queue the configuration	 options  are  written
	     before pie	token.	sysctl(8) variables can	be used	to control the
	     pie  default  parameters.	See the	"SYSCTL	VARIABLES" section for
	     more details.

       When used with IPv6 data, dummynet currently has	 several  limitations.
       Information  necessary  to  route link-local packets to an interface is
       not available after processing by dummynet so those packets are dropped
       in the output path.  Care should	be taken  to  ensure  that  link-local
       packets are not passed to dummynet.

CHECKLIST
       Here are	some important points to consider when designing your rules:

          Remember  that you filter both packets going	in and out.  Most con-
	   nections need packets going in both directions.

          Remember to test very carefully.  It	is a good idea to be near  the
	   console when	doing this.  If	you cannot be near the console,	use an
	   auto-recovery      script	  such	    as	    the	    one	    in
	   /usr/share/examples/ipfw/change_rules.sh.

          Do not forget the loopback interface.

FINE POINTS
          There are circumstances where fragmented datagrams are uncondition-
	   ally	dropped.  TCP packets are dropped if they do  not  contain  at
	   least  20  bytes  of	TCP header, UDP	packets	are dropped if they do
	   not contain a full 8	byte UDP header, and ICMP packets are  dropped
	   if  they  do	 not contain 4 bytes of	ICMP header, enough to specify
	   the ICMP type, code,	and checksum.  These packets are simply	logged
	   as "pullup failed" since there may not be enough good data  in  the
	   packet to produce a meaningful log entry.

          Another  type  of  packet  is unconditionally dropped, a TCP	packet
	   with	a fragment offset of one.  This	is a valid packet, but it only
	   has one use,	to try to circumvent firewalls.	 When logging  is  en-
	   abled, these	packets	are reported as	being dropped by rule -1.

          If  you are logged in over a	network, loading the kld(4) version of
	   ipfw	is probably not	as straightforward as you  would  think.   The
	   following command line is recommended:

		 kldload ipfw && \
		 ipfw add 32000	allow ip from any to any

	   Along the same lines, doing an

		 ipfw flush

	   in similar surroundings is also a bad idea.

          The	ipfw  filter  list  may	not be modified	if the system security
	   level is set	to 3 or	higher (see init(8) for	information on	system
	   security levels).

PACKET DIVERSION
       A divert(4) socket bound	to the specified port will receive all packets
       diverted	 to that port.	If no socket is	bound to the destination port,
       or if the divert	module is not loaded, or if the	kernel	was  not  com-
       piled with divert socket	support, the packets are dropped.

NETWORK	ADDRESS	TRANSLATION (NAT)
       ipfw  support  in-kernel	 NAT  using the	kernel version of libalias(3).
       The kernel module ipfw_nat should  be  loaded  or  kernel  should  have
       options IPFIREWALL_NAT to be able use NAT.

       The nat configuration command is	the following:

	     nat nat_number config nat-configuration

       The following parameters	can be configured:

       ip ip_address
	       Define an ip address to use for aliasing.

       if nic  Use  ip address of NIC for aliasing, dynamically	changing it if
	       NIC's ip	address	changes.

       log     Enable logging on this nat instance.

       deny_in
	       Deny any	incoming connection from outside world.

       same_ports
	       Try to leave the	alias port numbers unchanged from  the	actual
	       local port numbers.

       unreg_only
	       Traffic	on  the	 local network not originating from a RFC 1918
	       unregistered address spaces will	be ignored.

       unreg_cgn
	       Like unreg_only,	but includes the RFC 6598 (Carrier Grade  NAT)
	       address range.

       reset   Reset table of the packet aliasing engine on address change.

       reverse
	       Reverse the way libalias	handles	aliasing.

       proxy_only
	       Obey  transparent proxy rules only, packet aliasing is not per-
	       formed.

       skip_global
	       Skip instance in	case of	global state lookup (see below).

       port_range lower-upper
	       Set the aliasing	ports between the ranges  given.   Upper  port
	       has to be greater than lower.

       udp_eim
	       When  enabled,  UDP  packets  use  endpoint-independent mapping
	       (EIM) from RFC 4787 ("full cone"	NAT of RFC 3489).  All packets
	       from the	same internal address:port are mapped to the same  NAT
	       address:port, regardless	of their destination address:port.  If
	       filtering  rules	 allow,	and if deny_in is unset, any other ex-
	       ternal address:port can also send to the	internal  address:port
	       through	its  mapped NAT	address:port.  This is more compatible
	       with applications, and can reduce the need for port forwarding,
	       but less	scalable as each NAT address:port can only be  concur-
	       rently used by at most one internal address:port.

	       When disabled, UDP packets use endpoint-dependent mapping (EDM)
	       ("symmetric"  NAT).  Each connection from a particular internal
	       address:port to different external addresses:ports is mapped to
	       a random	and unpredictable NAT address:port.  Two appplications
	       behind EDM NATs can only	connect	to each	other by port forward-
	       ing on the NAT, or tunnelling through an	in-between server.

       Some special values can be supplied instead of nat_number in  nat  rule
       actions:

       global  Looks up	translation state in all configured nat	instances.  If
	       an  entry  is found, packet is aliased according	to that	entry.
	       If no entry was found in	any of the instances, packet is	passed
	       unchanged, and no new  entry  will  be  created.	  See  section
	       "MULTIPLE INSTANCES" in natd(8) for more	information.

       tablearg
	       Uses  argument  supplied	 in lookup table.  See "LOOKUP TABLES"
	       section below for more information on lookup tables.

       To let the packet continue after	 being	(de)aliased,  set  the	sysctl
       variable	 net.inet.ip.fw.one_pass  to  0.   For	more information about
       aliasing	modes, refer to	libalias(3).  See Section "EXAMPLES" for  some
       examples	of nat usage.

       To  delete  specific nat	configuration instance,	use the	following com-
       mand:

	     nat nat_number delete

   REDIRECT AND	LSNAT SUPPORT IN IPFW
       Redirect	and LSNAT support follow closely the syntax used  in  natd(8).
       See  Section  "EXAMPLES"	 for  some  examples on	how to do redirect and
       lsnat.

   SCTP	NAT SUPPORT
       SCTP nat	can be configured in a similar manner to TCP through the  ipfw
       command	line  tool.   The main difference is that sctp nat does	not do
       port translation.  Since	the local and global side ports	 will  be  the
       same,  there  is	no need	to specify both.  Ports	are redirected as fol-
       lows:

	     nat nat_number config if nic redirect_port	sctp
	     ip_address	[,addr_list] {[port | port-port] [,ports]}

       Most sctp nat configuration  can	 be  done  in  real-time  through  the
       sysctl(8)  interface.   All  may	 be  changed  dynamically,  though the
       hash_table size will only change	for new	nat  instances.	  See  "SYSCTL
       VARIABLES" for more info.

IPv6/IPv4 NETWORK ADDRESS AND PROTOCOL TRANSLATION
   Stateful translation
       ipfw supports in-kernel IPv6/IPv4 network address and protocol transla-
       tion.   Stateful	 NAT64 translation allows IPv6-only clients to contact
       IPv4 servers using unicast TCP, UDP or ICMP  protocols.	 One  or  more
       IPv4 addresses assigned to a stateful NAT64 translator are shared among
       several	IPv6-only clients.  When stateful NAT64	is used	in conjunction
       with DNS64, no changes are usually required in the IPv6 client  or  the
       IPv4  server.   The kernel module ipfw_nat64 should be loaded or	kernel
       should have options IPFIREWALL_NAT64 to	be  able  use  stateful	 NAT64
       translator.

       Stateful	 NAT64	uses  a	 bunch of memory for several types of objects.
       When IPv6 client	initiates connection, NAT64 translator creates a  host
       entry  in  the  states  table.	Each host entry	uses preallocated IPv4
       alias entry.  Each alias	entry has a number of ports group entries  al-
       located	on  demand.  Ports group entries contains connection state en-
       tries.  There are several options to control limits  and	 lifetime  for
       these objects.

       NAT64 translator	follows	RFC7915	when does ICMPv6/ICMP translation, un-
       supported  message  types will be silently dropped.  IPv6 needs several
       ICMPv6 message types to be explicitly allowed  for  correct  operation.
       Make sure that ND6 neighbor solicitation	(ICMPv6	type 135) and neighbor
       advertisement  (ICMPv6 type 136)	messages will not be handled by	trans-
       lation rules.

       After translation NAT64 translator by  default  sends  packets  through
       corresponding  netisr queue.  Thus translator host should be configured
       as IPv4 and IPv6	router.	 Also this means, that a packet	is handled  by
       firewall	 twice.	 First time an original	packet is handled and consumed
       by translator, and then it is handled again as translated packet.  This
       behavior	    can	     be	     changed	  by	  sysctl      variable
       net.inet.ip.fw.nat64_direct_output.   Also  translated  packet  can  be
       tagged using tag	rule action, and then  matched	by  tagged  opcode  to
       avoid loops and extra overhead.

       The stateful NAT64 configuration	command	is the following:

	     nat64lsn name create create-options

       The following parameters	can be configured:

       prefix4 ipv4_prefix/plen
	       The  IPv4  prefix  with mask defines the	pool of	IPv4 addresses
	       used as source address after translation.  Stateful NAT64  mod-
	       ule  translates	IPv6  source address of	client to one IPv4 ad-
	       dress from this pool.  Note that	 incoming  IPv4	 packets  that
	       don't  have  corresponding state	entry in the states table will
	       be dropped by translator.  Make	sure  that  translation	 rules
	       handle packets, destined	to configured prefix.

       prefix6 ipv6_prefix/length
	       The  IPv6  prefix  defines IPv4-embedded	IPv6 addresses used by
	       translator to  represent	 IPv4  addresses.   This  IPv6	prefix
	       should  be  configured in DNS64.	 The translator	implementation
	       follows RFC6052,	that restricts the length of prefixes  to  one
	       of  following:  32, 40, 48, 56, 64, or 96.  The Well-Known IPv6
	       Prefix 64:ff9b::	must be	96 bits	long.  The  special  ::/length
	       prefix  can  be	used  to handle	several	IPv6 prefixes with one
	       NAT64 instance.	The NAT64 instance will	determine  a  destina-
	       tion IPv4 address from prefix length.

       states_chunks number
	       The  number of states chunks in single ports group.  Each ports
	       group by	default	can keep 64 state  entries  in	single	chunk.
	       The  above  value affects the maximum number of states that can
	       be associated with a single IPv4	alias address and  port.   The
	       value must be power of 2, and up	to 128.

       host_del_age seconds
	       The  number  of	seconds	until the host entry for a IPv6	client
	       will be deleted and all its resources will be released  due  to
	       inactivity.  Default value is 3600.

       pg_del_age seconds
	       The number of seconds until a ports group with unused state en-
	       tries will be released.	Default	value is 900.

       tcp_syn_age seconds
	       The  number  of	seconds	while a	state entry for	TCP connection
	       with only SYN sent will be kept.	 If TCP	connection  establish-
	       ing will	not be finished, state entry will be deleted.  Default
	       value is	10.

       tcp_est_age seconds
	       The  number  of seconds while a state entry for established TCP
	       connection will be kept.	 Default value is 7200.

       tcp_close_age seconds
	       The number of seconds while a state entry for closed  TCP  con-
	       nection will be kept.  Keeping state entries for	closed connec-
	       tions  is  needed,  because  IPv4 servers typically keep	closed
	       connections in a	TIME_WAIT state	for a several minutes.	 Since
	       translator's  IPv4 addresses are	shared among all IPv6 clients,
	       new connections from the	same addresses and ports  may  be  re-
	       jected  by  server,  because  these  connections	are still in a
	       TIME_WAIT state.	 Keeping them in translator's state table pro-
	       tects from such rejects.	 Default value is 180.

       udp_age seconds
	       The number of seconds while translator keeps state entry	 in  a
	       waiting	for  reply to the sent UDP datagram.  Default value is
	       120.

       icmp_age	seconds
	       The number of seconds while translator keeps state entry	 in  a
	       waiting	for  reply to the sent ICMP message.  Default value is
	       60.

       log     Turn on logging of all handled packets via BPF through ipfwlog0
	       interface.  ipfwlog0 is a pseudo	interface and can  be  created
	       after  a	boot manually with ifconfig command.  Note that	it has
	       different purpose than ipfw0 interface.	Translators  sends  to
	       BPF  an	additional information with each packet.  With tcpdump
	       you are able to see each	handled	packet before and after	trans-
	       lation.

       -log    Turn off	logging	of all handled packets via BPF.

       allow_private
	       Turn on processing private IPv4	addresses.   By	 default  IPv6
	       packets	with destinations mapped to private address ranges de-
	       fined by	RFC1918	are not	processed.

       -allow_private
	       Turn off	private	address	handling in nat64 instance.

       To inspect a states table of stateful NAT64 the following  command  can
       be used:

	     nat64lsn name show	states

       Stateless  NAT64	 translator doesn't use	a states table for translation
       and converts IPv4 addresses to IPv6 and vice versa solely based on  the
       mappings	 taken	from  configured  lookup tables.  Since	a states table
       doesn't used by stateless translator, it	can be configured to pass IPv4
       clients to IPv6-only servers.

       The stateless NAT64 configuration command is the	following:

	     nat64stl name create create-options

       The following parameters	can be configured:

       prefix6 ipv6_prefix/length
	       The IPv6	prefix defines IPv4-embedded IPv6  addresses  used  by
	       translator  to  represent  IPv4	addresses.   This  IPv6	prefix
	       should be configured in DNS64.

       table4 table46
	       The lookup table	table46	contains mapping  how  IPv4  addresses
	       should be translated to IPv6 addresses.

       table6 table64
	       The  lookup  table  table64 contains mapping how	IPv6 addresses
	       should be translated to IPv4 addresses.

       log     Turn on logging of all handled packets via BPF through ipfwlog0
	       interface.

       -log    Turn off	logging	of all handled packets via BPF.

       allow_private
	       Turn on processing private IPv4	addresses.   By	 default  IPv6
	       packets	with destinations mapped to private address ranges de-
	       fined by	RFC1918	are not	processed.

       -allow_private
	       Turn off	private	address	handling in nat64 instance.

       Note that the behavior of stateless  translator	with  respect  to  not
       matched packets differs from stateful translator.  If corresponding ad-
       dresses	was  not  found	 in  the lookup	tables,	the packet will	not be
       dropped and the search continues.

   XLAT464 CLAT	translation
       XLAT464 CLAT NAT64 translator implements	client-side stateless transla-
       tion as defined in RFC6877 and is very similar to statless NAT64	trans-
       lator explained above.  Instead of lookup  tables  it  uses  one-to-one
       mapping	between	 IPv4  and  IPv6  addresses using configured prefixes.
       This mode can be	used as	a replacement of DNS64	service	 for  applica-
       tions  that  are	 not  using  it	 (e.g.	VoIP)  allowing	them to	access
       IPv4-only Internet over IPv6-only networks with help  of	 remote	 NAT64
       translator.

       The CLAT	NAT64 configuration command is the following:

	     nat64clat name create create-options

       The following parameters	can be configured:

       clat_prefix ipv6_prefix/length
	       The  IPv6  prefix  defines IPv4-embedded	IPv6 addresses used by
	       translator to represent source IPv4 addresses.

       plat_prefix ipv6_prefix/length
	       The IPv6	prefix defines IPv4-embedded IPv6  addresses  used  by
	       translator  to represent	destination IPv4 addresses.  This IPv6
	       prefix should be	configured on a	remote NAT64 translator.

       log     Turn on logging of all handled packets via BPF through ipfwlog0
	       interface.

       -log    Turn off	logging	of all handled packets via BPF.

       allow_private
	       Turn  on	 processing  private  IPv4  addresses.	  By   default
	       nat64clat  instance will	not process IPv4 packets with destina-
	       tion address from private ranges	as defined in RFC1918.

       -allow_private
	       Turn off	private	address	handling in nat64clat instance.

       Note that the behavior of CLAT translator with respect to  not  matched
       packets	differs	 from stateful translator.  If corresponding addresses
       were not	matched	against	prefixes configured, the packet	 will  not  be
       dropped and the search continues.

IPv6-to-IPv6 NETWORK PREFIX TRANSLATION	(NPTv6)
       ipfw  supports in-kernel	IPv6-to-IPv6 network prefix translation	as de-
       scribed in RFC6296.  The	kernel module ipfw_nptv6 should	be  loaded  or
       kernel  should has options IPFIREWALL_NPTV6 to be able use NPTv6	trans-
       lator.

       The NPTv6 configuration command is the following:

	     nptv6 name	create create-options

       The following parameters	can be configured:

       int_prefix ipv6_prefix
	       IPv6 prefix used	in internal network.  NPTv6 module  translates
	       source address when it matches this prefix.

       ext_prefix ipv6_prefix
	       IPv6  prefix used in external network.  NPTv6 module translates
	       destination address when	it matches this	prefix.

       ext_if nic
	       The NPTv6 module	will use first global IPv6 address from	inter-
	       face nic	as external prefix.  It	can be useful when IPv6	prefix
	       of external network is dynamically  obtained.   ext_prefix  and
	       ext_if options are mutually exclusive.

       prefixlen length
	       The  length  of	specified  IPv6	prefixes.  It must be in range
	       from 8 to 64.

       Note that the prefix translation	rules are silently ignored  when  IPv6
       packet  forwarding  is  disabled.  To enable the	packet forwarding, set
       the sysctl variable net.inet6.ip6.forwarding to 1.

       To let the packet continue after	being translated, set the sysctl vari-
       able net.inet.ip.fw.one_pass to 0.

LOADER TUNABLES
       Tunables	can be set in loader(8)	prompt,	loader.conf(5) or kenv(1)  be-
       fore ipfw module	gets loaded.

       net.inet.ip.fw.enable: 1
	       Enables	the firewall.  Setting this variable to	0 lets you run
	       your machine without firewall even if compiled in.

       net.inet6.ip6.fw.enable:	1
	       provides	the same functionality as above	for the	IPv6 case.

       net.link.ether.ipfw: 0
	       Controls	whether	layer2 packets are passed to ipfw.  Default is
	       no.

       net.inet.ip.fw.default_to_accept: 0
	       Defines ipfw last rule behavior.	 This value overrides  options
	       IPFW_DEFAULT_TO_(ACCEPT|DENY) from kernel configuration file.

       net.inet.ip.fw.tables_max: 128
	       Defines	number of tables available in ipfw.  Number cannot ex-
	       ceed 65534.

SYSCTL VARIABLES
       A set of	sysctl(8) variables controls the behaviour of the firewall and
       associated modules (dummynet, bridge, sctp nat).	 These are shown below
       together	with their default value (but always check with	the  sysctl(8)
       command what value is actually in use) and meaning:

       net.inet.ip.alias.sctp.accept_global_ootb_addip:	0
	       Defines	how the	nat responds to	receipt	of global OOTB ASCONF-
	       AddIP:

	       0       No response (unless a  partially	 matching  association
		       exists  - ports and vtags match but global address does
		       not)

	       1       nat will	accept and process all OOTB global AddIP  mes-
		       sages.

	       Option  1  should  never	 be  selected as this forms a security
	       risk.  An attacker can establish	multiple fake associations  by
	       sending AddIP messages.

       net.inet.ip.alias.sctp.chunk_proc_limit:	5
	       Defines	the  maximum  number  of chunks	in an SCTP packet that
	       will be parsed for a packet that	matches	an  existing  associa-
	       tion.   This  value  is	enforced  to  be greater or equal than
	       net.inet.ip.alias.sctp.initialising_chunk_proc_limit.   A  high
	       value  is  a DoS	risk yet setting too low a value may result in
	       important control chunks	in the packet not  being  located  and
	       parsed.

       net.inet.ip.alias.sctp.error_on_ootb: 1
	       Defines	when  the  nat	responds to any	Out-of-the-Blue	(OOTB)
	       packets with ErrorM packets.  An	OOTB packet is a  packet  that
	       arrives	with no	existing association registered	in the nat and
	       is not an INIT or ASCONF-AddIP packet:

	       0       ErrorM is never sent in response	to OOTB	packets.

	       1       ErrorM is only sent to OOTB packets received on the lo-
		       cal side.

	       2       ErrorM is sent to the local side	and on the global side
		       ONLY if there is	a partial match	(ports and vtags match
		       but the source global IP	does not).  This value is only
		       useful if the nat is tracking global IP addresses.

	       3       ErrorM is sent in response to all OOTB packets on  both
		       the local and global side (DoS risk).

	       At  the moment the default is 0,	since the ErrorM packet	is not
	       yet supported by	most SCTP stacks.  When	it is  supported,  and
	       if  not	tracking  global  addresses, we	recommend setting this
	       value to	1 to allow multi-homed local hosts  to	function  with
	       the  nat.  To track global addresses, we	recommend setting this
	       value to	2 to allow global hosts	to be informed when they  need
	       to  (re)send  an	 ASCONF-AddIP.	Value 3	should never be	chosen
	       (except for debugging) as the nat  will	respond	 to  all  OOTB
	       global packets (a DoS risk).

       net.inet.ip.alias.sctp.hashtable_size: 2003
	       Size  of	hash tables used for nat lookups (100 <	prime_number >
	       1000001).  This value sets the hash table size for  any	future
	       created	nat instance and therefore must	be set prior to	creat-
	       ing a nat instance.  The	table sizes may	 be  changed  to  suit
	       specific	 needs.	 If there will be few concurrent associations,
	       and memory is scarce, you may make  these  smaller.   If	 there
	       will  be	 many  thousands  (or millions)	of concurrent associa-
	       tions, you should make these larger.  A prime  number  is  best
	       for  the	 table	size.	The sysctl update function will	adjust
	       your input value	to the next highest prime number.

       net.inet.ip.alias.sctp.holddown_time: 0
	       Hold association	in table for this many seconds after receiving
	       a SHUTDOWN-COMPLETE.  This allows endpoints to correct shutdown
	       gracefully if a shutdown_complete is lost  and  retransmissions
	       are required.

       net.inet.ip.alias.sctp.init_timer: 15
	       Timeout	value  while  waiting  for (INIT-ACK|AddIP-ACK).  This
	       value cannot be 0.

       net.inet.ip.alias.sctp.initialising_chunk_proc_limit: 2
	       Defines the maximum number of chunks in	an  SCTP  packet  that
	       will be parsed when no existing association exists that matches
	       that  packet.   Ideally this packet will	only be	an INIT	or AS-
	       CONF-AddIP packet.  A higher value may become  a	 DoS  risk  as
	       malformed packets can consume processing	resources.

       net.inet.ip.alias.sctp.param_proc_limit:	25
	       Defines	the  maximum  number of	parameters within a chunk that
	       will be parsed in a packet.  As for other similar sysctl	 vari-
	       ables, larger values pose a DoS risk.

       net.inet.ip.alias.sctp.log_level: 0
	       Level  of  detail  in the system	log messages (0	- minimal, 1 -
	       event, 2	- info,	3 - detail, 4 -	debug, 5 - max debug).	May be
	       a good option in	high loss environments.

       net.inet.ip.alias.sctp.shutdown_time: 15
	       Timeout value while waiting for SHUTDOWN-COMPLETE.  This	 value
	       cannot be 0.

       net.inet.ip.alias.sctp.track_global_addresses: 0
	       Enables/disables	 global	IP address tracking within the nat and
	       places an upper limit on	the number of  addresses  tracked  for
	       each association:

	       0       Global tracking is disabled

	       >1      Enables	tracking,  the	maximum	 number	 of  addresses
		       tracked for each	association is limited to this value

	       This variable is	fully dynamic, the new value will  be  adopted
	       for  all	newly arriving associations, existing associations are
	       treated as they were previously.	 Global	tracking will decrease
	       the number of collisions	within the nat at a cost of  increased
	       processing  load,  memory  usage,  complexity, and possible nat
	       state problems in complex networks with multiple	nats.  We rec-
	       ommend not tracking global IP addresses,	this will still	result
	       in a fully functional nat.

       net.inet.ip.alias.sctp.up_timer:	300
	       Timeout value to	keep an	association up with no traffic.	  This
	       value cannot be 0.

       net.inet.ip.dummynet.codel.interval: 100000
	       Default	codel AQM interval in microseconds.  The value must be
	       in the range 1..5000000.

       net.inet.ip.dummynet.codel.target: 5000
	       Default codel AQM target	delay time in microseconds (the	 mini-
	       mum  acceptable	persistent queue delay).  The value must be in
	       the range 1..5000000.

       net.inet.ip.dummynet.expire: 1
	       Lazily delete dynamic pipes/queue once  they  have  no  pending
	       traffic.	 You can disable this by setting the variable to 0, in
	       which  case  the	 pipes/queues  will  only  be deleted when the
	       threshold is reached.

       net.inet.ip.dummynet.fqcodel.flows: 1024
	       Defines the default total number	of  flow  queues  (sub-queues)
	       that  fq_codel  creates	and manages.  The value	must be	in the
	       range 1..65536.

       net.inet.ip.dummynet.fqcodel.interval: 100000
	       Default fq_codel	scheduler/AQM interval in  microseconds.   The
	       value must be in	the range 1..5000000.

       net.inet.ip.dummynet.fqcodel.limit: 10240
	       The  default  hard size limit (in unit of packet) of all	queues
	       managed by an instance of the fq_codel  scheduler.   The	 value
	       must be in the range 1..20480.

       net.inet.ip.dummynet.fqcodel.quantum: 1514
	       The  default  quantum (credit) of the fq_codel in unit of byte.
	       The value must be in the	range 1..9000.

       net.inet.ip.dummynet.fqcodel.target: 5000
	       Default fq_codel	scheduler/AQM target delay time	 in  microsec-
	       onds  (the  minimum  acceptable	persistent  queue delay).  The
	       value must be in	the range 1..5000000.

       net.inet.ip.dummynet.fqpie.alpha: 125
	       The default alpha parameter (scaled by 1000) for	fq_pie	sched-
	       uler/AQM.  The value must be in the range 1..7000.

       net.inet.ip.dummynet.fqpie.beta:	1250
	       The  default  beta parameter (scaled by 1000) for fq_pie	sched-
	       uler/AQM.  The value must be in the range 1..7000.

       net.inet.ip.dummynet.fqpie.flows: 1024
	       Defines the default total number	of  flow  queues  (sub-queues)
	       that  fq_pie  creates  and  manages.   The value	must be	in the
	       range 1..65536.

       net.inet.ip.dummynet.fqpie.limit: 10240
	       The default hard	size limit (in unit of packet) of  all	queues
	       managed by an instance of the fq_pie scheduler.	The value must
	       be in the range 1..20480.

       net.inet.ip.dummynet.fqpie.max_burst: 150000
	       The  default  maximum period of microseconds that fq_pie	sched-
	       uler/AQM	does not drop/mark packets.  The value must be in  the
	       range 1..10000000.

       net.inet.ip.dummynet.fqpie.max_ecnth: 99
	       The  default maximum ECN	probability threshold (scaled by 1000)
	       for fq_pie scheduler/AQM.  The  value  must  be	in  the	 range
	       1..7000.

       net.inet.ip.dummynet.fqpie.quantum: 1514
	       The  default  quantum  (credit)	of the fq_pie in unit of byte.
	       The value must be in the	range 1..9000.

       net.inet.ip.dummynet.fqpie.target: 15000
	       The default target delay	of the fq_pie in unit of  microsecond.
	       The value must be in the	range 1..5000000.

       net.inet.ip.dummynet.fqpie.tupdate: 15000
	       The  default tupdate of the fq_pie in unit of microsecond.  The
	       value must be in	the range 1..5000000.

       net.inet.ip.dummynet.hash_size: 64
	       Default size of the hash	table used for	dynamic	 pipes/queues.
	       This  value  is	used  when no buckets option is	specified when
	       configuring a pipe/queue.

       net.inet.ip.dummynet.io_fast: 0
	       If set to a non-zero value, the "fast" mode of dummynet	opera-
	       tion (see above)	is enabled.

       net.inet.ip.dummynet.io_pkt
	       Number of packets passed	to dummynet.

       net.inet.ip.dummynet.io_pkt_drop
	       Number of packets dropped by dummynet.

       net.inet.ip.dummynet.io_pkt_fast
	       Number of packets bypassed by the dummynet scheduler.

       net.inet.ip.dummynet.max_chain_len: 16
	       Target  value  for the maximum number of	pipes/queues in	a hash
	       bucket.	The product max_chain_len*hash_size is used to	deter-
	       mine  the  threshold  over which	empty pipes/queues will	be ex-
	       pired even when net.inet.ip.dummynet.expire=0.

       net.inet.ip.dummynet.red_lookup_depth: 256

       net.inet.ip.dummynet.red_avg_pkt_size: 512

       net.inet.ip.dummynet.red_max_pkt_size: 1500
	       Parameters used in the computations of the drop probability for
	       the RED algorithm.

       net.inet.ip.dummynet.pie.alpha: 125
	       The default alpha parameter (scaled by 1000) for	pie AQM.   The
	       value must be in	the range 1..7000.

       net.inet.ip.dummynet.pie.beta: 1250
	       The  default  beta parameter (scaled by 1000) for pie AQM.  The
	       value must be in	the range 1..7000.

       net.inet.ip.dummynet.pie.max_burst: 150000
	       The default maximum period of microseconds that	pie  AQM  does
	       not  drop/mark  packets.	  The  value  must  be	in  the	 range
	       1..10000000.

       net.inet.ip.dummynet.pie.max_ecnth: 99
	       The default maximum ECN probability threshold (scaled by	 1000)
	       for pie AQM.  The value must be in the range 1..7000.

       net.inet.ip.dummynet.pie.target:	15000
	       The  default  target  delay  of pie AQM in unit of microsecond.
	       The value must be in the	range 1..5000000.

       net.inet.ip.dummynet.pie.tupdate: 15000
	       The default tupdate of pie AQM in  unit	of  microsecond.   The
	       value must be in	the range 1..5000000.

       net.inet.ip.dummynet.pipe_byte_limit: 1048576

       net.inet.ip.dummynet.pipe_slot_limit: 100
	       The  maximum queue size that can	be specified in	bytes or pack-
	       ets.  These limits prevent accidental exhaustion	 of  resources
	       such as mbufs.  If you raise these limits, you should make sure
	       the  system  is	configured  so	that  sufficient resources are
	       available.

       net.inet.ip.fw.autoinc_step: 100
	       Delta between rule  numbers  when  auto-generating  them.   The
	       value must be in	the range 1..1000.

       net.inet.ip.fw.curr_dyn_buckets:	net.inet.ip.fw.dyn_buckets
	       The  current  number  of	 buckets in the	hash table for dynamic
	       rules (readonly).

       net.inet.ip.fw.debug: 1
	       Controls	debugging messages produced by ipfw.

       net.inet.ip.fw.default_rule: 65535
	       The default rule	number (read-only).  By	the  design  of	 ipfw,
	       the  default rule is the	last one, so its number	can also serve
	       as the highest number allowed for a rule.

       net.inet.ip.fw.dyn_buckets: 256
	       The number of buckets in	the  hash  table  for  dynamic	rules.
	       Must  be	 a power of 2, up to 65536.  It	only takes effect when
	       all dynamic rules have expired, so you are  advised  to	use  a
	       flush command to	make sure that the hash	table is resized.

       net.inet.ip.fw.dyn_count: 3
	       Current number of dynamic rules (read-only).

       net.inet.ip.fw.dyn_keepalive: 1
	       Enables generation of keepalive packets for keep-state rules on
	       TCP  sessions.	A  keepalive is	generated to both sides	of the
	       connection every	5 seconds for the last 20 seconds of the life-
	       time of the rule.

       net.inet.ip.fw.dyn_max: 8192
	       Maximum number of dynamic rules.	 When you hit this  limit,  no
	       more dynamic rules can be installed until old ones expire.

       net.inet.ip.fw.dyn_ack_lifetime:	300

       net.inet.ip.fw.dyn_syn_lifetime:	20

       net.inet.ip.fw.dyn_fin_lifetime:	1

       net.inet.ip.fw.dyn_rst_lifetime:	1

       net.inet.ip.fw.dyn_udp_lifetime:	5

       net.inet.ip.fw.dyn_short_lifetime: 30
	       These  variables	 control  the lifetime,	in seconds, of dynamic
	       rules.  Upon the	initial	SYN  exchange  the  lifetime  is  kept
	       short,  then  increased after both SYN have been	seen, then de-
	       creased again during the	final FIN exchange or when  a  RST  is
	       received.   Both	 dyn_fin_lifetime and dyn_rst_lifetime must be
	       strictly	lower than 5 seconds,  the  period  of	repetition  of
	       keepalives.  The	firewall enforces that.

       net.inet.ip.fw.dyn_keep_states: 0
	       Keep  dynamic states on rule/set	deletion.  States are relinked
	       to default rule (65535).	 This can be handly  for  ruleset  re-
	       load.  Turned off by default.

       net.inet.ip.fw.one_pass:	1
	       When  set,  the	packet	exiting	from the dummynet pipe or from
	       ng_ipfw(4) node is not passed though the	firewall again.	  Oth-
	       erwise,	after  an  action,  the	 packet	is reinjected into the
	       firewall	at the next rule.

       net.inet.ip.fw.tables_max: 128
	       Maximum number of tables.

       net.inet.ip.fw.verbose: 1
	       Enables verbose messages.

       net.inet.ip.fw.verbose_limit: 0
	       Limits the number of messages produced by a verbose firewall.

       net.inet6.ip6.fw.deny_unknown_exthdrs: 1
	       If enabled packets with unknown IPv6 Extension Headers will  be
	       denied.

       net.link.bridge.ipfw: 0
	       Controls	 whether  bridged packets are passed to	ipfw.  Default
	       is no.

       net.inet.ip.fw.nat64_debug: 0
	       Controls	debugging messages produced by ipfw_nat64 module.

       net.inet.ip.fw.nat64_direct_output: 0
	       Controls	the output method used by ipfw_nat64 module:

	       0       A packet	is handled by ipfw twice.  First time an orig-
		       inal  packet  is	 handled  by  ipfw  and	 consumed   by
		       ipfw_nat64   translator.	  Then	translated  packet  is
		       queued via netisr to input processing again.

	       1       A packet	is handled by ipfw only	once, and after	trans-
		       lation it will be pushed	directly  to  outgoing	inter-
		       face.

INTERNAL DIAGNOSTICS
       There  are some commands	that may be useful to understand current state
       of certain subsystems inside kernel module.  These commands provide de-
       bugging output which may	change without notice.

       Currently the following commands	are available as internal sub-options:

       iflist  Lists all interface which are currently tracked	by  ipfw  with
	       their in-kernel status.

       monitor [filter-comment]
	       Capture	messages  from route(4)	socket,	that were logged using
	       rules with log logdst rtsock opcode.   Optional	filter-comment
	       can  be specified to show only those messages, that were	logged
	       by rules	with specific rule comment.

       talist  List all	table lookup algorithms	currently available.

EXAMPLES
       There are far too many possible uses of ipfw so this Section will  only
       give a small set	of examples.

   BASIC PACKET	FILTERING
       This   command  adds  an	 entry	which  denies  all  tcp	 packets  from
       cracker.evil.org	to the telnet port of wolf.tambov.su from  being  for-
       warded by the host:

	     ipfw add deny tcp from cracker.evil.org to	wolf.tambov.su telnet

       This  one disallows any connection from the entire cracker's network to
       my host:

	     ipfw add deny ip from 123.45.67.0/24 to my.host.org

       A first and efficient way to limit access (not using dynamic rules)  is
       the use of the following	rules:

	     ipfw add allow tcp	from any to any	established
	     ipfw add allow tcp	from net1 portlist1 to net2 portlist2 setup
	     ipfw add allow tcp	from net3 portlist3 to net3 portlist3 setup
	     ...
	     ipfw add deny tcp from any	to any

       The  first  rule	 will  be a quick match	for normal TCP packets,	but it
       will not	match the initial SYN packet, which will  be  matched  by  the
       setup  rules only for selected source/destination pairs.	 All other SYN
       packets will be rejected	by the final deny rule.

       If you administer one or	more subnets, you can take  advantage  of  the
       address	sets  and or-blocks and	write extremely	compact	rulesets which
       selectively enable services to blocks of	clients, as below:

	     goodguys="{ 10.1.2.0/24{20,35,66,18} or 10.2.3.0/28{6,3,11} }"
	     badguys="10.1.2.0/24{8,38,60}"

	     ipfw add allow ip from ${goodguys}	to any
	     ipfw add deny ip from ${badguys} to any
	     ... normal	policies ...

       Allow any transit packets coming	from single vlan 10 and	going  out  to
       vlans 100-1000:

	     ipfw add 10 allow out recv	vlan10 \
	     { xmit vlan1000 or	xmit "vlan[1-9]??" }

       The  verrevpath	option	could be used to do automated anti-spoofing by
       adding the following to the top of a ruleset:

	     ipfw add deny ip from any to any not verrevpath in

       This rule drops all incoming packets that appear	to be  coming  to  the
       system on the wrong interface.  For example, a packet with a source ad-
       dress  belonging	 to  a	host  on a protected internal network would be
       dropped if it tried to enter the	system from an external	interface.

       The antispoof option could be used to do	similar	 but  more  restricted
       anti-spoofing by	adding the following to	the top	of a ruleset:

	     ipfw add deny ip from any to any not antispoof in

       This  rule drops	all incoming packets that appear to be coming from an-
       other directly connected	system but on the wrong	interface.  For	 exam-
       ple,  a	packet	with a source address of 192.168.0.0/24, configured on
       fxp0, but coming	in on fxp1 would be dropped.

       The setdscp option could	be used	to (re)mark user  traffic,  by	adding
       the following to	the appropriate	place in ruleset:

	     ipfw add setdscp be ip from any to	any dscp af11,af21

   SELECTIVE MIRRORING
       If your network has network traffic analyzer connected to your host di-
       rectly  via dedicated interface or remotely via RSPAN vlan, you can se-
       lectively mirror	some Ethernet layer2 frames to the analyzer.

       First, make sure	your firewall is already configured and	 runs.	 Then,
       enable layer2 processing	if not already enabled:

	     sysctl net.link.ether.ipfw=1

       Next, load needed additional kernel modules:

	     kldload ng_ether ng_ipfw

       Optionally, make	system load these modules automatically	at startup:

	     sysrc kld_list+="ng_ether ng_ipfw"

       Next, configure ng_ipfw(4) kernel module	to transmit mirrored copies of
       layer2 frames out via vlan900 interface:

	     ngctl connect ipfw: vlan900: 1 lower

       Think  of  "1" here as of "mirroring instance index" and	vlan900	is its
       destination.  You can have arbitrary number  of	instances.   Refer  to
       ng_ipfw(4) for details.

       At  last,  actually  start mirroring of selected	frames using "instance
       1".  For	frames incoming	from em0 interface:

	     ipfw add ngtee 1 ip from any to 192.168.0.1 layer2	in recv	em0

       For frames outgoing to em0 interface:

	     ipfw add ngtee 1 ip from any to 192.168.0.1 layer2	out xmit em0

       For both	incoming and outgoing frames while flowing through em0:

	     ipfw add ngtee 1 ip from any to 192.168.0.1 layer2	via em0

       Make sure you do	not perform mirroring for already duplicated frames or
       kernel may hang as there	is no safety net.

   DYNAMIC RULES
       In order	to protect a site from flood attacks involving fake TCP	 pack-
       ets, it is safer	to use dynamic rules:

	     ipfw add check-state
	     ipfw add deny tcp from any	to any established
	     ipfw add allow tcp	from my-net to any setup keep-state

       This will let the firewall install dynamic rules	only for those connec-
       tion  which  start  with	a regular SYN packet coming from the inside of
       our network.  Dynamic rules are checked when encountering the first oc-
       currence	of a check-state, keep-state or	 limit	rule.	A  check-state
       rule should usually be placed near the beginning	of the ruleset to min-
       imize the amount	of work	scanning the ruleset.  Your mileage may	vary.

       For   more  complex  scenarios  with  dynamic  rules  record-state  and
       defer-action can	be used	to precisely control creation and checking  of
       dynamic	rules.	 Example  of  usage  of	 these options are provided in
       "NETWORK	ADDRESS	TRANSLATION (NAT)" Section.

       To limit	the number of connections a user can open you can use the fol-
       lowing type of rules:

	     ipfw add allow tcp	from my-net/24 to any setup limit src-addr 10
	     ipfw add allow tcp	from any to me setup limit src-addr 4

       The former (assuming it runs on a gateway) will allow each  host	 on  a
       /24  network  to	 open  at  most	10 TCP connections.  The latter	can be
       placed on a server to make sure that a single client does not use  more
       than 4 simultaneous connections.

       BEWARE: stateful	rules can be subject to	denial-of-service attacks by a
       SYN-flood  which	 opens a huge number of	dynamic	rules.	The effects of
       such attacks can	be partially limited by	acting on a set	 of  sysctl(8)
       variables which control the operation of	the firewall.

       Here  is	a good usage of	the list command to see	accounting records and
       timestamp information:

	     ipfw -at list

       or in short form	without	timestamps:

	     ipfw -a list

       which is	equivalent to:

	     ipfw show

       Next rule diverts all incoming packets from  192.168.2.0/24  to	divert
       port 5000:

	     ipfw divert 5000 ip from 192.168.2.0/24 to	any in

   TRAFFIC SHAPING
       The  following rules show some of the applications of ipfw and dummynet
       for simulations and the like.

       This rule drops random incoming packets with a probability of 5%:

	     ipfw add prob 0.05	deny ip	from any to any	in

       A similar effect	can be achieved	making use of dummynet pipes:

	     dnctl add pipe 10 ip from any to any
	     dnctl pipe	10 config plr 0.05

       We can use pipes	to artificially	limit bandwidth,  e.g.	on  a  machine
       acting  as  a router, if	we want	to limit traffic from local clients on
       192.168.2.0/24 we do:

	     ipfw add pipe 1 ip	from 192.168.2.0/24 to any out
	     dnctl pipe	1 config bw 300Kbit/s queue 50KBytes

       note that we use	the out	modifier so that the rule is not  used	twice.
       Remember	 in fact that ipfw rules are checked both on incoming and out-
       going packets.

       Should we want to simulate a bidirectional link with bandwidth  limita-
       tions, the correct way is the following:

	     ipfw add pipe 1 ip	from any to any	out
	     ipfw add pipe 2 ip	from any to any	in
	     dnctl pipe	1 config bw 64Kbit/s queue 10Kbytes
	     dnctl pipe	2 config bw 64Kbit/s queue 10Kbytes

       The  above  can	be very	useful,	e.g. if	you want to see	how your fancy
       Web page	will look for a	residential user who is	connected only through
       a slow link.  You should	not use	only one pipe for both directions, un-
       less you	want to	simulate a half-duplex medium (e.g. AppleTalk,	Ether-
       net, IRDA).  It is not necessary	that both pipes	have the same configu-
       ration, so we can also simulate asymmetric links.

       Should we want to verify	network	performance with the RED queue manage-
       ment algorithm:

	     ipfw add pipe 1 ip	from any to any
	     dnctl pipe	1 config bw 500Kbit/s queue 100	red 0.002/30/80/0.1

       Another	typical	application of the traffic shaper is to	introduce some
       delay in	the communication.  This can significantly affect applications
       which do	a lot of Remote	Procedure Calls, and where the round-trip-time
       of the connection often becomes a limiting factor much more than	 band-
       width:

	     ipfw add pipe 1 ip	from any to any	out
	     ipfw add pipe 2 ip	from any to any	in
	     dnctl pipe	1 config delay 250ms bw	1Mbit/s
	     dnctl pipe	2 config delay 250ms bw	1Mbit/s

       Per-flow	queueing can be	useful for a variety of	purposes.  A very sim-
       ple one is counting traffic:

	     ipfw add pipe 1 tcp from any to any
	     ipfw add pipe 1 udp from any to any
	     ipfw add pipe 1 ip	from any to any
	     dnctl pipe	1 config mask all

       The  above set of rules will create queues (and collect statistics) for
       all traffic.  Because the pipes have no limitations, the	only effect is
       collecting statistics.  Note that we need 3 rules, not  just  the  last
       one,  because  when ipfw	tries to match IP packets it will not consider
       ports, so we would not see connections on separate ports	 as  different
       ones.

       A  more sophisticated example is	limiting the outbound traffic on a net
       with per-host limits, rather than per-network limits:

	     ipfw add pipe 1 ip	from 192.168.2.0/24 to any out
	     ipfw add pipe 2 ip	from any to 192.168.2.0/24 in
	     dnctl pipe	1 config mask src-ip  0x000000ff  bw  200Kbit/s	 queue
	     20Kbytes
	     dnctl  pipe  2  config  mask dst-ip 0x000000ff bw 200Kbit/s queue
	     20Kbytes

   LOOKUP TABLES
       In the following	example, we need to create several  traffic  bandwidth
       classes	and  we	 need  different hosts/networks	to fall	into different
       classes.	 We create one pipe for	each class and configure them  accord-
       ingly.	Then  we create	a single table and fill	it with	IP subnets and
       addresses.  For each subnet/host	we set the argument equal to the  num-
       ber  of	the pipe that it should	use.  Then we classify traffic using a
       single rule:

	     dnctl pipe	1 config bw 1000Kbyte/s
	     dnctl pipe	4 config bw 4000Kbyte/s
	     ...
	     ipfw table	T1 create type addr
	     ipfw table	T1 add 192.168.2.0/24 1
	     ipfw table	T1 add 192.168.0.0/27 4
	     ipfw table	T1 add 192.168.0.2 1
	     ...
	     ipfw add pipe tablearg ip from 'table(T1)'	to any

       Using the fwd action, the table entries may include  hostnames  and  IP
       addresses.

	     ipfw table	T2 create type addr valtype ipv4
	     ipfw table	T2 add 192.168.2.0/24 10.23.2.1
	     ipfw table	T2 add 192.168.0.0/27 router1.dmz
	     ...
	     ipfw add 100 fwd tablearg ip from any to 'table(T2)'

       In the following	example	per-interface firewall is created:

	     ipfw table	IN create type iface valtype skipto,fib
	     ipfw table	IN add vlan20 12000,12
	     ipfw table	IN add vlan30 13000,13
	     ipfw table	OUT create type	iface valtype skipto
	     ipfw table	OUT add	vlan20 22000
	     ipfw table	OUT add	vlan30 23000
	     ..
	     ipfw  add 100 setfib tablearg ip from any to any recv 'table(IN)'
	     in
	     ipfw add 200 skipto tablearg ip from any to any recv  'table(IN)'
	     in
	     ipfw add 300 skipto tablearg ip from any to any xmit 'table(OUT)'
	     out

       The following example illustrate	usage of flow tables:

	     ipfw table	fl create type flow:src-ip,proto,dst-ip,dst-port
	     ipfw table	fl add 2001:db8:77::88,tcp,2001:db8:77::99,80 11
	     ipfw table	fl add 10.0.0.1,udp,10.0.0.2,53	12
	     ..
	     ipfw  add	100  allow ip from any to any flow 'table(fl,11)' recv
	     ix0

       The following example illustrate	masked table lookups  to  aid  uniform
       client distribution among multiple NAT instances:

	     # Configure NAT instances
	     ipfw nat 10 config	ip 192.0.2.0
	     ipfw nat 11 config	ip 192.0.2.1
	     ipfw nat 12 config	ip 192.0.2.2
	     ipfw nat 13 config	ip 192.0.2.3

	     ipfw table	mynats create type addr	valtype	nat
	     # Map external NAT	address	to NAT instance
	     ipfw table	mynats add 192.0.2.0 10
	     ipfw table	mynats add 192.0.2.1 11
	     ipfw table	mynats add 192.0.2.2 12
	     ipfw table	mynats add 192.0.2.3 13

	     # Map last	2 bits of client's IP address to NAT instance
	     ipfw table	mynats add 0.0.0.0 10
	     ipfw table	mynats add 0.0.0.1 11
	     ipfw table	mynats add 0.0.0.2 12
	     ipfw table	mynats add 0.0.0.3 13

	     # In -> Out NAT, zero out all bits	in a client's IP exept
	     # 2 least significant prior to table lookup
	     ipfw add nat tablearg ip from 10.0.0.0/24 to any
				     lookup src-ip4:0.0.0.3 mynats
	     # Out -> In NAT
	     ipfw add nat tablearg ip from any to 192.0.2.0/30
				     lookup dst-ip mynats

   SETS	OF RULES
       To add a	set of rules atomically, e.g. set 18:

	     ipfw set disable 18
	     ipfw add NN set 18	...	    # repeat as	needed
	     ipfw set enable 18

       To delete a set of rules	atomically the command is simply:

	     ipfw delete set 18

       To  test	 a ruleset and disable it and regain control if	something goes
       wrong:

	     ipfw set disable 18
	     ipfw add NN set 18	...	    # repeat as	needed
	     ipfw set enable 18; echo done; sleep 30 &&	ipfw set disable 18

       Here if everything goes well, you press control-C  before  the  "sleep"
       terminates,  and	 your ruleset will be left active.  Otherwise, e.g. if
       you cannot access your box, the ruleset	will  be  disabled  after  the
       sleep terminates	thus restoring the previous situation.

       To show rules of	the specific set:

	     ipfw set 18 show

       To show rules of	the disabled set:

	     ipfw -S set 18 show

       To clear	a specific rule	counters of the	specific set:

	     ipfw set 18 zero NN

       To delete a specific rule of the	specific set:

	     ipfw set 18 delete	NN

   NAT,	REDIRECT AND LSNAT
       First redirect all the traffic to nat instance 123:

	     ipfw add nat 123 all from any to any

       Then  to	 configure  nat	instance 123 to	alias all the outgoing traffic
       with ip 192.168.0.123, blocking all  incoming  connections,  trying  to
       keep  same  ports  on  both  sides,  clearing aliasing table on address
       change and keeping a log	of traffic/link	statistics:

	     ipfw nat 123 config ip 192.168.0.123 log deny_in reset same_ports

       Or to change address of instance	123, aliasing table  will  be  cleared
       (see reset option):

	     ipfw nat 123 config ip 10.0.0.1

       To see configuration of nat instance 123:

	     ipfw nat 123 show config

       To show logs of all instances:

	     ipfw nat show log

       To see configurations of	all instances:

	     ipfw nat show config

       Or a redirect rule with mixed modes could looks like:

	 ipfw nat 123 config redirect_addr 10.0.0.1 10.0.0.66
				  redirect_port	tcp 192.168.0.1:80 500
				  redirect_proto udp 192.168.1.43 192.168.1.1
				  redirect_addr	192.168.0.10,192.168.0.11
					     10.0.0.100	 # LSNAT
				  redirect_port	tcp 192.168.0.1:80,192.168.0.10:22
					     500	 # LSNAT

       or it could be split in:

	 ipfw nat 1 config redirect_addr 10.0.0.1 10.0.0.66
	 ipfw nat 2 config redirect_port tcp 192.168.0.1:80 500
	 ipfw nat 3 config redirect_proto udp 192.168.1.43 192.168.1.1
	 ipfw nat 4 config redirect_addr 192.168.0.10,192.168.0.11,192.168.0.12
						  10.0.0.100
	 ipfw nat 5 config redirect_port tcp
				 192.168.0.1:80,192.168.0.10:22,192.168.0.20:25	500

       Sometimes  you  may  want  to  mix  NAT and dynamic rules.  It could be
       achieved	with record-state and defer-action options.  Problem  is,  you
       need  to	 create	dynamic	rule before NAT	and check it after NAT actions
       (or vice	versa) to have consistent  addresses  and  ports.   Rule  with
       keep-state  option  will	 trigger activation of existing	dynamic	state,
       and action of such rule will be performed as soon as rule  is  matched.
       In  case	of NAT and allow rule packet need to be	passed to NAT, not al-
       lowed as	soon is	possible.

       There is	example	of set of rules	to achieve this.  Bear	in  mind  that
       this is example only and	it is not very useful by itself.

       On way out, after all checks place this rules:

	     ipfw add allow record-state defer-action
	     ipfw add nat 1

       And on way in there should be something like this:

	     ipfw add nat 1
	     ipfw add check-state

       Please  note,  that  first  rule	 on  way  out doesn't allow packet and
       doesn't execute existing	dynamic	rules.	All it does,  create  new  dy-
       namic  rule  with  allow	action,	if it is not created yet.  Later, this
       dynamic rule is used on way in by check-state rule.

   CONFIGURING CODEL, PIE, FQ-CODEL and	FQ-PIE AQM
       codel and pie AQM can be	configured for dummynet	pipe or	queue.

       To configure a pipe with	codel  AQM  using  default  configuration  for
       traffic from 192.168.0.0/24 and 1Mbits/s	rate limit, we do:

	     dnctl pipe	1 config bw 1mbits/s codel
	     ipfw add 100 pipe 1 ip from 192.168.0.0/24	to any

       To  configure a queue with codel	AQM using different configurations pa-
       rameters	for traffic from 192.168.0.0/24	and 1Mbits/s  rate  limit,  we
       do:

	     dnctl pipe	1 config bw 1mbits/s
	     dnctl queue 1 config pipe 1 codel target 8ms interval 160ms ecn
	     ipfw add 100 queue	1 ip from 192.168.0.0/24 to any

       To  configure a pipe with pie AQM using default configuration for traf-
       fic from	192.168.0.0/24 and 1Mbits/s rate limit,	we do:

	     dnctl pipe	1 config bw 1mbits/s pie
	     ipfw add 100 pipe 1 ip from 192.168.0.0/24	to any

       To configure a queue with pie AQM using different configuration parame-
       ters for	traffic	from 192.168.0.0/24 and	1Mbits/s rate limit, we	do:

	     dnctl pipe	1 config bw 1mbits/s
	     dnctl queue 1 config pipe 1 pie target 20ms tupdate 30ms ecn
	     ipfw add 100 queue	1 ip from 192.168.0.0/24 to any

       fq_codel	and fq_pie AQM can be configured for dummynet schedulers.

       To configure fq_codel scheduler using different configurations  parame-
       ters for	traffic	from 192.168.0.0/24 and	1Mbits/s rate limit, we	do:

	     dnctl pipe	1 config bw 1mbits/s
	     dnctl sched 1 config pipe 1 type fq_codel
	     dnctl queue 1 config sched	1
	     ipfw add 100 queue	1 ip from 192.168.0.0/24 to any

       To  change  fq_codel  default configuration for a sched such as disable
       ECN and change the target to 10ms, we do:

	     dnctl sched 1 config pipe 1 type fq_codel target 10ms noecn

       Similar to fq_codel, to configure fq_pie	scheduler using	different con-
       figurations parameters for traffic  from	 192.168.0.0/24	 and  1Mbits/s
       rate limit, we do:

	     dnctl pipe	1 config bw 1mbits/s
	     dnctl sched 1 config pipe 1 type fq_pie
	     dnctl queue 1 config sched	1
	     ipfw add 100 queue	1 ip from 192.168.0.0/24 to any

       The  configurations  of fq_pie sched can	be changed in a	similar	way as
       for fq_codel

SEE ALSO
       cpp(1),	 m4(1),	  fnmatch(3),	altq(4),    divert(4),	  dummynet(4),
       if_bridge(4),	ip(4),	  ipfirewall(4),    ng_ether(4),   ng_ipfw(4),
       protocols(5), services(5), init(8), kldload(8),	reboot(8),  sysctl(8),
       syslogd(8), sysrc(8)

HISTORY
       The  ipfw  utility  first appeared in FreeBSD 2.0.  dummynet was	intro-
       duced  in  FreeBSD  2.2.8.   Stateful  extensions  were	introduced  in
       FreeBSD 4.0.  ipfw2 was introduced in Summer 2002.

AUTHORS
       Ugen J. S. Antsilevich,
       Poul-Henning Kamp,
       Alex Nash,
       Archie Cobbs,
       Luigi Rizzo,
       Rasool Al-Saadi.

       API based upon code written by Daniel Boulet for	BSDI.

       Dummynet	has been introduced by Luigi Rizzo in 1997-1998.

       Some early work (1999-2000) on the dummynet traffic shaper supported by
       Akamba Corp.

       The  ipfw core (ipfw2) has been completely redesigned and reimplemented
       by Luigi	Rizzo in summer	2002.  Further actions and options  have  been
       added by	various	developers over	the years.

       In-kernel  NAT  support	written	 by Paolo Pisati <piso@FreeBSD.org> as
       part of a Summer	of Code	2005 project.

       SCTP nat	support	has been developed by The Centre for Advanced Internet
       Architectures (CAIA) <http://www.caia.swin.edu.au>.  The	primary	devel-
       opers and maintainers are David Hayes and Jason But.  For  further  in-
       formation visit:	<http://www.caia.swin.edu.au/urp/SONATA>

       Delay profiles have been	developed by Alessandro	Cerri and Luigi	Rizzo,
       supported  by  the  European  Commission	 within	 Projects  Onelab  and
       Onelab2.

       CoDel, PIE, FQ-CoDel and	FQ-PIE AQM for Dummynet	have been  implemented
       by  The Centre for Advanced Internet Architectures (CAIA) in 2016, sup-
       ported by The Comcast Innovation	Fund.  The primary developer is	Rasool
       Al-Saadi.

BUGS
       The syntax has grown over the years and sometimes it might  be  confus-
       ing.   Unfortunately,  backward compatibility prevents cleaning up mis-
       takes made in the definition of the syntax.

       !!! WARNING !!!

       Misconfiguring the firewall can put your	computer in an unusable	state,
       possibly	shutting down network services and requiring console access to
       regain control of it.

       Incoming	packet fragments diverted by divert are	reassembled before de-
       livery to the socket.  The action used on those packet is the one  from
       the rule	which matches the first	fragment of the	packet.

       Packets diverted	to userland, and then reinserted by a userland process
       may  lose  various packet attributes.  The packet source	interface name
       will be preserved if it is  shorter  than  8  bytes  and	 the  userland
       process	saves and reuses the sockaddr_in (as does natd(8)); otherwise,
       it may be lost.	If a packet is reinserted in this manner, later	 rules
       may  be	incorrectly  applied,  making the order	of divert rules	in the
       rule sequence very important.

       Dummynet	drops all packets with IPv6 link-local addresses.

       Rules using uid or gid may not behave as	expected.  In particular,  in-
       coming  SYN  packets  may have no uid or	gid associated with them since
       they do not yet belong to a TCP connection, and the uid/gid  associated
       with  a	packet	may not	be as expected if the associated process calls
       setuid(2) or similar system calls.

       Rule syntax is subject to the command line environment  and  some  pat-
       terns may need to be escaped with the backslash character or quoted ap-
       propriately.

       Due to the architecture of libalias(3), ipfw nat	is not compatible with
       the TCP segmentation offloading (TSO).  Thus, to	reliably nat your net-
       work traffic, please disable TSO	on your	NICs using ifconfig(8).

       ICMP error messages are not implicitly matched by dynamic rules for the
       respective conversations.  To avoid failures of network error detection
       and  path MTU discovery,	ICMP error messages may	need to	be allowed ex-
       plicitly	through	static rules.

       Rules using call	and return actions may lead to confusing behaviour  if
       ruleset	has  mistakes,	and/or interaction with	other subsystems (net-
       graph, dummynet,	etc.) is used.	One possible case for this  is	packet
       leaving ipfw in subroutine on the input pass, while later on output en-
       countering unpaired return first.  As the call stack is kept intact af-
       ter  input pass,	packet will suddenly return to the rule	number used on
       input pass, not on output one.  Order of	processing should  be  checked
       carefully to avoid such mistakes.

FreeBSD	ports 15.1		 March 1, 2026			       IPFW(8)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=ipfw&sektion=8&manpath=FreeBSD+15.1-RELEASE+and+Ports>

home | help