13efa11bbSBrian Somers.Dd July, 1997 23efa11bbSBrian Somers.Dt "libalias" 3 33efa11bbSBrian Somers.Os 43efa11bbSBrian Somers.Sh NAME 53efa11bbSBrian Somers.Nm "libalias" 63efa11bbSBrian SomersPacket Aliasing Library. A collection of 73efa11bbSBrian Somersfunctions for aliasing and de-aliasing 83efa11bbSBrian Somersof IP packets, intended for masquerading and 93efa11bbSBrian Somersnetwork address translation (NAT). 103efa11bbSBrian Somers 113efa11bbSBrian Somers.Sh SYNOPSIS 12442a25bdSBruce Evans.Fd #include <sys/types.h> 133efa11bbSBrian Somers.Fd #include <netinet/in.h> 143efa11bbSBrian Somers.Fd #include <alias.h> 153efa11bbSBrian Somers 163efa11bbSBrian SomersFunction prototypes are given in the main body 173efa11bbSBrian Somersof the text. 183efa11bbSBrian Somers 193efa11bbSBrian Somers.Sh CONTENTS 203efa11bbSBrian Somers.Bd -literal -offset left 213efa11bbSBrian Somers1. Introduction 223efa11bbSBrian Somers2. Initialization and Control 233efa11bbSBrian Somers 2.1 PacketAliasInit() 248ddc51bcSEivind Eklund 2.2 PacketAliasUninit() 258ddc51bcSEivind Eklund 2.3 PacketAliasSetAddress() 268ddc51bcSEivind Eklund 2.4 PacketAliasSetMode() 278ddc51bcSEivind Eklund 2.5 PacketAliasSetFWBase() 283efa11bbSBrian Somers3. Packet Handling 293efa11bbSBrian Somers 3.1 PacketAliasOut() 303efa11bbSBrian Somers 3.2 PacketAliasIn() 313efa11bbSBrian Somers4. Port and Address Redirection 323efa11bbSBrian Somers 4.1 PacketAliasRedirectPort() 333efa11bbSBrian Somers 4.2 PacketAliasRedirectAddr() 343efa11bbSBrian Somers 4.3 PacketAliasRedirectDelete() 353efa11bbSBrian Somers5. Fragment Handling 363efa11bbSBrian Somers 5.1 PacketAliasSaveFragment() 373efa11bbSBrian Somers 5.2 PacketAliasGetFragment() 383efa11bbSBrian Somers 5.3 PacketAliasFragmentIn() 393efa11bbSBrian Somers6. Miscellaneous Functions 403efa11bbSBrian Somers 6.1 PacketAliasSetTarget() 413efa11bbSBrian Somers 6.2 PacketAliasCheckNewLink() 423efa11bbSBrian Somers 6.3 PacketAliasInternetChecksum() 433efa11bbSBrian Somers7. Authors 443efa11bbSBrian Somers8. Acknowledgments 453efa11bbSBrian Somers 463efa11bbSBrian SomersAppendix A: Conceptual Background 473efa11bbSBrian Somers A.1 Aliasing Links 483efa11bbSBrian Somers A.2 Static and Dynamic Links 493efa11bbSBrian Somers A.3 Partially Specified Links 503efa11bbSBrian Somers A.4 Dynamic Link Creation 513efa11bbSBrian Somers.Ed 523efa11bbSBrian Somers 533efa11bbSBrian Somers.Sh 1. Introduction 543efa11bbSBrian SomersThis library is a moderately portable 553efa11bbSBrian Somersset of functions designed to assist 563efa11bbSBrian Somersin the process of IP masquerading and 573efa11bbSBrian Somersnetwork address translation. Outgoing 583efa11bbSBrian Somerspackets from a local network with 593efa11bbSBrian Somersunregistered IP addresses can be aliased 603efa11bbSBrian Somersto appear as if they came from an 613efa11bbSBrian Somersaccessible IP address. Incoming packets 623efa11bbSBrian Somersare then de-aliased so that they are sent 633efa11bbSBrian Somersto the correct machine on the local network. 643efa11bbSBrian Somers 653efa11bbSBrian SomersA certain amount of flexibility is built 663efa11bbSBrian Somersinto the packet aliasing engine. In 673efa11bbSBrian Somersthe simplest mode of operation, a 683efa11bbSBrian Somersmany-to-one address mapping takes place 693efa11bbSBrian Somersbetween local network and the packet 703efa11bbSBrian Somersaliasing host. This is known as IP 713efa11bbSBrian Somersmasquerading. In addition, one-to-one 723efa11bbSBrian Somersmappings between local and public addresses 733efa11bbSBrian Somerscan also be implemented, which is known as 743efa11bbSBrian Somersstatic NAT. In between these extremes, 753efa11bbSBrian Somersdifferent groups of private addresses 763efa11bbSBrian Somerscan be linked to different public addresses, 773efa11bbSBrian Somerscomprising several distinct many-to-one 783efa11bbSBrian Somersmappings. Also, a given public address 793efa11bbSBrian Somersand port can be staticly redirected to 803efa11bbSBrian Somersa private address/port. 813efa11bbSBrian Somers 823efa11bbSBrian SomersThe packet aliasing engine was designed 833efa11bbSBrian Somersto operate in user space outside of the 843efa11bbSBrian Somerskernel, without any access to private 853efa11bbSBrian Somerskernel data structure, but the source code 863efa11bbSBrian Somerscan also be ported to a kernel environment. 873efa11bbSBrian Somers 883efa11bbSBrian Somers.Sh 2. Initialization and Control 893efa11bbSBrian SomersTwo specific functions, PacketAliasInit() 903efa11bbSBrian Somersand PacketAliasSetAddress(), must always be 913efa11bbSBrian Somerscalled before any packet handling may be 923efa11bbSBrian Somersperformed. In addition, the operating mode 933efa11bbSBrian Somersof the packet aliasing engine can be customized 943efa11bbSBrian Somersby calling PacketAliasSetMode(). 953efa11bbSBrian Somers.Ss 2.1 PacketAliasInit() 963efa11bbSBrian Somers 973efa11bbSBrian Somers.Ft void 983efa11bbSBrian Somers.Fn PacketAliasInit "void" 993efa11bbSBrian Somers 1003efa11bbSBrian SomersThis function has no argument or return 1013efa11bbSBrian Somersvalue and is used to initialize internal 1023efa11bbSBrian Somersdata structures. The following mode bits 1033efa11bbSBrian Somersare always set after calling 1043efa11bbSBrian SomersPacketAliasInit(). See section 2.3 for 1053efa11bbSBrian Somersthe meaning of these mode bits. 1063efa11bbSBrian Somers.Bd -literal -offset indent 1073efa11bbSBrian Somers PKT_ALIAS_USE_SAME_PORTS 1083efa11bbSBrian Somers PKT_ALIAS_USE_SOCKETS 1093efa11bbSBrian Somers PKT_ALIAS_RESET_ON_ADDR_CHANGE 1103efa11bbSBrian Somers 1113efa11bbSBrian Somers.Ed 1123efa11bbSBrian SomersThis function will always return the packet 1133efa11bbSBrian Somersaliasing engine to the same initial state. 1143efa11bbSBrian SomersPacketAliasSetAddress() must be called afterwards, 1153efa11bbSBrian Somersand any desired changes from the default mode 1163efa11bbSBrian Somersbits listed above require a call to 1173efa11bbSBrian SomersPacketAliasSetMode(). 1183efa11bbSBrian Somers 1193efa11bbSBrian SomersIt is mandatory that this function be called 1203efa11bbSBrian Somersat the beginning of a program prior to any 1213efa11bbSBrian Somerspacket handling. 1228ddc51bcSEivind Eklund.Ss 2.2 PacketAliasUnInit() 1238ddc51bcSEivind Eklund 1248ddc51bcSEivind Eklund.Ft void 1258ddc51bcSEivind Eklund.Fn PacketAliasUnInit "void" 1268ddc51bcSEivind Eklund 1278ddc51bcSEivind EklundThis function has no argument or return 1288ddc51bcSEivind Eklundvalue and is used to clear any resources 1298ddc51bcSEivind Eklundattached to internal data structures. 1308ddc51bcSEivind Eklund 1318ddc51bcSEivind EklundThis functions should be called when a 1328ddc51bcSEivind Eklundprogram stop using the aliasing engine; 1338ddc51bcSEivind Eklundit do, among other things, clear out any 1348ddc51bcSEivind Eklundfirewall holes. To provide backwards 1358ddc51bcSEivind Eklundcompatibility and extra security, it is 1368ddc51bcSEivind Eklundadded to the atexit() chain by 1378ddc51bcSEivind EklundPacketAliasInit(). Calling it multiple 1388ddc51bcSEivind Eklundtimes is harmless. 1398ddc51bcSEivind Eklund.Ss 2.3 PacketAliasSetAddress() 1403efa11bbSBrian Somers 1413efa11bbSBrian Somers.Ft void 1423efa11bbSBrian Somers.Fn PacketAliasSetAddress "struct in_addr addr" 1433efa11bbSBrian Somers 1443efa11bbSBrian SomersThis function sets the source address to which 1453efa11bbSBrian Somersoutgoing packets from the local area network 1463efa11bbSBrian Somersare aliased. All outgoing packets are remapped 1473efa11bbSBrian Somersto this address unless overridden by a static 1483efa11bbSBrian Somersaddress mapping established by 1493efa11bbSBrian SomersPacketAliasRedirectAddr(). 1503efa11bbSBrian Somers 1513efa11bbSBrian SomersIf the PKT_ALIAS_RESET_ON_ADDR_CHANGE mode bit 1523efa11bbSBrian Somersis set (the default mode of operation), then 1533efa11bbSBrian Somersthe internal aliasing link tables will be reset 1543efa11bbSBrian Somersany time the aliasing address changes, as if 1553efa11bbSBrian SomersPacketAliasReset() were called. This is useful 1563efa11bbSBrian Somersfor interfaces such as ppp where the IP 1573efa11bbSBrian Somersaddress may or may not change on successive 1583efa11bbSBrian Somersdial-up attempts. 1593efa11bbSBrian Somers 1603efa11bbSBrian SomersIf the PKT_ALIAS_RESET_ON_ADDR_CHANGE mode bit 1613efa11bbSBrian Somersis set to zero, this function can also be used to 1623efa11bbSBrian Somersdynamically change the aliasing address on a 1633efa11bbSBrian Somerspacket to packet basis (it is a low overhead 1643efa11bbSBrian Somerscall). 1653efa11bbSBrian Somers 1663efa11bbSBrian SomersIt is mandatory that this function be called 1673efa11bbSBrian Somersprior to any packet handling. 1688ddc51bcSEivind Eklund.Ss 2.4 PacketAliasSetMode() 1693efa11bbSBrian Somers 170442a25bdSBruce Evans.Ft unsigned int 171442a25bdSBruce Evans.Fn PacketAliasSetMode "unsigned int mode" "unsigned int mask" 1723efa11bbSBrian Somers 1733efa11bbSBrian SomersThis function sets or clears mode bits 1743efa11bbSBrian Somersaccording to the value of 1753efa11bbSBrian Somers.Em mode . 1763efa11bbSBrian SomersOnly bits marked in 1773efa11bbSBrian Somers.Em mask 1783efa11bbSBrian Somersare affected. The following mode bits are 1793efa11bbSBrian Somersdefined in alias.h: 1803efa11bbSBrian Somers.Bl -hang -offset left 1813efa11bbSBrian Somers.It PKT_ALIAS_LOG. 1823efa11bbSBrian SomersEnables logging /var/log/alias.log. The log file 1833efa11bbSBrian Somersshows total numbers of links (icmp, tcp, udp) each 1843efa11bbSBrian Somerstime an aliasing link is created or deleted. Mainly 1853efa11bbSBrian Somersuseful for debugging when the log file is viewed 1863efa11bbSBrian Somerscontinuously with "tail -f". 1873efa11bbSBrian Somers.It PKT_ALIAS_DENY_INCOMING. 1883efa11bbSBrian SomersIf this mode bit is set, all incoming packets 1893efa11bbSBrian Somersassociated with new TCP connections or new 1903efa11bbSBrian SomersUDP transactions will be marked for being 1913efa11bbSBrian Somersignored (PacketAliasIn() return code 1923efa11bbSBrian SomersPKT_ALIAS_IGNORED) by the calling program. 1933efa11bbSBrian SomersResponse packets to connections or transactions 1943efa11bbSBrian Somersinitiated from the packet aliasing host or 1953efa11bbSBrian Somerslocal network will be unaffected. This mode 1963efa11bbSBrian Somersbit is useful for implementing a one-way firewall. 1973efa11bbSBrian Somers.It PKT_ALIAS_SAME_PORTS. 1983efa11bbSBrian SomersIf this mode bit is set, the packet aliasing 1993efa11bbSBrian Somersengine will attempt to leave the alias port 2003efa11bbSBrian Somersnumbers unchanged from the actual local port 2013efa11bbSBrian Somersnumber. This can be done as long as the 2023efa11bbSBrian Somersquintuple (proto, alias addr, alias port, 2033efa11bbSBrian Somersremote addr, remote port) is unique. If a 2043efa11bbSBrian Somersconflict exists, an new aliasing port number is 2053efa11bbSBrian Somerschosen even if this mode bit is set. 2063efa11bbSBrian Somers.It PKT_ALIAS_USE_SOCKETS. 2073efa11bbSBrian SomersThis bit should be set when the the packet 2083efa11bbSBrian Somersaliasing host originates network traffic as 2093efa11bbSBrian Somerswell as forwards it. When the packet aliasing 2103efa11bbSBrian Somershost is waiting for a connection from an 2113efa11bbSBrian Somersunknown host address or unknown port number 2123efa11bbSBrian Somers(e.g. an FTP data connection), this mode bit 2133efa11bbSBrian Somersspecifies that a socket be allocated as a place 2143efa11bbSBrian Somersholder to prevent port conflicts. Once a 2153efa11bbSBrian Somersconnection is extablished, usually within a 2163efa11bbSBrian Somersminute or so, the socket is closed. 2173efa11bbSBrian Somers.It PKT_ALIAS_UNREGISTERED_ONLY. 2183efa11bbSBrian SomersIf this mode bit is set, traffic on the 2193efa11bbSBrian Somerslocal network which does not originate from 2203efa11bbSBrian Somersunregistered address spaces will be ignored. 2213efa11bbSBrian SomersStandard Class A, B and C unregistered addresses 2223efa11bbSBrian Somersare: 2233efa11bbSBrian Somers.Bd -literal -offset indent 2243efa11bbSBrian Somers 10.0.0.0 -> 10.255.255.255 (Class A subnet) 2253efa11bbSBrian Somers 172.16.0.0 -> 172.31.255.255 (Class B subnets) 2263efa11bbSBrian Somers 192.168.0.0 -> 192.168.255.255 (Class C subnets) 2273efa11bbSBrian Somers 2283efa11bbSBrian Somers.Ed 2293efa11bbSBrian SomersThis option is useful in the case that 2303efa11bbSBrian Somerspacket aliasing host has both registered and 2313efa11bbSBrian Somersunregistered subnets on different interfaces. 2323efa11bbSBrian SomersThe registered subnet is fully accessible to 2333efa11bbSBrian Somersthe outside world, so traffic from it doesn't 2343efa11bbSBrian Somersneed to be passed through the packet aliasing 2353efa11bbSBrian Somersengine. 2363efa11bbSBrian Somers.It PKT_ALIAS_RESET_ON_ADDR_CHANGE. 2373efa11bbSBrian SomersWhen this mode bit is set and 2383efa11bbSBrian SomersPacketAliasSetAddress() is called to change 2393efa11bbSBrian Somersthe aliasing address, the internal link table 2403efa11bbSBrian Somersof the packet aliasing engine will be cleared. 2413efa11bbSBrian SomersThis operating mode is useful for ppp links 2423efa11bbSBrian Somerswhere the interface address can sometimes 2433efa11bbSBrian Somerschange or remain the same between dial-ups. 2443efa11bbSBrian SomersIf this mode bit is not set, it the link table 2453efa11bbSBrian Somerswill never be reset in the event of an 2463efa11bbSBrian Somersaddress change. 2478ddc51bcSEivind Eklund.It PKT_ALIAS_PUNCH_FW. 2488ddc51bcSEivind EklundThis option make libalias `punch holes' in an 2498ddc51bcSEivind Eklundipfw based firewall for FTP/IRC DCC connections. 2508ddc51bcSEivind EklundThe holes punched are bound by from/to IP address 2518ddc51bcSEivind Eklundand port; it will not be possible to use a hole 2528ddc51bcSEivind Eklundfor another connection. A hole is removed when 2538ddc51bcSEivind Eklundthe connection that use it die. To cater for 2548ddc51bcSEivind Eklundunexpected death of a program using libalias (e.g 2558ddc51bcSEivind Eklundkill -9), changing the state of the flag will 2568ddc51bcSEivind Eklundclear the entire ipfw range allocated for holes. 2578ddc51bcSEivind EklundThis will also happen on the initial call to 2588ddc51bcSEivind EklundPacketAliasSetFWBase(). This call must happen 2598ddc51bcSEivind Eklundprior to setting this flag. 2608ddc51bcSEivind Eklund 2613efa11bbSBrian Somers.El 2628ddc51bcSEivind Eklund 2638ddc51bcSEivind Eklund.Ss 2.5 PacketAliasSetFWBase() 2648ddc51bcSEivind Eklund 2658ddc51bcSEivind Eklund.Ft void 2668ddc51bcSEivind Eklund.Fn PacketAliasSetFWBase "unsigned int base" "unsigned int num" 2678ddc51bcSEivind Eklund 2688ddc51bcSEivind EklundSet IPFW range allocated for punching firewall holes (with the 2698ddc51bcSEivind EklundPKT_ALIAS_PUNCH_FW flag). The range will be cleared for all rules on 2708ddc51bcSEivind Eklundinitialization. 2718ddc51bcSEivind Eklund 2723efa11bbSBrian Somers.Sh 3. Packet Handling 2733efa11bbSBrian SomersThe packet handling functions are used to 2743efa11bbSBrian Somersmodify incoming (remote->local) and outgoing 2753efa11bbSBrian Somers(local->remote) packets. The calling program 2763efa11bbSBrian Somersis responsible for receiving and sending 2773efa11bbSBrian Somerspackets via network interfaces. 2783efa11bbSBrian Somers 2793efa11bbSBrian SomersAlong with PacketAliasInit() and PacketAliasSetAddress(), 2803efa11bbSBrian Somersthe two packet handling functions, PacketAliasIn() 2813efa11bbSBrian Somersand PacketAliasOut(), comprise minimal set of functions 2823efa11bbSBrian Somersneeded for a basic IP masquerading implementation. 2833efa11bbSBrian Somers.Ss 3.1 PacketAliasIn() 2843efa11bbSBrian Somers 2853efa11bbSBrian Somers.Ft int 2863efa11bbSBrian Somers.Fn PacketAliasIn "char *buffer" "int maxpacketsize" 2873efa11bbSBrian Somers 2883efa11bbSBrian SomersAn incoming packet coming from a remote machine to 2893efa11bbSBrian Somersthe local network is de-aliased by this function. 2903efa11bbSBrian SomersThe IP packet is pointed to by 2913efa11bbSBrian Somers.Em buffer , 2923efa11bbSBrian Somersand 2933efa11bbSBrian Somers.Em maxpacketsize 2943efa11bbSBrian Somersindicates the size of the data structure containing 2953efa11bbSBrian Somersthe packet and should be at least as large as the 2963efa11bbSBrian Somersactual packet size. 2973efa11bbSBrian Somers 2983efa11bbSBrian SomersReturn codes: 2993efa11bbSBrian Somers.Bl -hang -offset left 3003efa11bbSBrian Somers.It PKT_ALIAS_ERROR. 3013efa11bbSBrian SomersAn internal error within the packet aliasing 3023efa11bbSBrian Somersengine occured. 3033efa11bbSBrian Somers.It PKT_ALIAS_OK. 3043efa11bbSBrian SomersThe packet aliasing process was successful. 3053efa11bbSBrian Somers.It PKT_ALIAS_IGNORED. 3063efa11bbSBrian SomersThe packet was ignored and not de-aliased. 3073efa11bbSBrian SomersThis can happen if the protocal is unrecognized, 3083efa11bbSBrian Somerspossibly an ICMP message type is not handled or 3093efa11bbSBrian Somersif incoming packets for new connections are being 3103efa11bbSBrian Somersignored (see PKT_ALIAS_DENY_INCOMING in section 3113efa11bbSBrian Somers2.2). 3123efa11bbSBrian Somers.It PKT_ALIAS_UNRESOLVED_FRAGMENT. 3133efa11bbSBrian SomersThis is returned when a fragment cannot be 3143efa11bbSBrian Somersresolved because the header fragment has not 3153efa11bbSBrian Somersbeen sent yet. In this situation, fragments 3163efa11bbSBrian Somersmust be saved with PacketAliasSaveFragment() 3173efa11bbSBrian Somersuntil a header fragment is found. 3183efa11bbSBrian Somers.It PKT_ALIAS_FOUND_HEADER_FRAGMENT. 3193efa11bbSBrian SomersThe packet aliasing process was successful, 3203efa11bbSBrian Somersand a header fragment was found. This is a 3213efa11bbSBrian Somerssignal to retrieve any unresolved fragments 3223efa11bbSBrian Somerswith PacketAliasGetFragment() and de-alias 3233efa11bbSBrian Somersthem with PacketAliasFragmentIn(). 3243efa11bbSBrian Somers.El 3253efa11bbSBrian Somers.Ss 3.2 PacketAliasOut() 3263efa11bbSBrian Somers 3273efa11bbSBrian Somers.Ft int 3283efa11bbSBrian Somers.Fn PacketAliasIn "char *buffer" "int maxpacketsize" 3293efa11bbSBrian Somers 3303efa11bbSBrian SomersAn outgoing packet coming from the local network 3313efa11bbSBrian Somersto a remote machine is aliased by this function. 3323efa11bbSBrian SomersThe IP packet is pointed to by 3333efa11bbSBrian Somers.Em buffer r, 3343efa11bbSBrian Somersand 3353efa11bbSBrian Somers.Em maxpacketsize 3363efa11bbSBrian Somersindicates the maximum packet size permissable 3373efa11bbSBrian Somersshould the packet length be changed. IP encoding 3383efa11bbSBrian Somersprotocols place addresss and port information in 3393efa11bbSBrian Somersthe encapsulated data stream which have to be 3403efa11bbSBrian Somersmodified and can account for changes in packet 3413efa11bbSBrian Somerslength. Well known examples of such protocols 3428ddc51bcSEivind Eklundare FTP and IRC DCC. 3433efa11bbSBrian Somers 3443efa11bbSBrian SomersReturn codes: 3453efa11bbSBrian Somers.Bl -hang -offset left 3463efa11bbSBrian Somers.It PKT_ALIAS_ERROR. 3473efa11bbSBrian SomersAn internal error within the packet aliasing 3483efa11bbSBrian Somersengine occured. 3493efa11bbSBrian Somers.It PKT_ALIAS_OK. 3503efa11bbSBrian SomersThe packet aliasing process was successful. 3513efa11bbSBrian Somers.It PKT_ALIAS_IGNORED. 3523efa11bbSBrian SomersThe packet was ignored and not de-aliased. 3533efa11bbSBrian SomersThis can happen if the protocal is unrecognized, 3543efa11bbSBrian Somersor possibly an ICMP message type is not handled. 3553efa11bbSBrian Somers.El 3563efa11bbSBrian Somers 3573efa11bbSBrian Somers.Sh 4. Port and Address Redirection 3583efa11bbSBrian SomersThe functions described in this section allow machines 3593efa11bbSBrian Somerson the local network to be accessible in some degree 3603efa11bbSBrian Somersto new incoming connections from the external network. 3613efa11bbSBrian SomersIndividual ports can be re-mapped or static network 3623efa11bbSBrian Somersaddress translations can be designated. 3633efa11bbSBrian Somers.Ss 4.1 PacketAliasRedirectPort() 3643efa11bbSBrian Somers 3653efa11bbSBrian Somers.Ft struct alias_link * 3663efa11bbSBrian Somers.Fo PacketAliasRedirectPort 3673efa11bbSBrian Somers.Fa "struct in_addr local_addr" 3683efa11bbSBrian Somers.Fa "u_short local_port" 3693efa11bbSBrian Somers.Fa "struct in_addr remote_addr" 3703efa11bbSBrian Somers.Fa "u_short remote_port" 3713efa11bbSBrian Somers.Fa "struct in_addr alias_addr" 3723efa11bbSBrian Somers.Fa "u_short alias_port" 3733efa11bbSBrian Somers.Fa "u_char proto" 3743efa11bbSBrian Somers.Fc 3753efa11bbSBrian Somers 3763efa11bbSBrian SomersThis function specifies that traffic from a 3773efa11bbSBrian Somersgiven remote address/port to an alias address/port 3783efa11bbSBrian Somersbe redirected to a specified local address/port. 3793efa11bbSBrian SomersThe paramater 3803efa11bbSBrian Somers.Em proto 3813efa11bbSBrian Somerscan be either IPPROTO_TCP or IPPROTO_UDP, as 3823efa11bbSBrian Somersdefined in <netinet/in.h>. 3833efa11bbSBrian Somers 3843efa11bbSBrian SomersIf 3853efa11bbSBrian Somers.Em local_addr 3863efa11bbSBrian Somersor 3873efa11bbSBrian Somers.Em alias_addr 3883efa11bbSBrian Somersis zero, this indicates that the packet aliasing 3893efa11bbSBrian Somersaddress as established by PacketAliasSetAddress() 3903efa11bbSBrian Somersis to be used. Even if PacketAliasAddress() is 3913efa11bbSBrian Somerscalled to change the address after PacketAliasRedirectPort() 3923efa11bbSBrian Somersis called, a zero reference will track this change. 3933efa11bbSBrian Somers 3943efa11bbSBrian SomersIf 3953efa11bbSBrian Somers.Em remote_addr 3963efa11bbSBrian Somersis zero, this indicates to redirect packets from 3973efa11bbSBrian Somersany remote address. Likewise, if 3983efa11bbSBrian Somers.Em remote_port 3993efa11bbSBrian Somersis zero, this indicates to redirect packets originating 4003efa11bbSBrian Somersfrom any remote port number. Almost always, the remote 4013efa11bbSBrian Somersport specification will be zero, but non-zero remote 4023efa11bbSBrian Somersaddresses can be sometimes be useful for firewalling. 4033efa11bbSBrian SomersIf two calls to PacketAliasRedirectPort() overlap in 4043efa11bbSBrian Somerstheir address/port specifications, then the most recent 4053efa11bbSBrian Somerscall will have precedence. 4063efa11bbSBrian Somers 4073efa11bbSBrian SomersThis function returns a pointer which can subsequently 4083efa11bbSBrian Somersbe used by PacketAliasRedirectDelete(). If NULL is 4093efa11bbSBrian Somersreturned, then the function call did not complete 4103efa11bbSBrian Somerssuccessfully. 4113efa11bbSBrian Somers 4123efa11bbSBrian SomersAll port numbers are in network address byte order, 4133efa11bbSBrian Somersso it is necessary to use htons() to convert these 4143efa11bbSBrian Somersparameters from internally readable numbers to 4153efa11bbSBrian Somersnetwork byte order. Addresses are also in network 4163efa11bbSBrian Somersbyte order, which is implicit in the use of the 4173efa11bbSBrian Somers.Em struct in_addr 4183efa11bbSBrian Somersdata type. 4193efa11bbSBrian Somers.Ss 4.2 PacketAliasRedirectAddr() 4203efa11bbSBrian Somers 4213efa11bbSBrian Somers.Ft struct alias_link * 422442a25bdSBruce Evans.Fo PacketAliasRedirectAddr 4233efa11bbSBrian Somers.Fa "struct in_addr local_addr" 4243efa11bbSBrian Somers.Fa "struct in_addr alias_addr" 4253efa11bbSBrian Somers.Fc 4263efa11bbSBrian Somers 4273efa11bbSBrian SomersThis function desgnates that all incoming 4283efa11bbSBrian Somerstraffic to 4293efa11bbSBrian Somers.Em alias_addr 4303efa11bbSBrian Somersbe redirected to 4313efa11bbSBrian Somers.Em local_addr. 4323efa11bbSBrian SomersSimilarly, all outgoing traffic from 4333efa11bbSBrian Somers.Em local_addr 4343efa11bbSBrian Somersis aliased to 4353efa11bbSBrian Somers.Em alias_addr . 4363efa11bbSBrian Somers 4373efa11bbSBrian SomersIf 4383efa11bbSBrian Somers.Em local_addr 4393efa11bbSBrian Somersor 4403efa11bbSBrian Somers.Em alias_addr 4413efa11bbSBrian Somersis zero, this indicates that the packet aliasing 4423efa11bbSBrian Somersaddress as established by PacketAliasSetAddress() 4433efa11bbSBrian Somersis to be used. Even if PacketAliasAddress() is 4443efa11bbSBrian Somerscalled to change the address after PacketAliasRedirectAddr() 4453efa11bbSBrian Somersis called, a zero reference will track this change. 4463efa11bbSBrian Somers 4473efa11bbSBrian SomersIf subsequent calls to PacketAliasRedirectAddr() 4483efa11bbSBrian Somersuse the same aliasing address, all new incoming 4493efa11bbSBrian Somerstraffic to this aliasing address will be redirected 4503efa11bbSBrian Somersto the local address made in the last function call, 4513efa11bbSBrian Somersbut new traffic all of the local machines designated 4523efa11bbSBrian Somersin the several function calls will be aliased to 4533efa11bbSBrian Somersthe same address. Consider the following example: 4543efa11bbSBrian Somers.Bd -literal -offset left 4553efa11bbSBrian Somers PacketAliasRedirectAddr(inet_aton("192.168.0.2"), 4563efa11bbSBrian Somers inet_aton("141.221.254.101")); 4573efa11bbSBrian Somers PacketAliasRedirectAddr(inet_aton("192.168.0.3"), 4583efa11bbSBrian Somers inet_aton("141.221.254.101")); 4593efa11bbSBrian Somers PacketAliasRedirectAddr(inet_aton("192.168.0.4"), 4603efa11bbSBrian Somers inet_aton("141.221.254.101")); 4613efa11bbSBrian Somers.Ed 4623efa11bbSBrian Somers 4633efa11bbSBrian SomersAny outgoing connections such as telnet or ftp 4643efa11bbSBrian Somersfrom 192.168.0.2, 102.168.0.3, 192.168.0.4 will 4653efa11bbSBrian Somersappear to come from 141.221.254.101. Any incoming 4663efa11bbSBrian Somersconnections to 141.221.254.101 will be directed 4673efa11bbSBrian Somersto 192.168.0.4. 4683efa11bbSBrian Somers 4693efa11bbSBrian SomersAny calls to PacketAliasRedirectPort() will 4703efa11bbSBrian Somershave precedence over address mappings designated 4713efa11bbSBrian Somersby PacketAliasRedirectAddr(). 4723efa11bbSBrian Somers 4733efa11bbSBrian SomersThis function returns a pointer which can subsequently 4743efa11bbSBrian Somersbe used by PacketAliasRedirectDelete(). If NULL is 4753efa11bbSBrian Somersreturned, then the function call did not complete 4763efa11bbSBrian Somerssuccessfully. 4773efa11bbSBrian Somers.Ss 4.3 PacketAliasRedirectDelete() 4783efa11bbSBrian Somers 4793efa11bbSBrian Somers.Ft void 4803efa11bbSBrian Somers.Fn PacketAliasRedirectDelete "struct alias_link *ptr" 4813efa11bbSBrian Somers 4823efa11bbSBrian SomersThis function will delete a specific static redirect 4833efa11bbSBrian Somersrule entered by PacketAliasRedirectPort() or 4843efa11bbSBrian SomersPacketAliasRedirectAddr(). The parameter 4853efa11bbSBrian Somers.Em ptr 4863efa11bbSBrian Somersis the pointer returned by either of the redirection 4873efa11bbSBrian Somersfunctions. If an invalid pointer is passed to 4883efa11bbSBrian SomersPacketAliasRedirectDelete(), then a program crash 4893efa11bbSBrian Somersor unpredictable operation could result, so it is 4903efa11bbSBrian Somersnecessary to be careful using this function. 4913efa11bbSBrian Somers 4923efa11bbSBrian Somers.Sh 5. Fragment Handling 4933efa11bbSBrian SomersThe functions in this section are used to deal with 4943efa11bbSBrian Somersincoming fragments. 4953efa11bbSBrian Somers 4963efa11bbSBrian SomersOutgoing fragments are handled within PacketAliasOut() 4973efa11bbSBrian Somersby changing the address according to any 4983efa11bbSBrian Somersapplicable mapping set by PacketAliasRedirectAddress(), 4993efa11bbSBrian Somersor the default aliasing address set by 5003efa11bbSBrian SomersPacketAliasSetAddress(). 5013efa11bbSBrian Somers 5023efa11bbSBrian SomersIncoming fragments are handled in one of two ways. 5033efa11bbSBrian SomersIf the header of a fragmented IP packet has already 5043efa11bbSBrian Somersbeen seen, then all subsequent fragments will be 5053efa11bbSBrian Somersre-mapped in the same manner the header fragment 5063efa11bbSBrian Somerswas. Fragments which arrive before the header 5073efa11bbSBrian Somersare saved and then retrieved once the header fragment 5083efa11bbSBrian Somershas been resolved. 5093efa11bbSBrian Somers.Ss 5.1 PacketAliasSaveFragment() 5103efa11bbSBrian Somers 5113efa11bbSBrian Somers.Ft int 5123efa11bbSBrian Somers.Fn PacketAliasSaveFragment "char *ptr" 5133efa11bbSBrian Somers 5143efa11bbSBrian SomersWhen PacketAliasIn() returns 5153efa11bbSBrian SomersPKT_ALIAS_UNRESOLVED_FRAGMENT, this 5163efa11bbSBrian Somersfunction can be used to save the pointer to 5173efa11bbSBrian Somersthe unresolved fragment. 5183efa11bbSBrian Somers 5193efa11bbSBrian SomersIt is implicitly assumed that 5203efa11bbSBrian Somers.Em ptr 5213efa11bbSBrian Somerspoints to a block of memory allocated by 5223efa11bbSBrian Somersmalloc(). If the fragment is never 5233efa11bbSBrian Somersresolved, the packet aliasing engine will 5243efa11bbSBrian Somersautomatically free the memory after a 5253efa11bbSBrian Somerstimeout period. [Eventually this function 5263efa11bbSBrian Somersshould be modified so that a callback 5273efa11bbSBrian Somersfunction for freeing memory is passed as 5283efa11bbSBrian Somersan argument.] 5293efa11bbSBrian Somers 5303efa11bbSBrian SomersThis function returns PKT_ALIAS_OK if it 5313efa11bbSBrian Somerswas successful and PKT_ALIAS_ERROR if there 5323efa11bbSBrian Somerswas an error. 5333efa11bbSBrian Somers.Ss 5.2 PacketAliasGetNextFragment() 5343efa11bbSBrian Somers 5353efa11bbSBrian Somers.Ft char * 5363efa11bbSBrian Somers.Fn PacketAliasGetFragment "char *buffer" 5373efa11bbSBrian Somers 5383efa11bbSBrian SomersThis function can be used to retrieve fragment 5393efa11bbSBrian Somerspointers saved by PacketAliasSaveFragment(). 5403efa11bbSBrian SomersThe IP header fragment pointed to by 5413efa11bbSBrian SomersEm buffer 5423efa11bbSBrian Somersis the header fragment indicated when 5433efa11bbSBrian SomersPacketAliasIn() returns PKT_ALIAS_FOUND_HEADER_FRAGMENT. 5443efa11bbSBrian SomersOnce a a fragment pointer is retrieved, it 5453efa11bbSBrian Somersbecomes the calling program's responsibility 5463efa11bbSBrian Somersto free the dynamically allocated memory for 5473efa11bbSBrian Somersthe fragment. 5483efa11bbSBrian Somers 5493efa11bbSBrian SomersPacketAliasGetFragment() can be called 5503efa11bbSBrian Somerssequentially until there are no more fragments 5513efa11bbSBrian Somersavailable, at which time it returns NULL. 5523efa11bbSBrian Somers.Ss 5.3 PacketAliasFragmentIn() 5533efa11bbSBrian Somers 5543efa11bbSBrian Somers.Ft void 5553efa11bbSBrian Somers.Fn PacketAliasFragmentIn "char *header" "char *fragment" 5563efa11bbSBrian Somers 5573efa11bbSBrian SomersWhen a fragment is retrieved with 5583efa11bbSBrian SomersPacketAliasGetFragment(), it can then be 5593efa11bbSBrian Somersde-aliased with a call to PacketAliasFragmentIn(). 5603efa11bbSBrian Somers.Em header 5613efa11bbSBrian Somersis the pointer to a header fragment used as a 5623efa11bbSBrian Somerstemplate, and 5633efa11bbSBrian Somers.Em fragment 5643efa11bbSBrian Somersis the pointer to the packet to be de-aliased. 5653efa11bbSBrian Somers 5663efa11bbSBrian Somers.Sh 6. Miscellaneous Functions 5673efa11bbSBrian Somers 5683efa11bbSBrian Somers.Ss 6.1 PacketAliasSetTarget() 5693efa11bbSBrian Somers 5703efa11bbSBrian Somers.Ft void 5713efa11bbSBrian Somers.Fn PacketAliasSetTarget "struct in_addr addr" 5723efa11bbSBrian Somers 5733efa11bbSBrian SomersWhen an incoming packet not associated with 5743efa11bbSBrian Somersany pre-existing aliasing link arrives at the 5753efa11bbSBrian Somershost machine, it will be sent to the address 5763efa11bbSBrian Somersindicated by a call to PacketAliasSetTarget(). 5773efa11bbSBrian Somers 5783efa11bbSBrian SomersIf this function is not called, or is called 5793efa11bbSBrian Somerswith a zero address argument, then all new 5803efa11bbSBrian Somersincoming packets go to the address set by 5813efa11bbSBrian SomersPacketAliasSetAddress. 5823efa11bbSBrian Somers.Ss 6.2 PacketAliasCheckNewLink() 5833efa11bbSBrian Somers 5843efa11bbSBrian Somers.Ft int 5853efa11bbSBrian Somers.Fn PacketAliasCheckNewLink "void" 5863efa11bbSBrian Somers 5873efa11bbSBrian SomersThis function returns a non-zero value when 5883efa11bbSBrian Somersa new aliasing link is created. In circumstances 5893efa11bbSBrian Somerswhere incoming traffic is being sequentially 5903efa11bbSBrian Somerssent to different local servers, this function 5913efa11bbSBrian Somerscan be used to trigger when PacketAliasSetTarget() 5923efa11bbSBrian Somersis called to change the default target address. 5933efa11bbSBrian Somers.Ss 6.3 PacketAliasInternetChecksum() 5943efa11bbSBrian Somers 5953efa11bbSBrian Somers.Ft u_short 596442a25bdSBruce Evans.Fn PacketAliasInternetChecksum "u_short *buffer" "int nbytes" 5973efa11bbSBrian Somers 5983efa11bbSBrian SomersThis is a utility function that does not seem 5993efa11bbSBrian Somersto be available elswhere and is included as a 6003efa11bbSBrian Somersconvenience. It computes the internet checksum, 6013efa11bbSBrian Somerswhich is used in both IP and protocol-specific 6023efa11bbSBrian Somersheaders (TCP, UDP, ICMP). 6033efa11bbSBrian Somers 6043efa11bbSBrian Somers.Em buffer 6053efa11bbSBrian Somerspoints to the data block to be checksummed, and 6063efa11bbSBrian Somers.Em nbytes 6073efa11bbSBrian Somersis the number of bytes. The 16-bit checksum 6083efa11bbSBrian Somersfield should be zeroed before computing the checksum. 6093efa11bbSBrian Somers 6103efa11bbSBrian SomersChecksums can also be verified by operating on a block 6113efa11bbSBrian Somersof data including its checksum. If the checksum is 6123efa11bbSBrian Somersvalid, PacketAliasInternetChecksum() will return zero. 6133efa11bbSBrian Somers 6143efa11bbSBrian Somers.Sh 7. Authors 61559354a4eSBrian SomersCharles Mott (cmott@srv.net), versions 1.0 - 1.8, 2.0 - 2.4. 6163efa11bbSBrian Somers 6178ddc51bcSEivind EklundEivind Eklund (eivind@freebsd.org), versions 1.8b, 1.9 and 6188ddc51bcSEivind Eklund2.5. Added IRC DCC support as well as contributing a number of 6198ddc51bcSEivind Eklundarchitectural improvements; added the firewall bypass 6208ddc51bcSEivind Eklundfor FTP/IRC DCC. 6213efa11bbSBrian Somers 6223efa11bbSBrian Somers.Sh 8. Acknowledgments 6233efa11bbSBrian Somers 6243efa11bbSBrian SomersListed below, in approximate chronological 6253efa11bbSBrian Somersorder, are individuals who have provided 6263efa11bbSBrian Somersvaluable comments and/or debugging assistance. 6273efa11bbSBrian Somers 6283efa11bbSBrian Somers.Bl -inset -compact -offset left 6293efa11bbSBrian Somers.It Gary Roberts 6303efa11bbSBrian Somers.It Tom Torrance 6313efa11bbSBrian Somers.It Reto Burkhalter 6323efa11bbSBrian Somers.It Martin Renters 6333efa11bbSBrian Somers.It Brian Somers 6343efa11bbSBrian Somers.It Paul Traina 6353efa11bbSBrian Somers.It Ari Suutari 6363efa11bbSBrian Somers.It Dave Remien 6373efa11bbSBrian Somers.It J. Fortes 6383efa11bbSBrian Somers.It Andrzej Bialeki 6394fe071a9SBrian Somers.It Gordon Burditt 6403efa11bbSBrian Somers.El 6413efa11bbSBrian Somers 6423efa11bbSBrian Somers.Sh Appendix: Conceptual Background 6433efa11bbSBrian SomersThis appendix is intended for those who 6443efa11bbSBrian Somersare planning to modify the source code or want 6453efa11bbSBrian Somersto create somewhat esoteric applications using 6463efa11bbSBrian Somersthe packet aliasing functions. 6473efa11bbSBrian Somers 6483efa11bbSBrian SomersThe conceptual framework under which the 6493efa11bbSBrian Somerspacket aliasing engine operates is described here. 6503efa11bbSBrian SomersCentral to the discussion is the idea of an 6513efa11bbSBrian Somers"aliasing link" which describes the relationship 6523efa11bbSBrian Somersfor a given packet transaction between the local 6533efa11bbSBrian Somersmachine, aliased identity and remote machine. It 6543efa11bbSBrian Somersis discussed how such links come into existence 6553efa11bbSBrian Somersand are destroyed. 6563efa11bbSBrian Somers.Ss A.1 Aliasing Links 6573efa11bbSBrian SomersThere is a notion of an "aliasing link", 6583efa11bbSBrian Somerswhich is 7-tuple describing a specific 6593efa11bbSBrian Somerstranslation: 6603efa11bbSBrian Somers.Bd -literal -offset indent 6613efa11bbSBrian Somers(local addr, local port, alias addr, alias port, 6623efa11bbSBrian Somers remote addr, remote port, protocol) 6633efa11bbSBrian Somers.Ed 6643efa11bbSBrian Somers 6653efa11bbSBrian SomersOutgoing packets have the local address and 6663efa11bbSBrian Somersport number replaced with the alias address 6673efa11bbSBrian Somersand port number. Incoming packets undergo the 6683efa11bbSBrian Somersreverse process. The packet aliasing engine 6693efa11bbSBrian Somersattempts to match packets against an internal 6703efa11bbSBrian Somerstable of aliasing links to determine how to 6713efa11bbSBrian Somersmodify a given IP packet. Both the IP 6723efa11bbSBrian Somersheader and protocol dependent headers are 6733efa11bbSBrian Somersmodified as necessary. Aliasing links are 6743efa11bbSBrian Somerscreated and deleted as necessary according 6753efa11bbSBrian Somersto network traffic. 6763efa11bbSBrian Somers 6773efa11bbSBrian SomersProtocols can be TCP, UDP or even ICMP in 6783efa11bbSBrian Somerscertain circumstances. (Some types of ICMP 6793efa11bbSBrian Somerspackets can be aliased according to sequence 6803efa11bbSBrian Somersor id number which acts as an equivalent port 6813efa11bbSBrian Somersnumber for identifying how individual packets 6823efa11bbSBrian Somersshould be handled.) 6833efa11bbSBrian Somers 6843efa11bbSBrian SomersEach aliasing link must have a unique 6853efa11bbSBrian Somerscombination of the following five quanties: 6863efa11bbSBrian Somersalias address/port, remote address/port 6873efa11bbSBrian Somersand protocol. This ensures that several 6883efa11bbSBrian Somersmachines on a local network can share the 6893efa11bbSBrian Somerssame aliased IP address. In cases where 6903efa11bbSBrian Somersconflicts might arise, the aliasing port 6913efa11bbSBrian Somersis chosen so that uniqueness is maintained. 6923efa11bbSBrian Somers.Ss A.2 Static and Dynamic Links 6933efa11bbSBrian SomersAliasing links can either be static or dynamic. 6943efa11bbSBrian SomersStatic links persist indefinitely and represent 6953efa11bbSBrian Somersfixed rules for translating IP packets. Dynamic 6963efa11bbSBrian Somerslinks come into existence for a specific TCP 6973efa11bbSBrian Somersconnection or UDP transaction or ICMP echo 6983efa11bbSBrian Somerssequence. For the case of TCP, the connection 6993efa11bbSBrian Somerscan be monitored to see when the associated 7003efa11bbSBrian Somersaliasing link should be deleted. Aliasing links 7013efa11bbSBrian Somersfor UDP transactions (and ICMP echo and timestamp 7023efa11bbSBrian Somersequests) work on a simple timeout rule. When 7033efa11bbSBrian Somersno activity is observed on a dynamic link for 7043efa11bbSBrian Somersa certain amount of time it is automatically 7053efa11bbSBrian Somersdeleted. Timeout rules also apply to TCP 7063efa11bbSBrian Somersconnections which do not open or close 7073efa11bbSBrian Somersproperly. 7083efa11bbSBrian Somers.Ss A.3 Partially Specified Aliasing Links 7093efa11bbSBrian SomersAliasing links can be partially specified, 7103efa11bbSBrian Somersmeaning that the remote address and/or remote 7113efa11bbSBrian Somersports are unkown. In this case, when a packet 7123efa11bbSBrian Somersmatching the incomplete specification is found, 7133efa11bbSBrian Somersa fully specified dynamic link is created. If 7143efa11bbSBrian Somersthe original partially specified link is dynamic, 7153efa11bbSBrian Somersit will be deleted after the fully specified link 7163efa11bbSBrian Somersis created, otherwise it will persist. 7173efa11bbSBrian Somers 7183efa11bbSBrian SomersFor instance, a partially specified link might 7193efa11bbSBrian Somersbe 7203efa11bbSBrian Somers.Bd -literal -offset indent 7213efa11bbSBrian Somers(192.168.0.4, 23, 204.228.203.215, 8066, 0, 0, tcp) 7223efa11bbSBrian Somers.Ed 7233efa11bbSBrian Somers 7243efa11bbSBrian SomersThe zeros denote unspecified components for 7253efa11bbSBrian Somersthe remote address and port. If this link were 7263efa11bbSBrian Somersstatic it would have the effect of redirecting 7273efa11bbSBrian Somersall incoming traffic from port 8066 of 7283efa11bbSBrian Somers204.228.203.215 to port 23 (telnet) of machine 7293efa11bbSBrian Somers192.168.0.4 on the local network. Each 7303efa11bbSBrian Somersindividual telnet connection would initiate 7313efa11bbSBrian Somersthe creation of a distinct dynamic link. 7323efa11bbSBrian Somers.Ss A.4 Dynamic Link Creation 7333efa11bbSBrian SomersIn addition to aliasing links, there are 7343efa11bbSBrian Somersalso address mappings that can be stored 7353efa11bbSBrian Somerswithin the internal data table of the packet 7363efa11bbSBrian Somersaliasing mechanism. 7373efa11bbSBrian Somers.Bd -literal -offset indent 7383efa11bbSBrian Somers(local addr, alias addr) 7393efa11bbSBrian Somers.Ed 7403efa11bbSBrian Somers 7413efa11bbSBrian SomersAddress mappings are searched when creating 7423efa11bbSBrian Somersnew dynamic links. 7433efa11bbSBrian Somers 7443efa11bbSBrian SomersAll outgoing packets from the local network 7453efa11bbSBrian Somersautomatically create a dynamic link if 7463efa11bbSBrian Somersthey do not match an already existing fully 7473efa11bbSBrian Somersspecified link. If an address mapping exists 7483efa11bbSBrian Somersfor the the outgoing packet, this determines 7493efa11bbSBrian Somersthe alias address to be used. If no mapping 7503efa11bbSBrian Somersexists, then a default address, usually the 7513efa11bbSBrian Somersaddress of the packet aliasing host, is used. 7523efa11bbSBrian SomersIf necessary, this default address can be 7533efa11bbSBrian Somerschanged as often as each indvidual packet 7543efa11bbSBrian Somersarrives. 7553efa11bbSBrian Somers 7563efa11bbSBrian SomersThe aliasing port number is determined 7573efa11bbSBrian Somerssuch that the new dynamic link does not 7583efa11bbSBrian Somersconflict with any existing links. In the 7593efa11bbSBrian Somersdefault operating mode, the packet aliasing 7603efa11bbSBrian Somersengine attempts to set the aliasing port 7613efa11bbSBrian Somersequal to the local port number. If this 7623efa11bbSBrian Somersresults in a conflict, then port numbers 7633efa11bbSBrian Somersare randomly chosen until a unique aliasing 7643efa11bbSBrian Somerslink can be established. In an alternate 7653efa11bbSBrian Somersoperating mode, the first choice of an 7663efa11bbSBrian Somersaliasing port is also random and unrelated 7673efa11bbSBrian Somersto the local port number. 7683efa11bbSBrian Somers 769