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. 1019703a107SPhilippe CharnierThe 102a2900666SRuslan Ermilov.Fn PacketAliasSetAddress 1039703a107SPhilippe Charnierfunction is normally called afterwards, and any desired changes from the 1049703a107SPhilippe Charnierdefault mode bits listed above require a call to 105a2900666SRuslan Ermilov.Fn PacketAliasSetMode . 106a2900666SRuslan Ermilov.Pp 107a2900666SRuslan ErmilovIt is mandatory that this function be called at the beginning of a program 108a2900666SRuslan Ermilovprior to any packet handling. 109a2900666SRuslan Ermilov.Ed 110a2900666SRuslan Ermilov.Pp 1118ddc51bcSEivind Eklund.Ft void 112a2900666SRuslan Ermilov.Fn PacketAliasUninit void 113a2900666SRuslan Ermilov.Bd -ragged -offset indent 114a2900666SRuslan ErmilovThis function has no arguments or return value and is used to clear any 115a2900666SRuslan Ermilovresources attached to internal data structures. 116a2900666SRuslan Ermilov.Pp 117a2900666SRuslan ErmilovThis functions should be called when a program stops using the aliasing 118a2900666SRuslan Ermilovengine; it does, amongst other things, clear out any firewall holes. 119a2900666SRuslan ErmilovTo provide backwards compatibility and extra security, it is added to 120a2900666SRuslan Ermilovthe 121a2900666SRuslan Ermilov.Xr atexit 3 122a2900666SRuslan Ermilovchain by 123a2900666SRuslan Ermilov.Fn PacketAliasInit . 124a2900666SRuslan ErmilovCalling it multiple times is harmless. 125a2900666SRuslan Ermilov.Ed 126a2900666SRuslan Ermilov.Pp 1273efa11bbSBrian Somers.Ft void 1283efa11bbSBrian Somers.Fn PacketAliasSetAddress "struct in_addr addr" 129a2900666SRuslan Ermilov.Bd -ragged -offset indent 130a2900666SRuslan ErmilovThis function sets the source address to which outgoing packets from the 131a2900666SRuslan Ermilovlocal area network are aliased. 132a2900666SRuslan ErmilovAll outgoing packets are re-mapped to this address unless overridden by a 133a2900666SRuslan Ermilovstatic address mapping established by 134a2900666SRuslan Ermilov.Fn PacketAliasRedirectAddr . 135f1a529f3SRuslan ErmilovIf this function is not called, and no static rules match, an outgoing 136f1a529f3SRuslan Ermilovpacket retains its source address. 137a2900666SRuslan Ermilov.Pp 138a2900666SRuslan ErmilovIf the 139a2900666SRuslan Ermilov.Dv PKT_ALIAS_RESET_ON_ADDR_CHANGE 140a2900666SRuslan Ermilovmode bit is set (the default mode of operation), then the internal aliasing 141a2900666SRuslan Ermilovlink tables will be reset any time the aliasing address changes. 142a2900666SRuslan ErmilovThis is useful for interfaces such as 143a2900666SRuslan Ermilov.Xr ppp 8 , 144a2900666SRuslan Ermilovwhere the IP 145a2900666SRuslan Ermilovaddress may or may not change on successive dial-up attempts. 146a2900666SRuslan Ermilov.Pp 147a2900666SRuslan ErmilovIf the 148a2900666SRuslan Ermilov.Dv PKT_ALIAS_RESET_ON_ADDR_CHANGE 149a2900666SRuslan Ermilovmode bit is set to zero, this function can also be used to dynamically change 150a2900666SRuslan Ermilovthe aliasing address on a packet to packet basis (it is a low overhead call). 151a2900666SRuslan Ermilov.Pp 152a2900666SRuslan ErmilovIt is mandatory that this function be called prior to any packet handling. 153a2900666SRuslan Ermilov.Ed 154a2900666SRuslan Ermilov.Pp 155442a25bdSBruce Evans.Ft unsigned int 156a2900666SRuslan Ermilov.Fn PacketAliasSetMode "unsigned int flags" "unsigned int mask" 157a2900666SRuslan Ermilov.Bd -ragged -offset indent 1583efa11bbSBrian SomersThis function sets or clears mode bits 1593efa11bbSBrian Somersaccording to the value of 160a2900666SRuslan Ermilov.Fa flags . 1613efa11bbSBrian SomersOnly bits marked in 162a2900666SRuslan Ermilov.Fa mask 163a2900666SRuslan Ermilovare affected. 164a2900666SRuslan ErmilovThe following mode bits are defined in 165fe08efe6SRuslan Ermilov.In alias.h : 166a2900666SRuslan Ermilov.Bl -tag -width indent 167a2900666SRuslan Ermilov.It Dv PKT_ALIAS_LOG 168a2900666SRuslan ErmilovEnables logging into 169a2900666SRuslan Ermilov.Pa /var/log/alias.log . 170a2900666SRuslan ErmilovEach time an aliasing link is created or deleted, the log file is appended 171a2900666SRuslan Ermilovwith the current number of ICMP, TCP and UDP links. 172a2900666SRuslan ErmilovMainly useful for debugging when the log file is viewed continuously with 173a2900666SRuslan Ermilov.Xr tail 1 . 174a2900666SRuslan Ermilov.It Dv PKT_ALIAS_DENY_INCOMING 175a2900666SRuslan ErmilovIf this mode bit is set, all incoming packets associated with new TCP 176a2900666SRuslan Ermilovconnections or new UDP transactions will be marked for being ignored 177c4d9468eSRuslan Ermilov.Fn ( PacketAliasIn 178a2900666SRuslan Ermilovreturns 179a2900666SRuslan Ermilov.Dv PKT_ALIAS_IGNORED 180c4d9468eSRuslan Ermilovcode) 181a2900666SRuslan Ermilovby the calling program. 182a2900666SRuslan ErmilovResponse packets to connections or transactions initiated from the packet 183a2900666SRuslan Ermilovaliasing host or local network will be unaffected. 184a2900666SRuslan ErmilovThis mode bit is useful for implementing a one-way firewall. 185a2900666SRuslan Ermilov.It Dv PKT_ALIAS_SAME_PORTS 186a2900666SRuslan ErmilovIf this mode bit is set, the packet aliasing engine will attempt to leave 187a2900666SRuslan Ermilovthe alias port numbers unchanged from the actual local port numbers. 188a2900666SRuslan ErmilovThis can be done as long as the quintuple (proto, alias addr, alias port, 189a2900666SRuslan Ermilovremote addr, remote port) is unique. 190a2900666SRuslan ErmilovIf a conflict exists, a new aliasing port number is chosen even if this 191a2900666SRuslan Ermilovmode bit is set. 192a2900666SRuslan Ermilov.It Dv PKT_ALIAS_USE_SOCKETS 193a2900666SRuslan ErmilovThis bit should be set when the packet aliasing host originates network 194a2900666SRuslan Ermilovtraffic as well as forwards it. 195a2900666SRuslan ErmilovWhen the packet aliasing host is waiting for a connection from an unknown 196a2900666SRuslan Ermilovhost address or unknown port number (e.g. an FTP data connection), this 197a2900666SRuslan Ermilovmode bit specifies that a socket be allocated as a place holder to prevent 198a2900666SRuslan Ermilovport conflicts. 199a2900666SRuslan ErmilovOnce a connection is established, usually within a minute or so, the socket 200a2900666SRuslan Ermilovis closed. 201a2900666SRuslan Ermilov.It Dv PKT_ALIAS_UNREGISTERED_ONLY 202a2900666SRuslan ErmilovIf this mode bit is set, traffic on the local network which does not 203a2900666SRuslan Ermilovoriginate from unregistered address spaces will be ignored. 204a2900666SRuslan ErmilovStandard Class A, B and C unregistered addresses are: 2053efa11bbSBrian Somers.Bd -literal -offset indent 2063efa11bbSBrian Somers10.0.0.0 -> 10.255.255.255 (Class A subnet) 2073efa11bbSBrian Somers172.16.0.0 -> 172.31.255.255 (Class B subnets) 2083efa11bbSBrian Somers192.168.0.0 -> 192.168.255.255 (Class C subnets) 2093efa11bbSBrian Somers.Ed 210a2900666SRuslan Ermilov.Pp 211a2900666SRuslan ErmilovThis option is useful in the case that packet aliasing host has both 212a2900666SRuslan Ermilovregistered and unregistered subnets on different interfaces. 213a2900666SRuslan ErmilovThe registered subnet is fully accessible to the outside world, so traffic 214a2900666SRuslan Ermilovfrom it does not need to be passed through the packet aliasing engine. 215a2900666SRuslan Ermilov.It Dv PKT_ALIAS_RESET_ON_ADDR_CHANGE 2163efa11bbSBrian SomersWhen this mode bit is set and 217a2900666SRuslan Ermilov.Fn PacketAliasSetAddress 218a2900666SRuslan Ermilovis called to change the aliasing address, the internal link table of the 219a2900666SRuslan Ermilovpacket aliasing engine will be cleared. 220a2900666SRuslan ErmilovThis operating mode is useful for 221a2900666SRuslan Ermilov.Xr ppp 8 222a2900666SRuslan Ermilovlinks where the interface address can sometimes change or remain the same 223a2900666SRuslan Ermilovbetween dial-up attempts. 224a2900666SRuslan ErmilovIf this mode bit is not set, the link table will never be reset in the event 225a2900666SRuslan Ermilovof an address change. 226a2900666SRuslan Ermilov.It Dv PKT_ALIAS_PUNCH_FW 227a2900666SRuslan ErmilovThis option makes 228a2900666SRuslan Ermilov.Nm 229a2900666SRuslan Ermilov`punch holes' in an 230a2900666SRuslan Ermilov.Xr ipfirewall 4 231a2900666SRuslan Ermilovbased firewall for FTP/IRC DCC connections. 232a2900666SRuslan ErmilovThe holes punched are bound by from/to IP address and port; it will not be 233a2900666SRuslan Ermilovpossible to use a hole for another connection. 234a2900666SRuslan ErmilovA hole is removed when the connection that uses it dies. 235a2900666SRuslan ErmilovTo cater to unexpected death of a program using 236a2900666SRuslan Ermilov.Nm 237a2900666SRuslan Ermilov(e.g. kill -9), 238a2900666SRuslan Ermilovchanging the state of the flag will clear the entire firewall range 239a2900666SRuslan Ermilovallocated for holes. 2408ddc51bcSEivind EklundThis will also happen on the initial call to 241a2900666SRuslan Ermilov.Fn PacketAliasSetFWBase . 242a2900666SRuslan ErmilovThis call must happen prior to setting this flag. 243a2900666SRuslan Ermilov.It Dv PKT_ALIAS_REVERSE 244a2900666SRuslan ErmilovThis option makes 245a2900666SRuslan Ermilov.Nm 246a2900666SRuslan Ermilovreverse the way it handles incoming and outgoing packets, allowing it 247a2900666SRuslan Ermilovto be fed with data that passes through the internal interface rather 248a2900666SRuslan Ermilovthan the external one. 249a2900666SRuslan Ermilov.It Dv PKT_ALIAS_PROXY_ONLY 250a2900666SRuslan ErmilovThis option tells 251a2900666SRuslan Ermilov.Nm 252a2900666SRuslan Ermilovto obey transparent proxy rules only. 253a2900666SRuslan ErmilovNormal packet aliasing is not performed. 25421b9df57SBrian SomersSee 25521b9df57SBrian Somers.Fn PacketAliasProxyRule 25621b9df57SBrian Somersbelow for details. 2573efa11bbSBrian Somers.El 258a2900666SRuslan Ermilov.Ed 259a2900666SRuslan Ermilov.Pp 2608ddc51bcSEivind Eklund.Ft void 2618ddc51bcSEivind Eklund.Fn PacketAliasSetFWBase "unsigned int base" "unsigned int num" 262a2900666SRuslan Ermilov.Bd -ragged -offset indent 263a2900666SRuslan ErmilovSet firewall range allocated for punching firewall holes (with the 264a2900666SRuslan Ermilov.Dv PKT_ALIAS_PUNCH_FW 265a2900666SRuslan Ermilovflag). 266a2900666SRuslan ErmilovThe range will be cleared for all rules on initialization. 267a2900666SRuslan Ermilov.Ed 268a2900666SRuslan Ermilov.Sh PACKET HANDLING 269a2900666SRuslan ErmilovThe packet handling functions are used to modify incoming (remote to local) 270a2900666SRuslan Ermilovand outgoing (local to remote) packets. 271a2900666SRuslan ErmilovThe calling program is responsible for receiving and sending packets via 272a2900666SRuslan Ermilovnetwork interfaces. 273a2900666SRuslan Ermilov.Pp 274a2900666SRuslan ErmilovAlong with 275a2900666SRuslan Ermilov.Fn PacketAliasInit 276a2900666SRuslan Ermilovand 277a2900666SRuslan Ermilov.Fn PacketAliasSetAddress , 278a2900666SRuslan Ermilovthe two packet handling functions, 279a2900666SRuslan Ermilov.Fn PacketAliasIn 280a2900666SRuslan Ermilovand 281a2900666SRuslan Ermilov.Fn PacketAliasOut , 282a2900666SRuslan Ermilovcomprise minimal set of functions needed for a basic IP masquerading 283a2900666SRuslan Ermilovimplementation. 284a2900666SRuslan Ermilov.Pp 2853efa11bbSBrian Somers.Ft int 2863efa11bbSBrian Somers.Fn PacketAliasIn "char *buffer" "int maxpacketsize" 287a2900666SRuslan Ermilov.Bd -ragged -offset indent 288a2900666SRuslan ErmilovAn incoming packet coming from a remote machine to the local network is 289a2900666SRuslan Ermilovde-aliased by this function. 2903efa11bbSBrian SomersThe IP packet is pointed to by 291a2900666SRuslan Ermilov.Fa buffer , 2923efa11bbSBrian Somersand 293a2900666SRuslan Ermilov.Fa maxpacketsize 294a2900666SRuslan Ermilovindicates the size of the data structure containing the packet and should 295a2900666SRuslan Ermilovbe at least as large as the actual packet size. 296a2900666SRuslan Ermilov.Pp 2973efa11bbSBrian SomersReturn codes: 298a2900666SRuslan Ermilov.Bl -tag -width indent 299a2900666SRuslan Ermilov.It Dv PKT_ALIAS_OK 3003efa11bbSBrian SomersThe packet aliasing process was successful. 301a2900666SRuslan Ermilov.It Dv PKT_ALIAS_IGNORED 3023efa11bbSBrian SomersThe packet was ignored and not de-aliased. 303a2900666SRuslan ErmilovThis can happen if the protocol is unrecognized, possibly an ICMP message 304a2900666SRuslan Ermilovtype is not handled or if incoming packets for new connections are being 305a2900666SRuslan Ermilovignored (if 306a2900666SRuslan Ermilov.Dv PKT_ALIAS_DENY_INCOMING 307a2900666SRuslan Ermilovmode bit was set by 308a2900666SRuslan Ermilov.Fn PacketAliasSetMode ) . 309a2900666SRuslan Ermilov.It Dv PKT_ALIAS_UNRESOLVED_FRAGMENT 310a2900666SRuslan ErmilovThis is returned when a fragment cannot be resolved because the header 311a2900666SRuslan Ermilovfragment has not been sent yet. 312a2900666SRuslan ErmilovIn this situation, fragments must be saved with 313a2900666SRuslan Ermilov.Fn PacketAliasSaveFragment 3143efa11bbSBrian Somersuntil a header fragment is found. 315a2900666SRuslan Ermilov.It Dv PKT_ALIAS_FOUND_HEADER_FRAGMENT 316a2900666SRuslan ErmilovThe packet aliasing process was successful, and a header fragment was found. 317a2900666SRuslan ErmilovThis is a signal to retrieve any unresolved fragments with 318a2900666SRuslan Ermilov.Fn PacketAliasGetFragment 319a2900666SRuslan Ermilovand de-alias them with 320a2900666SRuslan Ermilov.Fn PacketAliasFragmentIn . 321a2900666SRuslan Ermilov.It Dv PKT_ALIAS_ERROR 322a2900666SRuslan ErmilovAn internal error within the packet aliasing engine occurred. 3233efa11bbSBrian Somers.El 324a2900666SRuslan Ermilov.Ed 325a2900666SRuslan Ermilov.Pp 3263efa11bbSBrian Somers.Ft int 327b2052ac8SJohn Polstra.Fn PacketAliasOut "char *buffer" "int maxpacketsize" 328a2900666SRuslan Ermilov.Bd -ragged -offset indent 329a2900666SRuslan ErmilovAn outgoing packet coming from the local network to a remote machine is 330a2900666SRuslan Ermilovaliased by this function. 3313efa11bbSBrian SomersThe IP packet is pointed to by 332a2900666SRuslan Ermilov.Fa buffer , 3333efa11bbSBrian Somersand 334a2900666SRuslan Ermilov.Fa maxpacketsize 335a2900666SRuslan Ermilovindicates the maximum packet size permissible should the packet length be 336a2900666SRuslan Ermilovchanged. 337a2900666SRuslan ErmilovIP encoding protocols place address and port information in the encapsulated 338a2900666SRuslan Ermilovdata stream which has to be modified and can account for changes in packet 339a2900666SRuslan Ermilovlength. 340a2900666SRuslan ErmilovWell known examples of such protocols are FTP and IRC DCC. 341a2900666SRuslan Ermilov.Pp 3423efa11bbSBrian SomersReturn codes: 343a2900666SRuslan Ermilov.Bl -tag -width indent 344a2900666SRuslan Ermilov.It Dv PKT_ALIAS_OK 3453efa11bbSBrian SomersThe packet aliasing process was successful. 346a2900666SRuslan Ermilov.It Dv PKT_ALIAS_IGNORED 347a2900666SRuslan ErmilovThe packet was ignored and not aliased. 348a2900666SRuslan ErmilovThis can happen if the protocol is unrecognized, or possibly an ICMP message 349a2900666SRuslan Ermilovtype is not handled. 350a2900666SRuslan Ermilov.It Dv PKT_ALIAS_ERROR 351a2900666SRuslan ErmilovAn internal error within the packet aliasing engine occurred. 3523efa11bbSBrian Somers.El 353a2900666SRuslan Ermilov.Ed 354a2900666SRuslan Ermilov.Sh PORT AND ADDRESS REDIRECTION 355a2900666SRuslan ErmilovThe functions described in this section allow machines on the local network 356a2900666SRuslan Ermilovto be accessible in some degree to new incoming connections from the external 357a2900666SRuslan Ermilovnetwork. 358a2900666SRuslan ErmilovIndividual ports can be re-mapped or static network address translations can 359a2900666SRuslan Ermilovbe designated. 360a2900666SRuslan Ermilov.Pp 3613efa11bbSBrian Somers.Ft struct alias_link * 3623efa11bbSBrian Somers.Fo PacketAliasRedirectPort 3633efa11bbSBrian Somers.Fa "struct in_addr local_addr" 3643efa11bbSBrian Somers.Fa "u_short local_port" 3653efa11bbSBrian Somers.Fa "struct in_addr remote_addr" 3663efa11bbSBrian Somers.Fa "u_short remote_port" 3673efa11bbSBrian Somers.Fa "struct in_addr alias_addr" 3683efa11bbSBrian Somers.Fa "u_short alias_port" 3693efa11bbSBrian Somers.Fa "u_char proto" 3703efa11bbSBrian Somers.Fc 371a2900666SRuslan Ermilov.Bd -ragged -offset indent 372a2900666SRuslan ErmilovThis function specifies that traffic from a given remote address/port to 373a2900666SRuslan Ermilovan alias address/port be redirected to a specified local address/port. 3749c727d2cSJoseph KoshyThe parameter 375a2900666SRuslan Ermilov.Fa proto 376a2900666SRuslan Ermilovcan be either 377a2900666SRuslan Ermilov.Dv IPPROTO_TCP 3783efa11bbSBrian Somersor 379a2900666SRuslan Ermilov.Dv IPPROTO_UDP , 380a2900666SRuslan Ermilovas defined in 381fe08efe6SRuslan Ermilov.In netinet/in.h . 382a2900666SRuslan Ermilov.Pp 3833efa11bbSBrian SomersIf 384a2900666SRuslan Ermilov.Fa local_addr 385a2900666SRuslan Ermilovor 386a2900666SRuslan Ermilov.Fa alias_addr 387a2900666SRuslan Ermilovis zero, this indicates that the packet aliasing address as established 388a2900666SRuslan Ermilovby 389a2900666SRuslan Ermilov.Fn PacketAliasSetAddress 390a2900666SRuslan Ermilovis to be used. 391a2900666SRuslan ErmilovEven if 392483d2f22SRuslan Ermilov.Fn PacketAliasSetAddress 393a2900666SRuslan Ermilovis called to change the address after 394483d2f22SRuslan Ermilov.Fn PacketAliasRedirectPort 395a2900666SRuslan Ermilovis called, a zero reference will track this change. 396a2900666SRuslan Ermilov.Pp 3976d20a774SRuslan ErmilovIf the link is further set up to operate for a load sharing, then 3986d20a774SRuslan Ermilov.Fa local_addr 3996d20a774SRuslan Ermilovand 4006d20a774SRuslan Ermilov.Fa local_port 4016d20a774SRuslan Ermilovare ignored, and are selected dynamically from the server pool, as described in 4026d20a774SRuslan Ermilov.Fn PacketAliasAddServer 4036d20a774SRuslan Ermilovbelow. 4046d20a774SRuslan Ermilov.Pp 405a2900666SRuslan ErmilovIf 406a2900666SRuslan Ermilov.Fa remote_addr 407a2900666SRuslan Ermilovis zero, this indicates to redirect packets from any remote address. 408a2900666SRuslan ErmilovLikewise, if 409a2900666SRuslan Ermilov.Fa remote_port 410a2900666SRuslan Ermilovis zero, this indicates to redirect packets originating from any remote 411a2900666SRuslan Ermilovport number. 412a2900666SRuslan ErmilovAlmost always, the remote port specification will be zero, but non-zero 413a2900666SRuslan Ermilovremote addresses can sometimes be useful for firewalling. 414a2900666SRuslan ErmilovIf two calls to 415a2900666SRuslan Ermilov.Fn PacketAliasRedirectPort 416a2900666SRuslan Ermilovoverlap in their address/port specifications, then the most recent call 417a2900666SRuslan Ermilovwill have precedence. 418a2900666SRuslan Ermilov.Pp 419a2900666SRuslan ErmilovThis function returns a pointer which can subsequently be used by 420a2900666SRuslan Ermilov.Fn PacketAliasRedirectDelete . 421a2900666SRuslan ErmilovIf 422a2900666SRuslan Ermilov.Dv NULL 423a2900666SRuslan Ermilovis returned, then the function call did not complete successfully. 424a2900666SRuslan Ermilov.Pp 425a2900666SRuslan ErmilovAll port numbers should be in network address byte order, so it is necessary 426a2900666SRuslan Ermilovto use 427a2900666SRuslan Ermilov.Xr htons 3 428a2900666SRuslan Ermilovto convert these parameters from internally readable numbers to network byte 429a2900666SRuslan Ermilovorder. 430a2900666SRuslan ErmilovAddresses are also in network byte order, which is implicit in the use of the 431a2900666SRuslan Ermilov.Fa struct in_addr 4323efa11bbSBrian Somersdata type. 433a2900666SRuslan Ermilov.Ed 434a2900666SRuslan Ermilov.Pp 4353efa11bbSBrian Somers.Ft struct alias_link * 436442a25bdSBruce Evans.Fo PacketAliasRedirectAddr 4373efa11bbSBrian Somers.Fa "struct in_addr local_addr" 4383efa11bbSBrian Somers.Fa "struct in_addr alias_addr" 4393efa11bbSBrian Somers.Fc 440a2900666SRuslan Ermilov.Bd -ragged -offset indent 441a2900666SRuslan ErmilovThis function designates that all incoming traffic to 442a2900666SRuslan Ermilov.Fa alias_addr 4433efa11bbSBrian Somersbe redirected to 444a2900666SRuslan Ermilov.Fa local_addr . 4453efa11bbSBrian SomersSimilarly, all outgoing traffic from 446a2900666SRuslan Ermilov.Fa local_addr 4473efa11bbSBrian Somersis aliased to 448a2900666SRuslan Ermilov.Fa alias_addr . 449a2900666SRuslan Ermilov.Pp 4503efa11bbSBrian SomersIf 451a2900666SRuslan Ermilov.Fa local_addr 4523efa11bbSBrian Somersor 453a2900666SRuslan Ermilov.Fa alias_addr 454a2900666SRuslan Ermilovis zero, this indicates that the packet aliasing address as established by 455a2900666SRuslan Ermilov.Fn PacketAliasSetAddress 456a2900666SRuslan Ermilovis to be used. 457a2900666SRuslan ErmilovEven if 458a2900666SRuslan Ermilov.Fn PacketAliasSetAddress 459a2900666SRuslan Ermilovis called to change the address after 460a2900666SRuslan Ermilov.Fn PacketAliasRedirectAddr 4613efa11bbSBrian Somersis called, a zero reference will track this change. 462a2900666SRuslan Ermilov.Pp 4636d20a774SRuslan ErmilovIf the link is further set up to operate for a load sharing, then 4646d20a774SRuslan Ermilov.Fa local_addr 4656d20a774SRuslan Ermilovis ignored, and is selected dynamically from the server pool, as described in 4666d20a774SRuslan Ermilov.Fn PacketAliasAddServer 4676d20a774SRuslan Ermilovbelow. 4686d20a774SRuslan Ermilov.Pp 469a2900666SRuslan ErmilovIf subsequent calls to 470a2900666SRuslan Ermilov.Fn PacketAliasRedirectAddr 471a2900666SRuslan Ermilovuse the same aliasing address, all new incoming traffic to this aliasing 472a2900666SRuslan Ermilovaddress will be redirected to the local address made in the last function 473a2900666SRuslan Ermilovcall. 474a2900666SRuslan ErmilovNew traffic generated by any of the local machines, designated in the 475a2900666SRuslan Ermilovseveral function calls, will be aliased to the same address. 476a2900666SRuslan ErmilovConsider the following example: 477a2900666SRuslan Ermilov.Bd -literal -offset indent 4783efa11bbSBrian SomersPacketAliasRedirectAddr(inet_aton("192.168.0.2"), 4793efa11bbSBrian Somers inet_aton("141.221.254.101")); 4803efa11bbSBrian SomersPacketAliasRedirectAddr(inet_aton("192.168.0.3"), 4813efa11bbSBrian Somers inet_aton("141.221.254.101")); 4823efa11bbSBrian SomersPacketAliasRedirectAddr(inet_aton("192.168.0.4"), 4833efa11bbSBrian Somers inet_aton("141.221.254.101")); 4843efa11bbSBrian Somers.Ed 485a2900666SRuslan Ermilov.Pp 486a2900666SRuslan ErmilovAny outgoing connections such as 487a2900666SRuslan Ermilov.Xr telnet 1 488a2900666SRuslan Ermilovor 489a2900666SRuslan Ermilov.Xr ftp 1 490a2900666SRuslan Ermilovfrom 192.168.0.2, 192.168.0.3 and 192.168.0.4 will appear to come from 491a2900666SRuslan Ermilov141.221.254.101. 492a2900666SRuslan ErmilovAny incoming connections to 141.221.254.101 will be directed to 192.168.0.4. 493a2900666SRuslan Ermilov.Pp 494a2900666SRuslan ErmilovAny calls to 495a2900666SRuslan Ermilov.Fn PacketAliasRedirectPort 496a2900666SRuslan Ermilovwill have precedence over address mappings designated by 497a2900666SRuslan Ermilov.Fn PacketAliasRedirectAddr . 498a2900666SRuslan Ermilov.Pp 499a2900666SRuslan ErmilovThis function returns a pointer which can subsequently be used by 500a2900666SRuslan Ermilov.Fn PacketAliasRedirectDelete . 501a2900666SRuslan ErmilovIf 502a2900666SRuslan Ermilov.Dv NULL 503a2900666SRuslan Ermilovis returned, then the function call did not complete successfully. 504a2900666SRuslan Ermilov.Ed 505a2900666SRuslan Ermilov.Pp 5066d20a774SRuslan Ermilov.Ft int 5076d20a774SRuslan Ermilov.Fo PacketAliasAddServer 5086d20a774SRuslan Ermilov.Fa "struct alias_link *link" 5096d20a774SRuslan Ermilov.Fa "struct in_addr addr" 5106d20a774SRuslan Ermilov.Fa "u_short port" 5116d20a774SRuslan Ermilov.Fc 5126d20a774SRuslan Ermilov.Bd -ragged -offset indent 5136d20a774SRuslan ErmilovThis function sets the 5146d20a774SRuslan Ermilov.Fa link 5156d20a774SRuslan Ermilovup for Load Sharing using IP Network Address Translation (RFC 2391, LSNAT). 5166d20a774SRuslan ErmilovLSNAT operates as follows. 5176d20a774SRuslan ErmilovA client attempts to access a server by using the server virtual address. 5186d20a774SRuslan ErmilovThe LSNAT router transparently redirects the request to one of the hosts 5196d20a774SRuslan Ermilovin server pool, selected using a real-time load sharing algorithm. 5206d20a774SRuslan ErmilovMultiple sessions may be initiated from the same client, and each session 5216d20a774SRuslan Ermilovcould be directed to a different host based on load balance across server 5226d20a774SRuslan Ermilovpool hosts at the time. 5236d20a774SRuslan ErmilovIf load share is desired for just a few specific services, the configuration 5246d20a774SRuslan Ermilovon LSNAT could be defined to restrict load share for just the services 5256d20a774SRuslan Ermilovdesired. 5266d20a774SRuslan Ermilov.Pp 5276d20a774SRuslan ErmilovCurrently, only the simplest selection algorithm is implemented, where a 5286d20a774SRuslan Ermilovhost is selected on a round-robin basis only, without regard to load on 5296d20a774SRuslan Ermilovthe host. 5306d20a774SRuslan Ermilov.Pp 5316d20a774SRuslan ErmilovFirst, the 5326d20a774SRuslan Ermilov.Fa link 5336d20a774SRuslan Ermilovis created by either 5346d20a774SRuslan Ermilov.Fn PacketAliasRedirectPort 5356d20a774SRuslan Ermilovor 5366d20a774SRuslan Ermilov.Fn PacketAliasRedirectAddr . 5376d20a774SRuslan ErmilovThen, 5386d20a774SRuslan Ermilov.Fn PacketAliasAddServer 5396d20a774SRuslan Ermilovis called multiple times to add entries to the 5406d20a774SRuslan Ermilov.Fa link Ns 's 5416d20a774SRuslan Ermilovserver pool. 5426d20a774SRuslan Ermilov.Pp 5436d20a774SRuslan ErmilovFor links created with 5446d20a774SRuslan Ermilov.Fn PacketAliasRedirectAddr , 5456d20a774SRuslan Ermilovthe 5466d20a774SRuslan Ermilov.Fa port 5476d20a774SRuslan Ermilovargument is ignored and could have any value, e.g. htons(~0). 5486d20a774SRuslan Ermilov.Pp 549234dfc90SRuslan ErmilovThis function returns 0 on success, \-1 otherwise. 550234dfc90SRuslan Ermilov.Ed 551234dfc90SRuslan Ermilov.Pp 552234dfc90SRuslan Ermilov.Ft int 553234dfc90SRuslan Ermilov.Fn PacketAliasRedirectDynamic "struct alias_link *link" 554234dfc90SRuslan Ermilov.Bd -ragged -offset indent 555234dfc90SRuslan ErmilovThis function marks the specified static redirect rule entered by 556234dfc90SRuslan Ermilov.Fn PacketAliasRedirectPort 557234dfc90SRuslan Ermilovas dynamic. 558234dfc90SRuslan ErmilovThis can be used to e.g. dynamically redirect a single TCP connection, 559234dfc90SRuslan Ermilovafter which the rule is removed. 560234dfc90SRuslan ErmilovOnly fully specified links can be made dynamic. 561234dfc90SRuslan Ermilov(See the 562234dfc90SRuslan Ermilov.Sx STATIC AND DYNAMIC LINKS 563234dfc90SRuslan Ermilovand 564234dfc90SRuslan Ermilov.Sx PARTIALLY SPECIFIED ALIASING LINKS 565234dfc90SRuslan Ermilovsections below for a definition of static vs. dynamic, 566234dfc90SRuslan Ermilovand partially vs. fully specified links.) 567234dfc90SRuslan Ermilov.Pp 568234dfc90SRuslan ErmilovThis function returns 0 on success, \-1 otherwise. 5696d20a774SRuslan Ermilov.Ed 5706d20a774SRuslan Ermilov.Pp 5713efa11bbSBrian Somers.Ft void 572a2900666SRuslan Ermilov.Fn PacketAliasRedirectDelete "struct alias_link *link" 573a2900666SRuslan Ermilov.Bd -ragged -offset indent 574a2900666SRuslan ErmilovThis function will delete a specific static redirect rule entered by 575a2900666SRuslan Ermilov.Fn PacketAliasRedirectPort 576a2900666SRuslan Ermilovor 577a2900666SRuslan Ermilov.Fn PacketAliasRedirectAddr . 578a2900666SRuslan ErmilovThe parameter 579a2900666SRuslan Ermilov.Fa link 580a2900666SRuslan Ermilovis the pointer returned by either of the redirection functions. 581a2900666SRuslan ErmilovIf an invalid pointer is passed to 582a2900666SRuslan Ermilov.Fn PacketAliasRedirectDelete , 583a2900666SRuslan Ermilovthen a program crash or unpredictable operation could result, so it is 5843efa11bbSBrian Somersnecessary to be careful using this function. 585a2900666SRuslan Ermilov.Ed 586a2900666SRuslan Ermilov.Pp 587619d1a30SBrian Somers.Ft int 58842889ed1SBrian Somers.Fn PacketAliasProxyRule "const char *cmd" 589a2900666SRuslan Ermilov.Bd -ragged -offset indent 590619d1a30SBrian SomersThe passed 591a2900666SRuslan Ermilov.Fa cmd 592a2900666SRuslan Ermilovstring consists of one or more pairs of words. 593a2900666SRuslan ErmilovThe first word in each pair is a token and the second is the value that 594a2900666SRuslan Ermilovshould be applied for that token. 595a2900666SRuslan ErmilovTokens and their argument types are as follows: 596a2900666SRuslan Ermilov.Bl -tag -width indent 597a2900666SRuslan Ermilov.It Cm type encode_ip_hdr | encode_tcp_stream | no_encode 598619d1a30SBrian SomersIn order to support transparent proxying, it is necessary to somehow 599619d1a30SBrian Somerspass the original address and port information into the new destination 600a2900666SRuslan Ermilovserver. 601a2900666SRuslan ErmilovIf 602a2900666SRuslan Ermilov.Cm encode_ip_hdr 60371760898SRuslan Ermilovis specified, the original destination address and port are passed 60471760898SRuslan Ermilovas an extra IP option. 605a2900666SRuslan ErmilovIf 606a2900666SRuslan Ermilov.Cm encode_tcp_stream 60771760898SRuslan Ermilovis specified, the original destination address and port are passed 60871760898SRuslan Ermilovas the first piece of data in the TCP stream in the format 60971760898SRuslan Ermilov.Dq Li DEST Ar IP port . 610a2900666SRuslan Ermilov.It Cm port Ar portnum 611619d1a30SBrian SomersOnly packets with the destination port 612619d1a30SBrian Somers.Ar portnum 613619d1a30SBrian Somersare proxied. 6149c88dc88SRuslan Ermilov.It Cm server Ar host Ns Op : Ns Ar portnum 615619d1a30SBrian SomersThis specifies the 616619d1a30SBrian Somers.Ar host 617619d1a30SBrian Somersand 618619d1a30SBrian Somers.Ar portnum 619ac8e3334SBrian Somersthat the data is to be redirected to. 620ac8e3334SBrian Somers.Ar host 621a2900666SRuslan Ermilovmust be an IP address rather than a DNS host name. 622a2900666SRuslan ErmilovIf 623619d1a30SBrian Somers.Ar portnum 624619d1a30SBrian Somersis not specified, the destination port number is not changed. 625619d1a30SBrian Somers.Pp 626619d1a30SBrian SomersThe 627619d1a30SBrian Somers.Ar server 628619d1a30SBrian Somersspecification is mandatory unless the 629a2900666SRuslan Ermilov.Cm delete 630619d1a30SBrian Somerscommand is being used. 631a2900666SRuslan Ermilov.It Cm rule Ar index 632619d1a30SBrian SomersNormally, each call to 633619d1a30SBrian Somers.Fn PacketAliasProxyRule 634a2900666SRuslan Ermilovinserts the next rule at the start of a linear list of rules. 635a2900666SRuslan ErmilovIf an 636619d1a30SBrian Somers.Ar index 637619d1a30SBrian Somersis specified, the new rule will be checked after all rules with lower 638a2900666SRuslan Ermilovindices. 639a2900666SRuslan ErmilovCalls to 640619d1a30SBrian Somers.Fn PacketAliasProxyRule 641619d1a30SBrian Somersthat do not specify a rule are assigned rule 0. 642a2900666SRuslan Ermilov.It Cm delete Ar index 643a2900666SRuslan ErmilovThis token and its argument MUST NOT be used with any other tokens. 644a2900666SRuslan ErmilovWhen used, all existing rules with the given 645619d1a30SBrian Somers.Ar index 646619d1a30SBrian Somersare deleted. 647a2900666SRuslan Ermilov.It Cm proto tcp | udp 648619d1a30SBrian SomersIf specified, only packets of the given protocol type are matched. 6499c88dc88SRuslan Ermilov.It Cm src Ar IP Ns Op / Ns Ar bits 650619d1a30SBrian SomersIf specified, only packets with a source address matching the given 651619d1a30SBrian Somers.Ar IP 652a2900666SRuslan Ermilovare matched. 653a2900666SRuslan ErmilovIf 654619d1a30SBrian Somers.Ar bits 655619d1a30SBrian Somersis also specified, then the first 656619d1a30SBrian Somers.Ar bits 657619d1a30SBrian Somersbits of 658619d1a30SBrian Somers.Ar IP 659619d1a30SBrian Somersare taken as a network specification, and all IP addresses from that 660619d1a30SBrian Somersnetwork will be matched. 6619c88dc88SRuslan Ermilov.It Cm dst Ar IP Ns Op / Ns Ar bits 662619d1a30SBrian SomersIf specified, only packets with a destination address matching the given 663619d1a30SBrian Somers.Ar IP 664a2900666SRuslan Ermilovare matched. 665a2900666SRuslan ErmilovIf 666619d1a30SBrian Somers.Ar bits 667619d1a30SBrian Somersis also specified, then the first 668619d1a30SBrian Somers.Ar bits 669619d1a30SBrian Somersbits of 670619d1a30SBrian Somers.Ar IP 671619d1a30SBrian Somersare taken as a network specification, and all IP addresses from that 672619d1a30SBrian Somersnetwork will be matched. 673619d1a30SBrian Somers.El 674a2900666SRuslan Ermilov.Pp 675619d1a30SBrian SomersThis function is usually used to redirect outgoing connections for 676619d1a30SBrian Somersinternal machines that are not permitted certain types of internet 677619d1a30SBrian Somersaccess, or to restrict access to certain external machines. 678a2900666SRuslan Ermilov.Ed 679a2900666SRuslan Ermilov.Pp 680483d2f22SRuslan Ermilov.Ft struct alias_link * 68180607605SRuslan Ermilov.Fo PacketAliasRedirectProto 682483d2f22SRuslan Ermilov.Fa "struct in_addr local_addr" 683483d2f22SRuslan Ermilov.Fa "struct in_addr remote_addr" 684483d2f22SRuslan Ermilov.Fa "struct in_addr alias_addr" 68580607605SRuslan Ermilov.Fa "u_char proto" 686483d2f22SRuslan Ermilov.Fc 687483d2f22SRuslan Ermilov.Bd -ragged -offset indent 68880607605SRuslan ErmilovThis function specifies that any IP packet with protocol number of 68980607605SRuslan Ermilov.Fa proto 69080607605SRuslan Ermilovfrom a given remote address to an alias address be 691483d2f22SRuslan Ermilovredirected to a specified local address. 692483d2f22SRuslan Ermilov.Pp 693483d2f22SRuslan ErmilovIf 694483d2f22SRuslan Ermilov.Fa local_addr 695483d2f22SRuslan Ermilovor 696483d2f22SRuslan Ermilov.Fa alias_addr 697483d2f22SRuslan Ermilovis zero, this indicates that the packet aliasing address as established 698483d2f22SRuslan Ermilovby 699483d2f22SRuslan Ermilov.Fn PacketAliasSetAddress 700483d2f22SRuslan Ermilovis to be used. 701483d2f22SRuslan ErmilovEven if 702483d2f22SRuslan Ermilov.Fn PacketAliasSetAddress 703483d2f22SRuslan Ermilovis called to change the address after 70480607605SRuslan Ermilov.Fn PacketAliasRedirectProto 705483d2f22SRuslan Ermilovis called, a zero reference will track this change. 706483d2f22SRuslan Ermilov.Pp 707483d2f22SRuslan ErmilovIf 708483d2f22SRuslan Ermilov.Fa remote_addr 70980607605SRuslan Ermilovis zero, this indicates to redirect packets from any remote address. 710483d2f22SRuslan ErmilovNon-zero remote addresses can sometimes be useful for firewalling. 711483d2f22SRuslan Ermilov.Pp 712483d2f22SRuslan ErmilovIf two calls to 71380607605SRuslan Ermilov.Fn PacketAliasRedirectProto 714483d2f22SRuslan Ermilovoverlap in their address specifications, then the most recent call 715483d2f22SRuslan Ermilovwill have precedence. 716483d2f22SRuslan Ermilov.Pp 717483d2f22SRuslan ErmilovThis function returns a pointer which can subsequently be used by 718483d2f22SRuslan Ermilov.Fn PacketAliasRedirectDelete . 719483d2f22SRuslan ErmilovIf 720483d2f22SRuslan Ermilov.Dv NULL 721483d2f22SRuslan Ermilovis returned, then the function call did not complete successfully. 722483d2f22SRuslan Ermilov.Ed 723a2900666SRuslan Ermilov.Sh FRAGMENT HANDLING 724a2900666SRuslan ErmilovThe functions in this section are used to deal with incoming fragments. 725a2900666SRuslan Ermilov.Pp 726a2900666SRuslan ErmilovOutgoing fragments are handled within 727a2900666SRuslan Ermilov.Fn PacketAliasOut 728a2900666SRuslan Ermilovby changing the address according to any applicable mapping set by 7295e8fc2d2SRuslan Ermilov.Fn PacketAliasRedirectAddr , 7301855100fSAlexey Zelkinor the default aliasing address set by 731a2900666SRuslan Ermilov.Fn PacketAliasSetAddress . 732a2900666SRuslan Ermilov.Pp 7331855100fSAlexey ZelkinIncoming fragments are handled in one of two ways. 734a2900666SRuslan ErmilovIf the header of a fragmented IP packet has already been seen, then all 735a2900666SRuslan Ermilovsubsequent fragments will be re-mapped in the same manner the header 736a2900666SRuslan Ermilovfragment was. 737a2900666SRuslan ErmilovFragments which arrive before the header are saved and then retrieved 738a2900666SRuslan Ermilovonce the header fragment has been resolved. 739a2900666SRuslan Ermilov.Pp 7403efa11bbSBrian Somers.Ft int 7413efa11bbSBrian Somers.Fn PacketAliasSaveFragment "char *ptr" 742a2900666SRuslan Ermilov.Bd -ragged -offset indent 743a2900666SRuslan ErmilovWhen 744a2900666SRuslan Ermilov.Fn PacketAliasIn 745a2900666SRuslan Ermilovreturns 746a2900666SRuslan Ermilov.Dv PKT_ALIAS_UNRESOLVED_FRAGMENT , 747a2900666SRuslan Ermilovthis function can be used to save the pointer to the unresolved fragment. 748a2900666SRuslan Ermilov.Pp 7493efa11bbSBrian SomersIt is implicitly assumed that 750a2900666SRuslan Ermilov.Fa ptr 7513efa11bbSBrian Somerspoints to a block of memory allocated by 752a2900666SRuslan Ermilov.Xr malloc 3 . 753a2900666SRuslan ErmilovIf the fragment is never resolved, the packet aliasing engine will 754a2900666SRuslan Ermilovautomatically free the memory after a timeout period. 755a2900666SRuslan Ermilov[Eventually this function should be modified so that a callback function 756a2900666SRuslan Ermilovfor freeing memory is passed as an argument.] 757a2900666SRuslan Ermilov.Pp 758a2900666SRuslan ErmilovThis function returns 759a2900666SRuslan Ermilov.Dv PKT_ALIAS_OK 760a2900666SRuslan Ermilovif it was successful and 761a2900666SRuslan Ermilov.Dv PKT_ALIAS_ERROR 762a2900666SRuslan Ermilovif there was an error. 763a2900666SRuslan Ermilov.Ed 764a2900666SRuslan Ermilov.Pp 7653efa11bbSBrian Somers.Ft char * 7663efa11bbSBrian Somers.Fn PacketAliasGetFragment "char *buffer" 767a2900666SRuslan Ermilov.Bd -ragged -offset indent 768a2900666SRuslan ErmilovThis function can be used to retrieve fragment pointers saved by 769a2900666SRuslan Ermilov.Fn PacketAliasSaveFragment . 7703efa11bbSBrian SomersThe IP header fragment pointed to by 771a2900666SRuslan Ermilov.Fa buffer 7723efa11bbSBrian Somersis the header fragment indicated when 773a2900666SRuslan Ermilov.Fn PacketAliasIn 774a2900666SRuslan Ermilovreturns 775a2900666SRuslan Ermilov.Dv PKT_ALIAS_FOUND_HEADER_FRAGMENT . 776a2900666SRuslan ErmilovOnce a fragment pointer is retrieved, it becomes the calling program's 777a2900666SRuslan Ermilovresponsibility to free the dynamically allocated memory for the fragment. 778a2900666SRuslan Ermilov.Pp 7799703a107SPhilippe CharnierThe 780a2900666SRuslan Ermilov.Fn PacketAliasGetFragment 7819703a107SPhilippe Charnierfunction can be called sequentially until there are no more fragments 7829703a107SPhilippe Charnieravailable, at which time it returns 783a2900666SRuslan Ermilov.Dv NULL . 784a2900666SRuslan Ermilov.Ed 785a2900666SRuslan Ermilov.Pp 7863efa11bbSBrian Somers.Ft void 7873efa11bbSBrian Somers.Fn PacketAliasFragmentIn "char *header" "char *fragment" 788a2900666SRuslan Ermilov.Bd -ragged -offset indent 7893efa11bbSBrian SomersWhen a fragment is retrieved with 790a2900666SRuslan Ermilov.Fn PacketAliasGetFragment , 791a2900666SRuslan Ermilovit can then be de-aliased with a call to 792a2900666SRuslan Ermilov.Fn PacketAliasFragmentIn . 793a2900666SRuslan ErmilovThe 794a2900666SRuslan Ermilov.Fa header 795a2900666SRuslan Ermilovargument is the pointer to a header fragment used as a template, and 796a2900666SRuslan Ermilov.Fa fragment 7973efa11bbSBrian Somersis the pointer to the packet to be de-aliased. 798a2900666SRuslan Ermilov.Ed 799a2900666SRuslan Ermilov.Sh MISCELLANEOUS FUNCTIONS 8003efa11bbSBrian Somers.Ft void 8013efa11bbSBrian Somers.Fn PacketAliasSetTarget "struct in_addr addr" 802a2900666SRuslan Ermilov.Bd -ragged -offset indent 803a2900666SRuslan ErmilovWhen an incoming packet not associated with any pre-existing aliasing link 804a2900666SRuslan Ermilovarrives at the host machine, it will be sent to the address indicated by a 805a2900666SRuslan Ermilovcall to 806a2900666SRuslan Ermilov.Fn PacketAliasSetTarget . 807a2900666SRuslan Ermilov.Pp 808151682eaSBrian SomersIf this function is called with an 809a2900666SRuslan Ermilov.Dv INADDR_NONE 810a2900666SRuslan Ermilovaddress argument, then all new incoming packets go to the address set by 811a2900666SRuslan Ermilov.Fn PacketAliasSetAddress . 812a2900666SRuslan Ermilov.Pp 813151682eaSBrian SomersIf this function is not called, or is called with an 814a2900666SRuslan Ermilov.Dv INADDR_ANY 815a2900666SRuslan Ermilovaddress argument, then all new incoming packets go to the address specified 816a2900666SRuslan Ermilovin the packet. 817a2900666SRuslan ErmilovThis allows external machines to talk directly to internal machines if they 818a2900666SRuslan Ermilovcan route packets to the machine in question. 819a2900666SRuslan Ermilov.Ed 820a2900666SRuslan Ermilov.Pp 8213efa11bbSBrian Somers.Ft int 822a2900666SRuslan Ermilov.Fn PacketAliasCheckNewLink void 823a2900666SRuslan Ermilov.Bd -ragged -offset indent 824a2900666SRuslan ErmilovThis function returns a non-zero value when a new aliasing link is created. 825a2900666SRuslan ErmilovIn circumstances where incoming traffic is being sequentially sent to 826a2900666SRuslan Ermilovdifferent local servers, this function can be used to trigger when 827a2900666SRuslan Ermilov.Fn PacketAliasSetTarget 8283efa11bbSBrian Somersis called to change the default target address. 829a2900666SRuslan Ermilov.Ed 830a2900666SRuslan Ermilov.Pp 8313efa11bbSBrian Somers.Ft u_short 832442a25bdSBruce Evans.Fn PacketAliasInternetChecksum "u_short *buffer" "int nbytes" 833a2900666SRuslan Ermilov.Bd -ragged -offset indent 834a2900666SRuslan ErmilovThis is a utility function that does not seem to be available elsewhere and 835a2900666SRuslan Ermilovis included as a convenience. 836a2900666SRuslan ErmilovIt computes the internet checksum, which is used in both IP and 837a2900666SRuslan Ermilovprotocol-specific headers (TCP, UDP, ICMP). 838a2900666SRuslan Ermilov.Pp 839a2900666SRuslan ErmilovThe 840a2900666SRuslan Ermilov.Fa buffer 841a2900666SRuslan Ermilovargument points to the data block to be checksummed, and 842a2900666SRuslan Ermilov.Fa nbytes 843a2900666SRuslan Ermilovis the number of bytes. 844a2900666SRuslan ErmilovThe 16-bit checksum field should be zeroed before computing the checksum. 845a2900666SRuslan Ermilov.Pp 846a2900666SRuslan ErmilovChecksums can also be verified by operating on a block of data including 847a2900666SRuslan Ermilovits checksum. 848a2900666SRuslan ErmilovIf the checksum is valid, 849a2900666SRuslan Ermilov.Fn PacketAliasInternetChecksum 850a2900666SRuslan Ermilovwill return zero. 851a2900666SRuslan Ermilov.Ed 852642e43b3SArchie Cobbs.Pp 853642e43b3SArchie Cobbs.Ft int 854642e43b3SArchie Cobbs.Fn PacketUnaliasOut "char *buffer" "int maxpacketsize" 855642e43b3SArchie Cobbs.Bd -ragged -offset indent 85671845bffSSheldon HearnAn outgoing packet, which has already been aliased, 85771845bffSSheldon Hearnhas its private address/port information restored by this function. 858642e43b3SArchie CobbsThe IP packet is pointed to by 859642e43b3SArchie Cobbs.Fa buffer , 860642e43b3SArchie Cobbsand 861642e43b3SArchie Cobbs.Fa maxpacketsize 862642e43b3SArchie Cobbsis provided for error checking purposes. 863642e43b3SArchie CobbsThis function can be used if an already-aliased packet needs to have its 864642e43b3SArchie Cobbsoriginal IP header restored for further processing (eg. logging). 865642e43b3SArchie Cobbs.Ed 866642e43b3SArchie Cobbs.Sh BUGS 867642e43b3SArchie CobbsPPTP aliasing does not work when more than one internal client 868642e43b3SArchie Cobbsconnects to the same external server at the same time, because 869642e43b3SArchie CobbsPPTP requires a single TCP control connection to be established 870642e43b3SArchie Cobbsbetween any two IP addresses. 871a2900666SRuslan Ermilov.Sh AUTHORS 872e83aaae3SBrian Somers.An Charles Mott Aq cm@linktel.net , 873a2900666SRuslan Ermilovversions 1.0 - 1.8, 2.0 - 2.4. 874a2900666SRuslan Ermilov.An Eivind Eklund Aq eivind@FreeBSD.org , 875a2900666SRuslan Ermilovversions 1.8b, 1.9 and 2.5. 876a2900666SRuslan ErmilovAdded IRC DCC support as well as contributing a number of architectural 877a2900666SRuslan Ermilovimprovements; added the firewall bypass for FTP/IRC DCC. 87855a39fc5SRuslan Ermilov.An Erik Salander Aq erik@whistle.com 879642e43b3SArchie Cobbsadded support for PPTP and RTSP. 880642e43b3SArchie Cobbs.An Junichi Satoh Aq junichi@junichi.org 881642e43b3SArchie Cobbsadded support for RTSP/PNA. 88261de149dSRuslan Ermilov.An Ruslan Ermilov Aq ru@FreeBSD.org 88361de149dSRuslan Ermilovadded support for PPTP and LSNAT as well as general hacking. 884a2900666SRuslan Ermilov.Sh ACKNOWLEDGMENTS 885a2900666SRuslan ErmilovListed below, in approximate chronological order, are individuals who 886a2900666SRuslan Ermilovhave provided valuable comments and/or debugging assistance. 887a2900666SRuslan Ermilov.Pp 8881b7b85c4SRuslan Ermilov.Bd -ragged -offset indent 8891b7b85c4SRuslan Ermilov.An -split 8901b7b85c4SRuslan Ermilov.An Gary Roberts 8911b7b85c4SRuslan Ermilov.An Tom Torrance 8921b7b85c4SRuslan Ermilov.An Reto Burkhalter 8931b7b85c4SRuslan Ermilov.An Martin Renters 8941b7b85c4SRuslan Ermilov.An Brian Somers 8951b7b85c4SRuslan Ermilov.An Paul Traina 8961b7b85c4SRuslan Ermilov.An Ari Suutari 8971b7b85c4SRuslan Ermilov.An Dave Remien 8981b7b85c4SRuslan Ermilov.An J. Fortes 8991b7b85c4SRuslan Ermilov.An Andrzej Bialecki 9001b7b85c4SRuslan Ermilov.An Gordon Burditt 9011b7b85c4SRuslan Ermilov.Ed 902a2900666SRuslan Ermilov.Sh CONCEPTUAL BACKGROUND 903a2900666SRuslan ErmilovThis section is intended for those who are planning to modify the source 904a2900666SRuslan Ermilovcode or want to create somewhat esoteric applications using the packet 905a2900666SRuslan Ermilovaliasing functions. 906a2900666SRuslan Ermilov.Pp 907a2900666SRuslan ErmilovThe conceptual framework under which the packet aliasing engine operates 908a2900666SRuslan Ermilovis described here. 9093efa11bbSBrian SomersCentral to the discussion is the idea of an 910a2900666SRuslan Ermilov.Em aliasing link 911a2900666SRuslan Ermilovwhich describes the relationship for a given packet transaction between 912a2900666SRuslan Ermilovthe local machine, aliased identity and remote machine. 913a2900666SRuslan ErmilovIt is discussed how such links come into existence and are destroyed. 914a2900666SRuslan Ermilov.Ss ALIASING LINKS 915a2900666SRuslan ErmilovThere is a notion of an 916a2900666SRuslan Ermilov.Em aliasing link , 917a2900666SRuslan Ermilovwhich is a 7-tuple describing a specific translation: 9183efa11bbSBrian Somers.Bd -literal -offset indent 9193efa11bbSBrian Somers(local addr, local port, alias addr, alias port, 9203efa11bbSBrian Somers remote addr, remote port, protocol) 9213efa11bbSBrian Somers.Ed 922a2900666SRuslan Ermilov.Pp 923a2900666SRuslan ErmilovOutgoing packets have the local address and port number replaced with the 924a2900666SRuslan Ermilovalias address and port number. 925a2900666SRuslan ErmilovIncoming packets undergo the reverse process. 926a2900666SRuslan ErmilovThe packet aliasing engine attempts to match packets against an internal 927a2900666SRuslan Ermilovtable of aliasing links to determine how to modify a given IP packet. 928a2900666SRuslan ErmilovBoth the IP header and protocol dependent headers are modified as necessary. 929a2900666SRuslan ErmilovAliasing links are created and deleted as necessary according to network 930a2900666SRuslan Ermilovtraffic. 931a2900666SRuslan Ermilov.Pp 932a2900666SRuslan ErmilovProtocols can be TCP, UDP or even ICMP in certain circumstances. 933a2900666SRuslan Ermilov(Some types of ICMP packets can be aliased according to sequence or ID 934a2900666SRuslan Ermilovnumber which acts as an equivalent port number for identifying how 935a2900666SRuslan Ermilovindividual packets should be handled.) 936a2900666SRuslan Ermilov.Pp 937a2900666SRuslan ErmilovEach aliasing link must have a unique combination of the following five 938a2900666SRuslan Ermilovquantities: alias address/port, remote address/port and protocol. 939a2900666SRuslan ErmilovThis ensures that several machines on a local network can share the 940a2900666SRuslan Ermilovsame aliasing IP address. 941a2900666SRuslan ErmilovIn cases where conflicts might arise, the aliasing port is chosen so that 942a2900666SRuslan Ermilovuniqueness is maintained. 943a2900666SRuslan Ermilov.Ss STATIC AND DYNAMIC LINKS 9443efa11bbSBrian SomersAliasing links can either be static or dynamic. 945a2900666SRuslan ErmilovStatic links persist indefinitely and represent fixed rules for translating 946a2900666SRuslan ErmilovIP packets. 947a2900666SRuslan ErmilovDynamic links come into existence for a specific TCP connection or UDP 948a2900666SRuslan Ermilovtransaction or ICMP ECHO sequence. 949a2900666SRuslan ErmilovFor the case of TCP, the connection can be monitored to see when the 950a2900666SRuslan Ermilovassociated aliasing link should be deleted. 951a2900666SRuslan ErmilovAliasing links for UDP transactions (and ICMP ECHO and TIMESTAMP requests) 952a2900666SRuslan Ermilovwork on a simple timeout rule. 953a2900666SRuslan ErmilovWhen no activity is observed on a dynamic link for a certain amount of time 954a2900666SRuslan Ermilovit is automatically deleted. 955a2900666SRuslan ErmilovTimeout rules also apply to TCP connections which do not open or close 9563efa11bbSBrian Somersproperly. 957a2900666SRuslan Ermilov.Ss PARTIALLY SPECIFIED ALIASING LINKS 958a2900666SRuslan ErmilovAliasing links can be partially specified, meaning that the remote address 959a2900666SRuslan Ermilovand/or remote port are unknown. 960a2900666SRuslan ErmilovIn this case, when a packet matching the incomplete specification is found, 961a2900666SRuslan Ermilova fully specified dynamic link is created. 962a2900666SRuslan ErmilovIf the original partially specified link is dynamic, it will be deleted 963a2900666SRuslan Ermilovafter the fully specified link is created, otherwise it will persist. 964a2900666SRuslan Ermilov.Pp 965a2900666SRuslan ErmilovFor instance, a partially specified link might be 9663efa11bbSBrian Somers.Bd -literal -offset indent 9673efa11bbSBrian Somers(192.168.0.4, 23, 204.228.203.215, 8066, 0, 0, tcp) 9683efa11bbSBrian Somers.Ed 969a2900666SRuslan Ermilov.Pp 970a2900666SRuslan ErmilovThe zeros denote unspecified components for the remote address and port. 971a2900666SRuslan ErmilovIf this link were static it would have the effect of redirecting all 972a2900666SRuslan Ermilovincoming traffic from port 8066 of 204.228.203.215 to port 23 (telnet) 973a2900666SRuslan Ermilovof machine 192.168.0.4 on the local network. 974a2900666SRuslan ErmilovEach individual telnet connection would initiate the creation of a distinct 975a2900666SRuslan Ermilovdynamic link. 976a2900666SRuslan Ermilov.Ss DYNAMIC LINK CREATION 977a2900666SRuslan ErmilovIn addition to aliasing links, there are also address mappings that can be 978a2900666SRuslan Ermilovstored within the internal data table of the packet aliasing mechanism. 9793efa11bbSBrian Somers.Bd -literal -offset indent 9803efa11bbSBrian Somers(local addr, alias addr) 9813efa11bbSBrian Somers.Ed 982a2900666SRuslan Ermilov.Pp 983a2900666SRuslan ErmilovAddress mappings are searched when creating new dynamic links. 984a2900666SRuslan Ermilov.Pp 985a2900666SRuslan ErmilovAll outgoing packets from the local network automatically create a dynamic 986a2900666SRuslan Ermilovlink if they do not match an already existing fully specified link. 987a2900666SRuslan ErmilovIf an address mapping exists for the outgoing packet, this determines 988a2900666SRuslan Ermilovthe alias address to be used. 989a2900666SRuslan ErmilovIf no mapping exists, then a default address, usually the address of the 990a2900666SRuslan Ermilovpacket aliasing host, is used. 991a2900666SRuslan ErmilovIf necessary, this default address can be changed as often as each individual 992a2900666SRuslan Ermilovpacket arrives. 993a2900666SRuslan Ermilov.Pp 994a2900666SRuslan ErmilovThe aliasing port number is determined such that the new dynamic link does 995a2900666SRuslan Ermilovnot conflict with any existing links. 996a2900666SRuslan ErmilovIn the default operating mode, the packet aliasing engine attempts to set 997a2900666SRuslan Ermilovthe aliasing port equal to the local port number. 998a2900666SRuslan ErmilovIf this results in a conflict, then port numbers are randomly chosen until 999a2900666SRuslan Ermilova unique aliasing link can be established. 1000a2900666SRuslan ErmilovIn an alternate operating mode, the first choice of an aliasing port is also 1001a2900666SRuslan Ermilovrandom and unrelated to the local port number. 1002