1999-04-28 02:49:29 +00:00
|
|
|
.\"
|
1999-04-29 19:14:17 +00:00
|
|
|
.\" $Id: ipfw.8,v 1.50 1999/04/28 02:49:29 ghelmer Exp $
|
1999-04-28 02:49:29 +00:00
|
|
|
.\"
|
1996-08-05 02:38:51 +00:00
|
|
|
.Dd July 20, 1996
|
1995-10-26 05:36:24 +00:00
|
|
|
.Dt IPFW 8 SMM
|
|
|
|
.Os FreeBSD
|
1994-11-17 09:50:30 +00:00
|
|
|
.Sh NAME
|
1995-10-26 05:36:24 +00:00
|
|
|
.Nm ipfw
|
1996-02-24 13:39:46 +00:00
|
|
|
.Nd controlling utility for IP firewall
|
1994-11-17 09:50:30 +00:00
|
|
|
.Sh SYNOPSIS
|
1998-08-04 14:41:37 +00:00
|
|
|
.Nm ipfw
|
1998-11-23 10:54:28 +00:00
|
|
|
.Op Fl q
|
1998-08-04 14:41:37 +00:00
|
|
|
.Oo
|
1998-11-23 10:54:28 +00:00
|
|
|
.Fl p Ar preproc
|
|
|
|
.Op Fl D Ar macro Ns Op Ns =value
|
|
|
|
.Op Fl U Ar macro
|
1998-08-04 14:41:37 +00:00
|
|
|
.Oc
|
|
|
|
file
|
1996-02-24 13:39:46 +00:00
|
|
|
.Nm ipfw
|
1997-02-10 15:36:54 +00:00
|
|
|
.Oo
|
|
|
|
.Fl f
|
|
|
|
|
|
|
|
|
.Fl q
|
|
|
|
.Oc
|
1996-02-24 13:39:46 +00:00
|
|
|
flush
|
|
|
|
.Nm ipfw
|
1997-02-10 15:36:54 +00:00
|
|
|
.Oo
|
|
|
|
.Fl q
|
|
|
|
.Oc
|
1996-02-24 13:39:46 +00:00
|
|
|
zero
|
1997-06-02 05:02:37 +00:00
|
|
|
.Op Ar number ...
|
1996-02-24 13:39:46 +00:00
|
|
|
.Nm ipfw
|
|
|
|
delete
|
1997-06-02 05:02:37 +00:00
|
|
|
.Ar number ...
|
1996-02-24 13:39:46 +00:00
|
|
|
.Nm ipfw
|
1996-12-23 02:03:15 +00:00
|
|
|
.Op Fl aftN
|
1996-02-24 13:39:46 +00:00
|
|
|
list
|
1998-01-07 02:23:04 +00:00
|
|
|
.Op Ar number ...
|
1995-10-26 05:36:24 +00:00
|
|
|
.Nm ipfw
|
1997-02-10 15:36:54 +00:00
|
|
|
.Oo
|
|
|
|
.Fl ftN
|
|
|
|
.Oc
|
|
|
|
show
|
1998-01-07 02:23:04 +00:00
|
|
|
.Op Ar number ...
|
1997-02-10 15:36:54 +00:00
|
|
|
.Nm ipfw
|
|
|
|
.Oo
|
|
|
|
.Fl q
|
|
|
|
.Oc
|
1996-02-24 13:39:46 +00:00
|
|
|
add
|
1996-12-23 02:03:15 +00:00
|
|
|
.Op Ar number
|
1996-02-24 13:39:46 +00:00
|
|
|
.Ar action
|
1997-01-16 21:04:29 +00:00
|
|
|
.Op log
|
1996-02-24 13:39:46 +00:00
|
|
|
.Ar proto
|
|
|
|
from
|
|
|
|
.Ar src
|
|
|
|
to
|
|
|
|
.Ar dst
|
1997-01-16 21:04:29 +00:00
|
|
|
.Op via Ar name | ipno
|
1996-12-23 02:03:15 +00:00
|
|
|
.Op Ar options
|
1994-11-17 09:50:30 +00:00
|
|
|
.Sh DESCRIPTION
|
1996-02-24 13:39:46 +00:00
|
|
|
If used as shown in the first synopsis line, the
|
|
|
|
.Ar file
|
|
|
|
will be read line by line and applied as arguments to the
|
1996-08-13 19:43:24 +00:00
|
|
|
.Nm
|
1996-02-24 13:39:46 +00:00
|
|
|
command.
|
|
|
|
.Pp
|
1998-11-23 10:54:28 +00:00
|
|
|
Optionally, a preprocessor can be specified using
|
|
|
|
.Fl p Ar preproc
|
|
|
|
where
|
|
|
|
.Ar file
|
|
|
|
is to be piped through. Useful preprocessors include
|
|
|
|
.Xr cpp 1
|
|
|
|
and
|
|
|
|
.Xr m4 1 .
|
|
|
|
If
|
|
|
|
.Ar preproc
|
|
|
|
doesn't start with a slash as its first character, the usual
|
|
|
|
.Ev PATH
|
|
|
|
name search is performed. Care should be taken with this in environments
|
|
|
|
where not all filesystems are mounted (yet) by the time
|
|
|
|
.Nm
|
|
|
|
is being run (e. g. since they are mounted over NFS). Once
|
|
|
|
.Fl p
|
|
|
|
has been specified, optional
|
|
|
|
.Fl D
|
|
|
|
and
|
|
|
|
.Fl U
|
1999-04-28 02:49:29 +00:00
|
|
|
specifications can follow and will be passed on to the preprocessor.
|
1998-11-23 10:54:28 +00:00
|
|
|
This allows for flexible configuration files (like conditionalizing
|
|
|
|
them on the local hostname) and the use of macros to centralize
|
|
|
|
frequently required arguments like IP addresses.
|
|
|
|
.Pp
|
1999-04-28 02:49:29 +00:00
|
|
|
Each packet that has been received or is about to be sent goes through
|
|
|
|
the
|
|
|
|
.Nm
|
|
|
|
rules. In the case of a host acting as a gateway, packets that are
|
|
|
|
forwarded by the host are processed by
|
|
|
|
.Nm
|
|
|
|
twice
|
|
|
|
.Po
|
|
|
|
once when entering, and once when leaving
|
|
|
|
.Pc .
|
|
|
|
Each packet can be filtered based on the following information that is
|
|
|
|
associated with it:
|
|
|
|
.Pp
|
|
|
|
.Bl -tag -offset indent -compact -width xxxx
|
|
|
|
.It Receive Interface Pq Ar recv
|
|
|
|
Interface over which the packet was received
|
|
|
|
.It Transmit Interface Pq Ar xmit
|
|
|
|
Interface over which the packet would be transmitted
|
|
|
|
.It Incoming Pq Ar in
|
|
|
|
Packet was just received
|
|
|
|
.It Outgoing Pq Ar out
|
|
|
|
Packet would be transmitted
|
|
|
|
.It Source IP Address
|
|
|
|
Sender's IP Address
|
|
|
|
.It Destination IP Address
|
|
|
|
Target's IP Address
|
|
|
|
.It Protocol
|
|
|
|
IP protocol, including but not limited to IP
|
|
|
|
.Pq Ar ip ,
|
|
|
|
UDP
|
|
|
|
.Pq Ar udp ,
|
|
|
|
TCP
|
|
|
|
.Pq Ar tcp ,
|
|
|
|
or
|
|
|
|
ICMP
|
|
|
|
.Pq Ar icmp
|
|
|
|
.It Source Port
|
|
|
|
Sender's UDP or TCP port
|
|
|
|
.It Destination Port
|
|
|
|
Target's UDP or TCP port
|
|
|
|
.It Connection Setup Flag Pq Ar setup
|
|
|
|
This packet is a request to setup a TCP connection
|
|
|
|
.It Connection Established Flag Pq Ar established
|
|
|
|
This packet is part of an established TCP connection
|
|
|
|
.It All TCP Flags Pq Ar tcpflags
|
|
|
|
One or more of the TCP flags: close connection
|
|
|
|
.Pq Ar fin ,
|
|
|
|
open connection
|
|
|
|
.Pq Ar syn ,
|
|
|
|
reset connection
|
|
|
|
.Pq Ar rst ,
|
|
|
|
push
|
|
|
|
.Pq Ar psh ,
|
|
|
|
acknowledgment
|
|
|
|
.Pq Ar ack ,
|
|
|
|
and
|
|
|
|
urgent
|
|
|
|
.Pq Ar urg
|
|
|
|
.It Fragment Flag Pq Ar frag
|
|
|
|
This packet is a fragment of an IP packet
|
|
|
|
.It IP Options Pq Ar ipoptions
|
|
|
|
One or more of the IP options: strict source route
|
|
|
|
.Pq Ar ssrr ,
|
|
|
|
loose source route
|
|
|
|
.Pq Ar lsrr ,
|
|
|
|
record route
|
|
|
|
.Pq Ar rr ,
|
|
|
|
and timestamp
|
1999-04-29 19:14:17 +00:00
|
|
|
.Pq Ar ts
|
|
|
|
.It ICMP Types Pq Ar icmptypes
|
|
|
|
One or more of the ICMP types: echo reply
|
|
|
|
.Pq Ar 0 ,
|
|
|
|
destination unreachable
|
|
|
|
.Pq Ar 3 ,
|
|
|
|
source quench
|
|
|
|
.Pq Ar 4 ,
|
|
|
|
redirect
|
|
|
|
.Pq Ar 5 ,
|
|
|
|
echo request
|
|
|
|
.Pq Ar 8 ,
|
|
|
|
router advertisement
|
|
|
|
.Pq Ar 9 ,
|
|
|
|
router solicitation
|
|
|
|
.Pq Ar 10 ,
|
|
|
|
time-to-live exceeded
|
|
|
|
.Pq Ar 11 ,
|
|
|
|
IP header bad
|
|
|
|
.Pq Ar 12 ,
|
|
|
|
timestamp request
|
|
|
|
.Pq Ar 13 ,
|
|
|
|
timestamp reply
|
|
|
|
.Pq Ar 14 ,
|
|
|
|
information request
|
|
|
|
.Pq Ar 15 ,
|
|
|
|
information reply
|
|
|
|
.Pq Ar 16 ,
|
|
|
|
address mask request
|
|
|
|
.Pq Ar 17 ,
|
|
|
|
and address mask reply
|
|
|
|
.Pq Ar 18
|
1999-04-28 02:49:29 +00:00
|
|
|
.El
|
|
|
|
.Pp
|
|
|
|
Note that may be dangerous to filter on the source IP address or
|
|
|
|
source TCP/UDP port because either or both could easily be spoofed.
|
|
|
|
.Pp
|
1996-08-13 19:43:24 +00:00
|
|
|
The
|
|
|
|
.Nm
|
1999-04-28 02:49:29 +00:00
|
|
|
code works by going through the rule-list for each packet
|
1996-02-24 13:39:46 +00:00
|
|
|
until a match is found.
|
1996-07-10 19:44:30 +00:00
|
|
|
All rules have two associated counters, a packet count and
|
1996-02-24 13:39:46 +00:00
|
|
|
a byte count.
|
|
|
|
These counters are updated when a packet matches the rule.
|
|
|
|
.Pp
|
1999-04-28 02:49:29 +00:00
|
|
|
The rules are ordered by a
|
|
|
|
.Dq line-number
|
|
|
|
from 1 to 65534 that is used
|
1996-07-10 19:44:30 +00:00
|
|
|
to order and delete rules. Rules are tried in increasing order, and the
|
|
|
|
first rule that matches a packet applies.
|
|
|
|
Multiple rules may share the same number and apply in
|
|
|
|
the order in which they were added.
|
|
|
|
.Pp
|
1999-01-21 19:51:04 +00:00
|
|
|
If a rule is added without a number, it is numbered 100 higher than the highest
|
|
|
|
defined rule number, unless the highest defined rule number is 65435 or
|
|
|
|
greater, in which case new rules are given that same number.
|
1996-07-10 19:44:30 +00:00
|
|
|
.Pp
|
|
|
|
The delete operation deletes the first rule with number
|
|
|
|
.Ar number ,
|
|
|
|
if any.
|
|
|
|
.Pp
|
|
|
|
The list command prints out the current rule set.
|
|
|
|
.Pp
|
1999-04-28 02:49:29 +00:00
|
|
|
The show command is equivalent to
|
|
|
|
.Sq ipfw -a list .
|
1997-02-10 15:36:54 +00:00
|
|
|
.Pp
|
1996-07-10 19:44:30 +00:00
|
|
|
The zero operation zeroes the counters associated with rule number
|
|
|
|
.Ar number .
|
|
|
|
.Pp
|
|
|
|
The flush operation removes all rules.
|
1996-02-24 13:39:46 +00:00
|
|
|
.Pp
|
1999-04-28 02:49:29 +00:00
|
|
|
Any command beginning with a
|
|
|
|
.Sq # ,
|
|
|
|
or being all blank, is ignored.
|
1997-12-05 02:43:26 +00:00
|
|
|
.Pp
|
1996-02-24 13:39:46 +00:00
|
|
|
One rule is always present:
|
|
|
|
.Bd -literal -offset center
|
|
|
|
65535 deny all from any to any
|
|
|
|
.Ed
|
1996-12-23 02:03:15 +00:00
|
|
|
.Pp
|
1996-07-10 19:44:30 +00:00
|
|
|
This rule is the default policy, i.e., don't allow anything at all.
|
1997-02-10 15:36:54 +00:00
|
|
|
Your job in setting up rules is to modify this policy to match your
|
|
|
|
needs.
|
1996-02-24 13:39:46 +00:00
|
|
|
.Pp
|
1997-09-10 04:02:37 +00:00
|
|
|
However, if the kernel option
|
|
|
|
.Dq IPFIREWALL_DEFAULT_TO_ACCEPT
|
|
|
|
is active, the rule is instead:
|
|
|
|
.Bd -literal -offset center
|
|
|
|
65535 allow all from any to any
|
|
|
|
.Ed
|
|
|
|
.Pp
|
|
|
|
This variation lets everything pass through. This option should only be
|
1998-05-19 03:10:14 +00:00
|
|
|
activated in particular circumstances, such as if you use the firewall
|
1997-09-10 04:02:37 +00:00
|
|
|
system as an on-demand denial-of-service filter that is normally wide open.
|
|
|
|
.Pp
|
1996-02-24 13:39:46 +00:00
|
|
|
The following options are available:
|
|
|
|
.Bl -tag -width flag
|
|
|
|
.It Fl a
|
1999-04-28 02:49:29 +00:00
|
|
|
While listing, show counter values. See also
|
|
|
|
.Dq show
|
|
|
|
command.
|
1996-08-31 17:58:23 +00:00
|
|
|
.It Fl f
|
|
|
|
Don't ask for confirmation for commands that can cause problems if misused
|
1999-04-28 02:49:29 +00:00
|
|
|
(i.e. flush).
|
1996-08-31 17:58:23 +00:00
|
|
|
.Ar Note ,
|
|
|
|
if there is no tty associated with the process, this is implied.
|
1997-02-10 15:36:54 +00:00
|
|
|
.It Fl q
|
1998-05-19 12:50:35 +00:00
|
|
|
While adding, zeroing or flushing, be quiet about actions (implies '-f').
|
1999-04-28 02:49:29 +00:00
|
|
|
This is useful for adjusting rules by executing multiple
|
|
|
|
.Nm
|
|
|
|
commands in a script
|
|
|
|
.Po
|
|
|
|
e.g.,
|
|
|
|
.Sq sh /etc/rc.firewall
|
|
|
|
.Pc ,
|
|
|
|
or by processing a file of many
|
|
|
|
.Nm
|
|
|
|
rules,
|
1997-02-10 15:36:54 +00:00
|
|
|
across a remote login session. If a flush is performed in normal
|
1997-09-10 04:02:37 +00:00
|
|
|
(verbose) mode (with the default kernel configuration), it prints a message.
|
|
|
|
Because all rules are flushed, the
|
1999-04-28 02:49:29 +00:00
|
|
|
message cannot be delivered to the login session. This causes the
|
|
|
|
remote login session to be closed and the remainder of the ruleset is
|
|
|
|
not processed. Access to the console is required to recover.
|
1996-06-15 01:38:51 +00:00
|
|
|
.It Fl t
|
|
|
|
While listing, show last match timestamp.
|
1996-02-24 13:39:46 +00:00
|
|
|
.It Fl N
|
1996-09-15 00:08:30 +00:00
|
|
|
Try to resolve addresses and service names in output.
|
1996-02-24 13:39:46 +00:00
|
|
|
.El
|
|
|
|
.Pp
|
|
|
|
.Ar action :
|
|
|
|
.Bl -hang -offset flag -width 1234567890123456
|
1996-12-23 02:03:15 +00:00
|
|
|
.It Ar allow
|
1996-06-15 01:38:51 +00:00
|
|
|
Allow packets that match rule.
|
1997-06-02 05:02:37 +00:00
|
|
|
The search terminates. Aliases are
|
|
|
|
.Ar pass ,
|
|
|
|
.Ar permit ,
|
|
|
|
and
|
|
|
|
.Ar accept .
|
1996-12-23 02:03:15 +00:00
|
|
|
.It Ar deny
|
1996-02-24 13:39:46 +00:00
|
|
|
Discard packets that match this rule.
|
|
|
|
The search terminates.
|
1997-06-02 05:02:37 +00:00
|
|
|
.Ar Drop
|
|
|
|
is an alias for
|
|
|
|
.Ar deny .
|
1996-12-23 02:03:15 +00:00
|
|
|
.It Ar reject
|
1997-06-02 05:02:37 +00:00
|
|
|
(Deprecated.) Discard packets that match this rule, and try to send an ICMP
|
|
|
|
host unreachable notice.
|
1996-07-10 19:44:30 +00:00
|
|
|
The search terminates.
|
1997-06-02 05:02:37 +00:00
|
|
|
.It Ar unreach code
|
|
|
|
Discard packets that match this rule, and try to send an ICMP
|
|
|
|
unreachable notice with code
|
|
|
|
.Ar code ,
|
|
|
|
where
|
|
|
|
.Ar code
|
|
|
|
is a number from zero to 255, or one of these aliases:
|
|
|
|
.Ar net ,
|
|
|
|
.Ar host ,
|
|
|
|
.Ar protocol ,
|
|
|
|
.Ar port ,
|
|
|
|
.Ar needfrag ,
|
|
|
|
.Ar srcfail ,
|
|
|
|
.Ar net-unknown ,
|
|
|
|
.Ar host-unknown ,
|
|
|
|
.Ar isolated ,
|
|
|
|
.Ar net-prohib ,
|
|
|
|
.Ar host-prohib ,
|
|
|
|
.Ar tosnet ,
|
|
|
|
.Ar toshost ,
|
|
|
|
.Ar filter-prohib ,
|
|
|
|
.Ar host-precedence ,
|
|
|
|
or
|
|
|
|
.Ar precedence-cutoff .
|
|
|
|
The search terminates.
|
|
|
|
.It Ar reset
|
|
|
|
TCP packets only. Discard packets that match this rule,
|
1999-04-28 02:49:29 +00:00
|
|
|
and try to send a TCP reset
|
|
|
|
.Pq RST
|
|
|
|
notice.
|
1997-06-02 05:02:37 +00:00
|
|
|
The search terminates.
|
|
|
|
.It Ar count
|
|
|
|
Update counters for all packets that match rule.
|
|
|
|
The search continues with the next rule.
|
1996-12-23 02:03:15 +00:00
|
|
|
.It Ar divert port
|
1997-06-02 05:02:37 +00:00
|
|
|
Divert packets that match this rule to the
|
|
|
|
.Xr divert 4
|
|
|
|
socket bound to port
|
1996-07-10 19:44:30 +00:00
|
|
|
.Ar port .
|
1996-02-24 13:39:46 +00:00
|
|
|
The search terminates.
|
1997-06-02 05:02:37 +00:00
|
|
|
.It Ar tee port
|
|
|
|
Send a copy of packets matching this rule to the
|
|
|
|
.Xr divert 4
|
|
|
|
socket bound to port
|
|
|
|
.Ar port .
|
1998-07-06 03:20:19 +00:00
|
|
|
The search continues with the next rule. This feature is not yet implemeted.
|
|
|
|
.It Ar fwd ipaddr Op ,port
|
|
|
|
Change the next-hop on matching packets to
|
|
|
|
.Ar ipaddr ,
|
|
|
|
which can be an IP address in dotted quad or a host name.
|
|
|
|
If
|
|
|
|
.Ar ipaddr
|
|
|
|
is not a directly-reachable address, the route
|
|
|
|
as found in the local routing table for that IP is used
|
|
|
|
instead.
|
|
|
|
If
|
|
|
|
.Ar ipaddr
|
|
|
|
is a local address, then on a packet entering the system from a remote
|
|
|
|
host it will be diverted to
|
|
|
|
.Ar port
|
|
|
|
on the local machine, keeping the local address of the socket set
|
|
|
|
to the original IP address the packet was destined for. This is intended
|
|
|
|
for use with transparent proxy servers. If the IP is not
|
|
|
|
a local address then the port number (if specified) is ignored and
|
|
|
|
the rule only applies to packets leaving the system. This will
|
|
|
|
also map addresses to local ports when packets are generated locally.
|
|
|
|
The search terminates if this rule matches. If the port number is not
|
|
|
|
given then the port number in the packet is used, so that a packet for
|
|
|
|
an external machine port Y would be forwarded to local port Y. The kernel
|
|
|
|
must have been compiled with optiions IPFIREWALL_FORWARD.
|
1997-06-02 05:02:37 +00:00
|
|
|
.It Ar skipto number
|
|
|
|
Skip all subsequent rules numbered less than
|
|
|
|
.Ar number .
|
|
|
|
The search continues with the first rule numbered
|
|
|
|
.Ar number
|
|
|
|
or higher.
|
1996-02-24 13:39:46 +00:00
|
|
|
.El
|
|
|
|
.Pp
|
1997-06-02 05:02:37 +00:00
|
|
|
If a packet matches more than one
|
|
|
|
.Ar divert
|
|
|
|
and/or
|
|
|
|
.Ar tee
|
|
|
|
rule, all but the last are ignored.
|
|
|
|
.Pp
|
|
|
|
If the kernel was compiled with
|
|
|
|
.Dv IPFIREWALL_VERBOSE ,
|
1999-04-28 02:49:29 +00:00
|
|
|
then when a packet matches a rule with the
|
|
|
|
.Ar log
|
1997-06-02 05:02:37 +00:00
|
|
|
keyword a message will be printed on the console.
|
1996-06-15 01:38:51 +00:00
|
|
|
If the kernel was compiled with the
|
1997-06-02 05:02:37 +00:00
|
|
|
.Dv IPFIREWALL_VERBOSE_LIMIT
|
1996-06-15 01:38:51 +00:00
|
|
|
option, then logging will cease after the number of packets
|
1996-11-05 22:27:33 +00:00
|
|
|
specified by the option are received for that particular
|
1996-06-15 01:38:51 +00:00
|
|
|
chain entry. Logging may then be re-enabled by clearing
|
|
|
|
the packet counter for that entry.
|
1996-02-24 13:39:46 +00:00
|
|
|
.Pp
|
1997-06-02 05:02:37 +00:00
|
|
|
Console logging and the log limit are adjustable dynamically
|
|
|
|
through the
|
|
|
|
.Xr sysctl 8
|
|
|
|
interface.
|
|
|
|
.Pp
|
1996-02-24 13:39:46 +00:00
|
|
|
.Ar proto :
|
|
|
|
.Bl -hang -offset flag -width 1234567890123456
|
1996-12-23 02:03:15 +00:00
|
|
|
.It Ar ip
|
1997-06-02 05:02:37 +00:00
|
|
|
All packets match. The alias
|
|
|
|
.Ar all
|
|
|
|
has the same effect.
|
1996-12-23 02:03:15 +00:00
|
|
|
.It Ar tcp
|
1996-02-24 13:39:46 +00:00
|
|
|
Only TCP packets match.
|
1996-12-23 02:03:15 +00:00
|
|
|
.It Ar udp
|
1996-02-24 13:39:46 +00:00
|
|
|
Only UDP packets match.
|
1996-12-23 02:03:15 +00:00
|
|
|
.It Ar icmp
|
1996-02-24 13:39:46 +00:00
|
|
|
Only ICMP packets match.
|
1996-12-23 02:03:15 +00:00
|
|
|
.It Ar <number|name>
|
1996-08-13 19:43:24 +00:00
|
|
|
Only packets for the specified protocol matches (see
|
|
|
|
.Pa /etc/protocols
|
|
|
|
for a complete list).
|
1996-02-24 13:39:46 +00:00
|
|
|
.El
|
|
|
|
.Pp
|
|
|
|
.Ar src
|
|
|
|
and
|
|
|
|
.Ar dst :
|
1996-06-15 01:38:51 +00:00
|
|
|
.Bl -hang -offset flag
|
1997-01-16 21:04:29 +00:00
|
|
|
.It Ar <address/mask>
|
|
|
|
.Op Ar ports
|
1996-06-15 01:38:51 +00:00
|
|
|
.El
|
|
|
|
.Pp
|
|
|
|
The
|
|
|
|
.Em <address/mask>
|
|
|
|
may be specified as:
|
1996-02-24 13:39:46 +00:00
|
|
|
.Bl -hang -offset flag -width 1234567890123456
|
|
|
|
.It Ar ipno
|
|
|
|
An ipnumber of the form 1.2.3.4.
|
|
|
|
Only this exact ip number match the rule.
|
|
|
|
.It Ar ipno/bits
|
|
|
|
An ipnumber with a mask width of the form 1.2.3.4/24.
|
|
|
|
In this case all ip numbers from 1.2.3.0 to 1.2.3.255 will match.
|
|
|
|
.It Ar ipno:mask
|
1996-07-10 19:44:30 +00:00
|
|
|
An ipnumber with a mask width of the form 1.2.3.4:255.255.240.0.
|
1996-02-24 13:39:46 +00:00
|
|
|
In this case all ip numbers from 1.2.0.0 to 1.2.15.255 will match.
|
|
|
|
.El
|
|
|
|
.Pp
|
1997-01-16 21:04:29 +00:00
|
|
|
The sense of the match can be inverted by preceding an address with the
|
1999-04-28 02:49:29 +00:00
|
|
|
.Dq not
|
|
|
|
modifier, causing all other addresses to be matched instead. This
|
1997-01-16 21:04:29 +00:00
|
|
|
does not affect the selection of port numbers.
|
|
|
|
.Pp
|
1997-06-23 22:32:13 +00:00
|
|
|
With the TCP and UDP protocols, optional
|
1997-01-16 21:04:29 +00:00
|
|
|
.Em ports
|
1996-06-15 01:38:51 +00:00
|
|
|
may be specified as:
|
|
|
|
.Pp
|
|
|
|
.Bl -hang -offset flag
|
1996-06-29 01:21:07 +00:00
|
|
|
.It Ns {port|port-port} Ns Op ,port Ns Op ,...
|
1996-06-15 01:38:51 +00:00
|
|
|
.El
|
|
|
|
.Pp
|
|
|
|
Service names (from
|
|
|
|
.Pa /etc/services )
|
1997-06-23 22:32:13 +00:00
|
|
|
may be used instead of numeric port values.
|
|
|
|
A range may only be specified as the first value,
|
|
|
|
and the length of the port list is limited to
|
1996-12-23 02:03:15 +00:00
|
|
|
.Dv IP_FW_MAX_PORTS
|
|
|
|
(as defined in
|
|
|
|
.Pa /usr/src/sys/netinet/ip_fw.h )
|
1996-06-15 01:38:51 +00:00
|
|
|
ports.
|
|
|
|
.Pp
|
1998-02-12 00:57:06 +00:00
|
|
|
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
|
|
|
|
.Ar frag
|
|
|
|
option for details on matching fragmented packets.
|
|
|
|
.Pp
|
1997-06-02 05:02:37 +00:00
|
|
|
Rules can apply to packets when they are incoming, or outgoing, or both.
|
|
|
|
The
|
|
|
|
.Ar in
|
|
|
|
keyword indicates the rule should only match incoming packets.
|
|
|
|
The
|
|
|
|
.Ar out
|
|
|
|
keyword indicates the rule should only match outgoing packets.
|
1996-02-24 13:39:46 +00:00
|
|
|
.Pp
|
1997-06-02 05:02:37 +00:00
|
|
|
To match packets going through a certain interface, specify
|
|
|
|
the interface using
|
|
|
|
.Ar via :
|
|
|
|
.Bl -hang -offset flag -width 1234567890123456
|
|
|
|
.It Ar via ifX
|
|
|
|
Packet must be going through interface
|
|
|
|
.Ar ifX.
|
|
|
|
.It Ar via if*
|
|
|
|
Packet must be going through interface
|
|
|
|
.Ar ifX ,
|
|
|
|
where X is any unit number.
|
|
|
|
.It Ar via any
|
|
|
|
Packet must be going through
|
|
|
|
.Em some
|
|
|
|
interface.
|
|
|
|
.It Ar via ipno
|
|
|
|
Packet must be going through the interface having IP address
|
|
|
|
.Ar ipno .
|
|
|
|
.El
|
|
|
|
.Pp
|
|
|
|
The
|
|
|
|
.Ar via
|
|
|
|
keyword causes the interface to always be checked.
|
|
|
|
If
|
|
|
|
.Ar recv
|
|
|
|
or
|
|
|
|
.Ar xmit
|
|
|
|
is used instead of
|
|
|
|
.Ar via ,
|
|
|
|
then the only 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.:
|
|
|
|
.Pp
|
|
|
|
.Dl "ipfw add 100 deny ip from any to any out recv ed0 xmit ed1"
|
1996-02-24 13:39:46 +00:00
|
|
|
.Pp
|
1997-06-02 05:02:37 +00:00
|
|
|
The
|
|
|
|
.Ar recv
|
|
|
|
interface can be tested on either incoming or outgoing packets, while the
|
|
|
|
.Ar xmit
|
|
|
|
interface can only be tested on outgoing packets. So
|
|
|
|
.Ar out
|
|
|
|
is required (and
|
|
|
|
.Ar in
|
|
|
|
invalid) whenver
|
|
|
|
.Ar xmit
|
|
|
|
is used. Specifying
|
|
|
|
.Ar via
|
|
|
|
together with
|
|
|
|
.Ar xmit
|
|
|
|
or
|
|
|
|
.Ar recv
|
|
|
|
is invalid.
|
|
|
|
.Pp
|
|
|
|
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.
|
|
|
|
.Pp
|
|
|
|
Additional
|
1996-02-24 13:39:46 +00:00
|
|
|
.Ar options :
|
|
|
|
.Bl -hang -offset flag -width 1234567890123456
|
|
|
|
.It frag
|
1996-06-15 01:38:51 +00:00
|
|
|
Matches if the packet is a fragment and this is not the first fragment
|
1996-02-24 13:39:46 +00:00
|
|
|
of the datagram.
|
1998-02-12 00:57:06 +00:00
|
|
|
.Ar frag
|
|
|
|
may not be used in conjunction with either
|
|
|
|
.Ar tcpflags
|
|
|
|
or TCP/UDP port specifications.
|
1996-02-24 13:39:46 +00:00
|
|
|
.It in
|
|
|
|
Matches if this packet was on the way in.
|
|
|
|
.It out
|
|
|
|
Matches if this packet was on the way out.
|
|
|
|
.It ipoptions Ar spec
|
1996-06-15 01:38:51 +00:00
|
|
|
Matches if the IP header contains the comma separated list of
|
|
|
|
options specified in
|
|
|
|
.Ar spec .
|
|
|
|
The supported IP options are:
|
1996-12-23 02:03:15 +00:00
|
|
|
.Ar ssrr
|
1996-06-15 01:38:51 +00:00
|
|
|
(strict source route),
|
1996-12-23 02:03:15 +00:00
|
|
|
.Ar lsrr
|
1996-06-15 01:38:51 +00:00
|
|
|
(loose source route),
|
1996-12-23 02:03:15 +00:00
|
|
|
.Ar rr
|
1996-06-15 01:38:51 +00:00
|
|
|
(record packet route), and
|
1996-12-23 02:03:15 +00:00
|
|
|
.Ar ts
|
1996-06-15 01:38:51 +00:00
|
|
|
(timestamp).
|
|
|
|
The absence of a particular option may be denoted
|
1999-04-28 02:49:29 +00:00
|
|
|
with a
|
|
|
|
.Dq ! .
|
1996-02-24 13:39:46 +00:00
|
|
|
.It established
|
1996-07-02 00:29:22 +00:00
|
|
|
Matches packets that have the RST or ACK bits set.
|
1996-02-24 13:39:46 +00:00
|
|
|
TCP packets only.
|
|
|
|
.It setup
|
|
|
|
Matches packets that have the SYN bit set but no ACK bit.
|
|
|
|
TCP packets only.
|
|
|
|
.It tcpflags Ar spec
|
1996-06-15 01:38:51 +00:00
|
|
|
Matches if the TCP header contains the comma separated list of
|
|
|
|
flags specified in
|
|
|
|
.Ar spec .
|
|
|
|
The supported TCP flags are:
|
1996-12-23 02:03:15 +00:00
|
|
|
.Ar fin ,
|
|
|
|
.Ar syn ,
|
|
|
|
.Ar rst ,
|
|
|
|
.Ar psh ,
|
|
|
|
.Ar ack ,
|
1996-06-15 01:38:51 +00:00
|
|
|
and
|
1996-12-23 02:03:15 +00:00
|
|
|
.Ar urg .
|
1996-06-15 01:38:51 +00:00
|
|
|
The absence of a particular flag may be denoted
|
1999-04-28 02:49:29 +00:00
|
|
|
with a
|
|
|
|
.Dq ! .
|
1998-02-12 00:57:06 +00:00
|
|
|
A rule which contains a
|
|
|
|
.Ar tcpflags
|
|
|
|
specification can never match a fragmented packet which has
|
|
|
|
a non-zero offset. See the
|
|
|
|
.Ar frag
|
|
|
|
option for details on matching fragmented packets.
|
1996-06-15 01:38:51 +00:00
|
|
|
.It icmptypes Ar types
|
|
|
|
Matches if the ICMP type is in the list
|
|
|
|
.Ar types .
|
|
|
|
The list may be specified as any combination of ranges
|
|
|
|
or individual types separated by commas.
|
1996-02-24 13:39:46 +00:00
|
|
|
.El
|
|
|
|
.Sh CHECKLIST
|
|
|
|
Here are some important points to consider when designing your
|
|
|
|
rules:
|
1996-12-23 02:03:15 +00:00
|
|
|
.Bl -bullet -hang -offset flag
|
1996-02-24 13:39:46 +00:00
|
|
|
.It
|
|
|
|
Remember that you filter both packets going in and out.
|
1996-06-15 01:38:51 +00:00
|
|
|
Most connections need packets going in both directions.
|
1996-02-24 13:39:46 +00:00
|
|
|
.It
|
|
|
|
Remember to test very carefully.
|
1996-06-15 01:38:51 +00:00
|
|
|
It is a good idea to be near the console when doing this.
|
1996-02-24 13:39:46 +00:00
|
|
|
.It
|
|
|
|
Don't forget the loopback interface.
|
|
|
|
.El
|
|
|
|
.Sh FINE POINTS
|
|
|
|
There is one kind of packet that the firewall will always discard,
|
|
|
|
that is an IP fragment with a fragment offset of one.
|
|
|
|
This is a valid packet, but it only has one use, to try to circumvent
|
|
|
|
firewalls.
|
|
|
|
.Pp
|
1999-04-08 13:56:25 +00:00
|
|
|
If you are logged in over a network, loading the KLD version of
|
1996-02-24 13:39:46 +00:00
|
|
|
.Nm
|
|
|
|
is probably not as straightforward as you would think.
|
|
|
|
I recommend this command line:
|
|
|
|
.Bd -literal -offset center
|
1999-04-08 13:56:25 +00:00
|
|
|
kldload /modules/ipfw.ko && \e
|
1996-02-24 13:39:46 +00:00
|
|
|
ipfw add 32000 allow all from any to any
|
|
|
|
.Ed
|
1996-12-23 02:03:15 +00:00
|
|
|
.Pp
|
1996-06-15 01:38:51 +00:00
|
|
|
Along the same lines, doing an
|
1996-02-24 13:39:46 +00:00
|
|
|
.Bd -literal -offset center
|
|
|
|
ipfw flush
|
|
|
|
.Ed
|
1996-12-23 02:03:15 +00:00
|
|
|
.Pp
|
1996-02-24 13:39:46 +00:00
|
|
|
in similar surroundings is also a bad idea.
|
1998-12-16 17:10:03 +00:00
|
|
|
.Pp
|
|
|
|
The IP filter list may not be modified if the system security level
|
1999-04-28 02:49:29 +00:00
|
|
|
is set to 3 or higher
|
|
|
|
.Po
|
|
|
|
see
|
1998-12-16 17:10:03 +00:00
|
|
|
.Xr init 8
|
1999-04-28 02:49:29 +00:00
|
|
|
for information on system security levels
|
|
|
|
.Pc .
|
1996-07-10 19:44:30 +00:00
|
|
|
.Sh PACKET DIVERSION
|
|
|
|
A divert socket bound to the specified port will receive all packets diverted
|
|
|
|
to that port; see
|
|
|
|
.Xr divert 4 .
|
|
|
|
If no socket is bound to the destination port, or if the kernel
|
|
|
|
wasn't compiled with divert socket support, diverted packets are dropped.
|
1994-11-17 09:50:30 +00:00
|
|
|
.Sh EXAMPLES
|
1995-10-26 05:36:24 +00:00
|
|
|
This command adds an entry which denies all tcp packets from
|
1998-04-08 12:00:48 +00:00
|
|
|
.Em cracker.evil.org
|
1995-10-26 05:36:24 +00:00
|
|
|
to the telnet port of
|
|
|
|
.Em wolf.tambov.su
|
|
|
|
from being forwarded by the host:
|
|
|
|
.Pp
|
1998-04-08 12:00:48 +00:00
|
|
|
.Dl ipfw add deny tcp from cracker.evil.org to wolf.tambov.su 23
|
1995-10-26 05:36:24 +00:00
|
|
|
.Pp
|
1998-04-08 12:00:48 +00:00
|
|
|
This one disallows any connection from the entire crackers network to
|
1995-10-26 05:36:24 +00:00
|
|
|
my host:
|
|
|
|
.Pp
|
1999-04-28 02:49:29 +00:00
|
|
|
.Dl ipfw add deny all from 123.45.67.0/24 to my.host.org
|
1995-10-26 05:36:24 +00:00
|
|
|
.Pp
|
1999-04-28 02:49:29 +00:00
|
|
|
Here is a good usage of the
|
|
|
|
.Ar list
|
|
|
|
command to see accounting records
|
1997-05-15 00:51:08 +00:00
|
|
|
and timestamp information:
|
1995-10-26 05:36:24 +00:00
|
|
|
.Pp
|
1996-06-15 23:01:44 +00:00
|
|
|
.Dl ipfw -at l
|
1995-10-26 05:36:24 +00:00
|
|
|
.Pp
|
1997-05-15 00:51:08 +00:00
|
|
|
or in short form without timestamps:
|
1995-10-26 05:36:24 +00:00
|
|
|
.Pp
|
1996-06-15 01:38:51 +00:00
|
|
|
.Dl ipfw -a l
|
1995-10-26 05:36:24 +00:00
|
|
|
.Pp
|
1996-07-10 19:44:30 +00:00
|
|
|
This rule diverts all incoming packets from 192.168.2.0/24 to divert port 5000:
|
|
|
|
.Pp
|
|
|
|
.Dl ipfw divert 5000 all from 192.168.2.0/24 to any in
|
1994-11-17 09:50:30 +00:00
|
|
|
.Sh SEE ALSO
|
1998-11-23 10:54:28 +00:00
|
|
|
.Xr cpp 1 ,
|
|
|
|
.Xr m4 1 ,
|
1997-09-29 19:11:55 +00:00
|
|
|
.Xr divert 4 ,
|
1995-10-26 05:36:24 +00:00
|
|
|
.Xr ip 4 ,
|
1997-06-23 22:32:13 +00:00
|
|
|
.Xr ipfirewall 4 ,
|
1996-08-05 02:38:51 +00:00
|
|
|
.Xr protocols 5 ,
|
|
|
|
.Xr services 5 ,
|
1998-12-16 17:10:03 +00:00
|
|
|
.Xr init 8 ,
|
1999-04-08 13:56:25 +00:00
|
|
|
.Xr kldload 8 ,
|
1995-10-26 05:36:24 +00:00
|
|
|
.Xr reboot 8 ,
|
1997-09-29 19:11:55 +00:00
|
|
|
.Xr sysctl 8 ,
|
1999-04-28 02:49:29 +00:00
|
|
|
.Xr syslogd 8 .
|
1994-11-17 09:50:30 +00:00
|
|
|
.Sh BUGS
|
1995-10-26 05:36:24 +00:00
|
|
|
.Pp
|
|
|
|
.Em WARNING!!WARNING!!WARNING!!WARNING!!WARNING!!WARNING!!WARNING!!
|
|
|
|
.Pp
|
|
|
|
This program can put your computer in rather unusable state. When
|
|
|
|
using it for the first time, work on the console of the computer, and
|
|
|
|
do
|
|
|
|
.Em NOT
|
|
|
|
do anything you don't understand.
|
|
|
|
.Pp
|
1996-08-05 02:38:51 +00:00
|
|
|
When manipulating/adding chain entries, service and protocol names are
|
1996-06-15 01:38:51 +00:00
|
|
|
not accepted.
|
1997-06-02 05:02:37 +00:00
|
|
|
.Pp
|
|
|
|
Incoming packet fragments diverted by
|
|
|
|
.Ar divert
|
|
|
|
are reassembled before delivery to the socket, whereas fragments diverted via
|
|
|
|
.Ar tee
|
|
|
|
are not.
|
1997-06-23 22:32:13 +00:00
|
|
|
.Pp
|
|
|
|
Port aliases containing dashes cannot be first in a list.
|
1998-12-07 05:54:37 +00:00
|
|
|
.Pp
|
1999-04-28 02:49:29 +00:00
|
|
|
The
|
|
|
|
.Dq tee
|
|
|
|
action is unimplemented.
|
1996-08-13 19:43:24 +00:00
|
|
|
.Sh AUTHORS
|
1998-03-19 07:46:04 +00:00
|
|
|
.An Ugen J. S. Antsilevich ,
|
|
|
|
.An Poul-Henning Kamp ,
|
|
|
|
.An Alex Nash ,
|
|
|
|
.An Archie Cobbs .
|
|
|
|
API based upon code written by
|
|
|
|
.An Daniel Boulet
|
|
|
|
for BSDI.
|
1994-11-17 09:50:30 +00:00
|
|
|
.Sh HISTORY
|
1996-08-13 19:43:24 +00:00
|
|
|
.Nm
|
1996-08-23 00:57:08 +00:00
|
|
|
first appeared in
|
|
|
|
.Fx 2.0 .
|