17f3dea24SPeter Wemm.\" $FreeBSD$ 274804d58SMike Pritchard.\" 3a2900666SRuslan Ermilov.Dd April 13, 2000 474804d58SMike Pritchard.Dt LIBALIAS 3 5a2900666SRuslan Ermilov.Os FreeBSD 63efa11bbSBrian Somers.Sh NAME 774804d58SMike Pritchard.Nm libalias 8a2900666SRuslan Ermilov.Nd packet aliasing library for masquerading and network address translation 93efa11bbSBrian Somers.Sh SYNOPSIS 10442a25bdSBruce Evans.Fd #include <sys/types.h> 113efa11bbSBrian Somers.Fd #include <netinet/in.h> 123efa11bbSBrian Somers.Fd #include <alias.h> 13a2900666SRuslan Ermilov.Pp 14a2900666SRuslan ErmilovFunction prototypes are given in the main body of the text. 1574804d58SMike Pritchard.Sh DESCRIPTION 1674804d58SMike PritchardThe 1774804d58SMike Pritchard.Nm 18a2900666SRuslan Ermilovlibrary is a collection of functions for aliasing and de-aliasing of IP 19a2900666SRuslan Ermilovpackets, intended for masquerading and network address translation (NAT). 20a2900666SRuslan Ermilov.Sh INTRODUCTION 21a2900666SRuslan ErmilovThis library is a moderately portable set of functions designed to assist 22a2900666SRuslan Ermilovin the process of IP masquerading and network address translation. 23a2900666SRuslan ErmilovOutgoing packets from a local network with unregistered IP addresses can 24a2900666SRuslan Ermilovbe aliased to appear as if they came from an accessible IP address. 25a2900666SRuslan ErmilovIncoming packets are then de-aliased so that they are sent to the correct 26a2900666SRuslan Ermilovmachine on the local network. 27a2900666SRuslan Ermilov.Pp 28a2900666SRuslan ErmilovA certain amount of flexibility is built into the packet aliasing engine. 29a2900666SRuslan ErmilovIn the simplest mode of operation, a many-to-one address mapping takes 30a2900666SRuslan Ermilovplace between local network and the packet aliasing host. 31a2900666SRuslan ErmilovThis is known as IP masquerading. 32a2900666SRuslan ErmilovIn addition, one-to-one mappings between local and public addresses can 33a2900666SRuslan Ermilovalso be implemented, which is known as static NAT. 34a2900666SRuslan ErmilovIn between these extremes, different groups of private addresses can be 35a2900666SRuslan Ermilovlinked to different public addresses, comprising several distinct 36a2900666SRuslan Ermilovmany-to-one mappings. 37a2900666SRuslan ErmilovAlso, a given public address and port can be statically redirected to a 38a2900666SRuslan Ermilovprivate address/port. 39a2900666SRuslan Ermilov.Pp 40a2900666SRuslan ErmilovThe packet aliasing engine was designed to operate in user space outside 41a2900666SRuslan Ermilovof the kernel, without any access to private kernel data structure, but 42a2900666SRuslan Ermilovthe source code can also be ported to a kernel environment. 43a2900666SRuslan Ermilov.Sh INITIALIZATION AND CONTROL 44a2900666SRuslan ErmilovTwo special functions, 45a2900666SRuslan Ermilov.Fn PacketAliasInit 46a2900666SRuslan Ermilovand 47a2900666SRuslan Ermilov.Fn PacketAliasSetAddress , 48a2900666SRuslan Ermilovmust always be called before any packet handling may be performed. 49a2900666SRuslan ErmilovIn addition, the operating mode of the packet aliasing engine can be 50a2900666SRuslan Ermilovcustomized by calling 51a2900666SRuslan Ermilov.Fn PacketAliasSetMode . 52a2900666SRuslan Ermilov.Pp 533efa11bbSBrian Somers.Ft void 54a2900666SRuslan Ermilov.Fn PacketAliasInit void 55a2900666SRuslan Ermilov.Bd -ragged -offset indent 56a2900666SRuslan ErmilovThis function has no arguments or return value and is used to initialize 57a2900666SRuslan Ermilovinternal data structures. 58a2900666SRuslan ErmilovThe following mode bits are always set after calling 59a2900666SRuslan Ermilov.Fn PacketAliasInit . 60a2900666SRuslan ErmilovSee the description of 61a2900666SRuslan Ermilov.Fn PacketAliasSetMode 62a2900666SRuslan Ermilovbelow for the meaning of these mode bits. 63a2900666SRuslan Ermilov.Pp 64a2900666SRuslan Ermilov.Bl -item -offset indent -compact 65a2900666SRuslan Ermilov.It 66a2900666SRuslan Ermilov.Dv PKT_ALIAS_SAME_PORTS 67a2900666SRuslan Ermilov.It 68a2900666SRuslan Ermilov.Dv PKT_ALIAS_USE_SOCKETS 69a2900666SRuslan Ermilov.It 70a2900666SRuslan Ermilov.Dv PKT_ALIAS_RESET_ON_ADDR_CHANGE 71a2900666SRuslan Ermilov.El 72a2900666SRuslan Ermilov.Pp 73a2900666SRuslan ErmilovThis function will always return the packet aliasing engine to the same 74a2900666SRuslan Ermilovinitial state. 75a2900666SRuslan Ermilov.Fn PacketAliasSetAddress 76a2900666SRuslan Ermilovmust be called afterwards, and any desired changes from the default mode 773efa11bbSBrian Somersbits listed above require a call to 78a2900666SRuslan Ermilov.Fn PacketAliasSetMode . 79a2900666SRuslan Ermilov.Pp 80a2900666SRuslan ErmilovIt is mandatory that this function be called at the beginning of a program 81a2900666SRuslan Ermilovprior to any packet handling. 82a2900666SRuslan Ermilov.Ed 83a2900666SRuslan Ermilov.Pp 848ddc51bcSEivind Eklund.Ft void 85a2900666SRuslan Ermilov.Fn PacketAliasUninit void 86a2900666SRuslan Ermilov.Bd -ragged -offset indent 87a2900666SRuslan ErmilovThis function has no arguments or return value and is used to clear any 88a2900666SRuslan Ermilovresources attached to internal data structures. 89a2900666SRuslan Ermilov.Pp 90a2900666SRuslan ErmilovThis functions should be called when a program stops using the aliasing 91a2900666SRuslan Ermilovengine; it does, amongst other things, clear out any firewall holes. 92a2900666SRuslan ErmilovTo provide backwards compatibility and extra security, it is added to 93a2900666SRuslan Ermilovthe 94a2900666SRuslan Ermilov.Xr atexit 3 95a2900666SRuslan Ermilovchain by 96a2900666SRuslan Ermilov.Fn PacketAliasInit . 97a2900666SRuslan ErmilovCalling it multiple times is harmless. 98a2900666SRuslan Ermilov.Ed 99a2900666SRuslan Ermilov.Pp 1003efa11bbSBrian Somers.Ft void 1013efa11bbSBrian Somers.Fn PacketAliasSetAddress "struct in_addr addr" 102a2900666SRuslan Ermilov.Bd -ragged -offset indent 103a2900666SRuslan ErmilovThis function sets the source address to which outgoing packets from the 104a2900666SRuslan Ermilovlocal area network are aliased. 105a2900666SRuslan ErmilovAll outgoing packets are re-mapped to this address unless overridden by a 106a2900666SRuslan Ermilovstatic address mapping established by 107a2900666SRuslan Ermilov.Fn PacketAliasRedirectAddr . 108a2900666SRuslan Ermilov.Pp 109a2900666SRuslan ErmilovIf the 110a2900666SRuslan Ermilov.Dv PKT_ALIAS_RESET_ON_ADDR_CHANGE 111a2900666SRuslan Ermilovmode bit is set (the default mode of operation), then the internal aliasing 112a2900666SRuslan Ermilovlink tables will be reset any time the aliasing address changes. 113a2900666SRuslan ErmilovThis is useful for interfaces such as 114a2900666SRuslan Ermilov.Xr ppp 8 , 115a2900666SRuslan Ermilovwhere the IP 116a2900666SRuslan Ermilovaddress may or may not change on successive dial-up attempts. 117a2900666SRuslan Ermilov.Pp 118a2900666SRuslan ErmilovIf the 119a2900666SRuslan Ermilov.Dv PKT_ALIAS_RESET_ON_ADDR_CHANGE 120a2900666SRuslan Ermilovmode bit is set to zero, this function can also be used to dynamically change 121a2900666SRuslan Ermilovthe aliasing address on a packet to packet basis (it is a low overhead call). 122a2900666SRuslan Ermilov.Pp 123a2900666SRuslan ErmilovIt is mandatory that this function be called prior to any packet handling. 124a2900666SRuslan Ermilov.Ed 125a2900666SRuslan Ermilov.Pp 126442a25bdSBruce Evans.Ft unsigned int 127a2900666SRuslan Ermilov.Fn PacketAliasSetMode "unsigned int flags" "unsigned int mask" 128a2900666SRuslan Ermilov.Bd -ragged -offset indent 1293efa11bbSBrian SomersThis function sets or clears mode bits 1303efa11bbSBrian Somersaccording to the value of 131a2900666SRuslan Ermilov.Fa flags . 1323efa11bbSBrian SomersOnly bits marked in 133a2900666SRuslan Ermilov.Fa mask 134a2900666SRuslan Ermilovare affected. 135a2900666SRuslan ErmilovThe following mode bits are defined in 136a2900666SRuslan Ermilov.Aq Pa alias.h : 137a2900666SRuslan Ermilov.Bl -tag -width indent 138a2900666SRuslan Ermilov.It Dv PKT_ALIAS_LOG 139a2900666SRuslan ErmilovEnables logging into 140a2900666SRuslan Ermilov.Pa /var/log/alias.log . 141a2900666SRuslan ErmilovEach time an aliasing link is created or deleted, the log file is appended 142a2900666SRuslan Ermilovwith the current number of ICMP, TCP and UDP links. 143a2900666SRuslan ErmilovMainly useful for debugging when the log file is viewed continuously with 144a2900666SRuslan Ermilov.Xr tail 1 . 145a2900666SRuslan Ermilov.It Dv PKT_ALIAS_DENY_INCOMING 146a2900666SRuslan ErmilovIf this mode bit is set, all incoming packets associated with new TCP 147a2900666SRuslan Ermilovconnections or new UDP transactions will be marked for being ignored 148a2900666SRuslan Ermilov.Po 149a2900666SRuslan Ermilov.Fn PacketAliasIn 150a2900666SRuslan Ermilovreturns 151a2900666SRuslan Ermilov.Dv PKT_ALIAS_IGNORED 152a2900666SRuslan Ermilovcode 153a2900666SRuslan Ermilov.Pc 154a2900666SRuslan Ermilovby the calling program. 155a2900666SRuslan ErmilovResponse packets to connections or transactions initiated from the packet 156a2900666SRuslan Ermilovaliasing host or local network will be unaffected. 157a2900666SRuslan ErmilovThis mode bit is useful for implementing a one-way firewall. 158a2900666SRuslan Ermilov.It Dv PKT_ALIAS_SAME_PORTS 159a2900666SRuslan ErmilovIf this mode bit is set, the packet aliasing engine will attempt to leave 160a2900666SRuslan Ermilovthe alias port numbers unchanged from the actual local port numbers. 161a2900666SRuslan ErmilovThis can be done as long as the quintuple (proto, alias addr, alias port, 162a2900666SRuslan Ermilovremote addr, remote port) is unique. 163a2900666SRuslan ErmilovIf a conflict exists, a new aliasing port number is chosen even if this 164a2900666SRuslan Ermilovmode bit is set. 165a2900666SRuslan Ermilov.It Dv PKT_ALIAS_USE_SOCKETS 166a2900666SRuslan ErmilovThis bit should be set when the packet aliasing host originates network 167a2900666SRuslan Ermilovtraffic as well as forwards it. 168a2900666SRuslan ErmilovWhen the packet aliasing host is waiting for a connection from an unknown 169a2900666SRuslan Ermilovhost address or unknown port number (e.g. an FTP data connection), this 170a2900666SRuslan Ermilovmode bit specifies that a socket be allocated as a place holder to prevent 171a2900666SRuslan Ermilovport conflicts. 172a2900666SRuslan ErmilovOnce a connection is established, usually within a minute or so, the socket 173a2900666SRuslan Ermilovis closed. 174a2900666SRuslan Ermilov.It Dv PKT_ALIAS_UNREGISTERED_ONLY 175a2900666SRuslan ErmilovIf this mode bit is set, traffic on the local network which does not 176a2900666SRuslan Ermilovoriginate from unregistered address spaces will be ignored. 177a2900666SRuslan ErmilovStandard Class A, B and C unregistered addresses are: 1783efa11bbSBrian Somers.Bd -literal -offset indent 1793efa11bbSBrian Somers10.0.0.0 -> 10.255.255.255 (Class A subnet) 1803efa11bbSBrian Somers172.16.0.0 -> 172.31.255.255 (Class B subnets) 1813efa11bbSBrian Somers192.168.0.0 -> 192.168.255.255 (Class C subnets) 1823efa11bbSBrian Somers.Ed 183a2900666SRuslan Ermilov.Pp 184a2900666SRuslan ErmilovThis option is useful in the case that packet aliasing host has both 185a2900666SRuslan Ermilovregistered and unregistered subnets on different interfaces. 186a2900666SRuslan ErmilovThe registered subnet is fully accessible to the outside world, so traffic 187a2900666SRuslan Ermilovfrom it does not need to be passed through the packet aliasing engine. 188a2900666SRuslan Ermilov.It Dv PKT_ALIAS_RESET_ON_ADDR_CHANGE 1893efa11bbSBrian SomersWhen this mode bit is set and 190a2900666SRuslan Ermilov.Fn PacketAliasSetAddress 191a2900666SRuslan Ermilovis called to change the aliasing address, the internal link table of the 192a2900666SRuslan Ermilovpacket aliasing engine will be cleared. 193a2900666SRuslan ErmilovThis operating mode is useful for 194a2900666SRuslan Ermilov.Xr ppp 8 195a2900666SRuslan Ermilovlinks where the interface address can sometimes change or remain the same 196a2900666SRuslan Ermilovbetween dial-up attempts. 197a2900666SRuslan ErmilovIf this mode bit is not set, the link table will never be reset in the event 198a2900666SRuslan Ermilovof an address change. 199a2900666SRuslan Ermilov.It Dv PKT_ALIAS_PUNCH_FW 200a2900666SRuslan ErmilovThis option makes 201a2900666SRuslan Ermilov.Nm 202a2900666SRuslan Ermilov`punch holes' in an 203a2900666SRuslan Ermilov.Xr ipfirewall 4 204a2900666SRuslan Ermilovbased firewall for FTP/IRC DCC connections. 205a2900666SRuslan ErmilovThe holes punched are bound by from/to IP address and port; it will not be 206a2900666SRuslan Ermilovpossible to use a hole for another connection. 207a2900666SRuslan ErmilovA hole is removed when the connection that uses it dies. 208a2900666SRuslan ErmilovTo cater to unexpected death of a program using 209a2900666SRuslan Ermilov.Nm 210a2900666SRuslan Ermilov(e.g. kill -9), 211a2900666SRuslan Ermilovchanging the state of the flag will clear the entire firewall range 212a2900666SRuslan Ermilovallocated for holes. 2138ddc51bcSEivind EklundThis will also happen on the initial call to 214a2900666SRuslan Ermilov.Fn PacketAliasSetFWBase . 215a2900666SRuslan ErmilovThis call must happen prior to setting this flag. 216a2900666SRuslan Ermilov.It Dv PKT_ALIAS_REVERSE 217a2900666SRuslan ErmilovThis option makes 218a2900666SRuslan Ermilov.Nm 219a2900666SRuslan Ermilovreverse the way it handles incoming and outgoing packets, allowing it 220a2900666SRuslan Ermilovto be fed with data that passes through the internal interface rather 221a2900666SRuslan Ermilovthan the external one. 222a2900666SRuslan Ermilov.It Dv PKT_ALIAS_PROXY_ONLY 223a2900666SRuslan ErmilovThis option tells 224a2900666SRuslan Ermilov.Nm 225a2900666SRuslan Ermilovto obey transparent proxy rules only. 226a2900666SRuslan ErmilovNormal packet aliasing is not performed. 22721b9df57SBrian SomersSee 22821b9df57SBrian Somers.Fn PacketAliasProxyRule 22921b9df57SBrian Somersbelow for details. 230483d2f22SRuslan Ermilov.It Dv PKT_ALIAS_DENY_PPTP 231483d2f22SRuslan ErmilovIf this mode bit is set, all PPTP packets will be marked for being ignored 232483d2f22SRuslan Ermilov(both 233483d2f22SRuslan Ermilov.Fn PacketAliasIn 234483d2f22SRuslan Ermilovand 235483d2f22SRuslan Ermilov.Fn PacketAliasOut 236483d2f22SRuslan Ermilovreturn 237483d2f22SRuslan Ermilov.Dv PKT_ALIAS_IGNORED 238483d2f22SRuslan Ermilovcode). 2393efa11bbSBrian Somers.El 240a2900666SRuslan Ermilov.Ed 241a2900666SRuslan Ermilov.Pp 2428ddc51bcSEivind Eklund.Ft void 2438ddc51bcSEivind Eklund.Fn PacketAliasSetFWBase "unsigned int base" "unsigned int num" 244a2900666SRuslan Ermilov.Bd -ragged -offset indent 245a2900666SRuslan ErmilovSet firewall range allocated for punching firewall holes (with the 246a2900666SRuslan Ermilov.Dv PKT_ALIAS_PUNCH_FW 247a2900666SRuslan Ermilovflag). 248a2900666SRuslan ErmilovThe range will be cleared for all rules on initialization. 249a2900666SRuslan Ermilov.Ed 250a2900666SRuslan Ermilov.Sh PACKET HANDLING 251a2900666SRuslan ErmilovThe packet handling functions are used to modify incoming (remote to local) 252a2900666SRuslan Ermilovand outgoing (local to remote) packets. 253a2900666SRuslan ErmilovThe calling program is responsible for receiving and sending packets via 254a2900666SRuslan Ermilovnetwork interfaces. 255a2900666SRuslan Ermilov.Pp 256a2900666SRuslan ErmilovAlong with 257a2900666SRuslan Ermilov.Fn PacketAliasInit 258a2900666SRuslan Ermilovand 259a2900666SRuslan Ermilov.Fn PacketAliasSetAddress , 260a2900666SRuslan Ermilovthe two packet handling functions, 261a2900666SRuslan Ermilov.Fn PacketAliasIn 262a2900666SRuslan Ermilovand 263a2900666SRuslan Ermilov.Fn PacketAliasOut , 264a2900666SRuslan Ermilovcomprise minimal set of functions needed for a basic IP masquerading 265a2900666SRuslan Ermilovimplementation. 266a2900666SRuslan Ermilov.Pp 2673efa11bbSBrian Somers.Ft int 2683efa11bbSBrian Somers.Fn PacketAliasIn "char *buffer" "int maxpacketsize" 269a2900666SRuslan Ermilov.Bd -ragged -offset indent 270a2900666SRuslan ErmilovAn incoming packet coming from a remote machine to the local network is 271a2900666SRuslan Ermilovde-aliased by this function. 2723efa11bbSBrian SomersThe IP packet is pointed to by 273a2900666SRuslan Ermilov.Fa buffer , 2743efa11bbSBrian Somersand 275a2900666SRuslan Ermilov.Fa maxpacketsize 276a2900666SRuslan Ermilovindicates the size of the data structure containing the packet and should 277a2900666SRuslan Ermilovbe at least as large as the actual packet size. 278a2900666SRuslan Ermilov.Pp 2793efa11bbSBrian SomersReturn codes: 280a2900666SRuslan Ermilov.Bl -tag -width indent 281a2900666SRuslan Ermilov.It Dv PKT_ALIAS_OK 2823efa11bbSBrian SomersThe packet aliasing process was successful. 283a2900666SRuslan Ermilov.It Dv PKT_ALIAS_IGNORED 2843efa11bbSBrian SomersThe packet was ignored and not de-aliased. 285a2900666SRuslan ErmilovThis can happen if the protocol is unrecognized, possibly an ICMP message 286a2900666SRuslan Ermilovtype is not handled or if incoming packets for new connections are being 287a2900666SRuslan Ermilovignored (if 288a2900666SRuslan Ermilov.Dv PKT_ALIAS_DENY_INCOMING 289a2900666SRuslan Ermilovmode bit was set by 290a2900666SRuslan Ermilov.Fn PacketAliasSetMode ) . 291a2900666SRuslan Ermilov.It Dv PKT_ALIAS_UNRESOLVED_FRAGMENT 292a2900666SRuslan ErmilovThis is returned when a fragment cannot be resolved because the header 293a2900666SRuslan Ermilovfragment has not been sent yet. 294a2900666SRuslan ErmilovIn this situation, fragments must be saved with 295a2900666SRuslan Ermilov.Fn PacketAliasSaveFragment 2963efa11bbSBrian Somersuntil a header fragment is found. 297a2900666SRuslan Ermilov.It Dv PKT_ALIAS_FOUND_HEADER_FRAGMENT 298a2900666SRuslan ErmilovThe packet aliasing process was successful, and a header fragment was found. 299a2900666SRuslan ErmilovThis is a signal to retrieve any unresolved fragments with 300a2900666SRuslan Ermilov.Fn PacketAliasGetFragment 301a2900666SRuslan Ermilovand de-alias them with 302a2900666SRuslan Ermilov.Fn PacketAliasFragmentIn . 303a2900666SRuslan Ermilov.It Dv PKT_ALIAS_ERROR 304a2900666SRuslan ErmilovAn internal error within the packet aliasing engine occurred. 3053efa11bbSBrian Somers.El 306a2900666SRuslan Ermilov.Ed 307a2900666SRuslan Ermilov.Pp 3083efa11bbSBrian Somers.Ft int 309b2052ac8SJohn Polstra.Fn PacketAliasOut "char *buffer" "int maxpacketsize" 310a2900666SRuslan Ermilov.Bd -ragged -offset indent 311a2900666SRuslan ErmilovAn outgoing packet coming from the local network to a remote machine is 312a2900666SRuslan Ermilovaliased by this function. 3133efa11bbSBrian SomersThe IP packet is pointed to by 314a2900666SRuslan Ermilov.Fa buffer , 3153efa11bbSBrian Somersand 316a2900666SRuslan Ermilov.Fa maxpacketsize 317a2900666SRuslan Ermilovindicates the maximum packet size permissible should the packet length be 318a2900666SRuslan Ermilovchanged. 319a2900666SRuslan ErmilovIP encoding protocols place address and port information in the encapsulated 320a2900666SRuslan Ermilovdata stream which has to be modified and can account for changes in packet 321a2900666SRuslan Ermilovlength. 322a2900666SRuslan ErmilovWell known examples of such protocols are FTP and IRC DCC. 323a2900666SRuslan Ermilov.Pp 3243efa11bbSBrian SomersReturn codes: 325a2900666SRuslan Ermilov.Bl -tag -width indent 326a2900666SRuslan Ermilov.It Dv PKT_ALIAS_OK 3273efa11bbSBrian SomersThe packet aliasing process was successful. 328a2900666SRuslan Ermilov.It Dv PKT_ALIAS_IGNORED 329a2900666SRuslan ErmilovThe packet was ignored and not aliased. 330a2900666SRuslan ErmilovThis can happen if the protocol is unrecognized, or possibly an ICMP message 331a2900666SRuslan Ermilovtype is not handled. 332a2900666SRuslan Ermilov.It Dv PKT_ALIAS_ERROR 333a2900666SRuslan ErmilovAn internal error within the packet aliasing engine occurred. 3343efa11bbSBrian Somers.El 335a2900666SRuslan Ermilov.Ed 336a2900666SRuslan Ermilov.Sh PORT AND ADDRESS REDIRECTION 337a2900666SRuslan ErmilovThe functions described in this section allow machines on the local network 338a2900666SRuslan Ermilovto be accessible in some degree to new incoming connections from the external 339a2900666SRuslan Ermilovnetwork. 340a2900666SRuslan ErmilovIndividual ports can be re-mapped or static network address translations can 341a2900666SRuslan Ermilovbe designated. 342a2900666SRuslan Ermilov.Pp 3433efa11bbSBrian Somers.Ft struct alias_link * 3443efa11bbSBrian Somers.Fo PacketAliasRedirectPort 3453efa11bbSBrian Somers.Fa "struct in_addr local_addr" 3463efa11bbSBrian Somers.Fa "u_short local_port" 3473efa11bbSBrian Somers.Fa "struct in_addr remote_addr" 3483efa11bbSBrian Somers.Fa "u_short remote_port" 3493efa11bbSBrian Somers.Fa "struct in_addr alias_addr" 3503efa11bbSBrian Somers.Fa "u_short alias_port" 3513efa11bbSBrian Somers.Fa "u_char proto" 3523efa11bbSBrian Somers.Fc 353a2900666SRuslan Ermilov.Bd -ragged -offset indent 354a2900666SRuslan ErmilovThis function specifies that traffic from a given remote address/port to 355a2900666SRuslan Ermilovan alias address/port be redirected to a specified local address/port. 3569c727d2cSJoseph KoshyThe parameter 357a2900666SRuslan Ermilov.Fa proto 358a2900666SRuslan Ermilovcan be either 359a2900666SRuslan Ermilov.Dv IPPROTO_TCP 3603efa11bbSBrian Somersor 361a2900666SRuslan Ermilov.Dv IPPROTO_UDP , 362a2900666SRuslan Ermilovas defined in 363a2900666SRuslan Ermilov.Aq Pa netinet/in.h . 364a2900666SRuslan Ermilov.Pp 3653efa11bbSBrian SomersIf 366a2900666SRuslan Ermilov.Fa local_addr 367a2900666SRuslan Ermilovor 368a2900666SRuslan Ermilov.Fa alias_addr 369a2900666SRuslan Ermilovis zero, this indicates that the packet aliasing address as established 370a2900666SRuslan Ermilovby 371a2900666SRuslan Ermilov.Fn PacketAliasSetAddress 372a2900666SRuslan Ermilovis to be used. 373a2900666SRuslan ErmilovEven if 374483d2f22SRuslan Ermilov.Fn PacketAliasSetAddress 375a2900666SRuslan Ermilovis called to change the address after 376483d2f22SRuslan Ermilov.Fn PacketAliasRedirectPort 377a2900666SRuslan Ermilovis called, a zero reference will track this change. 378a2900666SRuslan Ermilov.Pp 3796d20a774SRuslan ErmilovIf the link is further set up to operate for a load sharing, then 3806d20a774SRuslan Ermilov.Fa local_addr 3816d20a774SRuslan Ermilovand 3826d20a774SRuslan Ermilov.Fa local_port 3836d20a774SRuslan Ermilovare ignored, and are selected dynamically from the server pool, as described in 3846d20a774SRuslan Ermilov.Fn PacketAliasAddServer 3856d20a774SRuslan Ermilovbelow. 3866d20a774SRuslan Ermilov.Pp 387a2900666SRuslan ErmilovIf 388a2900666SRuslan Ermilov.Fa remote_addr 389a2900666SRuslan Ermilovis zero, this indicates to redirect packets from any remote address. 390a2900666SRuslan ErmilovLikewise, if 391a2900666SRuslan Ermilov.Fa remote_port 392a2900666SRuslan Ermilovis zero, this indicates to redirect packets originating from any remote 393a2900666SRuslan Ermilovport number. 394a2900666SRuslan ErmilovAlmost always, the remote port specification will be zero, but non-zero 395a2900666SRuslan Ermilovremote addresses can sometimes be useful for firewalling. 396a2900666SRuslan ErmilovIf two calls to 397a2900666SRuslan Ermilov.Fn PacketAliasRedirectPort 398a2900666SRuslan Ermilovoverlap in their address/port specifications, then the most recent call 399a2900666SRuslan Ermilovwill have precedence. 400a2900666SRuslan Ermilov.Pp 401a2900666SRuslan ErmilovThis function returns a pointer which can subsequently be used by 402a2900666SRuslan Ermilov.Fn PacketAliasRedirectDelete . 403a2900666SRuslan ErmilovIf 404a2900666SRuslan Ermilov.Dv NULL 405a2900666SRuslan Ermilovis returned, then the function call did not complete successfully. 406a2900666SRuslan Ermilov.Pp 407a2900666SRuslan ErmilovAll port numbers should be in network address byte order, so it is necessary 408a2900666SRuslan Ermilovto use 409a2900666SRuslan Ermilov.Xr htons 3 410a2900666SRuslan Ermilovto convert these parameters from internally readable numbers to network byte 411a2900666SRuslan Ermilovorder. 412a2900666SRuslan ErmilovAddresses are also in network byte order, which is implicit in the use of the 413a2900666SRuslan Ermilov.Fa struct in_addr 4143efa11bbSBrian Somersdata type. 415a2900666SRuslan Ermilov.Ed 416a2900666SRuslan Ermilov.Pp 4173efa11bbSBrian Somers.Ft struct alias_link * 418442a25bdSBruce Evans.Fo PacketAliasRedirectAddr 4193efa11bbSBrian Somers.Fa "struct in_addr local_addr" 4203efa11bbSBrian Somers.Fa "struct in_addr alias_addr" 4213efa11bbSBrian Somers.Fc 422a2900666SRuslan Ermilov.Bd -ragged -offset indent 423a2900666SRuslan ErmilovThis function designates that all incoming traffic to 424a2900666SRuslan Ermilov.Fa alias_addr 4253efa11bbSBrian Somersbe redirected to 426a2900666SRuslan Ermilov.Fa local_addr . 4273efa11bbSBrian SomersSimilarly, all outgoing traffic from 428a2900666SRuslan Ermilov.Fa local_addr 4293efa11bbSBrian Somersis aliased to 430a2900666SRuslan Ermilov.Fa alias_addr . 431a2900666SRuslan Ermilov.Pp 4323efa11bbSBrian SomersIf 433a2900666SRuslan Ermilov.Fa local_addr 4343efa11bbSBrian Somersor 435a2900666SRuslan Ermilov.Fa alias_addr 436a2900666SRuslan Ermilovis zero, this indicates that the packet aliasing address as established by 437a2900666SRuslan Ermilov.Fn PacketAliasSetAddress 438a2900666SRuslan Ermilovis to be used. 439a2900666SRuslan ErmilovEven if 440a2900666SRuslan Ermilov.Fn PacketAliasSetAddress 441a2900666SRuslan Ermilovis called to change the address after 442a2900666SRuslan Ermilov.Fn PacketAliasRedirectAddr 4433efa11bbSBrian Somersis called, a zero reference will track this change. 444a2900666SRuslan Ermilov.Pp 4456d20a774SRuslan ErmilovIf the link is further set up to operate for a load sharing, then 4466d20a774SRuslan Ermilov.Fa local_addr 4476d20a774SRuslan Ermilovis ignored, and is selected dynamically from the server pool, as described in 4486d20a774SRuslan Ermilov.Fn PacketAliasAddServer 4496d20a774SRuslan Ermilovbelow. 4506d20a774SRuslan Ermilov.Pp 451a2900666SRuslan ErmilovIf subsequent calls to 452a2900666SRuslan Ermilov.Fn PacketAliasRedirectAddr 453a2900666SRuslan Ermilovuse the same aliasing address, all new incoming traffic to this aliasing 454a2900666SRuslan Ermilovaddress will be redirected to the local address made in the last function 455a2900666SRuslan Ermilovcall. 456a2900666SRuslan ErmilovNew traffic generated by any of the local machines, designated in the 457a2900666SRuslan Ermilovseveral function calls, will be aliased to the same address. 458a2900666SRuslan ErmilovConsider the following example: 459a2900666SRuslan Ermilov.Bd -literal -offset indent 4603efa11bbSBrian SomersPacketAliasRedirectAddr(inet_aton("192.168.0.2"), 4613efa11bbSBrian Somers inet_aton("141.221.254.101")); 4623efa11bbSBrian SomersPacketAliasRedirectAddr(inet_aton("192.168.0.3"), 4633efa11bbSBrian Somers inet_aton("141.221.254.101")); 4643efa11bbSBrian SomersPacketAliasRedirectAddr(inet_aton("192.168.0.4"), 4653efa11bbSBrian Somers inet_aton("141.221.254.101")); 4663efa11bbSBrian Somers.Ed 467a2900666SRuslan Ermilov.Pp 468a2900666SRuslan ErmilovAny outgoing connections such as 469a2900666SRuslan Ermilov.Xr telnet 1 470a2900666SRuslan Ermilovor 471a2900666SRuslan Ermilov.Xr ftp 1 472a2900666SRuslan Ermilovfrom 192.168.0.2, 192.168.0.3 and 192.168.0.4 will appear to come from 473a2900666SRuslan Ermilov141.221.254.101. 474a2900666SRuslan ErmilovAny incoming connections to 141.221.254.101 will be directed to 192.168.0.4. 475a2900666SRuslan Ermilov.Pp 476a2900666SRuslan ErmilovAny calls to 477a2900666SRuslan Ermilov.Fn PacketAliasRedirectPort 478a2900666SRuslan Ermilovwill have precedence over address mappings designated by 479a2900666SRuslan Ermilov.Fn PacketAliasRedirectAddr . 480a2900666SRuslan Ermilov.Pp 481a2900666SRuslan ErmilovThis function returns a pointer which can subsequently be used by 482a2900666SRuslan Ermilov.Fn PacketAliasRedirectDelete . 483a2900666SRuslan ErmilovIf 484a2900666SRuslan Ermilov.Dv NULL 485a2900666SRuslan Ermilovis returned, then the function call did not complete successfully. 486a2900666SRuslan Ermilov.Ed 487a2900666SRuslan Ermilov.Pp 4886d20a774SRuslan Ermilov.Ft int 4896d20a774SRuslan Ermilov.Fo PacketAliasAddServer 4906d20a774SRuslan Ermilov.Fa "struct alias_link *link" 4916d20a774SRuslan Ermilov.Fa "struct in_addr addr" 4926d20a774SRuslan Ermilov.Fa "u_short port" 4936d20a774SRuslan Ermilov.Fc 4946d20a774SRuslan Ermilov.Bd -ragged -offset indent 4956d20a774SRuslan ErmilovThis function sets the 4966d20a774SRuslan Ermilov.Fa link 4976d20a774SRuslan Ermilovup for Load Sharing using IP Network Address Translation (RFC 2391, LSNAT). 4986d20a774SRuslan ErmilovLSNAT operates as follows. 4996d20a774SRuslan ErmilovA client attempts to access a server by using the server virtual address. 5006d20a774SRuslan ErmilovThe LSNAT router transparently redirects the request to one of the hosts 5016d20a774SRuslan Ermilovin server pool, selected using a real-time load sharing algorithm. 5026d20a774SRuslan ErmilovMultiple sessions may be initiated from the same client, and each session 5036d20a774SRuslan Ermilovcould be directed to a different host based on load balance across server 5046d20a774SRuslan Ermilovpool hosts at the time. 5056d20a774SRuslan ErmilovIf load share is desired for just a few specific services, the configuration 5066d20a774SRuslan Ermilovon LSNAT could be defined to restrict load share for just the services 5076d20a774SRuslan Ermilovdesired. 5086d20a774SRuslan Ermilov.Pp 5096d20a774SRuslan ErmilovCurrently, only the simplest selection algorithm is implemented, where a 5106d20a774SRuslan Ermilovhost is selected on a round-robin basis only, without regard to load on 5116d20a774SRuslan Ermilovthe host. 5126d20a774SRuslan Ermilov.Pp 5136d20a774SRuslan ErmilovFirst, the 5146d20a774SRuslan Ermilov.Fa link 5156d20a774SRuslan Ermilovis created by either 5166d20a774SRuslan Ermilov.Fn PacketAliasRedirectPort 5176d20a774SRuslan Ermilovor 5186d20a774SRuslan Ermilov.Fn PacketAliasRedirectAddr . 5196d20a774SRuslan ErmilovThen, 5206d20a774SRuslan Ermilov.Fn PacketAliasAddServer 5216d20a774SRuslan Ermilovis called multiple times to add entries to the 5226d20a774SRuslan Ermilov.Fa link Ns 's 5236d20a774SRuslan Ermilovserver pool. 5246d20a774SRuslan Ermilov.Pp 5256d20a774SRuslan ErmilovFor links created with 5266d20a774SRuslan Ermilov.Fn PacketAliasRedirectAddr , 5276d20a774SRuslan Ermilovthe 5286d20a774SRuslan Ermilov.Fa port 5296d20a774SRuslan Ermilovargument is ignored and could have any value, e.g. htons(~0). 5306d20a774SRuslan Ermilov.Pp 5316d20a774SRuslan ErmilovThis function returns 0 on success, -1 otherwise. 5326d20a774SRuslan Ermilov.Ed 5336d20a774SRuslan Ermilov.Pp 5343efa11bbSBrian Somers.Ft void 535a2900666SRuslan Ermilov.Fn PacketAliasRedirectDelete "struct alias_link *link" 536a2900666SRuslan Ermilov.Bd -ragged -offset indent 537a2900666SRuslan ErmilovThis function will delete a specific static redirect rule entered by 538a2900666SRuslan Ermilov.Fn PacketAliasRedirectPort 539a2900666SRuslan Ermilovor 540a2900666SRuslan Ermilov.Fn PacketAliasRedirectAddr . 541a2900666SRuslan ErmilovThe parameter 542a2900666SRuslan Ermilov.Fa link 543a2900666SRuslan Ermilovis the pointer returned by either of the redirection functions. 544a2900666SRuslan ErmilovIf an invalid pointer is passed to 545a2900666SRuslan Ermilov.Fn PacketAliasRedirectDelete , 546a2900666SRuslan Ermilovthen a program crash or unpredictable operation could result, so it is 5473efa11bbSBrian Somersnecessary to be careful using this function. 548a2900666SRuslan Ermilov.Ed 549a2900666SRuslan Ermilov.Pp 550619d1a30SBrian Somers.Ft int 55142889ed1SBrian Somers.Fn PacketAliasProxyRule "const char *cmd" 552a2900666SRuslan Ermilov.Bd -ragged -offset indent 553619d1a30SBrian SomersThe passed 554a2900666SRuslan Ermilov.Fa cmd 555a2900666SRuslan Ermilovstring consists of one or more pairs of words. 556a2900666SRuslan ErmilovThe first word in each pair is a token and the second is the value that 557a2900666SRuslan Ermilovshould be applied for that token. 558a2900666SRuslan ErmilovTokens and their argument types are as follows: 559a2900666SRuslan Ermilov.Bl -tag -width indent 560a2900666SRuslan Ermilov.It Cm type encode_ip_hdr | encode_tcp_stream | no_encode 561619d1a30SBrian SomersIn order to support transparent proxying, it is necessary to somehow 562619d1a30SBrian Somerspass the original address and port information into the new destination 563a2900666SRuslan Ermilovserver. 564a2900666SRuslan ErmilovIf 565a2900666SRuslan Ermilov.Cm encode_ip_hdr 566619d1a30SBrian Somersis specified, the original address and port is passed as an extra IP 567a2900666SRuslan Ermilovoption. 568a2900666SRuslan ErmilovIf 569a2900666SRuslan Ermilov.Cm encode_tcp_stream 570619d1a30SBrian Somersis specified, the original address and port is passed as the first 571a2900666SRuslan Ermilovpiece of data in the TCP stream in the format 572619d1a30SBrian Somers.Dq DEST Ar IP port . 573a2900666SRuslan Ermilov.It Cm port Ar portnum 574619d1a30SBrian SomersOnly packets with the destination port 575619d1a30SBrian Somers.Ar portnum 576619d1a30SBrian Somersare proxied. 577a2900666SRuslan Ermilov.It Cm server Ar host Ns Xo 578a2900666SRuslan Ermilov.Op : Ns Ar portnum 579a2900666SRuslan Ermilov.Xc 580619d1a30SBrian SomersThis specifies the 581619d1a30SBrian Somers.Ar host 582619d1a30SBrian Somersand 583619d1a30SBrian Somers.Ar portnum 584ac8e3334SBrian Somersthat the data is to be redirected to. 585ac8e3334SBrian Somers.Ar host 586a2900666SRuslan Ermilovmust be an IP address rather than a DNS host name. 587a2900666SRuslan ErmilovIf 588619d1a30SBrian Somers.Ar portnum 589619d1a30SBrian Somersis not specified, the destination port number is not changed. 590619d1a30SBrian Somers.Pp 591619d1a30SBrian SomersThe 592619d1a30SBrian Somers.Ar server 593619d1a30SBrian Somersspecification is mandatory unless the 594a2900666SRuslan Ermilov.Cm delete 595619d1a30SBrian Somerscommand is being used. 596a2900666SRuslan Ermilov.It Cm rule Ar index 597619d1a30SBrian SomersNormally, each call to 598619d1a30SBrian Somers.Fn PacketAliasProxyRule 599a2900666SRuslan Ermilovinserts the next rule at the start of a linear list of rules. 600a2900666SRuslan ErmilovIf an 601619d1a30SBrian Somers.Ar index 602619d1a30SBrian Somersis specified, the new rule will be checked after all rules with lower 603a2900666SRuslan Ermilovindices. 604a2900666SRuslan ErmilovCalls to 605619d1a30SBrian Somers.Fn PacketAliasProxyRule 606619d1a30SBrian Somersthat do not specify a rule are assigned rule 0. 607a2900666SRuslan Ermilov.It Cm delete Ar index 608a2900666SRuslan ErmilovThis token and its argument MUST NOT be used with any other tokens. 609a2900666SRuslan ErmilovWhen used, all existing rules with the given 610619d1a30SBrian Somers.Ar index 611619d1a30SBrian Somersare deleted. 612a2900666SRuslan Ermilov.It Cm proto tcp | udp 613619d1a30SBrian SomersIf specified, only packets of the given protocol type are matched. 614a2900666SRuslan Ermilov.It Cm src Ar IP Ns Xo 615a2900666SRuslan Ermilov.Op / Ns Ar bits 616a2900666SRuslan Ermilov.Xc 617619d1a30SBrian SomersIf specified, only packets with a source address matching the given 618619d1a30SBrian Somers.Ar IP 619a2900666SRuslan Ermilovare matched. 620a2900666SRuslan ErmilovIf 621619d1a30SBrian Somers.Ar bits 622619d1a30SBrian Somersis also specified, then the first 623619d1a30SBrian Somers.Ar bits 624619d1a30SBrian Somersbits of 625619d1a30SBrian Somers.Ar IP 626619d1a30SBrian Somersare taken as a network specification, and all IP addresses from that 627619d1a30SBrian Somersnetwork will be matched. 628a2900666SRuslan Ermilov.It Cm dst Ar IP Ns Xo 629a2900666SRuslan Ermilov.Op / Ns Ar bits 630a2900666SRuslan Ermilov.Xc 631619d1a30SBrian SomersIf specified, only packets with a destination address matching the given 632619d1a30SBrian Somers.Ar IP 633a2900666SRuslan Ermilovare matched. 634a2900666SRuslan ErmilovIf 635619d1a30SBrian Somers.Ar bits 636619d1a30SBrian Somersis also specified, then the first 637619d1a30SBrian Somers.Ar bits 638619d1a30SBrian Somersbits of 639619d1a30SBrian Somers.Ar IP 640619d1a30SBrian Somersare taken as a network specification, and all IP addresses from that 641619d1a30SBrian Somersnetwork will be matched. 642619d1a30SBrian Somers.El 643a2900666SRuslan Ermilov.Pp 644619d1a30SBrian SomersThis function is usually used to redirect outgoing connections for 645619d1a30SBrian Somersinternal machines that are not permitted certain types of internet 646619d1a30SBrian Somersaccess, or to restrict access to certain external machines. 647a2900666SRuslan Ermilov.Ed 648a2900666SRuslan Ermilov.Pp 649483d2f22SRuslan Ermilov.Ft struct alias_link * 650483d2f22SRuslan Ermilov.Fo PacketAliasRedirectPptp 651483d2f22SRuslan Ermilov.Fa "struct in_addr local_addr" 652483d2f22SRuslan Ermilov.Fa "struct in_addr remote_addr" 653483d2f22SRuslan Ermilov.Fa "struct in_addr alias_addr" 654483d2f22SRuslan Ermilov.Fc 655483d2f22SRuslan Ermilov.Bd -ragged -offset indent 656483d2f22SRuslan ErmilovThis function specifies that any Point to Point Tunneling Protocol 657483d2f22SRuslan Ermilov(PPTP) traffic from a given remote address to an alias address be 658483d2f22SRuslan Ermilovredirected to a specified local address. 659483d2f22SRuslan ErmilovCurrently supported PPTP protocols include: 660483d2f22SRuslan Ermilov.Pp 661483d2f22SRuslan Ermilov.Bl -tag -width "IPPROTO_GRE" -compact 662483d2f22SRuslan Ermilov.It IPPROTO_GRE 663483d2f22SRuslan ErmilovGeneric Routing Encapsulation (RFC 1702) 664483d2f22SRuslan Ermilov.It IPPROTO_ESP 665483d2f22SRuslan ErmilovIP Encapsulating Security Payload (RFC 1827) 666483d2f22SRuslan Ermilov.It IPPROTO_AH 667483d2f22SRuslan ErmilovIP Authentication Header (RFC 1826) 668483d2f22SRuslan Ermilov.El 669483d2f22SRuslan Ermilov.Pp 670483d2f22SRuslan ErmilovIf 671483d2f22SRuslan Ermilov.Fa local_addr 672483d2f22SRuslan Ermilovor 673483d2f22SRuslan Ermilov.Fa alias_addr 674483d2f22SRuslan Ermilovis zero, this indicates that the packet aliasing address as established 675483d2f22SRuslan Ermilovby 676483d2f22SRuslan Ermilov.Fn PacketAliasSetAddress 677483d2f22SRuslan Ermilovis to be used. 678483d2f22SRuslan ErmilovEven if 679483d2f22SRuslan Ermilov.Fn PacketAliasSetAddress 680483d2f22SRuslan Ermilovis called to change the address after 681483d2f22SRuslan Ermilov.Fn PacketAliasRedirectPptp 682483d2f22SRuslan Ermilovis called, a zero reference will track this change. 683483d2f22SRuslan Ermilov.Pp 684483d2f22SRuslan ErmilovIf 685483d2f22SRuslan Ermilov.Fa remote_addr 686483d2f22SRuslan Ermilovis zero, this indicates to redirect PPTP packets from any remote address. 687483d2f22SRuslan ErmilovNon-zero remote addresses can sometimes be useful for firewalling. 688483d2f22SRuslan Ermilov.Pp 689483d2f22SRuslan ErmilovIf two calls to 690483d2f22SRuslan Ermilov.Fn PacketAliasRedirectPptp 691483d2f22SRuslan Ermilovoverlap in their address specifications, then the most recent call 692483d2f22SRuslan Ermilovwill have precedence. 693483d2f22SRuslan Ermilov.Pp 694483d2f22SRuslan ErmilovThis function returns a pointer which can subsequently be used by 695483d2f22SRuslan Ermilov.Fn PacketAliasRedirectDelete . 696483d2f22SRuslan ErmilovIf 697483d2f22SRuslan Ermilov.Dv NULL 698483d2f22SRuslan Ermilovis returned, then the function call did not complete successfully. 699483d2f22SRuslan Ermilov.Ed 700483d2f22SRuslan Ermilov.Pp 701a2900666SRuslan Ermilov.Ft int 702164928d3SBrian Somers.Fn PacketAliasPptp "struct in_addr addr" 703a2900666SRuslan Ermilov.Bd -ragged -offset indent 704483d2f22SRuslan ErmilovThis function causes any PPTP packets to be aliased using 705483d2f22SRuslan Ermilov.Fa addr 706164928d3SBrian Somersrather than the address set via 707164928d3SBrian Somers.Fn PacketAliasSetAddress . 708483d2f22SRuslan ErmilovThis allows the uses of the PPTP on a single machine on the internal network. 709164928d3SBrian Somers.Pp 710164928d3SBrian SomersIf the passed address is 711a2900666SRuslan Ermilov.Dv INADDR_NONE , 712483d2f22SRuslan Ermilovthen PPTP aliasing is disabled. 713483d2f22SRuslan Ermilov.Pp 714483d2f22SRuslan Ermilov.Bf -symbolic 715483d2f22SRuslan ErmilovThis function is made obsolete by 716483d2f22SRuslan Ermilov.Fn PacketAliasRedirectPptp 717483d2f22SRuslan Ermilovand 718483d2f22SRuslan Ermilov.Dv PKT_ALIAS_DENY_PPTP 719483d2f22SRuslan Ermilovmode bit, and is provided only for backward compatibility. 720483d2f22SRuslan Ermilov.Ef 721a2900666SRuslan Ermilov.Ed 722a2900666SRuslan Ermilov.Sh FRAGMENT HANDLING 723a2900666SRuslan ErmilovThe functions in this section are used to deal with incoming fragments. 724a2900666SRuslan Ermilov.Pp 725a2900666SRuslan ErmilovOutgoing fragments are handled within 726a2900666SRuslan Ermilov.Fn PacketAliasOut 727a2900666SRuslan Ermilovby changing the address according to any applicable mapping set by 728a2900666SRuslan Ermilov.Fn PacketAliasRedirectAddress , 7291855100fSAlexey Zelkinor the default aliasing address set by 730a2900666SRuslan Ermilov.Fn PacketAliasSetAddress . 731a2900666SRuslan Ermilov.Pp 7321855100fSAlexey ZelkinIncoming fragments are handled in one of two ways. 733a2900666SRuslan ErmilovIf the header of a fragmented IP packet has already been seen, then all 734a2900666SRuslan Ermilovsubsequent fragments will be re-mapped in the same manner the header 735a2900666SRuslan Ermilovfragment was. 736a2900666SRuslan ErmilovFragments which arrive before the header are saved and then retrieved 737a2900666SRuslan Ermilovonce the header fragment has been resolved. 738a2900666SRuslan Ermilov.Pp 7393efa11bbSBrian Somers.Ft int 7403efa11bbSBrian Somers.Fn PacketAliasSaveFragment "char *ptr" 741a2900666SRuslan Ermilov.Bd -ragged -offset indent 742a2900666SRuslan ErmilovWhen 743a2900666SRuslan Ermilov.Fn PacketAliasIn 744a2900666SRuslan Ermilovreturns 745a2900666SRuslan Ermilov.Dv PKT_ALIAS_UNRESOLVED_FRAGMENT , 746a2900666SRuslan Ermilovthis function can be used to save the pointer to the unresolved fragment. 747a2900666SRuslan Ermilov.Pp 7483efa11bbSBrian SomersIt is implicitly assumed that 749a2900666SRuslan Ermilov.Fa ptr 7503efa11bbSBrian Somerspoints to a block of memory allocated by 751a2900666SRuslan Ermilov.Xr malloc 3 . 752a2900666SRuslan ErmilovIf the fragment is never resolved, the packet aliasing engine will 753a2900666SRuslan Ermilovautomatically free the memory after a timeout period. 754a2900666SRuslan Ermilov[Eventually this function should be modified so that a callback function 755a2900666SRuslan Ermilovfor freeing memory is passed as an argument.] 756a2900666SRuslan Ermilov.Pp 757a2900666SRuslan ErmilovThis function returns 758a2900666SRuslan Ermilov.Dv PKT_ALIAS_OK 759a2900666SRuslan Ermilovif it was successful and 760a2900666SRuslan Ermilov.Dv PKT_ALIAS_ERROR 761a2900666SRuslan Ermilovif there was an error. 762a2900666SRuslan Ermilov.Ed 763a2900666SRuslan Ermilov.Pp 7643efa11bbSBrian Somers.Ft char * 7653efa11bbSBrian Somers.Fn PacketAliasGetFragment "char *buffer" 766a2900666SRuslan Ermilov.Bd -ragged -offset indent 767a2900666SRuslan ErmilovThis function can be used to retrieve fragment pointers saved by 768a2900666SRuslan Ermilov.Fn PacketAliasSaveFragment . 7693efa11bbSBrian SomersThe IP header fragment pointed to by 770a2900666SRuslan Ermilov.Fa buffer 7713efa11bbSBrian Somersis the header fragment indicated when 772a2900666SRuslan Ermilov.Fn PacketAliasIn 773a2900666SRuslan Ermilovreturns 774a2900666SRuslan Ermilov.Dv PKT_ALIAS_FOUND_HEADER_FRAGMENT . 775a2900666SRuslan ErmilovOnce a fragment pointer is retrieved, it becomes the calling program's 776a2900666SRuslan Ermilovresponsibility to free the dynamically allocated memory for the fragment. 777a2900666SRuslan Ermilov.Pp 778a2900666SRuslan Ermilov.Fn PacketAliasGetFragment 779a2900666SRuslan Ermilovcan be called sequentially until there are no more fragments available, 780a2900666SRuslan Ermilovat which time it returns 781a2900666SRuslan Ermilov.Dv NULL . 782a2900666SRuslan Ermilov.Ed 783a2900666SRuslan Ermilov.Pp 7843efa11bbSBrian Somers.Ft void 7853efa11bbSBrian Somers.Fn PacketAliasFragmentIn "char *header" "char *fragment" 786a2900666SRuslan Ermilov.Bd -ragged -offset indent 7873efa11bbSBrian SomersWhen a fragment is retrieved with 788a2900666SRuslan Ermilov.Fn PacketAliasGetFragment , 789a2900666SRuslan Ermilovit can then be de-aliased with a call to 790a2900666SRuslan Ermilov.Fn PacketAliasFragmentIn . 791a2900666SRuslan ErmilovThe 792a2900666SRuslan Ermilov.Fa header 793a2900666SRuslan Ermilovargument is the pointer to a header fragment used as a template, and 794a2900666SRuslan Ermilov.Fa fragment 7953efa11bbSBrian Somersis the pointer to the packet to be de-aliased. 796a2900666SRuslan Ermilov.Ed 797a2900666SRuslan Ermilov.Sh MISCELLANEOUS FUNCTIONS 7983efa11bbSBrian Somers.Ft void 7993efa11bbSBrian Somers.Fn PacketAliasSetTarget "struct in_addr addr" 800a2900666SRuslan Ermilov.Bd -ragged -offset indent 801a2900666SRuslan ErmilovWhen an incoming packet not associated with any pre-existing aliasing link 802a2900666SRuslan Ermilovarrives at the host machine, it will be sent to the address indicated by a 803a2900666SRuslan Ermilovcall to 804a2900666SRuslan Ermilov.Fn PacketAliasSetTarget . 805a2900666SRuslan Ermilov.Pp 806a2900666SRuslan ErmilovIf this function is not called, or is called with an 807a2900666SRuslan Ermilov.Dv INADDR_NONE 808a2900666SRuslan Ermilovaddress argument, then all new incoming packets go to the address set by 809a2900666SRuslan Ermilov.Fn PacketAliasSetAddress . 810a2900666SRuslan Ermilov.Pp 811a2900666SRuslan ErmilovIf this function is called with an 812a2900666SRuslan Ermilov.Dv INADDR_ANY 813a2900666SRuslan Ermilovaddress argument, then all new incoming packets go to the address specified 814a2900666SRuslan Ermilovin the packet. 815a2900666SRuslan ErmilovThis allows external machines to talk directly to internal machines if they 816a2900666SRuslan Ermilovcan route packets to the machine in question. 817a2900666SRuslan Ermilov.Ed 818a2900666SRuslan Ermilov.Pp 8193efa11bbSBrian Somers.Ft int 820a2900666SRuslan Ermilov.Fn PacketAliasCheckNewLink void 821a2900666SRuslan Ermilov.Bd -ragged -offset indent 822a2900666SRuslan ErmilovThis function returns a non-zero value when a new aliasing link is created. 823a2900666SRuslan ErmilovIn circumstances where incoming traffic is being sequentially sent to 824a2900666SRuslan Ermilovdifferent local servers, this function can be used to trigger when 825a2900666SRuslan Ermilov.Fn PacketAliasSetTarget 8263efa11bbSBrian Somersis called to change the default target address. 827a2900666SRuslan Ermilov.Ed 828a2900666SRuslan Ermilov.Pp 8293efa11bbSBrian Somers.Ft u_short 830442a25bdSBruce Evans.Fn PacketAliasInternetChecksum "u_short *buffer" "int nbytes" 831a2900666SRuslan Ermilov.Bd -ragged -offset indent 832a2900666SRuslan ErmilovThis is a utility function that does not seem to be available elsewhere and 833a2900666SRuslan Ermilovis included as a convenience. 834a2900666SRuslan ErmilovIt computes the internet checksum, which is used in both IP and 835a2900666SRuslan Ermilovprotocol-specific headers (TCP, UDP, ICMP). 836a2900666SRuslan Ermilov.Pp 837a2900666SRuslan ErmilovThe 838a2900666SRuslan Ermilov.Fa buffer 839a2900666SRuslan Ermilovargument points to the data block to be checksummed, and 840a2900666SRuslan Ermilov.Fa nbytes 841a2900666SRuslan Ermilovis the number of bytes. 842a2900666SRuslan ErmilovThe 16-bit checksum field should be zeroed before computing the checksum. 843a2900666SRuslan Ermilov.Pp 844a2900666SRuslan ErmilovChecksums can also be verified by operating on a block of data including 845a2900666SRuslan Ermilovits checksum. 846a2900666SRuslan ErmilovIf the checksum is valid, 847a2900666SRuslan Ermilov.Fn PacketAliasInternetChecksum 848a2900666SRuslan Ermilovwill return zero. 849a2900666SRuslan Ermilov.Ed 850a2900666SRuslan Ermilov.Sh AUTHORS 851a2900666SRuslan Ermilov.An Charles Mott Aq cmott@scientech.com , 852a2900666SRuslan Ermilovversions 1.0 - 1.8, 2.0 - 2.4. 853a2900666SRuslan Ermilov.An Eivind Eklund Aq eivind@FreeBSD.org , 854a2900666SRuslan Ermilovversions 1.8b, 1.9 and 2.5. 855a2900666SRuslan ErmilovAdded IRC DCC support as well as contributing a number of architectural 856a2900666SRuslan Ermilovimprovements; added the firewall bypass for FTP/IRC DCC. 857a2900666SRuslan Ermilov.Sh ACKNOWLEDGMENTS 858a2900666SRuslan ErmilovListed below, in approximate chronological order, are individuals who 859a2900666SRuslan Ermilovhave provided valuable comments and/or debugging assistance. 860a2900666SRuslan Ermilov.Pp 861a2900666SRuslan Ermilov.Bl -item -offset indent -compact 862a2900666SRuslan Ermilov.It 863a2900666SRuslan ErmilovGary Roberts 864a2900666SRuslan Ermilov.It 865a2900666SRuslan ErmilovTom Torrance 866a2900666SRuslan Ermilov.It 867a2900666SRuslan ErmilovReto Burkhalter 868a2900666SRuslan Ermilov.It 869a2900666SRuslan ErmilovMartin Renters 870a2900666SRuslan Ermilov.It 871a2900666SRuslan ErmilovBrian Somers 872a2900666SRuslan Ermilov.It 873a2900666SRuslan ErmilovPaul Traina 874a2900666SRuslan Ermilov.It 875a2900666SRuslan ErmilovAri Suutari 876a2900666SRuslan Ermilov.It 877a2900666SRuslan ErmilovDave Remien 878a2900666SRuslan Ermilov.It 879a2900666SRuslan ErmilovJ. Fortes 880a2900666SRuslan Ermilov.It 881a2900666SRuslan ErmilovAndrzej Bialecki 882a2900666SRuslan Ermilov.It 883a2900666SRuslan ErmilovGordon Burditt 8843efa11bbSBrian Somers.El 885a2900666SRuslan Ermilov.Sh CONCEPTUAL BACKGROUND 886a2900666SRuslan ErmilovThis section is intended for those who are planning to modify the source 887a2900666SRuslan Ermilovcode or want to create somewhat esoteric applications using the packet 888a2900666SRuslan Ermilovaliasing functions. 889a2900666SRuslan Ermilov.Pp 890a2900666SRuslan ErmilovThe conceptual framework under which the packet aliasing engine operates 891a2900666SRuslan Ermilovis described here. 8923efa11bbSBrian SomersCentral to the discussion is the idea of an 893a2900666SRuslan Ermilov.Em aliasing link 894a2900666SRuslan Ermilovwhich describes the relationship for a given packet transaction between 895a2900666SRuslan Ermilovthe local machine, aliased identity and remote machine. 896a2900666SRuslan ErmilovIt is discussed how such links come into existence and are destroyed. 897a2900666SRuslan Ermilov.Ss ALIASING LINKS 898a2900666SRuslan ErmilovThere is a notion of an 899a2900666SRuslan Ermilov.Em aliasing link , 900a2900666SRuslan Ermilovwhich is a 7-tuple describing a specific translation: 9013efa11bbSBrian Somers.Bd -literal -offset indent 9023efa11bbSBrian Somers(local addr, local port, alias addr, alias port, 9033efa11bbSBrian Somers remote addr, remote port, protocol) 9043efa11bbSBrian Somers.Ed 905a2900666SRuslan Ermilov.Pp 906a2900666SRuslan ErmilovOutgoing packets have the local address and port number replaced with the 907a2900666SRuslan Ermilovalias address and port number. 908a2900666SRuslan ErmilovIncoming packets undergo the reverse process. 909a2900666SRuslan ErmilovThe packet aliasing engine attempts to match packets against an internal 910a2900666SRuslan Ermilovtable of aliasing links to determine how to modify a given IP packet. 911a2900666SRuslan ErmilovBoth the IP header and protocol dependent headers are modified as necessary. 912a2900666SRuslan ErmilovAliasing links are created and deleted as necessary according to network 913a2900666SRuslan Ermilovtraffic. 914a2900666SRuslan Ermilov.Pp 915a2900666SRuslan ErmilovProtocols can be TCP, UDP or even ICMP in certain circumstances. 916a2900666SRuslan Ermilov(Some types of ICMP packets can be aliased according to sequence or ID 917a2900666SRuslan Ermilovnumber which acts as an equivalent port number for identifying how 918a2900666SRuslan Ermilovindividual packets should be handled.) 919a2900666SRuslan Ermilov.Pp 920a2900666SRuslan ErmilovEach aliasing link must have a unique combination of the following five 921a2900666SRuslan Ermilovquantities: alias address/port, remote address/port and protocol. 922a2900666SRuslan ErmilovThis ensures that several machines on a local network can share the 923a2900666SRuslan Ermilovsame aliasing IP address. 924a2900666SRuslan ErmilovIn cases where conflicts might arise, the aliasing port is chosen so that 925a2900666SRuslan Ermilovuniqueness is maintained. 926a2900666SRuslan Ermilov.Ss STATIC AND DYNAMIC LINKS 9273efa11bbSBrian SomersAliasing links can either be static or dynamic. 928a2900666SRuslan ErmilovStatic links persist indefinitely and represent fixed rules for translating 929a2900666SRuslan ErmilovIP packets. 930a2900666SRuslan ErmilovDynamic links come into existence for a specific TCP connection or UDP 931a2900666SRuslan Ermilovtransaction or ICMP ECHO sequence. 932a2900666SRuslan ErmilovFor the case of TCP, the connection can be monitored to see when the 933a2900666SRuslan Ermilovassociated aliasing link should be deleted. 934a2900666SRuslan ErmilovAliasing links for UDP transactions (and ICMP ECHO and TIMESTAMP requests) 935a2900666SRuslan Ermilovwork on a simple timeout rule. 936a2900666SRuslan ErmilovWhen no activity is observed on a dynamic link for a certain amount of time 937a2900666SRuslan Ermilovit is automatically deleted. 938a2900666SRuslan ErmilovTimeout rules also apply to TCP connections which do not open or close 9393efa11bbSBrian Somersproperly. 940a2900666SRuslan Ermilov.Ss PARTIALLY SPECIFIED ALIASING LINKS 941a2900666SRuslan ErmilovAliasing links can be partially specified, meaning that the remote address 942a2900666SRuslan Ermilovand/or remote port are unknown. 943a2900666SRuslan ErmilovIn this case, when a packet matching the incomplete specification is found, 944a2900666SRuslan Ermilova fully specified dynamic link is created. 945a2900666SRuslan ErmilovIf the original partially specified link is dynamic, it will be deleted 946a2900666SRuslan Ermilovafter the fully specified link is created, otherwise it will persist. 947a2900666SRuslan Ermilov.Pp 948a2900666SRuslan ErmilovFor instance, a partially specified link might be 9493efa11bbSBrian Somers.Bd -literal -offset indent 9503efa11bbSBrian Somers(192.168.0.4, 23, 204.228.203.215, 8066, 0, 0, tcp) 9513efa11bbSBrian Somers.Ed 952a2900666SRuslan Ermilov.Pp 953a2900666SRuslan ErmilovThe zeros denote unspecified components for the remote address and port. 954a2900666SRuslan ErmilovIf this link were static it would have the effect of redirecting all 955a2900666SRuslan Ermilovincoming traffic from port 8066 of 204.228.203.215 to port 23 (telnet) 956a2900666SRuslan Ermilovof machine 192.168.0.4 on the local network. 957a2900666SRuslan ErmilovEach individual telnet connection would initiate the creation of a distinct 958a2900666SRuslan Ermilovdynamic link. 959a2900666SRuslan Ermilov.Ss DYNAMIC LINK CREATION 960a2900666SRuslan ErmilovIn addition to aliasing links, there are also address mappings that can be 961a2900666SRuslan Ermilovstored within the internal data table of the packet aliasing mechanism. 9623efa11bbSBrian Somers.Bd -literal -offset indent 9633efa11bbSBrian Somers(local addr, alias addr) 9643efa11bbSBrian Somers.Ed 965a2900666SRuslan Ermilov.Pp 966a2900666SRuslan ErmilovAddress mappings are searched when creating new dynamic links. 967a2900666SRuslan Ermilov.Pp 968a2900666SRuslan ErmilovAll outgoing packets from the local network automatically create a dynamic 969a2900666SRuslan Ermilovlink if they do not match an already existing fully specified link. 970a2900666SRuslan ErmilovIf an address mapping exists for the outgoing packet, this determines 971a2900666SRuslan Ermilovthe alias address to be used. 972a2900666SRuslan ErmilovIf no mapping exists, then a default address, usually the address of the 973a2900666SRuslan Ermilovpacket aliasing host, is used. 974a2900666SRuslan ErmilovIf necessary, this default address can be changed as often as each individual 975a2900666SRuslan Ermilovpacket arrives. 976a2900666SRuslan Ermilov.Pp 977a2900666SRuslan ErmilovThe aliasing port number is determined such that the new dynamic link does 978a2900666SRuslan Ermilovnot conflict with any existing links. 979a2900666SRuslan ErmilovIn the default operating mode, the packet aliasing engine attempts to set 980a2900666SRuslan Ermilovthe aliasing port equal to the local port number. 981a2900666SRuslan ErmilovIf this results in a conflict, then port numbers are randomly chosen until 982a2900666SRuslan Ermilova unique aliasing link can be established. 983a2900666SRuslan ErmilovIn an alternate operating mode, the first choice of an aliasing port is also 984a2900666SRuslan Ermilovrandom and unrelated to the local port number. 985