xref: /freebsd/share/man/man4/divert.4 (revision 6c89995002b9c6d1a9c7365483c55c106fc752d5)
17f3dea24SPeter Wemm.\" $FreeBSD$
20b992c1dSWolfram Schneider.\"
3db8d970aSGleb Smirnoff.Dd December 17, 2004
493e0e116SJulian Elischer.Dt DIVERT 4
53d45e180SRuslan Ermilov.Os
693e0e116SJulian Elischer.Sh NAME
793e0e116SJulian Elischer.Nm divert
893e0e116SJulian Elischer.Nd kernel packet diversion mechanism
993e0e116SJulian Elischer.Sh SYNOPSIS
1032eef9aeSRuslan Ermilov.In sys/types.h
1132eef9aeSRuslan Ermilov.In sys/socket.h
1232eef9aeSRuslan Ermilov.In netinet/in.h
1393e0e116SJulian Elischer.Ft int
1493e0e116SJulian Elischer.Fn socket PF_INET SOCK_RAW IPPROTO_DIVERT
15e1bd11beSDaniel Gerzo.Pp
16e1bd11beSDaniel GerzoTo enable support for divert sockets, place the following lines in the
17e1bd11beSDaniel Gerzokernel configuration file:
18e1bd11beSDaniel Gerzo.Bd -ragged -offset indent
19e1bd11beSDaniel Gerzo.Cd "options IPFIREWALL"
20e1bd11beSDaniel Gerzo.Cd "options IPDIVERT"
21e1bd11beSDaniel Gerzo.Ed
22e1bd11beSDaniel Gerzo.Pp
23e1bd11beSDaniel GerzoAlternatively, to load
247646a841SJoel Dahlthe driver
25e1bd11beSDaniel Gerzoas a module at boot time, add the following lines into the
26e1bd11beSDaniel Gerzo.Xr loader.conf 5
27e1bd11beSDaniel Gerzofile:
28e1bd11beSDaniel Gerzo.Bd -literal -offset indent
29e1bd11beSDaniel Gerzoipfw_load="YES"
30e1bd11beSDaniel Gerzoipdivert_load="YES"
31e1bd11beSDaniel Gerzo.Ed
3293e0e116SJulian Elischer.Sh DESCRIPTION
3393e0e116SJulian ElischerDivert sockets are similar to raw IP sockets, except that they
3493e0e116SJulian Elischercan be bound to a specific
3593e0e116SJulian Elischer.Nm
3693e0e116SJulian Elischerport via the
3793e0e116SJulian Elischer.Xr bind 2
386d249eeeSSheldon Hearnsystem call.
396d249eeeSSheldon HearnThe IP address in the bind is ignored; only the port
4093e0e116SJulian Elischernumber is significant.
4193e0e116SJulian ElischerA divert socket bound to a divert port will receive all packets diverted
4293e0e116SJulian Elischerto that port by some (here unspecified) kernel mechanism(s).
4393e0e116SJulian ElischerPackets may also be written to a divert port, in which case they
4493e0e116SJulian Elischerre-enter kernel IP packet processing.
4593e0e116SJulian Elischer.Pp
4693e0e116SJulian ElischerDivert sockets are normally used in conjunction with
47b5c508fbSRuslan Ermilov.Fx Ns 's
48b5c508fbSRuslan Ermilovpacket filtering implementation and the
4993e0e116SJulian Elischer.Xr ipfw 8
506d249eeeSSheldon Hearnprogram.
516d249eeeSSheldon HearnBy reading from and writing to a divert socket, matching packets
5293e0e116SJulian Elischercan be passed through an arbitrary ``filter'' as they travel through
5393e0e116SJulian Elischerthe host machine, special routing tricks can be done, etc.
5493e0e116SJulian Elischer.Sh READING PACKETS
5593e0e116SJulian ElischerPackets are diverted either as they are ``incoming'' or ``outgoing.''
5693e0e116SJulian ElischerIncoming packets are diverted after reception on an IP interface,
5793e0e116SJulian Elischerwhereas outgoing packets are diverted before next hop forwarding.
5893e0e116SJulian Elischer.Pp
5993e0e116SJulian ElischerDiverted packets may be read unaltered via
6093e0e116SJulian Elischer.Xr read 2 ,
6193e0e116SJulian Elischer.Xr recv 2 ,
6293e0e116SJulian Elischeror
6393e0e116SJulian Elischer.Xr recvfrom 2 .
6493e0e116SJulian ElischerIn the latter case, the address returned will have its port set to
6571678683SGiorgos Keramidassome tag supplied by the packet diverter, (usually the ipfw rule number)
669355ecfcSJulian Elischerand the IP address set to the (first) address of
6709b4b086SMike Pritchardthe interface on which the packet was received (if the packet
6893e0e116SJulian Elischerwas incoming) or
6993e0e116SJulian Elischer.Dv INADDR_ANY
70a10c9747SDaniel Harris(if the packet was outgoing).
71a10c9747SDaniel HarrisThe interface name (if defined
72a10c9747SDaniel Harrisfor the packet) will be placed in the 8 bytes following the address,
73a10c9747SDaniel Harrisif it fits.
7493e0e116SJulian Elischer.Sh WRITING PACKETS
7593e0e116SJulian ElischerWriting to a divert socket is similar to writing to a raw IP socket;
7693e0e116SJulian Elischerthe packet is injected ``as is'' into the normal kernel IP packet
7785432d40SGleb Smirnoffprocessing using
7885432d40SGleb Smirnoff.Xr sendto 2
7985432d40SGleb Smirnoffand minimal error checking is done.
8085432d40SGleb SmirnoffPackets are distinguished as either incoming or outgoing.
8185432d40SGleb SmirnoffIf
8293e0e116SJulian Elischer.Xr sendto 2
8393e0e116SJulian Elischeris used with a destination IP address of
8493e0e116SJulian Elischer.Dv INADDR_ANY ,
8593e0e116SJulian Elischerthen the packet is treated as if it were outgoing, i.e., destined
86b5e7e999SRuslan Ermilovfor a non-local address.
87b5e7e999SRuslan ErmilovOtherwise, the packet is assumed to be
8893e0e116SJulian Elischerincoming and full packet routing is done.
8993e0e116SJulian Elischer.Pp
9093e0e116SJulian ElischerIn the latter case, the
91436c7212SJulian ElischerIP address specified must match the address of some local interface,
92436c7212SJulian Elischeror an interface name
936d249eeeSSheldon Hearnmust be found after the IP address.
946d249eeeSSheldon HearnIf an interface name is found,
95436c7212SJulian Elischerthat interface will be used and the value of the IP address will be
96436c7212SJulian Elischerignored (other than the fact that it is not
9794ba280cSRuslan Ermilov.Dv INADDR_ANY ) .
98b5e7e999SRuslan ErmilovThis is to indicate on which interface the packet
99b5e7e999SRuslan Ermilov.Dq arrived .
10093e0e116SJulian Elischer.Pp
10193e0e116SJulian ElischerNormally, packets read as incoming should be written as incoming;
102b5e7e999SRuslan Ermilovsimilarly for outgoing packets.
103b5e7e999SRuslan ErmilovWhen reading and then writing back
10493e0e116SJulian Elischerpackets, passing the same socket address supplied by
10593e0e116SJulian Elischer.Xr recvfrom 2
10693e0e116SJulian Elischerunmodified to
10793e0e116SJulian Elischer.Xr sendto 2
1089355ecfcSJulian Elischersimplifies things (see below).
1099355ecfcSJulian Elischer.Pp
1109355ecfcSJulian ElischerThe port part of the socket address passed to the
1119355ecfcSJulian Elischer.Xr sendto 2
1126d249eeeSSheldon Hearncontains a tag that should be meaningful to the diversion module.
1136d249eeeSSheldon HearnIn the
1149355ecfcSJulian Elischercase of
115f38ca148SRuslan Ermilov.Xr ipfw 8
116f38ca148SRuslan Ermilovthe tag is interpreted as the rule number
1179355ecfcSJulian Elischer.Em after which
1189355ecfcSJulian Elischerrule processing should restart.
11993e0e116SJulian Elischer.Sh LOOP AVOIDANCE
120d7ec3e91SRuslan ErmilovPackets written into a divert socket
121c4d9468eSRuslan Ermilov(using
122c4d9468eSRuslan Ermilov.Xr sendto 2 )
123d7ec3e91SRuslan Ermilovre-enter the packet filter at the rule number
1249355ecfcSJulian Elischerfollowing the tag given in the port part of the socket address, which
1259355ecfcSJulian Elischeris usually already set at the rule number that caused the diversion
1265203edcdSRuslan Ermilov(not the next rule if there are several at the same number).
1275203edcdSRuslan ErmilovIf the 'tag'
1289355ecfcSJulian Elischeris altered to indicate an alternative re-entry point, care should be taken
1299355ecfcSJulian Elischerto avoid loops, where the same packet is diverted more than once at the
1309355ecfcSJulian Elischersame rule.
13193e0e116SJulian Elischer.Sh DETAILS
13293e0e116SJulian ElischerIf a packet is diverted but no socket is bound to the
13393e0e116SJulian Elischerport, or if
13493e0e116SJulian Elischer.Dv IPDIVERT
13524fc79b0SAndre Oppermannis not enabled or loaded in the kernel, the packet is dropped.
13693e0e116SJulian Elischer.Pp
13793e0e116SJulian ElischerIncoming packet fragments which get diverted are fully reassembled
13893e0e116SJulian Elischerbefore delivery; the diversion of any one fragment causes the entire
13993e0e116SJulian Elischerpacket to get diverted.
14093e0e116SJulian ElischerIf different fragments divert to different ports,
14193e0e116SJulian Elischerthen which port ultimately gets chosen is unpredictable.
14293e0e116SJulian Elischer.Pp
14313177659SAndre OppermannNote that packets arriving on the divert socket by the
14413177659SAndre Oppermann.Xr ipfw 8
14513177659SAndre Oppermann.Cm tee
14613177659SAndre Oppermannaction are delivered as-is and packet fragments do not get reassembled
14713177659SAndre Oppermannin this case.
14813177659SAndre Oppermann.Pp
14904f36f75SBrian SomersPackets are received and sent unchanged, except that
150dd121c1eSArchie Cobbspackets read as outgoing have invalid IP header checksums, and
15104f36f75SBrian Somerspackets written as outgoing have their IP header checksums overwritten
15293e0e116SJulian Elischerwith the correct value.
15393e0e116SJulian ElischerPackets written as incoming and having incorrect checksums will be dropped.
15493e0e116SJulian ElischerOtherwise, all header fields are unchanged (and therefore in network order).
15593e0e116SJulian Elischer.Pp
15604f36f75SBrian SomersBinding to port numbers less than 1024 requires super-user access, as does
15704f36f75SBrian Somerscreating a socket of type SOCK_RAW.
15893e0e116SJulian Elischer.Sh ERRORS
15993e0e116SJulian ElischerWriting to a divert socket can return these errors, along with
16093e0e116SJulian Elischerthe usual errors possible when writing raw packets:
16193e0e116SJulian Elischer.Bl -tag -width Er
16293e0e116SJulian Elischer.It Bq Er EINVAL
16393e0e116SJulian ElischerThe packet had an invalid header, or the IP options in the packet
16493e0e116SJulian Elischerand the socket options set were incompatible.
16593e0e116SJulian Elischer.It Bq Er EADDRNOTAVAIL
16693e0e116SJulian ElischerThe destination address contained an IP address not equal to
16793e0e116SJulian Elischer.Dv INADDR_ANY
16893e0e116SJulian Elischerthat was not associated with any interface.
16993e0e116SJulian Elischer.El
17093e0e116SJulian Elischer.Sh SEE ALSO
17193e0e116SJulian Elischer.Xr bind 2 ,
1720b992c1dSWolfram Schneider.Xr recvfrom 2 ,
173aab5e1b6SMike Pritchard.Xr sendto 2 ,
1740b992c1dSWolfram Schneider.Xr socket 2 ,
175e1bd11beSDaniel Gerzo.Xr ipfw 4 ,
1760b992c1dSWolfram Schneider.Xr ipfw 8
1779cbda590SRuslan Ermilov.Sh AUTHORS
178*6c899950SBaptiste Daroussin.An Archie Cobbs Aq Mt archie@FreeBSD.org ,
1799cbda590SRuslan ErmilovWhistle Communications Corp.
18093e0e116SJulian Elischer.Sh BUGS
18193e0e116SJulian ElischerThis is an attempt to provide a clean way for user mode processes
18293e0e116SJulian Elischerto implement various IP tricks like address translation, but it
18336a142c4SRuslan Ermilovcould be cleaner, and it is too dependent on
18493e0e116SJulian Elischer.Xr ipfw 8 .
18593e0e116SJulian Elischer.Pp
18636a142c4SRuslan ErmilovIt is questionable whether incoming fragments should be reassembled
1876d249eeeSSheldon Hearnbefore being diverted.
1886d249eeeSSheldon HearnFor example, if only some fragments of a
1890227791bSRuslan Ermilovpacket destined for another machine do not get routed through the
1906d249eeeSSheldon Hearnlocal machine, the packet is lost.
1916d249eeeSSheldon HearnThis should probably be
19293e0e116SJulian Elischera settable socket option in any case.
193