xref: /freebsd/sys/netinet/libalias/libalias.3 (revision 234dfc904a52cbc332358ef0ec06fb9b823fb103)
1f987e1bdSBrian Somers.\"-
2e83aaae3SBrian Somers.\" Copyright (c) 2001 Charles Mott <cm@linktel.net>
3f987e1bdSBrian Somers.\" All rights reserved.
4f987e1bdSBrian Somers.\"
5f987e1bdSBrian Somers.\" Redistribution and use in source and binary forms, with or without
6f987e1bdSBrian Somers.\" modification, are permitted provided that the following conditions
7f987e1bdSBrian Somers.\" are met:
8f987e1bdSBrian Somers.\" 1. Redistributions of source code must retain the above copyright
9f987e1bdSBrian Somers.\"    notice, this list of conditions and the following disclaimer.
10f987e1bdSBrian Somers.\" 2. Redistributions in binary form must reproduce the above copyright
11f987e1bdSBrian Somers.\"    notice, this list of conditions and the following disclaimer in the
12f987e1bdSBrian Somers.\"    documentation and/or other materials provided with the distribution.
13f987e1bdSBrian Somers.\"
14f987e1bdSBrian Somers.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15f987e1bdSBrian Somers.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16f987e1bdSBrian Somers.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17f987e1bdSBrian Somers.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18f987e1bdSBrian Somers.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19f987e1bdSBrian Somers.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20f987e1bdSBrian Somers.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21f987e1bdSBrian Somers.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22f987e1bdSBrian Somers.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23f987e1bdSBrian Somers.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24f987e1bdSBrian Somers.\" SUCH DAMAGE.
25f987e1bdSBrian Somers.\"
267f3dea24SPeter Wemm.\" $FreeBSD$
2774804d58SMike Pritchard.\"
28a2900666SRuslan Ermilov.Dd April 13, 2000
2974804d58SMike Pritchard.Dt LIBALIAS 3
30a307d598SRuslan Ermilov.Os
313efa11bbSBrian Somers.Sh NAME
3274804d58SMike Pritchard.Nm libalias
33a2900666SRuslan Ermilov.Nd packet aliasing library for masquerading and network address translation
343efa11bbSBrian Somers.Sh SYNOPSIS
3532eef9aeSRuslan Ermilov.In sys/types.h
3632eef9aeSRuslan Ermilov.In netinet/in.h
3732eef9aeSRuslan Ermilov.In alias.h
38a2900666SRuslan Ermilov.Pp
39a2900666SRuslan ErmilovFunction prototypes are given in the main body of the text.
4074804d58SMike Pritchard.Sh DESCRIPTION
4174804d58SMike PritchardThe
4274804d58SMike Pritchard.Nm
43a2900666SRuslan Ermilovlibrary is a collection of functions for aliasing and de-aliasing of IP
44a2900666SRuslan Ermilovpackets, intended for masquerading and network address translation (NAT).
45a2900666SRuslan Ermilov.Sh INTRODUCTION
46a2900666SRuslan ErmilovThis library is a moderately portable set of functions designed to assist
47a2900666SRuslan Ermilovin the process of IP masquerading and network address translation.
48a2900666SRuslan ErmilovOutgoing packets from a local network with unregistered IP addresses can
49a2900666SRuslan Ermilovbe aliased to appear as if they came from an accessible IP address.
50a2900666SRuslan ErmilovIncoming packets are then de-aliased so that they are sent to the correct
51a2900666SRuslan Ermilovmachine on the local network.
52a2900666SRuslan Ermilov.Pp
53a2900666SRuslan ErmilovA certain amount of flexibility is built into the packet aliasing engine.
54a2900666SRuslan ErmilovIn the simplest mode of operation, a many-to-one address mapping takes
55a2900666SRuslan Ermilovplace between local network and the packet aliasing host.
56a2900666SRuslan ErmilovThis is known as IP masquerading.
57a2900666SRuslan ErmilovIn addition, one-to-one mappings between local and public addresses can
58a2900666SRuslan Ermilovalso be implemented, which is known as static NAT.
59a2900666SRuslan ErmilovIn between these extremes, different groups of private addresses can be
60a2900666SRuslan Ermilovlinked to different public addresses, comprising several distinct
61a2900666SRuslan Ermilovmany-to-one mappings.
62a2900666SRuslan ErmilovAlso, a given public address and port can be statically redirected to a
63a2900666SRuslan Ermilovprivate address/port.
64a2900666SRuslan Ermilov.Pp
65a2900666SRuslan ErmilovThe packet aliasing engine was designed to operate in user space outside
66a2900666SRuslan Ermilovof the kernel, without any access to private kernel data structure, but
67a2900666SRuslan Ermilovthe source code can also be ported to a kernel environment.
68a2900666SRuslan Ermilov.Sh INITIALIZATION AND CONTROL
69f1a529f3SRuslan ErmilovOne special function,
70f1a529f3SRuslan Ermilov.Fn PacketAliasInit ,
71a2900666SRuslan Ermilovmust always be called before any packet handling may be performed.
72f1a529f3SRuslan ErmilovNormally, the
73f1a529f3SRuslan Ermilov.Fn PacketAliasSetAddress
74f1a529f3SRuslan Ermilovfunction is called afterwards, to set the default aliasing address.
75a2900666SRuslan ErmilovIn addition, the operating mode of the packet aliasing engine can be
76a2900666SRuslan Ermilovcustomized by calling
77a2900666SRuslan Ermilov.Fn PacketAliasSetMode .
78a2900666SRuslan Ermilov.Pp
793efa11bbSBrian Somers.Ft void
80a2900666SRuslan Ermilov.Fn PacketAliasInit void
81a2900666SRuslan Ermilov.Bd -ragged -offset indent
82a2900666SRuslan ErmilovThis function has no arguments or return value and is used to initialize
83a2900666SRuslan Ermilovinternal data structures.
84a2900666SRuslan ErmilovThe following mode bits are always set after calling
85a2900666SRuslan Ermilov.Fn PacketAliasInit .
86a2900666SRuslan ErmilovSee the description of
87a2900666SRuslan Ermilov.Fn PacketAliasSetMode
88a2900666SRuslan Ermilovbelow for the meaning of these mode bits.
89a2900666SRuslan Ermilov.Pp
90a2900666SRuslan Ermilov.Bl -item -offset indent -compact
91a2900666SRuslan Ermilov.It
92a2900666SRuslan Ermilov.Dv PKT_ALIAS_SAME_PORTS
93a2900666SRuslan Ermilov.It
94a2900666SRuslan Ermilov.Dv PKT_ALIAS_USE_SOCKETS
95a2900666SRuslan Ermilov.It
96a2900666SRuslan Ermilov.Dv PKT_ALIAS_RESET_ON_ADDR_CHANGE
97a2900666SRuslan Ermilov.El
98a2900666SRuslan Ermilov.Pp
99a2900666SRuslan ErmilovThis function will always return the packet aliasing engine to the same
100a2900666SRuslan Ermilovinitial state.
101a2900666SRuslan Ermilov.Fn PacketAliasSetAddress
102f1a529f3SRuslan Ermilovis normally called afterwards, and any desired changes from the default mode
1033efa11bbSBrian Somersbits listed above require a call to
104a2900666SRuslan Ermilov.Fn PacketAliasSetMode .
105a2900666SRuslan Ermilov.Pp
106a2900666SRuslan ErmilovIt is mandatory that this function be called at the beginning of a program
107a2900666SRuslan Ermilovprior to any packet handling.
108a2900666SRuslan Ermilov.Ed
109a2900666SRuslan Ermilov.Pp
1108ddc51bcSEivind Eklund.Ft void
111a2900666SRuslan Ermilov.Fn PacketAliasUninit void
112a2900666SRuslan Ermilov.Bd -ragged -offset indent
113a2900666SRuslan ErmilovThis function has no arguments or return value and is used to clear any
114a2900666SRuslan Ermilovresources attached to internal data structures.
115a2900666SRuslan Ermilov.Pp
116a2900666SRuslan ErmilovThis functions should be called when a program stops using the aliasing
117a2900666SRuslan Ermilovengine; it does, amongst other things, clear out any firewall holes.
118a2900666SRuslan ErmilovTo provide backwards compatibility and extra security, it is added to
119a2900666SRuslan Ermilovthe
120a2900666SRuslan Ermilov.Xr atexit 3
121a2900666SRuslan Ermilovchain by
122a2900666SRuslan Ermilov.Fn PacketAliasInit .
123a2900666SRuslan ErmilovCalling it multiple times is harmless.
124a2900666SRuslan Ermilov.Ed
125a2900666SRuslan Ermilov.Pp
1263efa11bbSBrian Somers.Ft void
1273efa11bbSBrian Somers.Fn PacketAliasSetAddress "struct in_addr addr"
128a2900666SRuslan Ermilov.Bd -ragged -offset indent
129a2900666SRuslan ErmilovThis function sets the source address to which outgoing packets from the
130a2900666SRuslan Ermilovlocal area network are aliased.
131a2900666SRuslan ErmilovAll outgoing packets are re-mapped to this address unless overridden by a
132a2900666SRuslan Ermilovstatic address mapping established by
133a2900666SRuslan Ermilov.Fn PacketAliasRedirectAddr .
134f1a529f3SRuslan ErmilovIf this function is not called, and no static rules match, an outgoing
135f1a529f3SRuslan Ermilovpacket retains its source address.
136a2900666SRuslan Ermilov.Pp
137a2900666SRuslan ErmilovIf the
138a2900666SRuslan Ermilov.Dv PKT_ALIAS_RESET_ON_ADDR_CHANGE
139a2900666SRuslan Ermilovmode bit is set (the default mode of operation), then the internal aliasing
140a2900666SRuslan Ermilovlink tables will be reset any time the aliasing address changes.
141a2900666SRuslan ErmilovThis is useful for interfaces such as
142a2900666SRuslan Ermilov.Xr ppp 8 ,
143a2900666SRuslan Ermilovwhere the IP
144a2900666SRuslan Ermilovaddress may or may not change on successive dial-up attempts.
145a2900666SRuslan Ermilov.Pp
146a2900666SRuslan ErmilovIf the
147a2900666SRuslan Ermilov.Dv PKT_ALIAS_RESET_ON_ADDR_CHANGE
148a2900666SRuslan Ermilovmode bit is set to zero, this function can also be used to dynamically change
149a2900666SRuslan Ermilovthe aliasing address on a packet to packet basis (it is a low overhead call).
150a2900666SRuslan Ermilov.Pp
151a2900666SRuslan ErmilovIt is mandatory that this function be called prior to any packet handling.
152a2900666SRuslan Ermilov.Ed
153a2900666SRuslan Ermilov.Pp
154442a25bdSBruce Evans.Ft unsigned int
155a2900666SRuslan Ermilov.Fn PacketAliasSetMode "unsigned int flags" "unsigned int mask"
156a2900666SRuslan Ermilov.Bd -ragged -offset indent
1573efa11bbSBrian SomersThis function sets or clears mode bits
1583efa11bbSBrian Somersaccording to the value of
159a2900666SRuslan Ermilov.Fa flags .
1603efa11bbSBrian SomersOnly bits marked in
161a2900666SRuslan Ermilov.Fa mask
162a2900666SRuslan Ermilovare affected.
163a2900666SRuslan ErmilovThe following mode bits are defined in
164a2900666SRuslan Ermilov.Aq Pa alias.h :
165a2900666SRuslan Ermilov.Bl -tag -width indent
166a2900666SRuslan Ermilov.It Dv PKT_ALIAS_LOG
167a2900666SRuslan ErmilovEnables logging into
168a2900666SRuslan Ermilov.Pa /var/log/alias.log .
169a2900666SRuslan ErmilovEach time an aliasing link is created or deleted, the log file is appended
170a2900666SRuslan Ermilovwith the current number of ICMP, TCP and UDP links.
171a2900666SRuslan ErmilovMainly useful for debugging when the log file is viewed continuously with
172a2900666SRuslan Ermilov.Xr tail 1 .
173a2900666SRuslan Ermilov.It Dv PKT_ALIAS_DENY_INCOMING
174a2900666SRuslan ErmilovIf this mode bit is set, all incoming packets associated with new TCP
175a2900666SRuslan Ermilovconnections or new UDP transactions will be marked for being ignored
176c4d9468eSRuslan Ermilov.Fn ( PacketAliasIn
177a2900666SRuslan Ermilovreturns
178a2900666SRuslan Ermilov.Dv PKT_ALIAS_IGNORED
179c4d9468eSRuslan Ermilovcode)
180a2900666SRuslan Ermilovby the calling program.
181a2900666SRuslan ErmilovResponse packets to connections or transactions initiated from the packet
182a2900666SRuslan Ermilovaliasing host or local network will be unaffected.
183a2900666SRuslan ErmilovThis mode bit is useful for implementing a one-way firewall.
184a2900666SRuslan Ermilov.It Dv PKT_ALIAS_SAME_PORTS
185a2900666SRuslan ErmilovIf this mode bit is set, the packet aliasing engine will attempt to leave
186a2900666SRuslan Ermilovthe alias port numbers unchanged from the actual local port numbers.
187a2900666SRuslan ErmilovThis can be done as long as the quintuple (proto, alias addr, alias port,
188a2900666SRuslan Ermilovremote addr, remote port) is unique.
189a2900666SRuslan ErmilovIf a conflict exists, a new aliasing port number is chosen even if this
190a2900666SRuslan Ermilovmode bit is set.
191a2900666SRuslan Ermilov.It Dv PKT_ALIAS_USE_SOCKETS
192a2900666SRuslan ErmilovThis bit should be set when the packet aliasing host originates network
193a2900666SRuslan Ermilovtraffic as well as forwards it.
194a2900666SRuslan ErmilovWhen the packet aliasing host is waiting for a connection from an unknown
195a2900666SRuslan Ermilovhost address or unknown port number (e.g. an FTP data connection), this
196a2900666SRuslan Ermilovmode bit specifies that a socket be allocated as a place holder to prevent
197a2900666SRuslan Ermilovport conflicts.
198a2900666SRuslan ErmilovOnce a connection is established, usually within a minute or so, the socket
199a2900666SRuslan Ermilovis closed.
200a2900666SRuslan Ermilov.It Dv PKT_ALIAS_UNREGISTERED_ONLY
201a2900666SRuslan ErmilovIf this mode bit is set, traffic on the local network which does not
202a2900666SRuslan Ermilovoriginate from unregistered address spaces will be ignored.
203a2900666SRuslan ErmilovStandard Class A, B and C unregistered addresses are:
2043efa11bbSBrian Somers.Bd -literal -offset indent
2053efa11bbSBrian Somers10.0.0.0     ->  10.255.255.255   (Class A subnet)
2063efa11bbSBrian Somers172.16.0.0   ->  172.31.255.255   (Class B subnets)
2073efa11bbSBrian Somers192.168.0.0  ->  192.168.255.255  (Class C subnets)
2083efa11bbSBrian Somers.Ed
209a2900666SRuslan Ermilov.Pp
210a2900666SRuslan ErmilovThis option is useful in the case that packet aliasing host has both
211a2900666SRuslan Ermilovregistered and unregistered subnets on different interfaces.
212a2900666SRuslan ErmilovThe registered subnet is fully accessible to the outside world, so traffic
213a2900666SRuslan Ermilovfrom it does not need to be passed through the packet aliasing engine.
214a2900666SRuslan Ermilov.It Dv PKT_ALIAS_RESET_ON_ADDR_CHANGE
2153efa11bbSBrian SomersWhen this mode bit is set and
216a2900666SRuslan Ermilov.Fn PacketAliasSetAddress
217a2900666SRuslan Ermilovis called to change the aliasing address, the internal link table of the
218a2900666SRuslan Ermilovpacket aliasing engine will be cleared.
219a2900666SRuslan ErmilovThis operating mode is useful for
220a2900666SRuslan Ermilov.Xr ppp 8
221a2900666SRuslan Ermilovlinks where the interface address can sometimes change or remain the same
222a2900666SRuslan Ermilovbetween dial-up attempts.
223a2900666SRuslan ErmilovIf this mode bit is not set, the link table will never be reset in the event
224a2900666SRuslan Ermilovof an address change.
225a2900666SRuslan Ermilov.It Dv PKT_ALIAS_PUNCH_FW
226a2900666SRuslan ErmilovThis option makes
227a2900666SRuslan Ermilov.Nm
228a2900666SRuslan Ermilov`punch holes' in an
229a2900666SRuslan Ermilov.Xr ipfirewall 4
230a2900666SRuslan Ermilovbased firewall for FTP/IRC DCC connections.
231a2900666SRuslan ErmilovThe holes punched are bound by from/to IP address and port; it will not be
232a2900666SRuslan Ermilovpossible to use a hole for another connection.
233a2900666SRuslan ErmilovA hole is removed when the connection that uses it dies.
234a2900666SRuslan ErmilovTo cater to unexpected death of a program using
235a2900666SRuslan Ermilov.Nm
236a2900666SRuslan Ermilov(e.g. kill -9),
237a2900666SRuslan Ermilovchanging the state of the flag will clear the entire firewall range
238a2900666SRuslan Ermilovallocated for holes.
2398ddc51bcSEivind EklundThis will also happen on the initial call to
240a2900666SRuslan Ermilov.Fn PacketAliasSetFWBase .
241a2900666SRuslan ErmilovThis call must happen prior to setting this flag.
242a2900666SRuslan Ermilov.It Dv PKT_ALIAS_REVERSE
243a2900666SRuslan ErmilovThis option makes
244a2900666SRuslan Ermilov.Nm
245a2900666SRuslan Ermilovreverse the way it handles incoming and outgoing packets, allowing it
246a2900666SRuslan Ermilovto be fed with data that passes through the internal interface rather
247a2900666SRuslan Ermilovthan the external one.
248a2900666SRuslan Ermilov.It Dv PKT_ALIAS_PROXY_ONLY
249a2900666SRuslan ErmilovThis option tells
250a2900666SRuslan Ermilov.Nm
251a2900666SRuslan Ermilovto obey transparent proxy rules only.
252a2900666SRuslan ErmilovNormal packet aliasing is not performed.
25321b9df57SBrian SomersSee
25421b9df57SBrian Somers.Fn PacketAliasProxyRule
25521b9df57SBrian Somersbelow for details.
2563efa11bbSBrian Somers.El
257a2900666SRuslan Ermilov.Ed
258a2900666SRuslan Ermilov.Pp
2598ddc51bcSEivind Eklund.Ft void
2608ddc51bcSEivind Eklund.Fn PacketAliasSetFWBase "unsigned int base" "unsigned int num"
261a2900666SRuslan Ermilov.Bd -ragged -offset indent
262a2900666SRuslan ErmilovSet firewall range allocated for punching firewall holes (with the
263a2900666SRuslan Ermilov.Dv PKT_ALIAS_PUNCH_FW
264a2900666SRuslan Ermilovflag).
265a2900666SRuslan ErmilovThe range will be cleared for all rules on initialization.
266a2900666SRuslan Ermilov.Ed
267a2900666SRuslan Ermilov.Sh PACKET HANDLING
268a2900666SRuslan ErmilovThe packet handling functions are used to modify incoming (remote to local)
269a2900666SRuslan Ermilovand outgoing (local to remote) packets.
270a2900666SRuslan ErmilovThe calling program is responsible for receiving and sending packets via
271a2900666SRuslan Ermilovnetwork interfaces.
272a2900666SRuslan Ermilov.Pp
273a2900666SRuslan ErmilovAlong with
274a2900666SRuslan Ermilov.Fn PacketAliasInit
275a2900666SRuslan Ermilovand
276a2900666SRuslan Ermilov.Fn PacketAliasSetAddress ,
277a2900666SRuslan Ermilovthe two packet handling functions,
278a2900666SRuslan Ermilov.Fn PacketAliasIn
279a2900666SRuslan Ermilovand
280a2900666SRuslan Ermilov.Fn PacketAliasOut ,
281a2900666SRuslan Ermilovcomprise minimal set of functions needed for a basic IP masquerading
282a2900666SRuslan Ermilovimplementation.
283a2900666SRuslan Ermilov.Pp
2843efa11bbSBrian Somers.Ft int
2853efa11bbSBrian Somers.Fn PacketAliasIn "char *buffer" "int maxpacketsize"
286a2900666SRuslan Ermilov.Bd -ragged -offset indent
287a2900666SRuslan ErmilovAn incoming packet coming from a remote machine to the local network is
288a2900666SRuslan Ermilovde-aliased by this function.
2893efa11bbSBrian SomersThe IP packet is pointed to by
290a2900666SRuslan Ermilov.Fa buffer ,
2913efa11bbSBrian Somersand
292a2900666SRuslan Ermilov.Fa maxpacketsize
293a2900666SRuslan Ermilovindicates the size of the data structure containing the packet and should
294a2900666SRuslan Ermilovbe at least as large as the actual packet size.
295a2900666SRuslan Ermilov.Pp
2963efa11bbSBrian SomersReturn codes:
297a2900666SRuslan Ermilov.Bl -tag -width indent
298a2900666SRuslan Ermilov.It Dv PKT_ALIAS_OK
2993efa11bbSBrian SomersThe packet aliasing process was successful.
300a2900666SRuslan Ermilov.It Dv PKT_ALIAS_IGNORED
3013efa11bbSBrian SomersThe packet was ignored and not de-aliased.
302a2900666SRuslan ErmilovThis can happen if the protocol is unrecognized, possibly an ICMP message
303a2900666SRuslan Ermilovtype is not handled or if incoming packets for new connections are being
304a2900666SRuslan Ermilovignored (if
305a2900666SRuslan Ermilov.Dv PKT_ALIAS_DENY_INCOMING
306a2900666SRuslan Ermilovmode bit was set by
307a2900666SRuslan Ermilov.Fn PacketAliasSetMode ) .
308a2900666SRuslan Ermilov.It Dv PKT_ALIAS_UNRESOLVED_FRAGMENT
309a2900666SRuslan ErmilovThis is returned when a fragment cannot be resolved because the header
310a2900666SRuslan Ermilovfragment has not been sent yet.
311a2900666SRuslan ErmilovIn this situation, fragments must be saved with
312a2900666SRuslan Ermilov.Fn PacketAliasSaveFragment
3133efa11bbSBrian Somersuntil a header fragment is found.
314a2900666SRuslan Ermilov.It Dv PKT_ALIAS_FOUND_HEADER_FRAGMENT
315a2900666SRuslan ErmilovThe packet aliasing process was successful, and a header fragment was found.
316a2900666SRuslan ErmilovThis is a signal to retrieve any unresolved fragments with
317a2900666SRuslan Ermilov.Fn PacketAliasGetFragment
318a2900666SRuslan Ermilovand de-alias them with
319a2900666SRuslan Ermilov.Fn PacketAliasFragmentIn .
320a2900666SRuslan Ermilov.It Dv PKT_ALIAS_ERROR
321a2900666SRuslan ErmilovAn internal error within the packet aliasing engine occurred.
3223efa11bbSBrian Somers.El
323a2900666SRuslan Ermilov.Ed
324a2900666SRuslan Ermilov.Pp
3253efa11bbSBrian Somers.Ft int
326b2052ac8SJohn Polstra.Fn PacketAliasOut "char *buffer" "int maxpacketsize"
327a2900666SRuslan Ermilov.Bd -ragged -offset indent
328a2900666SRuslan ErmilovAn outgoing packet coming from the local network to a remote machine is
329a2900666SRuslan Ermilovaliased by this function.
3303efa11bbSBrian SomersThe IP packet is pointed to by
331a2900666SRuslan Ermilov.Fa buffer ,
3323efa11bbSBrian Somersand
333a2900666SRuslan Ermilov.Fa maxpacketsize
334a2900666SRuslan Ermilovindicates the maximum packet size permissible should the packet length be
335a2900666SRuslan Ermilovchanged.
336a2900666SRuslan ErmilovIP encoding protocols place address and port information in the encapsulated
337a2900666SRuslan Ermilovdata stream which has to be modified and can account for changes in packet
338a2900666SRuslan Ermilovlength.
339a2900666SRuslan ErmilovWell known examples of such protocols are FTP and IRC DCC.
340a2900666SRuslan Ermilov.Pp
3413efa11bbSBrian SomersReturn codes:
342a2900666SRuslan Ermilov.Bl -tag -width indent
343a2900666SRuslan Ermilov.It Dv PKT_ALIAS_OK
3443efa11bbSBrian SomersThe packet aliasing process was successful.
345a2900666SRuslan Ermilov.It Dv PKT_ALIAS_IGNORED
346a2900666SRuslan ErmilovThe packet was ignored and not aliased.
347a2900666SRuslan ErmilovThis can happen if the protocol is unrecognized, or possibly an ICMP message
348a2900666SRuslan Ermilovtype is not handled.
349a2900666SRuslan Ermilov.It Dv PKT_ALIAS_ERROR
350a2900666SRuslan ErmilovAn internal error within the packet aliasing engine occurred.
3513efa11bbSBrian Somers.El
352a2900666SRuslan Ermilov.Ed
353a2900666SRuslan Ermilov.Sh PORT AND ADDRESS REDIRECTION
354a2900666SRuslan ErmilovThe functions described in this section allow machines on the local network
355a2900666SRuslan Ermilovto be accessible in some degree to new incoming connections from the external
356a2900666SRuslan Ermilovnetwork.
357a2900666SRuslan ErmilovIndividual ports can be re-mapped or static network address translations can
358a2900666SRuslan Ermilovbe designated.
359a2900666SRuslan Ermilov.Pp
3603efa11bbSBrian Somers.Ft struct alias_link *
3613efa11bbSBrian Somers.Fo PacketAliasRedirectPort
3623efa11bbSBrian Somers.Fa "struct in_addr local_addr"
3633efa11bbSBrian Somers.Fa "u_short local_port"
3643efa11bbSBrian Somers.Fa "struct in_addr remote_addr"
3653efa11bbSBrian Somers.Fa "u_short remote_port"
3663efa11bbSBrian Somers.Fa "struct in_addr alias_addr"
3673efa11bbSBrian Somers.Fa "u_short alias_port"
3683efa11bbSBrian Somers.Fa "u_char proto"
3693efa11bbSBrian Somers.Fc
370a2900666SRuslan Ermilov.Bd -ragged -offset indent
371a2900666SRuslan ErmilovThis function specifies that traffic from a given remote address/port to
372a2900666SRuslan Ermilovan alias address/port be redirected to a specified local address/port.
3739c727d2cSJoseph KoshyThe parameter
374a2900666SRuslan Ermilov.Fa proto
375a2900666SRuslan Ermilovcan be either
376a2900666SRuslan Ermilov.Dv IPPROTO_TCP
3773efa11bbSBrian Somersor
378a2900666SRuslan Ermilov.Dv IPPROTO_UDP ,
379a2900666SRuslan Ermilovas defined in
380a2900666SRuslan Ermilov.Aq Pa netinet/in.h .
381a2900666SRuslan Ermilov.Pp
3823efa11bbSBrian SomersIf
383a2900666SRuslan Ermilov.Fa local_addr
384a2900666SRuslan Ermilovor
385a2900666SRuslan Ermilov.Fa alias_addr
386a2900666SRuslan Ermilovis zero, this indicates that the packet aliasing address as established
387a2900666SRuslan Ermilovby
388a2900666SRuslan Ermilov.Fn PacketAliasSetAddress
389a2900666SRuslan Ermilovis to be used.
390a2900666SRuslan ErmilovEven if
391483d2f22SRuslan Ermilov.Fn PacketAliasSetAddress
392a2900666SRuslan Ermilovis called to change the address after
393483d2f22SRuslan Ermilov.Fn PacketAliasRedirectPort
394a2900666SRuslan Ermilovis called, a zero reference will track this change.
395a2900666SRuslan Ermilov.Pp
3966d20a774SRuslan ErmilovIf the link is further set up to operate for a load sharing, then
3976d20a774SRuslan Ermilov.Fa local_addr
3986d20a774SRuslan Ermilovand
3996d20a774SRuslan Ermilov.Fa local_port
4006d20a774SRuslan Ermilovare ignored, and are selected dynamically from the server pool, as described in
4016d20a774SRuslan Ermilov.Fn PacketAliasAddServer
4026d20a774SRuslan Ermilovbelow.
4036d20a774SRuslan Ermilov.Pp
404a2900666SRuslan ErmilovIf
405a2900666SRuslan Ermilov.Fa remote_addr
406a2900666SRuslan Ermilovis zero, this indicates to redirect packets from any remote address.
407a2900666SRuslan ErmilovLikewise, if
408a2900666SRuslan Ermilov.Fa remote_port
409a2900666SRuslan Ermilovis zero, this indicates to redirect packets originating from any remote
410a2900666SRuslan Ermilovport number.
411a2900666SRuslan ErmilovAlmost always, the remote port specification will be zero, but non-zero
412a2900666SRuslan Ermilovremote addresses can sometimes be useful for firewalling.
413a2900666SRuslan ErmilovIf two calls to
414a2900666SRuslan Ermilov.Fn PacketAliasRedirectPort
415a2900666SRuslan Ermilovoverlap in their address/port specifications, then the most recent call
416a2900666SRuslan Ermilovwill have precedence.
417a2900666SRuslan Ermilov.Pp
418a2900666SRuslan ErmilovThis function returns a pointer which can subsequently be used by
419a2900666SRuslan Ermilov.Fn PacketAliasRedirectDelete .
420a2900666SRuslan ErmilovIf
421a2900666SRuslan Ermilov.Dv NULL
422a2900666SRuslan Ermilovis returned, then the function call did not complete successfully.
423a2900666SRuslan Ermilov.Pp
424a2900666SRuslan ErmilovAll port numbers should be in network address byte order, so it is necessary
425a2900666SRuslan Ermilovto use
426a2900666SRuslan Ermilov.Xr htons 3
427a2900666SRuslan Ermilovto convert these parameters from internally readable numbers to network byte
428a2900666SRuslan Ermilovorder.
429a2900666SRuslan ErmilovAddresses are also in network byte order, which is implicit in the use of the
430a2900666SRuslan Ermilov.Fa struct in_addr
4313efa11bbSBrian Somersdata type.
432a2900666SRuslan Ermilov.Ed
433a2900666SRuslan Ermilov.Pp
4343efa11bbSBrian Somers.Ft struct alias_link *
435442a25bdSBruce Evans.Fo PacketAliasRedirectAddr
4363efa11bbSBrian Somers.Fa "struct in_addr local_addr"
4373efa11bbSBrian Somers.Fa "struct in_addr alias_addr"
4383efa11bbSBrian Somers.Fc
439a2900666SRuslan Ermilov.Bd -ragged -offset indent
440a2900666SRuslan ErmilovThis function designates that all incoming traffic to
441a2900666SRuslan Ermilov.Fa alias_addr
4423efa11bbSBrian Somersbe redirected to
443a2900666SRuslan Ermilov.Fa local_addr .
4443efa11bbSBrian SomersSimilarly, all outgoing traffic from
445a2900666SRuslan Ermilov.Fa local_addr
4463efa11bbSBrian Somersis aliased to
447a2900666SRuslan Ermilov.Fa alias_addr .
448a2900666SRuslan Ermilov.Pp
4493efa11bbSBrian SomersIf
450a2900666SRuslan Ermilov.Fa local_addr
4513efa11bbSBrian Somersor
452a2900666SRuslan Ermilov.Fa alias_addr
453a2900666SRuslan Ermilovis zero, this indicates that the packet aliasing address as established by
454a2900666SRuslan Ermilov.Fn PacketAliasSetAddress
455a2900666SRuslan Ermilovis to be used.
456a2900666SRuslan ErmilovEven if
457a2900666SRuslan Ermilov.Fn PacketAliasSetAddress
458a2900666SRuslan Ermilovis called to change the address after
459a2900666SRuslan Ermilov.Fn PacketAliasRedirectAddr
4603efa11bbSBrian Somersis called, a zero reference will track this change.
461a2900666SRuslan Ermilov.Pp
4626d20a774SRuslan ErmilovIf the link is further set up to operate for a load sharing, then
4636d20a774SRuslan Ermilov.Fa local_addr
4646d20a774SRuslan Ermilovis ignored, and is selected dynamically from the server pool, as described in
4656d20a774SRuslan Ermilov.Fn PacketAliasAddServer
4666d20a774SRuslan Ermilovbelow.
4676d20a774SRuslan Ermilov.Pp
468a2900666SRuslan ErmilovIf subsequent calls to
469a2900666SRuslan Ermilov.Fn PacketAliasRedirectAddr
470a2900666SRuslan Ermilovuse the same aliasing address, all new incoming traffic to this aliasing
471a2900666SRuslan Ermilovaddress will be redirected to the local address made in the last function
472a2900666SRuslan Ermilovcall.
473a2900666SRuslan ErmilovNew traffic generated by any of the local machines, designated in the
474a2900666SRuslan Ermilovseveral function calls, will be aliased to the same address.
475a2900666SRuslan ErmilovConsider the following example:
476a2900666SRuslan Ermilov.Bd -literal -offset indent
4773efa11bbSBrian SomersPacketAliasRedirectAddr(inet_aton("192.168.0.2"),
4783efa11bbSBrian Somers                        inet_aton("141.221.254.101"));
4793efa11bbSBrian SomersPacketAliasRedirectAddr(inet_aton("192.168.0.3"),
4803efa11bbSBrian Somers                        inet_aton("141.221.254.101"));
4813efa11bbSBrian SomersPacketAliasRedirectAddr(inet_aton("192.168.0.4"),
4823efa11bbSBrian Somers                        inet_aton("141.221.254.101"));
4833efa11bbSBrian Somers.Ed
484a2900666SRuslan Ermilov.Pp
485a2900666SRuslan ErmilovAny outgoing connections such as
486a2900666SRuslan Ermilov.Xr telnet 1
487a2900666SRuslan Ermilovor
488a2900666SRuslan Ermilov.Xr ftp 1
489a2900666SRuslan Ermilovfrom 192.168.0.2, 192.168.0.3 and 192.168.0.4 will appear to come from
490a2900666SRuslan Ermilov141.221.254.101.
491a2900666SRuslan ErmilovAny incoming connections to 141.221.254.101 will be directed to 192.168.0.4.
492a2900666SRuslan Ermilov.Pp
493a2900666SRuslan ErmilovAny calls to
494a2900666SRuslan Ermilov.Fn PacketAliasRedirectPort
495a2900666SRuslan Ermilovwill have precedence over address mappings designated by
496a2900666SRuslan Ermilov.Fn PacketAliasRedirectAddr .
497a2900666SRuslan Ermilov.Pp
498a2900666SRuslan ErmilovThis function returns a pointer which can subsequently be used by
499a2900666SRuslan Ermilov.Fn PacketAliasRedirectDelete .
500a2900666SRuslan ErmilovIf
501a2900666SRuslan Ermilov.Dv NULL
502a2900666SRuslan Ermilovis returned, then the function call did not complete successfully.
503a2900666SRuslan Ermilov.Ed
504a2900666SRuslan Ermilov.Pp
5056d20a774SRuslan Ermilov.Ft int
5066d20a774SRuslan Ermilov.Fo PacketAliasAddServer
5076d20a774SRuslan Ermilov.Fa "struct alias_link *link"
5086d20a774SRuslan Ermilov.Fa "struct in_addr addr"
5096d20a774SRuslan Ermilov.Fa "u_short port"
5106d20a774SRuslan Ermilov.Fc
5116d20a774SRuslan Ermilov.Bd -ragged -offset indent
5126d20a774SRuslan ErmilovThis function sets the
5136d20a774SRuslan Ermilov.Fa link
5146d20a774SRuslan Ermilovup for Load Sharing using IP Network Address Translation (RFC 2391, LSNAT).
5156d20a774SRuslan ErmilovLSNAT operates as follows.
5166d20a774SRuslan ErmilovA client attempts to access a server by using the server virtual address.
5176d20a774SRuslan ErmilovThe LSNAT router transparently redirects the request to one of the hosts
5186d20a774SRuslan Ermilovin server pool, selected using a real-time load sharing algorithm.
5196d20a774SRuslan ErmilovMultiple sessions may be initiated from the same client, and each session
5206d20a774SRuslan Ermilovcould be directed to a different host based on load balance across server
5216d20a774SRuslan Ermilovpool hosts at the time.
5226d20a774SRuslan ErmilovIf load share is desired for just a few specific services, the configuration
5236d20a774SRuslan Ermilovon LSNAT could be defined to restrict load share for just the services
5246d20a774SRuslan Ermilovdesired.
5256d20a774SRuslan Ermilov.Pp
5266d20a774SRuslan ErmilovCurrently, only the simplest selection algorithm is implemented, where a
5276d20a774SRuslan Ermilovhost is selected on a round-robin basis only, without regard to load on
5286d20a774SRuslan Ermilovthe host.
5296d20a774SRuslan Ermilov.Pp
5306d20a774SRuslan ErmilovFirst, the
5316d20a774SRuslan Ermilov.Fa link
5326d20a774SRuslan Ermilovis created by either
5336d20a774SRuslan Ermilov.Fn PacketAliasRedirectPort
5346d20a774SRuslan Ermilovor
5356d20a774SRuslan Ermilov.Fn PacketAliasRedirectAddr .
5366d20a774SRuslan ErmilovThen,
5376d20a774SRuslan Ermilov.Fn PacketAliasAddServer
5386d20a774SRuslan Ermilovis called multiple times to add entries to the
5396d20a774SRuslan Ermilov.Fa link Ns 's
5406d20a774SRuslan Ermilovserver pool.
5416d20a774SRuslan Ermilov.Pp
5426d20a774SRuslan ErmilovFor links created with
5436d20a774SRuslan Ermilov.Fn PacketAliasRedirectAddr ,
5446d20a774SRuslan Ermilovthe
5456d20a774SRuslan Ermilov.Fa port
5466d20a774SRuslan Ermilovargument is ignored and could have any value, e.g. htons(~0).
5476d20a774SRuslan Ermilov.Pp
548234dfc90SRuslan ErmilovThis function returns 0 on success, \-1 otherwise.
549234dfc90SRuslan Ermilov.Ed
550234dfc90SRuslan Ermilov.Pp
551234dfc90SRuslan Ermilov.Ft int
552234dfc90SRuslan Ermilov.Fn PacketAliasRedirectDynamic "struct alias_link *link"
553234dfc90SRuslan Ermilov.Bd -ragged -offset indent
554234dfc90SRuslan ErmilovThis function marks the specified static redirect rule entered by
555234dfc90SRuslan Ermilov.Fn PacketAliasRedirectPort
556234dfc90SRuslan Ermilovas dynamic.
557234dfc90SRuslan ErmilovThis can be used to e.g. dynamically redirect a single TCP connection,
558234dfc90SRuslan Ermilovafter which the rule is removed.
559234dfc90SRuslan ErmilovOnly fully specified links can be made dynamic.
560234dfc90SRuslan Ermilov(See the
561234dfc90SRuslan Ermilov.Sx STATIC AND DYNAMIC LINKS
562234dfc90SRuslan Ermilovand
563234dfc90SRuslan Ermilov.Sx PARTIALLY SPECIFIED ALIASING LINKS
564234dfc90SRuslan Ermilovsections below for a definition of static vs. dynamic,
565234dfc90SRuslan Ermilovand partially vs. fully specified links.)
566234dfc90SRuslan Ermilov.Pp
567234dfc90SRuslan ErmilovThis function returns 0 on success, \-1 otherwise.
5686d20a774SRuslan Ermilov.Ed
5696d20a774SRuslan Ermilov.Pp
5703efa11bbSBrian Somers.Ft void
571a2900666SRuslan Ermilov.Fn PacketAliasRedirectDelete "struct alias_link *link"
572a2900666SRuslan Ermilov.Bd -ragged -offset indent
573a2900666SRuslan ErmilovThis function will delete a specific static redirect rule entered by
574a2900666SRuslan Ermilov.Fn PacketAliasRedirectPort
575a2900666SRuslan Ermilovor
576a2900666SRuslan Ermilov.Fn PacketAliasRedirectAddr .
577a2900666SRuslan ErmilovThe parameter
578a2900666SRuslan Ermilov.Fa link
579a2900666SRuslan Ermilovis the pointer returned by either of the redirection functions.
580a2900666SRuslan ErmilovIf an invalid pointer is passed to
581a2900666SRuslan Ermilov.Fn PacketAliasRedirectDelete ,
582a2900666SRuslan Ermilovthen a program crash or unpredictable operation could result, so it is
5833efa11bbSBrian Somersnecessary to be careful using this function.
584a2900666SRuslan Ermilov.Ed
585a2900666SRuslan Ermilov.Pp
586619d1a30SBrian Somers.Ft int
58742889ed1SBrian Somers.Fn PacketAliasProxyRule "const char *cmd"
588a2900666SRuslan Ermilov.Bd -ragged -offset indent
589619d1a30SBrian SomersThe passed
590a2900666SRuslan Ermilov.Fa cmd
591a2900666SRuslan Ermilovstring consists of one or more pairs of words.
592a2900666SRuslan ErmilovThe first word in each pair is a token and the second is the value that
593a2900666SRuslan Ermilovshould be applied for that token.
594a2900666SRuslan ErmilovTokens and their argument types are as follows:
595a2900666SRuslan Ermilov.Bl -tag -width indent
596a2900666SRuslan Ermilov.It Cm type encode_ip_hdr | encode_tcp_stream | no_encode
597619d1a30SBrian SomersIn order to support transparent proxying, it is necessary to somehow
598619d1a30SBrian Somerspass the original address and port information into the new destination
599a2900666SRuslan Ermilovserver.
600a2900666SRuslan ErmilovIf
601a2900666SRuslan Ermilov.Cm encode_ip_hdr
602619d1a30SBrian Somersis specified, the original address and port is passed as an extra IP
603a2900666SRuslan Ermilovoption.
604a2900666SRuslan ErmilovIf
605a2900666SRuslan Ermilov.Cm encode_tcp_stream
606619d1a30SBrian Somersis specified, the original address and port is passed as the first
607a2900666SRuslan Ermilovpiece of data in the TCP stream in the format
608619d1a30SBrian Somers.Dq DEST Ar IP port .
609a2900666SRuslan Ermilov.It Cm port Ar portnum
610619d1a30SBrian SomersOnly packets with the destination port
611619d1a30SBrian Somers.Ar portnum
612619d1a30SBrian Somersare proxied.
613a2900666SRuslan Ermilov.It Cm server Ar host Ns Xo
614a2900666SRuslan Ermilov.Op : Ns Ar portnum
615a2900666SRuslan Ermilov.Xc
616619d1a30SBrian SomersThis specifies the
617619d1a30SBrian Somers.Ar host
618619d1a30SBrian Somersand
619619d1a30SBrian Somers.Ar portnum
620ac8e3334SBrian Somersthat the data is to be redirected to.
621ac8e3334SBrian Somers.Ar host
622a2900666SRuslan Ermilovmust be an IP address rather than a DNS host name.
623a2900666SRuslan ErmilovIf
624619d1a30SBrian Somers.Ar portnum
625619d1a30SBrian Somersis not specified, the destination port number is not changed.
626619d1a30SBrian Somers.Pp
627619d1a30SBrian SomersThe
628619d1a30SBrian Somers.Ar server
629619d1a30SBrian Somersspecification is mandatory unless the
630a2900666SRuslan Ermilov.Cm delete
631619d1a30SBrian Somerscommand is being used.
632a2900666SRuslan Ermilov.It Cm rule Ar index
633619d1a30SBrian SomersNormally, each call to
634619d1a30SBrian Somers.Fn PacketAliasProxyRule
635a2900666SRuslan Ermilovinserts the next rule at the start of a linear list of rules.
636a2900666SRuslan ErmilovIf an
637619d1a30SBrian Somers.Ar index
638619d1a30SBrian Somersis specified, the new rule will be checked after all rules with lower
639a2900666SRuslan Ermilovindices.
640a2900666SRuslan ErmilovCalls to
641619d1a30SBrian Somers.Fn PacketAliasProxyRule
642619d1a30SBrian Somersthat do not specify a rule are assigned rule 0.
643a2900666SRuslan Ermilov.It Cm delete Ar index
644a2900666SRuslan ErmilovThis token and its argument MUST NOT be used with any other tokens.
645a2900666SRuslan ErmilovWhen used, all existing rules with the given
646619d1a30SBrian Somers.Ar index
647619d1a30SBrian Somersare deleted.
648a2900666SRuslan Ermilov.It Cm proto tcp | udp
649619d1a30SBrian SomersIf specified, only packets of the given protocol type are matched.
650a2900666SRuslan Ermilov.It Cm src Ar IP Ns Xo
651a2900666SRuslan Ermilov.Op / Ns Ar bits
652a2900666SRuslan Ermilov.Xc
653619d1a30SBrian SomersIf specified, only packets with a source address matching the given
654619d1a30SBrian Somers.Ar IP
655a2900666SRuslan Ermilovare matched.
656a2900666SRuslan ErmilovIf
657619d1a30SBrian Somers.Ar bits
658619d1a30SBrian Somersis also specified, then the first
659619d1a30SBrian Somers.Ar bits
660619d1a30SBrian Somersbits of
661619d1a30SBrian Somers.Ar IP
662619d1a30SBrian Somersare taken as a network specification, and all IP addresses from that
663619d1a30SBrian Somersnetwork will be matched.
664a2900666SRuslan Ermilov.It Cm dst Ar IP Ns Xo
665a2900666SRuslan Ermilov.Op / Ns Ar bits
666a2900666SRuslan Ermilov.Xc
667619d1a30SBrian SomersIf specified, only packets with a destination address matching the given
668619d1a30SBrian Somers.Ar IP
669a2900666SRuslan Ermilovare matched.
670a2900666SRuslan ErmilovIf
671619d1a30SBrian Somers.Ar bits
672619d1a30SBrian Somersis also specified, then the first
673619d1a30SBrian Somers.Ar bits
674619d1a30SBrian Somersbits of
675619d1a30SBrian Somers.Ar IP
676619d1a30SBrian Somersare taken as a network specification, and all IP addresses from that
677619d1a30SBrian Somersnetwork will be matched.
678619d1a30SBrian Somers.El
679a2900666SRuslan Ermilov.Pp
680619d1a30SBrian SomersThis function is usually used to redirect outgoing connections for
681619d1a30SBrian Somersinternal machines that are not permitted certain types of internet
682619d1a30SBrian Somersaccess, or to restrict access to certain external machines.
683a2900666SRuslan Ermilov.Ed
684a2900666SRuslan Ermilov.Pp
685483d2f22SRuslan Ermilov.Ft struct alias_link *
68680607605SRuslan Ermilov.Fo PacketAliasRedirectProto
687483d2f22SRuslan Ermilov.Fa "struct in_addr local_addr"
688483d2f22SRuslan Ermilov.Fa "struct in_addr remote_addr"
689483d2f22SRuslan Ermilov.Fa "struct in_addr alias_addr"
69080607605SRuslan Ermilov.Fa "u_char proto"
691483d2f22SRuslan Ermilov.Fc
692483d2f22SRuslan Ermilov.Bd -ragged -offset indent
69380607605SRuslan ErmilovThis function specifies that any IP packet with protocol number of
69480607605SRuslan Ermilov.Fa proto
69580607605SRuslan Ermilovfrom a given remote address to an alias address be
696483d2f22SRuslan Ermilovredirected to a specified local address.
697483d2f22SRuslan Ermilov.Pp
698483d2f22SRuslan ErmilovIf
699483d2f22SRuslan Ermilov.Fa local_addr
700483d2f22SRuslan Ermilovor
701483d2f22SRuslan Ermilov.Fa alias_addr
702483d2f22SRuslan Ermilovis zero, this indicates that the packet aliasing address as established
703483d2f22SRuslan Ermilovby
704483d2f22SRuslan Ermilov.Fn PacketAliasSetAddress
705483d2f22SRuslan Ermilovis to be used.
706483d2f22SRuslan ErmilovEven if
707483d2f22SRuslan Ermilov.Fn PacketAliasSetAddress
708483d2f22SRuslan Ermilovis called to change the address after
70980607605SRuslan Ermilov.Fn PacketAliasRedirectProto
710483d2f22SRuslan Ermilovis called, a zero reference will track this change.
711483d2f22SRuslan Ermilov.Pp
712483d2f22SRuslan ErmilovIf
713483d2f22SRuslan Ermilov.Fa remote_addr
71480607605SRuslan Ermilovis zero, this indicates to redirect packets from any remote address.
715483d2f22SRuslan ErmilovNon-zero remote addresses can sometimes be useful for firewalling.
716483d2f22SRuslan Ermilov.Pp
717483d2f22SRuslan ErmilovIf two calls to
71880607605SRuslan Ermilov.Fn PacketAliasRedirectProto
719483d2f22SRuslan Ermilovoverlap in their address specifications, then the most recent call
720483d2f22SRuslan Ermilovwill have precedence.
721483d2f22SRuslan Ermilov.Pp
722483d2f22SRuslan ErmilovThis function returns a pointer which can subsequently be used by
723483d2f22SRuslan Ermilov.Fn PacketAliasRedirectDelete .
724483d2f22SRuslan ErmilovIf
725483d2f22SRuslan Ermilov.Dv NULL
726483d2f22SRuslan Ermilovis returned, then the function call did not complete successfully.
727483d2f22SRuslan Ermilov.Ed
728a2900666SRuslan Ermilov.Sh FRAGMENT HANDLING
729a2900666SRuslan ErmilovThe functions in this section are used to deal with incoming fragments.
730a2900666SRuslan Ermilov.Pp
731a2900666SRuslan ErmilovOutgoing fragments are handled within
732a2900666SRuslan Ermilov.Fn PacketAliasOut
733a2900666SRuslan Ermilovby changing the address according to any applicable mapping set by
7345e8fc2d2SRuslan Ermilov.Fn PacketAliasRedirectAddr ,
7351855100fSAlexey Zelkinor the default aliasing address set by
736a2900666SRuslan Ermilov.Fn PacketAliasSetAddress .
737a2900666SRuslan Ermilov.Pp
7381855100fSAlexey ZelkinIncoming fragments are handled in one of two ways.
739a2900666SRuslan ErmilovIf the header of a fragmented IP packet has already been seen, then all
740a2900666SRuslan Ermilovsubsequent fragments will be re-mapped in the same manner the header
741a2900666SRuslan Ermilovfragment was.
742a2900666SRuslan ErmilovFragments which arrive before the header are saved and then retrieved
743a2900666SRuslan Ermilovonce the header fragment has been resolved.
744a2900666SRuslan Ermilov.Pp
7453efa11bbSBrian Somers.Ft int
7463efa11bbSBrian Somers.Fn PacketAliasSaveFragment "char *ptr"
747a2900666SRuslan Ermilov.Bd -ragged -offset indent
748a2900666SRuslan ErmilovWhen
749a2900666SRuslan Ermilov.Fn PacketAliasIn
750a2900666SRuslan Ermilovreturns
751a2900666SRuslan Ermilov.Dv PKT_ALIAS_UNRESOLVED_FRAGMENT ,
752a2900666SRuslan Ermilovthis function can be used to save the pointer to the unresolved fragment.
753a2900666SRuslan Ermilov.Pp
7543efa11bbSBrian SomersIt is implicitly assumed that
755a2900666SRuslan Ermilov.Fa ptr
7563efa11bbSBrian Somerspoints to a block of memory allocated by
757a2900666SRuslan Ermilov.Xr malloc 3 .
758a2900666SRuslan ErmilovIf the fragment is never resolved, the packet aliasing engine will
759a2900666SRuslan Ermilovautomatically free the memory after a timeout period.
760a2900666SRuslan Ermilov[Eventually this function should be modified so that a callback function
761a2900666SRuslan Ermilovfor freeing memory is passed as an argument.]
762a2900666SRuslan Ermilov.Pp
763a2900666SRuslan ErmilovThis function returns
764a2900666SRuslan Ermilov.Dv PKT_ALIAS_OK
765a2900666SRuslan Ermilovif it was successful and
766a2900666SRuslan Ermilov.Dv PKT_ALIAS_ERROR
767a2900666SRuslan Ermilovif there was an error.
768a2900666SRuslan Ermilov.Ed
769a2900666SRuslan Ermilov.Pp
7703efa11bbSBrian Somers.Ft char *
7713efa11bbSBrian Somers.Fn PacketAliasGetFragment "char *buffer"
772a2900666SRuslan Ermilov.Bd -ragged -offset indent
773a2900666SRuslan ErmilovThis function can be used to retrieve fragment pointers saved by
774a2900666SRuslan Ermilov.Fn PacketAliasSaveFragment .
7753efa11bbSBrian SomersThe IP header fragment pointed to by
776a2900666SRuslan Ermilov.Fa buffer
7773efa11bbSBrian Somersis the header fragment indicated when
778a2900666SRuslan Ermilov.Fn PacketAliasIn
779a2900666SRuslan Ermilovreturns
780a2900666SRuslan Ermilov.Dv PKT_ALIAS_FOUND_HEADER_FRAGMENT .
781a2900666SRuslan ErmilovOnce a fragment pointer is retrieved, it becomes the calling program's
782a2900666SRuslan Ermilovresponsibility to free the dynamically allocated memory for the fragment.
783a2900666SRuslan Ermilov.Pp
784a2900666SRuslan Ermilov.Fn PacketAliasGetFragment
785a2900666SRuslan Ermilovcan be called sequentially until there are no more fragments available,
786a2900666SRuslan Ermilovat which time it returns
787a2900666SRuslan Ermilov.Dv NULL .
788a2900666SRuslan Ermilov.Ed
789a2900666SRuslan Ermilov.Pp
7903efa11bbSBrian Somers.Ft void
7913efa11bbSBrian Somers.Fn PacketAliasFragmentIn "char *header" "char *fragment"
792a2900666SRuslan Ermilov.Bd -ragged -offset indent
7933efa11bbSBrian SomersWhen a fragment is retrieved with
794a2900666SRuslan Ermilov.Fn PacketAliasGetFragment ,
795a2900666SRuslan Ermilovit can then be de-aliased with a call to
796a2900666SRuslan Ermilov.Fn PacketAliasFragmentIn .
797a2900666SRuslan ErmilovThe
798a2900666SRuslan Ermilov.Fa header
799a2900666SRuslan Ermilovargument is the pointer to a header fragment used as a template, and
800a2900666SRuslan Ermilov.Fa fragment
8013efa11bbSBrian Somersis the pointer to the packet to be de-aliased.
802a2900666SRuslan Ermilov.Ed
803a2900666SRuslan Ermilov.Sh MISCELLANEOUS FUNCTIONS
8043efa11bbSBrian Somers.Ft void
8053efa11bbSBrian Somers.Fn PacketAliasSetTarget "struct in_addr addr"
806a2900666SRuslan Ermilov.Bd -ragged -offset indent
807a2900666SRuslan ErmilovWhen an incoming packet not associated with any pre-existing aliasing link
808a2900666SRuslan Ermilovarrives at the host machine, it will be sent to the address indicated by a
809a2900666SRuslan Ermilovcall to
810a2900666SRuslan Ermilov.Fn PacketAliasSetTarget .
811a2900666SRuslan Ermilov.Pp
812151682eaSBrian SomersIf this function is called with an
813a2900666SRuslan Ermilov.Dv INADDR_NONE
814a2900666SRuslan Ermilovaddress argument, then all new incoming packets go to the address set by
815a2900666SRuslan Ermilov.Fn PacketAliasSetAddress .
816a2900666SRuslan Ermilov.Pp
817151682eaSBrian SomersIf this function is not called, or is called with an
818a2900666SRuslan Ermilov.Dv INADDR_ANY
819a2900666SRuslan Ermilovaddress argument, then all new incoming packets go to the address specified
820a2900666SRuslan Ermilovin the packet.
821a2900666SRuslan ErmilovThis allows external machines to talk directly to internal machines if they
822a2900666SRuslan Ermilovcan route packets to the machine in question.
823a2900666SRuslan Ermilov.Ed
824a2900666SRuslan Ermilov.Pp
8253efa11bbSBrian Somers.Ft int
826a2900666SRuslan Ermilov.Fn PacketAliasCheckNewLink void
827a2900666SRuslan Ermilov.Bd -ragged -offset indent
828a2900666SRuslan ErmilovThis function returns a non-zero value when a new aliasing link is created.
829a2900666SRuslan ErmilovIn circumstances where incoming traffic is being sequentially sent to
830a2900666SRuslan Ermilovdifferent local servers, this function can be used to trigger when
831a2900666SRuslan Ermilov.Fn PacketAliasSetTarget
8323efa11bbSBrian Somersis called to change the default target address.
833a2900666SRuslan Ermilov.Ed
834a2900666SRuslan Ermilov.Pp
8353efa11bbSBrian Somers.Ft u_short
836442a25bdSBruce Evans.Fn PacketAliasInternetChecksum "u_short *buffer" "int nbytes"
837a2900666SRuslan Ermilov.Bd -ragged -offset indent
838a2900666SRuslan ErmilovThis is a utility function that does not seem to be available elsewhere and
839a2900666SRuslan Ermilovis included as a convenience.
840a2900666SRuslan ErmilovIt computes the internet checksum, which is used in both IP and
841a2900666SRuslan Ermilovprotocol-specific headers (TCP, UDP, ICMP).
842a2900666SRuslan Ermilov.Pp
843a2900666SRuslan ErmilovThe
844a2900666SRuslan Ermilov.Fa buffer
845a2900666SRuslan Ermilovargument points to the data block to be checksummed, and
846a2900666SRuslan Ermilov.Fa nbytes
847a2900666SRuslan Ermilovis the number of bytes.
848a2900666SRuslan ErmilovThe 16-bit checksum field should be zeroed before computing the checksum.
849a2900666SRuslan Ermilov.Pp
850a2900666SRuslan ErmilovChecksums can also be verified by operating on a block of data including
851a2900666SRuslan Ermilovits checksum.
852a2900666SRuslan ErmilovIf the checksum is valid,
853a2900666SRuslan Ermilov.Fn PacketAliasInternetChecksum
854a2900666SRuslan Ermilovwill return zero.
855a2900666SRuslan Ermilov.Ed
856642e43b3SArchie Cobbs.Pp
857642e43b3SArchie Cobbs.Ft int
858642e43b3SArchie Cobbs.Fn PacketUnaliasOut "char *buffer" "int maxpacketsize"
859642e43b3SArchie Cobbs.Bd -ragged -offset indent
86071845bffSSheldon HearnAn outgoing packet, which has already been aliased,
86171845bffSSheldon Hearnhas its private address/port information restored by this function.
862642e43b3SArchie CobbsThe IP packet is pointed to by
863642e43b3SArchie Cobbs.Fa buffer ,
864642e43b3SArchie Cobbsand
865642e43b3SArchie Cobbs.Fa maxpacketsize
866642e43b3SArchie Cobbsis provided for error checking purposes.
867642e43b3SArchie CobbsThis function can be used if an already-aliased packet needs to have its
868642e43b3SArchie Cobbsoriginal IP header restored for further processing (eg. logging).
869642e43b3SArchie Cobbs.Ed
870642e43b3SArchie Cobbs.Sh BUGS
871642e43b3SArchie CobbsPPTP aliasing does not work when more than one internal client
872642e43b3SArchie Cobbsconnects to the same external server at the same time, because
873642e43b3SArchie CobbsPPTP requires a single TCP control connection to be established
874642e43b3SArchie Cobbsbetween any two IP addresses.
875a2900666SRuslan Ermilov.Sh AUTHORS
876e83aaae3SBrian Somers.An Charles Mott Aq cm@linktel.net ,
877a2900666SRuslan Ermilovversions 1.0 - 1.8, 2.0 - 2.4.
878a2900666SRuslan Ermilov.An Eivind Eklund Aq eivind@FreeBSD.org ,
879a2900666SRuslan Ermilovversions 1.8b, 1.9 and 2.5.
880a2900666SRuslan ErmilovAdded IRC DCC support as well as contributing a number of architectural
881a2900666SRuslan Ermilovimprovements; added the firewall bypass for FTP/IRC DCC.
88255a39fc5SRuslan Ermilov.An Erik Salander Aq erik@whistle.com
883642e43b3SArchie Cobbsadded support for PPTP and RTSP.
884642e43b3SArchie Cobbs.An Junichi Satoh Aq junichi@junichi.org
885642e43b3SArchie Cobbsadded support for RTSP/PNA.
886a2900666SRuslan Ermilov.Sh ACKNOWLEDGMENTS
887a2900666SRuslan ErmilovListed below, in approximate chronological order, are individuals who
888a2900666SRuslan Ermilovhave provided valuable comments and/or debugging assistance.
889a2900666SRuslan Ermilov.Pp
8901b7b85c4SRuslan Ermilov.Bd -ragged -offset indent
8911b7b85c4SRuslan Ermilov.An -split
8921b7b85c4SRuslan Ermilov.An Gary Roberts
8931b7b85c4SRuslan Ermilov.An Tom Torrance
8941b7b85c4SRuslan Ermilov.An Reto Burkhalter
8951b7b85c4SRuslan Ermilov.An Martin Renters
8961b7b85c4SRuslan Ermilov.An Brian Somers
8971b7b85c4SRuslan Ermilov.An Paul Traina
8981b7b85c4SRuslan Ermilov.An Ari Suutari
8991b7b85c4SRuslan Ermilov.An Dave Remien
9001b7b85c4SRuslan Ermilov.An J. Fortes
9011b7b85c4SRuslan Ermilov.An Andrzej Bialecki
9021b7b85c4SRuslan Ermilov.An Gordon Burditt
9031b7b85c4SRuslan Ermilov.Ed
904a2900666SRuslan Ermilov.Sh CONCEPTUAL BACKGROUND
905a2900666SRuslan ErmilovThis section is intended for those who are planning to modify the source
906a2900666SRuslan Ermilovcode or want to create somewhat esoteric applications using the packet
907a2900666SRuslan Ermilovaliasing functions.
908a2900666SRuslan Ermilov.Pp
909a2900666SRuslan ErmilovThe conceptual framework under which the packet aliasing engine operates
910a2900666SRuslan Ermilovis described here.
9113efa11bbSBrian SomersCentral to the discussion is the idea of an
912a2900666SRuslan Ermilov.Em aliasing link
913a2900666SRuslan Ermilovwhich describes the relationship for a given packet transaction between
914a2900666SRuslan Ermilovthe local machine, aliased identity and remote machine.
915a2900666SRuslan ErmilovIt is discussed how such links come into existence and are destroyed.
916a2900666SRuslan Ermilov.Ss ALIASING LINKS
917a2900666SRuslan ErmilovThere is a notion of an
918a2900666SRuslan Ermilov.Em aliasing link ,
919a2900666SRuslan Ermilovwhich is a 7-tuple describing a specific translation:
9203efa11bbSBrian Somers.Bd -literal -offset indent
9213efa11bbSBrian Somers(local addr, local port, alias addr, alias port,
9223efa11bbSBrian Somers remote addr, remote port, protocol)
9233efa11bbSBrian Somers.Ed
924a2900666SRuslan Ermilov.Pp
925a2900666SRuslan ErmilovOutgoing packets have the local address and port number replaced with the
926a2900666SRuslan Ermilovalias address and port number.
927a2900666SRuslan ErmilovIncoming packets undergo the reverse process.
928a2900666SRuslan ErmilovThe packet aliasing engine attempts to match packets against an internal
929a2900666SRuslan Ermilovtable of aliasing links to determine how to modify a given IP packet.
930a2900666SRuslan ErmilovBoth the IP header and protocol dependent headers are modified as necessary.
931a2900666SRuslan ErmilovAliasing links are created and deleted as necessary according to network
932a2900666SRuslan Ermilovtraffic.
933a2900666SRuslan Ermilov.Pp
934a2900666SRuslan ErmilovProtocols can be TCP, UDP or even ICMP in certain circumstances.
935a2900666SRuslan Ermilov(Some types of ICMP packets can be aliased according to sequence or ID
936a2900666SRuslan Ermilovnumber which acts as an equivalent port number for identifying how
937a2900666SRuslan Ermilovindividual packets should be handled.)
938a2900666SRuslan Ermilov.Pp
939a2900666SRuslan ErmilovEach aliasing link must have a unique combination of the following five
940a2900666SRuslan Ermilovquantities: alias address/port, remote address/port and protocol.
941a2900666SRuslan ErmilovThis ensures that several machines on a local network can share the
942a2900666SRuslan Ermilovsame aliasing IP address.
943a2900666SRuslan ErmilovIn cases where conflicts might arise, the aliasing port is chosen so that
944a2900666SRuslan Ermilovuniqueness is maintained.
945a2900666SRuslan Ermilov.Ss STATIC AND DYNAMIC LINKS
9463efa11bbSBrian SomersAliasing links can either be static or dynamic.
947a2900666SRuslan ErmilovStatic links persist indefinitely and represent fixed rules for translating
948a2900666SRuslan ErmilovIP packets.
949a2900666SRuslan ErmilovDynamic links come into existence for a specific TCP connection or UDP
950a2900666SRuslan Ermilovtransaction or ICMP ECHO sequence.
951a2900666SRuslan ErmilovFor the case of TCP, the connection can be monitored to see when the
952a2900666SRuslan Ermilovassociated aliasing link should be deleted.
953a2900666SRuslan ErmilovAliasing links for UDP transactions (and ICMP ECHO and TIMESTAMP requests)
954a2900666SRuslan Ermilovwork on a simple timeout rule.
955a2900666SRuslan ErmilovWhen no activity is observed on a dynamic link for a certain amount of time
956a2900666SRuslan Ermilovit is automatically deleted.
957a2900666SRuslan ErmilovTimeout rules also apply to TCP connections which do not open or close
9583efa11bbSBrian Somersproperly.
959a2900666SRuslan Ermilov.Ss PARTIALLY SPECIFIED ALIASING LINKS
960a2900666SRuslan ErmilovAliasing links can be partially specified, meaning that the remote address
961a2900666SRuslan Ermilovand/or remote port are unknown.
962a2900666SRuslan ErmilovIn this case, when a packet matching the incomplete specification is found,
963a2900666SRuslan Ermilova fully specified dynamic link is created.
964a2900666SRuslan ErmilovIf the original partially specified link is dynamic, it will be deleted
965a2900666SRuslan Ermilovafter the fully specified link is created, otherwise it will persist.
966a2900666SRuslan Ermilov.Pp
967a2900666SRuslan ErmilovFor instance, a partially specified link might be
9683efa11bbSBrian Somers.Bd -literal -offset indent
9693efa11bbSBrian Somers(192.168.0.4, 23, 204.228.203.215, 8066, 0, 0, tcp)
9703efa11bbSBrian Somers.Ed
971a2900666SRuslan Ermilov.Pp
972a2900666SRuslan ErmilovThe zeros denote unspecified components for the remote address and port.
973a2900666SRuslan ErmilovIf this link were static it would have the effect of redirecting all
974a2900666SRuslan Ermilovincoming traffic from port 8066 of 204.228.203.215 to port 23 (telnet)
975a2900666SRuslan Ermilovof machine 192.168.0.4 on the local network.
976a2900666SRuslan ErmilovEach individual telnet connection would initiate the creation of a distinct
977a2900666SRuslan Ermilovdynamic link.
978a2900666SRuslan Ermilov.Ss DYNAMIC LINK CREATION
979a2900666SRuslan ErmilovIn addition to aliasing links, there are also address mappings that can be
980a2900666SRuslan Ermilovstored within the internal data table of the packet aliasing mechanism.
9813efa11bbSBrian Somers.Bd -literal -offset indent
9823efa11bbSBrian Somers(local addr, alias addr)
9833efa11bbSBrian Somers.Ed
984a2900666SRuslan Ermilov.Pp
985a2900666SRuslan ErmilovAddress mappings are searched when creating new dynamic links.
986a2900666SRuslan Ermilov.Pp
987a2900666SRuslan ErmilovAll outgoing packets from the local network automatically create a dynamic
988a2900666SRuslan Ermilovlink if they do not match an already existing fully specified link.
989a2900666SRuslan ErmilovIf an address mapping exists for the outgoing packet, this determines
990a2900666SRuslan Ermilovthe alias address to be used.
991a2900666SRuslan ErmilovIf no mapping exists, then a default address, usually the address of the
992a2900666SRuslan Ermilovpacket aliasing host, is used.
993a2900666SRuslan ErmilovIf necessary, this default address can be changed as often as each individual
994a2900666SRuslan Ermilovpacket arrives.
995a2900666SRuslan Ermilov.Pp
996a2900666SRuslan ErmilovThe aliasing port number is determined such that the new dynamic link does
997a2900666SRuslan Ermilovnot conflict with any existing links.
998a2900666SRuslan ErmilovIn the default operating mode, the packet aliasing engine attempts to set
999a2900666SRuslan Ermilovthe aliasing port equal to the local port number.
1000a2900666SRuslan ErmilovIf this results in a conflict, then port numbers are randomly chosen until
1001a2900666SRuslan Ermilova unique aliasing link can be established.
1002a2900666SRuslan ErmilovIn an alternate operating mode, the first choice of an aliasing port is also
1003a2900666SRuslan Ermilovrandom and unrelated to the local port number.
1004