ipfw(8)
NAME
ipfw - IP firewall and traffic shaper control program
SYNOPSIS
ipfw [-cq] add rule ipfw [-acdefnNStT] {list | show} [rule | first-last ...] ipfw [-f | -q] flush ipfw [-q] {delete | zero | resetlog} [set] [number ...] ipfw enable {firewall | altq | one_pass | debug | verbose dyn_keepalive} ipfw disable {firewall | altq | one_pass | debug | verbose dyn_keepalive} ipfw set [disable number ...] [enable number ...] ipfw set move [rule] number to number ipfw set swap number number ipfw set show ipfw table number add addr[/masklen] [value] ipfw table number delete addr[/masklen] ipfw table number flush ipfw table number list ipfw {pipe | queue} number config config-options ipfw [-s [field]] {pipe | queue} {delete | list | show} [number ...] ipfw [-cfnNqS] [-p preproc [preproc-flags]] pathname
DESCRIPTION
- The ipfw utility is the user interface for controlling the
- ipfw(4) firewall and the dummynet(4) traffic shaper in FreeBSD.
- An ipfw configuration, or ruleset, is made of a list of
- rules numbered
from 1 to 65535. Packets are passed to ipfw from a number - of different
places in the protocol stack (depending on the source and - destination of
the packet, it is possible that ipfw is invoked multiple - times on the
same packet). The packet passed to the firewall is compared - against each
of the rules in the firewall ruleset. 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. - An ipfw 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 de
- pending on how
the kernel is configured. - If the ruleset includes one or more rules with the
- keep-state or limit
option, then ipfw assumes a stateful behaviour, i.e., upon a - match it
will create dynamic rules matching the exact parameters (ad - dresses and
ports) of the matching packet. - These 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.
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 in - dicating the
time of the last match. Counters can be displayed or reset - with ipfw
commands. - Rules can be added with the add command; deleted individual
- ly or in
groups with the delete command, and globally (except those - in set 31)
with the flush command; displayed, optionally with the con - tent of the
counters, using the show and list commands. Finally, coun - ters can be
reset with the zero and resetlog commands. - Also, each rule belongs to one of 32 different sets , and
- there are ipfw
commands to atomically manipulate sets, such as enable, dis - able, 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. - The following options are available:
- -a While listing, show counter values. The show com
- mand 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 com
- pact 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 associ
- ated with the
process, this is implied. - -n Only check syntax of the command strings, without
- actually pass
- ing them to the kernel.
- -N Try to resolve addresses and service names in out
- put.
- -q While adding, zeroing, resetlogging or flushing, 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 con - figuration), 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 post
- processing by
scripts. - 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 - arguments to
the ipfw utility. - Optionally, a preprocessor can be specified using -p preproc
- where
pathname is to be piped through. Useful preprocessors in - clude 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 as passed on to - the preprocessor for interpretation. This allows for flexible config
- uration files
(like conditionalizing them on the local hostname) and the - use of macros
to centralize frequently required arguments like IP address - es.
- The ipfw pipe and queue commands are used to configure the
- traffic
shaper, as shown in the TRAFFIC SHAPER (DUMMYNET) - CONFIGURATION Section
below. - 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 ad
- versely effect
the booting process. You can use ipfw disable firewall to - temporarily
disable the firewall to regain access to the network, allow - ing 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.in
- et.ip.fw.enable=1
^ V- [ether_demux] [ether_output_frame]
- net.link.ether.ipfw=1
+-->--[bdg_forward]-->--+- net.link.ether.bridge_ipfw=1
^ V
| to devices - As can be noted from the above picture, 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 in - spection.
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 ruleset, irrespective of the place where the check occurs, or
- the source of
the packet. If a rule contains some match patterns or ac - tions 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 differentiate - among the possible places. skipto rules can be useful here, as an exam
- ple:
# 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_demux
and bdg_forward).
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).
- In ipfw2 you can introduce spaces after commas ',' 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 equivalent:
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 ipfw rules is the following:
- [rule_number] [set set_number] [prob
- match_probability]
action [log [logamount number]] [altq queue] body
- where the body of the rule specifies which information is
- used for filtering packets, among the following:
Layer-2 header fields When available
IPv4 and IPv6 Protocol 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, data
gram length, identification,
fragment flag (nonzero IP offset), Time To Live - IP options
IPv6 Extension headers Fragmentation, Hop - by-Hop
options, sourcerouting, IPSec
options. - IPv6 Flow-ID
Misc. TCP header fields TCP flags (SYN, - FIN, ACK, RST,
etc.), sequencenumber, acknowledgment 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 localsocket.
- Divert status Whether a packet
- came from a
divert socket(e.g., natd(8)).
- 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. - 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 assigned by incrementing - the last nondefault rule number by the value of the sysctl vari
- able
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 parameter
is of fundamental importance for atomic ruleset ma - nipulation. 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 proba
- bility (floating
point number between 0 and 1). This can be useful - for a number
of applications such as random packet drop or (in - conjunction
with dummynet(4)) to simulate the effect of multiple - paths leading to out-of-order packet delivery.
- Note: this condition is checked before any other
- condition,
including ones such as keep-state or check-state - which might have
side effects. - log [logamount number]
- When a packet matches a rule with the log keyword, a
- message will
be logged to syslogd(8) with a LOG_SECURITY facili - ty. The logging only occurs if the sysctl variable
- net.inet.ip.fw.verbose is
set to 1 (which is the default when the kernel is - compiled with
IPFIREWALL_VERBOSE) and the number of packets logged - so far for
that particular rule does not exceed the logamount - parameter. If
no logamount is specified, the limit is taken from - the sysctl
variable net.inet.ip.fw.verbose_limit. In both cas - es, a value of
0 removes the logging limit. - Once the limit is reached, logging can be re-enabled
- by clearing
the logging counter or the packet counter for that - entry, see the
resetlog command. - Note: logging is done after all other packet match
- ing conditions
have been successfully verified, and before perform - ing the final
action (accept, deny, etc.) on the packet. - 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 pack - ets going
"out" of IPFW, and not being rejected or going to - divert sockets.
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 ex - ample,
check-state and keep-state rules may come later and - provide the
actual filtering decisions in addition to the fall - back 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 disci - plines are
rearranged, the rules in containing the queue iden - tifiers in the
kernel will likely have gone stale and need to be - reloaded.
Stale queue identifiers will probably result in mis - classification.
- 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 traf - fic 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
- 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 con
- tinues 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 num - ber (if specified) is ignored, and the packet will be forwarded
- to the remote
address, using the route as found in the local rout - ing table for
that IP.
A fwd rule will not match layer-2 packets (those re - ceived 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 un - modified, 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 destina - tion 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 options IPFIREWALL_FORWARD. With the addi - tional option
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 automatical - ly 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 termi - nates; 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 band
- width 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 di
- vert(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, de - pending 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 (im - plicit) and
operators -- i.e., all must match in order for the rule to - match. Individual patterns can be prefixed by the not operator to re
- verse 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 advis - able to put a
backslash in front of them to prevent such interpretations. - The body of a rule must in general include a source and des
- tination
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 com
- patibility with
earlier versions of FreeBSD. In modern FreeBSD any match - pattern
(including MAC headers, IP protocols, addresses and ports) - can be specified 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 acomplete list
see /etc/protocols), or one of the following keywords:ip4 | ipv4Matches 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 pro
- vided for convenience only but its use is deprecated.
- src and dst: {addr | { addr or ... }} [[not] ports]
- An address (or a list, see below) optionally fol
- lowed by ports
specifiers. - The second format (or-block with multiple addresses)
- is provided
for convenience only and its use is discouraged. - addr: [not] {any | me | me6 table(number[,value])
- 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 sys
- tem. The address list is evaluated at the time the
- packet is
analysed. - table(number[,value])
- Matches any IPv4 address for which an entry exists
- in the lookup
table number. If an optional 32-bit unsigned value - is also specified, an entry will match only if it has this val
- ue. 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 asdotted-quad
or a hostname. Hostnames are resolved atthe time the
rule is added to the firewall list. - addr/masklen
- Matches all addresses with base addr (speci
- fied as an IP
address or a hostname) and mask width of - masklen bits.
As an example, 1.2.3.4/25 will match all IP - numbers from
1.2.3.0 to 1.2.3.127 . - addr:mask
- Matches all addresses with base addr (speci
- fied as an IP
address or a hostname) and the mask of mask, - specified as
a dotted quad. As an example, - 1.2.3.4:255.0.255.0 will
match 1.*.3.*. 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. - addr-set: addr[/masklen]{list}
- list: {num | num-num}[,list]
- Matches all addresses with base address addr (speci
- fied as an IP
address or a hostname) and whose last byte is in the - list between
braces { } . Note that there must be no spaces be - tween braces
and numbers (spaces after commas are allowed). Ele - ments of the
list can be specified as single entries or ranges. - The masklen
field is used to limit the size of the set of ad - dresses, 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 re
- duces the complexity of rulesets.
As an example, an address specified as - 1.2.3.4/24{128,35-55,89}
will match the following IP addresses:
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 byinet_pton(3)
or a hostname. Hostnames are resolved atthe time the
rule is added to the firewall list. - addr/masklen
- Matches all IPv6 addresses with base addr
- (specified as
allowed by inet_pton or a hostname) and mask - width of
masklen bits. - No support for sets of IPv6 addresses is provided
- because IPv6
addresses are typically random past the initial pre - fix.
- ports: {port | port-port}[,ports]
- For protocols which support port numbers (such as
- 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 (including
boundaries). - Service names (from /etc/services) may be used in
- stead of numeric
port values. The length of the port list is limited - to 30 ports
or ranges, though one can specify larger ranges by - using an
or-block in the options section of the rule. - A backslash (`´) can be used to escape the dash
- (`-') character
in a service name (from a shell, the backslash must - be typed
twice to avoid the shell itself interpreting it as - an escape
character).
ipfw add count tcp from any ftp-data-ftp toany - 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 de - tails on matching
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 alpha
- betical order):
- // this is a comment.
Inserts the specified text as a comment in the rule.Everything
following // is considered as a comment and storedin the rule.
You can have comment-only rules, which are listed ashaving 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. - {dst-ip6 | dst-ipv6} 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 authen - tication headers (ah), and IPSec encapsulated security payload
- headers (esp).
- flow-id labels
- Matches IPv6 packets containing any of the flow la
- bels 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 individ - ual 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 in - dividual 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 in
- cluded 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 speci
- fying 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 process
- ing 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 sup - ported IP types
of service are: - lowdelay (IPTOS_LOWDELAY), throughput (IP
- TOS_THROUGHPUT),
reliability (IPTOS_RELIABILITY), mincost (IPTOS_MIN - COST),
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 proto - col. 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 {src-addr | src-port | dst-addr | dst-port} 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 ad
- dresses, 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: - 1. A slash (/) followed by the number of sig
- nificant 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 spec
- ified 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 spe
- cial meaning
in many shells and should generally be es - caped.
- 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 corre - sponds to one of
those specified as argument. mac-type is specified - in the same
way as port numbers (i.e., one or more comma-sepa - rated 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 {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 inter - face.
- 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 inter
- face: packets
originating from the local host have no receive in - terface, 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 acknowl - edgment 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 sup - ported TCP
flags are: - fin, syn, rst, psh, ack and urg. The absence of a
- particular
flag may be denoted with a `!'. A rule which con - tains 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 ad
- vertisement),
sack (selective ack), ts (rfc1323 timestamp) and cc - (rfc1644
t/tcp connection count). The absence of a particu - lar 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 num - ber. This
option should be used only if debug.mpsafenet=0 to - avoid possible
deadlocks due to layering violations in its imple - mentation.
- 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 inten
- tionally 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 inter - face. 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
exists, but not the default route or a blackhole/re - ject route,
the packet matches. Otherwise, the packet does not - match. All
outgoing packets match. - The name and functionality of the option is inten
- tionally 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 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 - network 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 connected - networks
instead of all source addresses.
LOOKUP TABLES
- Lookup tables are useful to handle large sparse address
- sets, typically
from a hundred to several thousands of entries. There may - be up to 128
different lookup tables, numbered 0 to 127. - Each entry is represented by an addr[/masklen] and will
- match all
addresses with base addr (specified as an IP address or a - hostname) and
mask width of masklen bits. If masklen is not specified, it - defaults to
32. When looking up an IP address in a table, the most spe - cific entry
will match. Associated with each entry is a 32-bit unsigned - value, which
can optionally be checked by a rule matching code. When - adding an entry,
if value is not specified, it defaults to 0. - An entry can be added to a table (add), removed from a table
- (delete), a
table can be examined (list) or flushed (flush). - Internally, each table is stored in a Radix tree, the same
- way as the
routing table (see route(4)). - Lookup tables currently support IPv4 addresses only.
- The tablearg feature provides the ability to use a value,
- looked up in
the table, as the argument for a rule action. This can sig - nificantly
reduce number of rules in some configurations. The tablearg - argument can
be used with the following actions: pipe, queue, divert, - tee, netgraph,
ngtee. See the EXAMPLES Section for example usage of tables - and the
tablearg keyword.
SETS OF RULES
- Each rule belongs to one of 32 different sets , numbered 0
- to 31. Set 31
is reserved for the default rule. - By default, rules are put in set 0, unless you use the set N
- attribute
when entering a new rule. 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 atomi
- cally) switch
between them. 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 default,
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 - dynamic
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-setSee 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
and limit options of rules. - Dynamic rules are created when a packet matches a keep-state
- or 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). Dynamic rules will be checked at the first - check-state,
keep-state or limit occurrence, and the action performed up - on a match
will be the same as in the parent rule. - Note that no additional attributes other than protocol and
- IP addresses
and ports are checked on dynamic rules. - The typical use of dynamic rules is to keep a closed fire
- wall configuration, but let the first TCP SYN packet from the inside net
- work install a
dynamic rule for the flow so that packets belonging to that - session will
be allowed through the firewall:
ipfw add check-state
ipfw add allow tcp from my-subnet to any setup keep- state
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
ipfw add allow udp from my-subnet to any keep-state
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(4) traffic
- shaper.
- dummynet operates by first using the firewall to classify
- packets and
divide them into flows, using any match pattern that can be - used in ipfw
rules. Depending on local policies, a flow can contain - packets for a
single TCP connection, or from/to a given host, or entire - subnet, or a
protocol type, etc. - Packets belonging to the same flow are then passed to either
- of two different objects, which implement the traffic regulation:
pipe A pipe emulates a link with given bandwidth,- propagation
delay, queue size and packet loss rate. Packets - are queued
in front of the pipe as they come out from the - classifier,
and then transferred to the pipe according to - the pipe's
parameters. - queue A queue is an abstraction used to implement the
- WF2Q+ (Worst
case Fair Weighted Fair Queueing) policy, which - is an efficient variant of the WFQ policy.
The queue associates a weight and a reference - pipe to each
flow, and then all backlogged (i.e., with pack - ets queued)
flows linked to the same pipe share the pipe's - bandwidth proportionally to their weights. Note that weights
- are not priorities; a flow with a lower weight is still
- guaranteed to
get its fraction of the bandwidth even if a flow - with a
higher weight is permanently backlogged. - 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 flow
share the available bandwidth. - The pipe and queue configuration commands are the following:
pipe number config pipe-configuration- queue number config queue-configuration
- The following parameters can be configured for a pipe:
- bw bandwidth | device
Bandwidth, measured in [K|M]{bit/s|Byte/s}. - A value of 0 (default) means unlimited bandwidth.
- The unit must
immediately follow the number, as in
ipfw pipe 1 config bw 300Kbit/s- If a device name is specified instead of a numeric
- value, as in
ipfw 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 - functionality,
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 (typ - ically 10ms,
but it is a good practice to run kernels with ``op - tions HZ=1000''
to reduce the granularity to 1ms or less). Default - value is 0,
meaning no delay. - 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.
- 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 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 proto
- col 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 ob - ject, 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 sig
- nificant.
- 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. Set - ting 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 {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 maxsized 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 be
- tween 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 be - haviour:
- net.inet.ip.dummynet.red_lookup_depth specifies the accuracy in computing the aver
- age 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). - When used with IPv6 data, dummynet currently has several
- limitations.
First, debug.mpsafenet=0 must be set. Second, the informa - tion necessicary to route link-local packets to an interface is not
- avalable after
processing by dummynet so those packets are dropped in the - output path.
Care should be taken to insure that link-local packets are - not passed to
dummynet.
CHECKLIST
- Here are some important points to consider when designing
- your rules:
- +o Remember that you filter both packets going in and out.
- Most connec
tions need packets going in both directions. - +o Remember to test very carefully. It is a good idea to
- be near the
console when doing this. If you cannot be near the con - sole, use an
auto-recovery script such as the one in
/usr/share/examples/ipfw/change_rules.sh. - +o Do not forget the loopback interface.
FINE POINTS
- +o 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 da - ta in the
packet to produce a meaningful log entry. - +o 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 enabled,
these packets are reported as being dropped by rule -1. - +o If you are logged in over a network, loading the kld(4)
- version of
ipfw is probably not as straightforward as you would - think. I recommend the following command line:
kldload ipfw && ipfw add 32000 al- low ip from any to any
- Along the same lines, doing an
ipfw flush- in similar surroundings is also a bad idea.
- +o 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 desti - nation port, or
if the divert module is not loaded, or if the kernel was not - compiled
with divert socket support, the packets are dropped.
SYSCTL VARIABLES
- A set of sysctl(8) variables controls the behaviour of the
- firewall and
associated modules (dummynet, bridge). These are shown be - low together
with their default value (but always check with the - sysctl(8) command
what value is actually in use) and meaning: - 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 speci - fied 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. - 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 Head
- ers 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.
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 forwarded by the host:
ipfw add deny tcp from cracker.evil.org to wolf.tam- bov.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 advan
- tage of the
address sets and or-blocks and write extremely compact rule - sets 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 ... - 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 com
- ing to the system on the wrong interface. For example, a packet with a
- source address
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 rule - set:
ipfw add deny ip from any to any not antispoof in- This rule drops all incoming packets that appear to be com
- ing from
another directly connected system but on the wrong inter - face. For example, a packet with a source address of 192.168.0.0/24 , con
- figured on
fxp0 , but coming in on fxp1 would be dropped. - DYNAMIC RULES
In order to protect a site from flood attacks involving fake - TCP packets,
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 connection which start with a regular SYN packet coming from the
- inside of our
network. Dynamic rules are checked when encountering the - first
check-state or keep-state rule. A check-state rule should - usually be
placed near the beginning of the ruleset to minimize the - amount of work
scanning the ruleset. Your mileage may vary. - To limit the number of connections a user can open you can
- use the following 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 listwhich is equivalent to:
ipfw showNext rule diverts all incoming packets from 192.168.2.0/24to 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(4)
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:
ipfw add pipe 10 ip from any to any
ipfw 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
ipfw 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 incom - ing and outgoing packets.
- Should we want to simulate a bidirectional link with band
- width limitations, 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
ipfw pipe 1 config bw 64Kbit/s queue 10Kbytes
ipfw 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 direc - tions, unless
you want to simulate a half-duplex medium (e.g. AppleTalk, - Ethernet,
IRDA). It is not necessary that both pipes have the same - configuration,
so we can also simulate asymmetric links. - Should we want to verify network performance with the RED
- queue management algorithm:
ipfw add pipe 1 ip from any to any
ipfw pipe 1 config bw 500Kbit/s queue 100 red- 0.002/30/80/0.1
- Another typical application of the traffic shaper is to in
- troduce 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 bandwidth:
ipfw add pipe 1 ip from any to any out
ipfw add pipe 2 ip from any to any in
ipfw pipe 1 config delay 250ms bw 1Mbit/s
ipfw pipe 2 config delay 250ms bw 1Mbit/s- Per-flow queueing can be useful for a variety of purposes.
- A very simple
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
ipfw 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 on - ly 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 con - sider ports,
so we would not see connections on separate ports as differ - ent ones.
- A more sophisticated example is limiting the outbound traf
- fic 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
ipfw pipe 1 config mask src-ip 0x000000ff bw 200Kbit/s- queue
20Kbytes
ipfw 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 accordingly. 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 number
of the pipe that it should use. Then we classify traffic - using a single
rule:
ipfw pipe 1 config bw 1000Kbyte/s
ipfw pipe 4 config bw 4000Kbyte/s
...
ipfw table 1 add 192.168.2.0/24 1
ipfw table 1 add 192.168.0.0/27 4
ipfw table 1 add 192.168.0.2 1
...
ipfw pipe tablearg ip from table(1) to any- 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 18To test a ruleset and disable it and regain control if some - thing 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.
SEE ALSO
- cpp(1), m4(1), altq(4), bridge(4), divert(4), dummynet(4),
- ip(4),
ipfirewall(4), ng_ipfw(4), protocols(5), services(5), - init(8),
kldload(8), reboot(8), sysctl(8), syslogd(8)
HISTORY
- The ipfw utility first appeared in FreeBSD 2.0. dummynet(4)
- was introduced 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.
API based upon code written by Daniel Boulet for BSDI.
Work on dummynet(4) traffic shaper supported by Akamba Corp.
BUGS
- Use of dummynet with IPv6 requires that debug.mpsafenet be
- set to 0.
- The syntax has grown over the years and sometimes it might
- be confusing.
Unfortunately, backward compatibility prevents cleaning up - mistakes made
in the definition of the syntax. - !!! WARNING !!!
- Misconfiguring the firewall can put your computer in an un
- usable state,
possibly shutting down network services and requiring con - sole access to
regain control of it. - Incoming packet fragments diverted by divert are reassembled
- before
delivery 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 user
- land process
may lose various packet attributes. The packet source in - terface 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)); other - wise, 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 par
- ticular, incoming 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 associ - ated with a
packet may not be as expected if the associated process - calls setuid(2)
or similar system calls. - Rules which use uid, gid or jail based matching should be
- used only if
debug.mpsafenet=0 to avoid possible deadlocks due to layer - ing violations
in its implementation. - BSD January 16, 2006