| -a   |  While listing, show counter values. The  show command just implies 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., without the optional "ip from any to any" string when this does not carry any additional information.  | 
 | -d   |  While listing, show dynamic rules in addition to static ones.  | 
 | -e   |  While listing, if the -d  option was specified, also show expired dynamic rules.  | 
 | -f   |  Do not ask for confirmation for commands that can cause problems if misused, i.e. flush. If there is no tty associated with the process, this is implied.  | 
 | -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   |  While  add ing,  zero ing,  resetlog ging or  flush ing, be quiet about actions (implies -f ). This is useful for adjusting rules by executing multiple ipfw commands in a script (e.g., sh /etc/rc.firewall), or by processing a file of many ipfw rules across a remote login session. If a  flush is performed in normal (verbose) mode (with the default kernel configuration), it prints a message. Because all rules are flushed, the message might not be delivered to the login session, causing the remote login session to be closed and the remainder of the ruleset to not be processed. Access to the console would then be required to recover.  | 
 | -S   |  While listing rules, show the  set each rule belongs to. If this flag is not specified, disabled rules will not be listed.  | 
 | -s  [field]  | 
|   |  While listing pipes, sort according to one of the four counters (total or current packets or bytes).  | 
 | -t   |  While listing, show last match timestamp (converted with ctime()).  | 
 | -T   |  While listing, show last match timestamp (as seconds from the epoch). This form can be more convenient for postprocessing by scripts.  | 
 |
  Note that some of the above information, e.g. source MAC or IP addresses and TCP/UDP ports, could easily be spoofed, so filtering on those fields alone might not guarantee the desired results. 
 |  allow | accept | pass | permit  | 
|   |  Allow packets that match rule. The search terminates.  | 
 |  check-state  | 
|   |  Checks the packet against the dynamic ruleset. If a match is found, execute the action associated with the rule which generated 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.  | 
 |  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 [,port]  | 
|   |  Change the next-hop on matching packets to  ipaddr, which can be an IP address or a host name. 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 layer-2 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 unmodified, 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 local address of the socket will be set to the original destination address of the packet. This makes the netstat(1) entry look rather weird but is intended for use with transparent proxy servers.   To enable  fwd a custom kernel needs to be compiled with the option  .Cd "options IPFIREWALL_FORWARD" . With the additional option  .Cd "options IPFIREWALL_FORWARD_EXTENDED" all safeguards are removed and it also makes it possible to redirect packets destined to locally configured IP addresses. Please note that such rules apply to locally generated packets as well and great care is required to ensure proper behaviour for automatically generated packets like ICMP message size exceeded and others.   | 
 |  pipe pipe_nr  | 
|   |  Pass packet to a dummynet(4) "pipe" (for bandwidth limitation, delay, etc.). See the  TRAFFIC SHAPER (DUMMYNET) CONFIGURATION Section for further information. The search terminates; however, 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(4) "queue" (for bandwidth limitation using 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  | 
|   |  Skip all subsequent rules numbered less than  number. The search continues with the first rule numbered  number or higher.  | 
 |  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  | 
|   |  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 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 terminates. If packet is later returned from netgraph it is either 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 is either accepted or continues with the next rule, depending on  net.inet.ip.fw.one_pass sysctl variable. See ng_ipfw(4) for more information on  netgraph and  ngtee actions.  | 
 |
      
    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 parentheses ( ) 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 address 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  ipfw1. In  ipfw2 any match pattern (including MAC headers, IP protocols, addresses and ports) can be specified in the  options section. 
 Rule fields have the following meaning: 
 No support for sets of IPv6 addresses is provided because IPv6 addresses are typically random past the initial prefix. 
 |  // this is a comment.  | 
|   |  Inserts the specified text as a comment in the rule. Everything 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.  | 
 |  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 address(es) specified as argument.  | 
 |  Bro dst-ip6 | dst-ipv6 Brc ip6-address  | 
|   |  Matches IPv6 packets whose destination IP is one of the address(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), Source routing (route), Destination options (dstopt), IPSec authentication headers (ah), and IPSec encapsulated security payload headers (esp).   | 
 |  flow-id labels  | 
|   |  Matches IPv6 packets containing any of the flow labels given in  labels.  labels is a comma seperate list of numeric flow labels.  | 
 |  frag  |  Matches packets that are fragments and not the first fragment of an IP datagram. Note that these packets will not have the next protocol header (e.g. TCP, UDP) so options that look into these headers cannot match.  | 
 |  gid group  | 
|   |  Matches all TCP or UDP packets sent by or received for a  group. A  group may be specified by name or number. This option should be used only if debug.mpsafenet=0 to avoid possible deadlocks due to layering violations in its implementation.  | 
 |  jail prisonID  | 
|   |  Matches all TCP or UDP packets sent by or received for the jail whos prison ID is  prisonID. This option should be used only if debug.mpsafenet=0 to avoid possible deadlocks due to layering violations in its implementation.  | 
 |  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), information request (15), information reply (16), address mask request (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 IPSEC_FILTERGIF option, 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 separated 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_CE). The absence of a particular type may be denoted with a !.   | 
 |  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  | 
|   |  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.  | 
 |  layer2  | 
|   |  Matches only layer2 packets, i.e., those passed to ipfw from ether_demux() and ether_output_frame().  | 
 |  limit Bro src-addr | src-port | dst-addr | dst-port Brc N  | 
|   |  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. Currently, only IPv4 flows are supported.  | 
 |  { MAC | mac } dst-mac src-mac  | 
|   |  Match packets with a given  dst-mac and  src-mac addresses, specified as the  any keyword (matching any MAC address), or six groups of hex digits separated by colons, and optionally followed by a mask indicating the significant bits. The mask may be specified using either of the following methods:  - 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"      - 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 symbolic resolution will be attempted).  | 
 |  proto protocol  | 
|   |  Matches packets with the corresponding IP protocol.  | 
 |  recv | xmit | via Brq ifX | if * | ipno | any  | 
|   |  Matches packets received, transmitted or going through, respectively, the interface specified by exact name ( ifX ), by device name ( if * ), by IP address, or through some interface.   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 outgoing packets. So  out is required (and  in is invalid) whenever  xmit is used.   A packet may not have a receive or transmit interface: packets originating from the local host have no receive interface, while packets destined for the local host have no transmit interface.   | 
 |  setup  |  Matches TCP packets that have the SYN bit set but no ACK bit. This is the short form of "tcpflags syn,!ack".  | 
 |  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.  | 
 |  tcpack ack  | 
|   |  TCP packets only. Match if the TCP header acknowledgment number 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.   | 
 |  tcpseq seq  | 
|   |  TCP packets only. Match if the TCP header sequence number field is set to  seq.  | 
 |  tcpwin win  | 
|   |  TCP packets only. Match if the TCP header window field is set to  win.  | 
 |  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. This option should be used only if debug.mpsafenet=0 to avoid possible deadlocks due to layering violations in its implementation.  | 
 |  verrevpath  | 
|   |  For incoming packets, a routing table lookup is done on the packets 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 similar 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 packets source address. If a route to the source address exists, 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 similar 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 packets 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 network but do not come in through that interface. This option is similar to but more restricted than  verrevpath because it engages only on packets with source addresses of directly connected networks instead of all source addresses.   | 
 |
  |  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 further classified into multiple flows, each of which is then sent to a different  dynamic pipe or queue. A flow identifier is constructed 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 parents 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 simulate loss or congestion at a remote router.     | 
 |  plr packet-loss-rate  | 
|   |  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. The loss rate is internally represented on 31 bits.     | 
 |  queue Brq slots | size Kbytes  | 
|   |  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.     | 
 |  red | gred w_q / min_th / max_th / max_p  | 
|   |  Make use of the RED (Random Early Detection) queue management algorithm.  w_q and  max_p are floating point numbers between 0 and 1 (0 not included), while  min_th and  max_th are integer numbers specifying thresholds for queue management (thresholds are computed in bytes if the queue has been defined in bytes, in slots otherwise). The dummynet(4) also supports the gentle RED variant (gred). 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).  | 
 |
  |  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.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.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 determine the threshold over which empty pipes/queues will be expired 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.fw.autoinc_step: 100  | 
|   |  Delta between rule numbers when auto-generating them. The value must be in the range 1..1000. This variable is only present in  ipfw2, the delta is hardwired to 100 in  ipfw1.  | 
 |  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.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 lifetime 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 decreased 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.enable: 1  | 
|   |  Enables the firewall. Setting this variable to 0 lets you run your machine without firewall even if compiled in.  | 
 |  net.inet.ip.fw.one_pass: 1  | 
|   |  When set, the packet exiting from the dummynet(4) pipe or from ng_ipfw(4) node is not passed though the firewall again. Otherwise, after an action, the packet is reinjected into the firewall at the next rule.  | 
 |  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.ether.ipfw: 0  | 
|   |  Controls whether layer-2 packets are passed to ipfw. Default is no.  | 
 |  net.link.ether.bridge_ipfw: 0  | 
|   |  Controls whether bridged packets are passed to ipfw. Default is no.  | 
 |
  |  Syntax and flags  | 
|   |   ipfw1 does not support the -n flag (only test syntax), nor does it allow spaces after commas or support all rule fields in a single argument.  ipfw1 does not allow the -f flag (force) in conjunction with the -p flag (preprocessor).  ipfw1 does not support the -c (compact) flag.  | 
 |  Handling of non-IPv4 packets  | 
|   |   ipfw1 will silently accept all non-IPv4 packets (which  ipfw1 will only see when  net.link.ether.bridge_ipfw=1).  ipfw2 will filter all packets (including non-IPv4 ones) according to the ruleset. To achieve the same behaviour as  ipfw1 you can use the following as the very first rule in your ruleset:         "ipfw add 1 allow layer2 not mac-type ip"    The  layer2 option might seem redundant, but it is necessary -- packets passed to the firewall from layer3 will not have a MAC header, so the  mac-type ip pattern will always fail on them, and the  not operator will make this rule into a pass-all.   | 
 |  Addresses  | 
|   |   ipfw1 does not support address sets or lists of addresses.     | 
 |  Port specifications  | 
|   |   ipfw1 only allows one port range when specifying TCP and UDP ports, and is limited to 10 entries instead of the 30 allowed by  ipfw2. Also, in  ipfw1 you can only specify ports when the rule is requesting  tcp or  udp packets. With  ipfw2 you can put port specifications in rules matching all packets, and the match will be attempted only on those packets carrying protocols which include port identifiers.   Finally,  ipfw1 allowed the first port entry to be specified as  port:mask where  mask can be an arbitrary 16-bit mask. This syntax is of questionable usefulness and it is not supported anymore in  ipfw2.   | 
 |  Or-blocks  | 
|   |   ipfw1 does not support Or-blocks.  | 
 |  keepalives  | 
|   |   ipfw1 does not generate keepalives for stateful sessions. As a consequence, it might cause idle sessions to drop because the lifetime of the dynamic rules expires.  | 
 |  Sets of rules  | 
|   |   ipfw1 does not implement sets of rules.  | 
 |  MAC header filtering and Layer-2 firewalling.  | 
|   |   ipfw1 does not implement filtering on MAC header fields, nor is it invoked on packets from  ether_demux() and  ether_output_frame(). The sysctl variable  net.link.ether.ipfw has no effect there.  | 
 |  Options  | 
|   |  In  ipfw1, the following options only accept a single value as an argument:    ipid, iplen, ipttl   The following options are not implemented by  ipfw1:    dst-ip, dst-port, layer2, mac, mac-type, src-ip, src-port.   Additionally, the RELENG_4 version of  ipfw1 does not implement the following options:    ipid, iplen, ipprecedence, iptos, ipttl,  ipversion, tcpack, tcpseq, tcpwin.   | 
 |  Dummynet options  | 
|   |  The following option for  dummynet pipes/queues is not supported:  noerror.  | 
 |  IPv6 Support  | 
|   |  There was no IPv6 support in  ipfw1.  | 
 |