-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. |
|