mirror of
https://git.FreeBSD.org/src.git
synced 2024-12-15 10:17:20 +00:00
Make this file bare a small resemblance to reality again
Requested from: Archie Cobbs (archie@whistle.com)
This commit is contained in:
parent
5373cfdc0d
commit
2a81fd7c16
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=26824
@ -1,215 +1,199 @@
|
||||
.\"
|
||||
.\" $Id: ipfirewall.4,v 1.8 1997/03/07 02:49:27 jmg Exp $
|
||||
.\" $Id: ipfirewall.4,v 1.6.2.2 1997/03/07 03:07:41 mpp Exp $
|
||||
.\"
|
||||
.Dd November 16, 1994
|
||||
.Dd June 22, 1997
|
||||
.Dt IPFIREWALL 4
|
||||
.Os
|
||||
.Sh NAME
|
||||
.Nm ipfirewall ,
|
||||
.Nm ipfw ,
|
||||
.Nm ipaccounting ,
|
||||
.Nm ipacct
|
||||
.Nd IP packet filter and traffic accounting.
|
||||
.Nm ipfirewall
|
||||
.Nd IP packet filter and traffic accounting
|
||||
.Sh SYNOPSIS
|
||||
.Fd #include <sys/types.h>
|
||||
.Fd #include <sys/queue.h>
|
||||
.Fd #include <netinet/in.h>
|
||||
.Fd #include <netinet/ip_fw.h>
|
||||
.Ft int
|
||||
.Fn setsockopt raw_socket IPPROTO_IP "ipfw/ipacct option" "struct ip | struct ipfw" size
|
||||
|
||||
Ipfw options:
|
||||
IP_FW_ADD_BLK - add entry to blocking chain.
|
||||
IP_FW_ADD_FWD - add entry to forwarding chain.
|
||||
IP_FW_CHK_BLK - check ip packet against blocking chain.
|
||||
IP_FW_CHK_FWD - check ip packet against forwarding chain.
|
||||
IP_FW_DEL_BLK - delete entry from blocking chain.
|
||||
IP_FW_DEL_FWD - delete entry from forwarding chain.
|
||||
IP_FW_FLUSH - flush all blocking & forwarding chain entries.
|
||||
IP_FW_POLICY - define default ipfw policy.
|
||||
|
||||
Ipacct options:
|
||||
IP_ACCT_ADD - add entry to accounting chain.
|
||||
IP_ACCT_DEL - delete entry from accounting chain.
|
||||
IP_ACCT_FLUSH - flush all accounting chain entries.
|
||||
IP_ACCT_ZERO - zero all accounting chain entries.
|
||||
|
||||
Ipfw/ipacct entry structure:
|
||||
#define IP_FW_MAX_PORTS 10
|
||||
|
||||
struct ip_fw {
|
||||
struct ip_fw *next;
|
||||
struct in_addr src, dst;
|
||||
struct in_addr src_mask, dst_mask;
|
||||
u_short flags;
|
||||
u_short n_src_p, n_dst_p;
|
||||
u_short ports[IP_FW_MAX_PORTS];
|
||||
u_long p_cnt,b_cnt;
|
||||
}
|
||||
|
||||
Flags values for "flags" field:
|
||||
IP_FW_F_ALL - The entry should match all IP packets.
|
||||
IP_FW_F_TCP - The entry should match TCP packets.
|
||||
IP_FW_F_UDP - The entry should match UDP packets.
|
||||
IP_FW_F_ICMP - The entry should match ICMP packets.
|
||||
IP_FW_F_KIND - Mask value to separate protocol kind.
|
||||
IP_FW_F_ACCEPT - This entry is accepting ( see below )
|
||||
IP_FW_F_SRNG - Source ports are range ( see below )
|
||||
IP_FW_F_DRNG - Destination ports are range ( see below )
|
||||
IP_FW_F_PRN - Print this entry ( see below )
|
||||
IP_FW_F_BIDIR - This acct entry is bidirectional ( see below )
|
||||
IP_FW_F_MASK - Mask to match all valid flag bits.
|
||||
|
||||
Kernel symbols to kvm_nlist():
|
||||
struct ip_fw *ip_fw_blk_chain - chain of forwarding entries.
|
||||
struct ip_fw *ip_fw_fwd_chain - chain of blocking entries.
|
||||
int ip_fw_policy - default policy.
|
||||
struct ip_fw *ip_acct_chain - chain of accounting entries.
|
||||
|
||||
Options in the kernel configuration file:
|
||||
IPFIREWALL - enable ipfirewall.
|
||||
IPFIREWALL_VERBOSE - enable firewall output ( see below )
|
||||
DEBUG_IPFIREWALL - enable extensive debugging output.
|
||||
IPACCT - enable ipaccounting.
|
||||
|
||||
.Fn setsockopt raw_socket IPPROTO_IP "ipfw option" "struct ipfw" size
|
||||
.Sh DESCRIPTION
|
||||
Ipfirewall (later ipfw) is a system facility,which allows filtering
|
||||
of incoming and/or forwarding packets on the protocol+source/destination
|
||||
address/ports base.
|
||||
Ipaccounting (later ipacct) is a system facility,which allows counting
|
||||
of incoming,outgoing and forwarding traffic by packet/byte count.
|
||||
Ipfirewall (alias ipfw) is a system facility which allows filtering,
|
||||
redirecting, and other operations on IP packets travelling through
|
||||
system interfaces. Packets are matched by applying an ordered list
|
||||
of pattern rules against each packet until a match is found, at
|
||||
which point the corresponding action is taken. Rules are numbered
|
||||
from 1 to 65534; multiple rules may share the same number.
|
||||
.Pp
|
||||
Basic idea is that every packet checked against number of entries
|
||||
in several chains. There are 3 chains:
|
||||
Blocking - this chain defines whenever packet should be accepted
|
||||
ever for local delivery or for forwarding.
|
||||
Forwarding - this chain defines whenever packet should be accepted
|
||||
for forwarding only.
|
||||
Accounting - this chain defines types of packets , which should be
|
||||
|
||||
There is one rule that always exists, rule number 65535. This rule
|
||||
causes all packets to be dropped. Hence, any packet which does not
|
||||
match a lower numbered rule will be dropped.
|
||||
.Pp
|
||||
Options to add/remove specific entries or to flush all entries described
|
||||
above. Value passed to
|
||||
The value passed to
|
||||
.Fn setsockopt
|
||||
is a value of struct ip_fw for
|
||||
entry. If an entry is added, it checked by such rules that when we start
|
||||
searching chain for matching entry the first matching is the best match,
|
||||
[ or at least one of them :^) ].
|
||||
That means:
|
||||
* First in chain entries with specific protocol and small ranges
|
||||
of src/dst addresses and ports.
|
||||
* Later go entries with wider ranges of ports and addresses.
|
||||
* Later entries matching every port for some address range.
|
||||
* Later universal entries matching any protocol.
|
||||
is a struct ip_fw describing the rule (see below). In some cases
|
||||
(such as IP_FW_DEL), only the rule number is significant.
|
||||
.Sh COMMANDS
|
||||
The following socket options are used to manage the rule list:
|
||||
.Pp
|
||||
While deleting entry, every entry which is equal to that passed to
|
||||
.Fn setsockopt
|
||||
will be removed. Flush removes all entries.
|
||||
Each entry has several fields by which packets are matched:
|
||||
|
||||
|
||||
struct ip_fw *next - next entry in chain.(Set internally)
|
||||
|
||||
struct in_addr src - source address to be matched.
|
||||
struct in_addr src_mask - source address mask.
|
||||
To match whole networks/subnets or address groups
|
||||
mask bits should be zeroed here and also
|
||||
in src_mask field. Valuable bits should be set
|
||||
in src_mask field.
|
||||
struct in_addr dst - destination address to be matched.
|
||||
struct in_addr dst_mask - destination address mask.
|
||||
|
||||
u_short flags - flags field.See exact description of flags meaning
|
||||
in description later.
|
||||
|
||||
u_short n_src_p - number of source ports in "ports" array.
|
||||
u_short n_dst_p - number of destination ports in "ports" array.
|
||||
u_short ports[] - ports array.Overall length currently defined
|
||||
to reasonable maximum - 10,and could be changed.
|
||||
The packet's src port can ever match one of
|
||||
ports[0] ... ports[--n_src_p] numbers,or if
|
||||
flag IP_FW_F_SRNG set take port[0] as bottom
|
||||
range value and ports[1] as top one.n_src_p should
|
||||
be set to 2 then.If n_src_p equal to 0 , every port
|
||||
match. The same rules apply to packet's dst port,
|
||||
except that it matched against ports[n_src_p] ...
|
||||
... ports[n_src_p+n_dst_p--],or if IP_FW_F_DRNG set,
|
||||
range is ports[n_src_p] to ports[n_srcp++].
|
||||
|
||||
u_long p_cnt - packets count for ipacct entries.
|
||||
u_long b_cnt - bytes count for ipacct entries.
|
||||
|
||||
Packet matching proceeds in the following manner:
|
||||
|
||||
a) If packet entry protocol set to ALL, see c).
|
||||
|
||||
b) If entry protocol set to TCP/UDP/ICMP and packet protocol
|
||||
different - no match, if packet protocol and entry protocol
|
||||
same - continue.
|
||||
|
||||
c) If source address pattern does not equal to packets sources address
|
||||
masked with src_mask, or destination pattern not equal to packets
|
||||
destination address masked with dst_mask - no match.
|
||||
If they does and protocol set to ALL/ICMP - got match.
|
||||
If they does and protocol set to TCP/UDP - continue.
|
||||
|
||||
d) If src port doesn't match or dst port doesn't match - all
|
||||
packet don't match. If they do - got match.
|
||||
IP_FW_ADD inserts the rule into the rule list.
|
||||
.Pp
|
||||
In ipfw packet matched consequently against every chain entry.
|
||||
Search continues untill first matching entry found.If IP_FW_F_ACCEPT
|
||||
flag set - packet accepted. If it is not set - packet denied.
|
||||
If no matching entry found, all unmatched packets ever accepted or
|
||||
denied depending on global policy value. It can be set with
|
||||
IP_FW_POLICY raw socket option. The value for deny is 0,
|
||||
and 1 for accept.
|
||||
IP_FW_DEL deletes all rules having the matching rule number.
|
||||
.Pp
|
||||
Entries can be added with IP_FW_F_PRN flag set.If kernel compiled
|
||||
with IPFIREWALL_VERBOSE option,packets matching this entries will
|
||||
be printed by kernel printf's.
|
||||
IP_FW_GET returns the (first) rule having the matching rule number.
|
||||
.Pp
|
||||
If some chain is empty,every packet accepted by this chain no
|
||||
matter what default policy is.
|
||||
IP_FW_ZERO zeros the statistics associated with all rules having the
|
||||
matching rule number. If the rule number is zero, all rules are zeroed.
|
||||
.Pp
|
||||
To check whenever or not packet denied by some chain , checking
|
||||
options to setsockopt() can be issued. Then the argument is
|
||||
a buffer representing ip packet,thus it has to be
|
||||
struct ip + struct tcphdr .
|
||||
Then setsockopt() return value 0 on accept or another on deny.
|
||||
IP_FW_FLUSH removes all rules (except 65535).
|
||||
.Pp
|
||||
Ipaccounting entries added the same way as ipfw ones.Packet checked
|
||||
against all entries in chain and values of p_cnt and b_cnt in matching
|
||||
entries rised.p_cnt rises by 1 and b_cnt by ip_len value of ip packet.
|
||||
Thus all traffic size counted including IP headers.
|
||||
When the kernel security level is greater than 2, only IP_FW_GET
|
||||
is allowed.
|
||||
.Sh RULE STRUCTURE
|
||||
Rules are described by the following structure:
|
||||
.Bd -literal
|
||||
/* Specify an interface */
|
||||
union ip_fw_if {
|
||||
struct in_addr fu_via_ip; /* Specified by IP address */
|
||||
struct { /* Specified by interface name */
|
||||
#define FW_IFNLEN 6 /* To keep structure on 2^x boundary */
|
||||
char name[FW_IFNLEN];
|
||||
short unit; /* -1 means match any unit */
|
||||
} fu_via_if;
|
||||
};
|
||||
|
||||
/* One ipfw rule */
|
||||
struct ip_fw {
|
||||
u_long fw_pcnt,fw_bcnt; /* Packet and byte counters */
|
||||
struct in_addr fw_src, fw_dst; /* Source and destination IP addr */
|
||||
struct in_addr fw_smsk, fw_dmsk;/* Mask for src and dest IP addr */
|
||||
u_short fw_number; /* Rule number */
|
||||
u_short fw_flg; /* Flags word */
|
||||
#define IP_FW_MAX_PORTS 10 /* A reasonable maximum */
|
||||
u_short fw_pts[IP_FW_MAX_PORTS];/* Array of port numbers to match */
|
||||
u_char fw_ipopt,fw_ipnopt; /* IP options set/unset */
|
||||
u_char fw_tcpf,fw_tcpnf; /* TCP flags set/unset */
|
||||
#define IP_FW_ICMPTYPES_DIM (256 / (sizeof(unsigned) * 8))
|
||||
unsigned fw_icmptypes[IP_FW_ICMPTYPES_DIM]; /* ICMP types bitmap */
|
||||
long timestamp; /* timestamp (tv_sec) of last match */
|
||||
union ip_fw_if fw_in_if, fw_out_if;/* Incoming / outgoing interfaces */
|
||||
union {
|
||||
u_short fu_divert_port; /* Divert/tee port */
|
||||
u_short fu_skipto_rule; /* SKIPTO command rule number */
|
||||
u_short fu_reject_code; /* REJECT response code */
|
||||
} fw_un;
|
||||
u_char fw_prot; /* IP protocol */
|
||||
u_char fw_nports; /* N'of src ports and # of dst ports */
|
||||
/* in ports array (dst ports follow */
|
||||
/* src ports; max of 10 ports in all */
|
||||
/* count of 0 means match all ports) */
|
||||
};
|
||||
|
||||
/* Encoding of number of source/dest ports from "fw_nports" */
|
||||
|
||||
#define IP_FW_GETNSRCP(rule) ((rule)->fw_nports & 0x0f)
|
||||
#define IP_FW_SETNSRCP(rule, n) do { \\
|
||||
(rule)->fw_nports &= ~0x0f; \\
|
||||
(rule)->fw_nports |= (n); \\
|
||||
} while (0)
|
||||
#define IP_FW_GETNDSTP(rule) ((rule)->fw_nports >> 4)
|
||||
#define IP_FW_SETNDSTP(rule, n) do { \\
|
||||
(rule)->fw_nports &= ~0xf0; \\
|
||||
(rule)->fw_nports |= (n) << 4;\\
|
||||
} while (0)
|
||||
|
||||
/* Flags values for "flags" field */
|
||||
|
||||
#define IP_FW_F_IN 0x0001 /* Check inbound packets */
|
||||
#define IP_FW_F_OUT 0x0002 /* Check outbound packets */
|
||||
#define IP_FW_F_IIFACE 0x0004 /* Apply inbound interface test */
|
||||
#define IP_FW_F_OIFACE 0x0008 /* Apply outbound interface test */
|
||||
|
||||
#define IP_FW_F_COMMAND 0x0070 /* Mask for type of chain entry: */
|
||||
#define IP_FW_F_DENY 0x0000 /* This is a deny rule */
|
||||
#define IP_FW_F_REJECT 0x0010 /* Deny and send a response packet */
|
||||
#define IP_FW_F_ACCEPT 0x0020 /* This is an accept rule */
|
||||
#define IP_FW_F_COUNT 0x0030 /* This is a count rule */
|
||||
#define IP_FW_F_DIVERT 0x0040 /* This is a divert rule */
|
||||
#define IP_FW_F_TEE 0x0050 /* This is a tee rule */
|
||||
#define IP_FW_F_SKIPTO 0x0060 /* This is a skipto rule */
|
||||
|
||||
#define IP_FW_F_PRN 0x0080 /* Print if this rule matches */
|
||||
|
||||
#define IP_FW_F_SRNG 0x0100 /* The first two src ports are a min *
|
||||
* and max range (stored in host byte *
|
||||
* order). */
|
||||
|
||||
#define IP_FW_F_DRNG 0x0200 /* The first two dst ports are a min *
|
||||
* and max range (stored in host byte *
|
||||
* order). */
|
||||
|
||||
#define IP_FW_F_IIFNAME 0x0400 /* In interface by name/unit (not IP) */
|
||||
#define IP_FW_F_OIFNAME 0x0800 /* Out interface by name/unit (not IP) */
|
||||
|
||||
#define IP_FW_F_INVSRC 0x1000 /* Invert sense of src check */
|
||||
#define IP_FW_F_INVDST 0x2000 /* Invert sense of dst check */
|
||||
|
||||
#define IP_FW_F_FRAG 0x4000 /* Fragment */
|
||||
|
||||
#define IP_FW_F_ICMPBIT 0x8000 /* ICMP type bitmap is valid */
|
||||
|
||||
#define IP_FW_F_MASK 0xFFFF /* All possible flag bits mask */
|
||||
.Ed
|
||||
|
||||
.Sh RULE ACTIONS
|
||||
Each rule has an action described by the IP_FW_F_COMMAND bits in the
|
||||
flags word:
|
||||
|
||||
IP_FW_F_DENY - drop packet
|
||||
IP_FW_F_REJECT - drop packet; send rejection via ICMP or TCP
|
||||
IP_FW_F_ACCEPT - accept packet
|
||||
IP_FW_F_COUNT - increment counters; continue matching
|
||||
IP_FW_F_DIVERT - divert packet to a divert(4) socket
|
||||
IP_FW_F_TEE - copy packet to a divert(4) socket; continue
|
||||
IP_FW_F_SKIPTO - skip to rule number fu_skipto_rule
|
||||
.Pp
|
||||
If IP_FW_F_BIDIR flag is set in accounting entry,packets counted are
|
||||
those which match entry in standard way along with packets which match
|
||||
entry while their source and destination addr/port pairs swapped.
|
||||
In the case of IP_FW_F_REJECT, if the fu_reject_code is a number
|
||||
from 0 to 255, then an ICMP unreachable packet is sent back to the
|
||||
original packet's source IP address, with the corresponding code.
|
||||
Otherwise, the value must be 256 and the protocol IPPROTO_TCP,
|
||||
in which case a TCP reset packet is sent instead.
|
||||
.Pp
|
||||
Zero option allows all accounting to be cleared.
|
||||
With IP_FW_F_SKIPTO, all succeeding rules having rule number less
|
||||
than fu_skipto_rule are skipped.
|
||||
.Sh KERNEL OPTIONS
|
||||
Options in the kernel configuration file:
|
||||
IPFIREWALL - enable ipfirewall.
|
||||
IPFIREWALL_VERBOSE - enable firewall output
|
||||
IPFIREWALL_VERBOSE_LIMIT - limit firewall output
|
||||
DIVERT - enable divert(4) sockets.
|
||||
.Pp
|
||||
When packets match a rule with the IP_FW_F_PRN bit set, a message
|
||||
is logged to the console if IPFIREWALL_VERBOSE has been enabled;
|
||||
IPFIREWALL_VERBOSE_LIMIT limits the maximum number of times each
|
||||
rule can cause cause a log message. These variables are also
|
||||
available via the
|
||||
.Xr sysctl 3
|
||||
interface.
|
||||
.Sh DIAGNOSTICS
|
||||
|
||||
[EINVAL] The IP option field was improperly formed; an option
|
||||
field was shorter than the minimum value or longer than
|
||||
the option buffer provided.An structural error in
|
||||
the option buffer provided. A structural error in
|
||||
ip_fw structure occurred (n_src_p+n_dst_p too big,
|
||||
ports set for ALL/ICMP protocols etc.)
|
||||
ports set for ALL/ICMP protocols etc.). An invalid
|
||||
rule number was used.
|
||||
.Sh SEE ALSO
|
||||
.Xr setsockopt 2 ,
|
||||
.Xr kvm_nlist 3 ,
|
||||
.Xr kvm_read 3 ,
|
||||
.Xr ip 4
|
||||
.Xr ip 4 ,
|
||||
.Xr divert 4 ,
|
||||
.Xr ipfw 8 ,
|
||||
.Xr sysctl 8 .
|
||||
.Sh BUGS
|
||||
The ipfw/ipacct facilities are new and, although serious bugs have
|
||||
been tracked, some less important ones are expected.
|
||||
The ``tee'' rule is not yet implemented (currently it has no effect).
|
||||
.Pp
|
||||
This man page is mostly out of date and should be rewritten.
|
||||
This man page still needs work.
|
||||
.Sh HISTORY
|
||||
Ipfw facility has been initially written as package to BSDI
|
||||
The ipfw facility was initially written as package to BSDI
|
||||
by Daniel Boulet <danny@BouletFermat.ab.ca>.
|
||||
It has been heavily modified and ported to
|
||||
.Fx 2.0
|
||||
by Ugen J.S.Antsilevich <ugen@NetVision.net.il>
|
||||
Ipacct facility written for
|
||||
.Fx 2.0
|
||||
by Ugen J.S.Antsilevich <ugen@NetVision.net.il>
|
||||
It has been heavily modified and ported to FreeBSD
|
||||
by Ugen J.S.Antsilevich <ugen@NetVision.net.il>.
|
||||
.Pp
|
||||
Several enhancements added by Archie Cobbs <archie@whistle.com>.
|
||||
|
Loading…
Reference in New Issue
Block a user