1f987e1bdSBrian Somers.\"- 2e83aaae3SBrian Somers.\" Copyright (c) 2001 Charles Mott <cm@linktel.net> 3f987e1bdSBrian Somers.\" All rights reserved. 4f987e1bdSBrian Somers.\" 5f987e1bdSBrian Somers.\" Redistribution and use in source and binary forms, with or without 6f987e1bdSBrian Somers.\" modification, are permitted provided that the following conditions 7f987e1bdSBrian Somers.\" are met: 8f987e1bdSBrian Somers.\" 1. Redistributions of source code must retain the above copyright 9f987e1bdSBrian Somers.\" notice, this list of conditions and the following disclaimer. 10f987e1bdSBrian Somers.\" 2. Redistributions in binary form must reproduce the above copyright 11f987e1bdSBrian Somers.\" notice, this list of conditions and the following disclaimer in the 12f987e1bdSBrian Somers.\" documentation and/or other materials provided with the distribution. 13f987e1bdSBrian Somers.\" 14f987e1bdSBrian Somers.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15f987e1bdSBrian Somers.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16f987e1bdSBrian Somers.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17f987e1bdSBrian Somers.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18f987e1bdSBrian Somers.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19f987e1bdSBrian Somers.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20f987e1bdSBrian Somers.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21f987e1bdSBrian Somers.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22f987e1bdSBrian Somers.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23f987e1bdSBrian Somers.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24f987e1bdSBrian Somers.\" SUCH DAMAGE. 25f987e1bdSBrian Somers.\" 267f3dea24SPeter Wemm.\" $FreeBSD$ 2774804d58SMike Pritchard.\" 28*535e0a09SGleb Smirnoff.Dd December 25, 2013 2974804d58SMike Pritchard.Dt LIBALIAS 3 30a307d598SRuslan Ermilov.Os 313efa11bbSBrian Somers.Sh NAME 3274804d58SMike Pritchard.Nm libalias 33a2900666SRuslan Ermilov.Nd packet aliasing library for masquerading and network address translation 343efa11bbSBrian Somers.Sh SYNOPSIS 3532eef9aeSRuslan Ermilov.In sys/types.h 3632eef9aeSRuslan Ermilov.In netinet/in.h 3732eef9aeSRuslan Ermilov.In alias.h 38a2900666SRuslan Ermilov.Pp 39a2900666SRuslan ErmilovFunction prototypes are given in the main body of the text. 4074804d58SMike Pritchard.Sh DESCRIPTION 4174804d58SMike PritchardThe 4274804d58SMike Pritchard.Nm 43a2900666SRuslan Ermilovlibrary is a collection of functions for aliasing and de-aliasing of IP 44a2900666SRuslan Ermilovpackets, intended for masquerading and network address translation (NAT). 45a2900666SRuslan Ermilov.Sh INTRODUCTION 46a2900666SRuslan ErmilovThis library is a moderately portable set of functions designed to assist 47a2900666SRuslan Ermilovin the process of IP masquerading and network address translation. 48a2900666SRuslan ErmilovOutgoing packets from a local network with unregistered IP addresses can 49a2900666SRuslan Ermilovbe aliased to appear as if they came from an accessible IP address. 50a2900666SRuslan ErmilovIncoming packets are then de-aliased so that they are sent to the correct 51a2900666SRuslan Ermilovmachine on the local network. 52a2900666SRuslan Ermilov.Pp 53a2900666SRuslan ErmilovA certain amount of flexibility is built into the packet aliasing engine. 54a2900666SRuslan ErmilovIn the simplest mode of operation, a many-to-one address mapping takes 55ff19f85dSGlen Barberplace between the local network and the packet aliasing host. 56a2900666SRuslan ErmilovThis is known as IP masquerading. 57a2900666SRuslan ErmilovIn addition, one-to-one mappings between local and public addresses can 58a2900666SRuslan Ermilovalso be implemented, which is known as static NAT. 59a2900666SRuslan ErmilovIn between these extremes, different groups of private addresses can be 60a2900666SRuslan Ermilovlinked to different public addresses, comprising several distinct 61a2900666SRuslan Ermilovmany-to-one mappings. 62a2900666SRuslan ErmilovAlso, a given public address and port can be statically redirected to a 63a2900666SRuslan Ermilovprivate address/port. 64a2900666SRuslan Ermilov.Sh INITIALIZATION AND CONTROL 65f1a529f3SRuslan ErmilovOne special function, 665e289f9eSPoul-Henning Kamp.Fn LibAliasInit , 67ff19f85dSGlen Barbermust always be called before any packet handling may be performed, and 68ff19f85dSGlen Barberthe returned instance pointer must be passed to all the other functions. 69f1a529f3SRuslan ErmilovNormally, the 705e289f9eSPoul-Henning Kamp.Fn LibAliasSetAddress 71f1a529f3SRuslan Ermilovfunction is called afterwards, to set the default aliasing address. 72a2900666SRuslan ErmilovIn addition, the operating mode of the packet aliasing engine can be 73a2900666SRuslan Ermilovcustomized by calling 745e289f9eSPoul-Henning Kamp.Fn LibAliasSetMode . 75a2900666SRuslan Ermilov.Pp 765e289f9eSPoul-Henning Kamp.Ft "struct libalias *" 775e289f9eSPoul-Henning Kamp.Fn LibAliasInit "struct libalias *" 78a2900666SRuslan Ermilov.Bd -ragged -offset indent 795e289f9eSPoul-Henning KampThis function is used to initialize 80a2900666SRuslan Ermilovinternal data structures. 81c9a24641SRuslan ErmilovWhen called the first time, a 82c9a24641SRuslan Ermilov.Dv NULL 83c9a24641SRuslan Ermilovpointer should be passed as an argument. 84a2900666SRuslan ErmilovThe following mode bits are always set after calling 855e289f9eSPoul-Henning Kamp.Fn LibAliasInit . 86a2900666SRuslan ErmilovSee the description of 875e289f9eSPoul-Henning Kamp.Fn LibAliasSetMode 88a2900666SRuslan Ermilovbelow for the meaning of these mode bits. 89a2900666SRuslan Ermilov.Pp 90a2900666SRuslan Ermilov.Bl -item -offset indent -compact 91a2900666SRuslan Ermilov.It 92a2900666SRuslan Ermilov.Dv PKT_ALIAS_SAME_PORTS 93a2900666SRuslan Ermilov.It 94a2900666SRuslan Ermilov.Dv PKT_ALIAS_USE_SOCKETS 95a2900666SRuslan Ermilov.It 96a2900666SRuslan Ermilov.Dv PKT_ALIAS_RESET_ON_ADDR_CHANGE 97a2900666SRuslan Ermilov.El 98a2900666SRuslan Ermilov.Pp 99a2900666SRuslan ErmilovThis function will always return the packet aliasing engine to the same 100a2900666SRuslan Ermilovinitial state. 1019703a107SPhilippe CharnierThe 1025e289f9eSPoul-Henning Kamp.Fn LibAliasSetAddress 1039703a107SPhilippe Charnierfunction is normally called afterwards, and any desired changes from the 1049703a107SPhilippe Charnierdefault mode bits listed above require a call to 1055e289f9eSPoul-Henning Kamp.Fn LibAliasSetMode . 106a2900666SRuslan Ermilov.Pp 107a2900666SRuslan ErmilovIt is mandatory that this function be called at the beginning of a program 108a2900666SRuslan Ermilovprior to any packet handling. 109a2900666SRuslan Ermilov.Ed 110a2900666SRuslan Ermilov.Pp 1118ddc51bcSEivind Eklund.Ft void 1125e289f9eSPoul-Henning Kamp.Fn LibAliasUninit "struct libalias *" 113a2900666SRuslan Ermilov.Bd -ragged -offset indent 1145e289f9eSPoul-Henning KampThis function has no return value and is used to clear any 115a2900666SRuslan Ermilovresources attached to internal data structures. 116a2900666SRuslan Ermilov.Pp 117ff19f85dSGlen BarberThis function should be called when a program stops using the aliasing 118ff19f85dSGlen Barberengine; amongst other things, it clears out any firewall holes. 119a2900666SRuslan ErmilovTo provide backwards compatibility and extra security, it is added to 120a2900666SRuslan Ermilovthe 121a2900666SRuslan Ermilov.Xr atexit 3 122a2900666SRuslan Ermilovchain by 1235e289f9eSPoul-Henning Kamp.Fn LibAliasInit . 124a2900666SRuslan Ermilov.Ed 125a2900666SRuslan Ermilov.Pp 1263efa11bbSBrian Somers.Ft void 1275e289f9eSPoul-Henning Kamp.Fn LibAliasSetAddress "struct libalias *" "struct in_addr addr" 128a2900666SRuslan Ermilov.Bd -ragged -offset indent 129a2900666SRuslan ErmilovThis function sets the source address to which outgoing packets from the 130a2900666SRuslan Ermilovlocal area network are aliased. 131a2900666SRuslan ErmilovAll outgoing packets are re-mapped to this address unless overridden by a 132a2900666SRuslan Ermilovstatic address mapping established by 1335e289f9eSPoul-Henning Kamp.Fn LibAliasRedirectAddr . 134ff19f85dSGlen BarberIf this function has not been called, and no static rules match, an outgoing 135f1a529f3SRuslan Ermilovpacket retains its source address. 136a2900666SRuslan Ermilov.Pp 137a2900666SRuslan ErmilovIf the 138a2900666SRuslan Ermilov.Dv PKT_ALIAS_RESET_ON_ADDR_CHANGE 139a2900666SRuslan Ermilovmode bit is set (the default mode of operation), then the internal aliasing 140a2900666SRuslan Ermilovlink tables will be reset any time the aliasing address changes. 141a2900666SRuslan ErmilovThis is useful for interfaces such as 142a2900666SRuslan Ermilov.Xr ppp 8 , 143a2900666SRuslan Ermilovwhere the IP 144a2900666SRuslan Ermilovaddress may or may not change on successive dial-up attempts. 145a2900666SRuslan Ermilov.Pp 146a2900666SRuslan ErmilovIf the 147a2900666SRuslan Ermilov.Dv PKT_ALIAS_RESET_ON_ADDR_CHANGE 148a2900666SRuslan Ermilovmode bit is set to zero, this function can also be used to dynamically change 149ff19f85dSGlen Barberthe aliasing address on a packet-to-packet basis (it is a low overhead call). 150a2900666SRuslan Ermilov.Pp 151a2900666SRuslan ErmilovIt is mandatory that this function be called prior to any packet handling. 152a2900666SRuslan Ermilov.Ed 153a2900666SRuslan Ermilov.Pp 154442a25bdSBruce Evans.Ft unsigned int 1555e289f9eSPoul-Henning Kamp.Fn LibAliasSetMode "struct libalias *" "unsigned int flags" "unsigned int mask" 156a2900666SRuslan Ermilov.Bd -ragged -offset indent 1573efa11bbSBrian SomersThis function sets or clears mode bits 1583efa11bbSBrian Somersaccording to the value of 159a2900666SRuslan Ermilov.Fa flags . 1603efa11bbSBrian SomersOnly bits marked in 161a2900666SRuslan Ermilov.Fa mask 162a2900666SRuslan Ermilovare affected. 163a2900666SRuslan ErmilovThe following mode bits are defined in 164fe08efe6SRuslan Ermilov.In alias.h : 165a2900666SRuslan Ermilov.Bl -tag -width indent 166a2900666SRuslan Ermilov.It Dv PKT_ALIAS_LOG 167a2900666SRuslan ErmilovEnables logging into 168a2900666SRuslan Ermilov.Pa /var/log/alias.log . 169ff19f85dSGlen BarberEach time an aliasing link is created or deleted, the log file is appended to 170a2900666SRuslan Ermilovwith the current number of ICMP, TCP and UDP links. 171a2900666SRuslan ErmilovMainly useful for debugging when the log file is viewed continuously with 172a2900666SRuslan Ermilov.Xr tail 1 . 173a2900666SRuslan Ermilov.It Dv PKT_ALIAS_DENY_INCOMING 174a2900666SRuslan ErmilovIf this mode bit is set, all incoming packets associated with new TCP 175a2900666SRuslan Ermilovconnections or new UDP transactions will be marked for being ignored 1765e289f9eSPoul-Henning Kamp.Fn ( LibAliasIn 177a2900666SRuslan Ermilovreturns 178a2900666SRuslan Ermilov.Dv PKT_ALIAS_IGNORED 179c4d9468eSRuslan Ermilovcode) 180a2900666SRuslan Ermilovby the calling program. 181a2900666SRuslan ErmilovResponse packets to connections or transactions initiated from the packet 182a2900666SRuslan Ermilovaliasing host or local network will be unaffected. 183a2900666SRuslan ErmilovThis mode bit is useful for implementing a one-way firewall. 184a2900666SRuslan Ermilov.It Dv PKT_ALIAS_SAME_PORTS 185ff19f85dSGlen BarberIf this mode bit is set, the packet-aliasing engine will attempt to leave 186a2900666SRuslan Ermilovthe alias port numbers unchanged from the actual local port numbers. 187a2900666SRuslan ErmilovThis can be done as long as the quintuple (proto, alias addr, alias port, 188a2900666SRuslan Ermilovremote addr, remote port) is unique. 189a2900666SRuslan ErmilovIf a conflict exists, a new aliasing port number is chosen even if this 190a2900666SRuslan Ermilovmode bit is set. 191a2900666SRuslan Ermilov.It Dv PKT_ALIAS_USE_SOCKETS 192a2900666SRuslan ErmilovThis bit should be set when the packet aliasing host originates network 193a2900666SRuslan Ermilovtraffic as well as forwards it. 194a2900666SRuslan ErmilovWhen the packet aliasing host is waiting for a connection from an unknown 1951a0a9345SRuslan Ermilovhost address or unknown port number (e.g.\& an FTP data connection), this 196a2900666SRuslan Ermilovmode bit specifies that a socket be allocated as a place holder to prevent 197a2900666SRuslan Ermilovport conflicts. 198a2900666SRuslan ErmilovOnce a connection is established, usually within a minute or so, the socket 199a2900666SRuslan Ermilovis closed. 200a2900666SRuslan Ermilov.It Dv PKT_ALIAS_UNREGISTERED_ONLY 201a2900666SRuslan ErmilovIf this mode bit is set, traffic on the local network which does not 202a2900666SRuslan Ermilovoriginate from unregistered address spaces will be ignored. 203a2900666SRuslan ErmilovStandard Class A, B and C unregistered addresses are: 2046ae742a5SJoel Dahl.Pp 2053efa11bbSBrian Somers10.0.0.0 -> 10.255.255.255 (Class A subnet) 2063efa11bbSBrian Somers172.16.0.0 -> 172.31.255.255 (Class B subnets) 2073efa11bbSBrian Somers192.168.0.0 -> 192.168.255.255 (Class C subnets) 208a2900666SRuslan Ermilov.Pp 209ff19f85dSGlen BarberThis option is useful in the case that the packet aliasing host has both 210a2900666SRuslan Ermilovregistered and unregistered subnets on different interfaces. 211a2900666SRuslan ErmilovThe registered subnet is fully accessible to the outside world, so traffic 212a2900666SRuslan Ermilovfrom it does not need to be passed through the packet aliasing engine. 213a2900666SRuslan Ermilov.It Dv PKT_ALIAS_RESET_ON_ADDR_CHANGE 2143efa11bbSBrian SomersWhen this mode bit is set and 2155e289f9eSPoul-Henning Kamp.Fn LibAliasSetAddress 216a2900666SRuslan Ermilovis called to change the aliasing address, the internal link table of the 217a2900666SRuslan Ermilovpacket aliasing engine will be cleared. 218a2900666SRuslan ErmilovThis operating mode is useful for 219a2900666SRuslan Ermilov.Xr ppp 8 220a2900666SRuslan Ermilovlinks where the interface address can sometimes change or remain the same 221a2900666SRuslan Ermilovbetween dial-up attempts. 222a2900666SRuslan ErmilovIf this mode bit is not set, the link table will never be reset in the event 223a2900666SRuslan Ermilovof an address change. 224a2900666SRuslan Ermilov.It Dv PKT_ALIAS_PUNCH_FW 225a2900666SRuslan ErmilovThis option makes 226a2900666SRuslan Ermilov.Nm 227ff19f85dSGlen Barber.Dq punch holes 228ff19f85dSGlen Barberin an 229ff19f85dSGlen Barber.Xr ipfirewall 4 - 230a2900666SRuslan Ermilovbased firewall for FTP/IRC DCC connections. 231a2900666SRuslan ErmilovThe holes punched are bound by from/to IP address and port; it will not be 232a2900666SRuslan Ermilovpossible to use a hole for another connection. 233a2900666SRuslan ErmilovA hole is removed when the connection that uses it dies. 234a2900666SRuslan ErmilovTo cater to unexpected death of a program using 235a2900666SRuslan Ermilov.Nm 2361a0a9345SRuslan Ermilov(e.g.\& kill -9), 237a2900666SRuslan Ermilovchanging the state of the flag will clear the entire firewall range 238a2900666SRuslan Ermilovallocated for holes. 239ff19f85dSGlen BarberThis clearing will also happen on the initial call to 240ff19f85dSGlen Barber.Fn LibAliasSetFWBase , 241ff19f85dSGlen Barberwhich must happen prior to setting this flag. 242a2900666SRuslan Ermilov.It Dv PKT_ALIAS_REVERSE 243a2900666SRuslan ErmilovThis option makes 244a2900666SRuslan Ermilov.Nm 245a2900666SRuslan Ermilovreverse the way it handles incoming and outgoing packets, allowing it 246a2900666SRuslan Ermilovto be fed with data that passes through the internal interface rather 247a2900666SRuslan Ermilovthan the external one. 248a2900666SRuslan Ermilov.It Dv PKT_ALIAS_PROXY_ONLY 249a2900666SRuslan ErmilovThis option tells 250a2900666SRuslan Ermilov.Nm 251a2900666SRuslan Ermilovto obey transparent proxy rules only. 252a2900666SRuslan ErmilovNormal packet aliasing is not performed. 25321b9df57SBrian SomersSee 2545e289f9eSPoul-Henning Kamp.Fn LibAliasProxyRule 25521b9df57SBrian Somersbelow for details. 25662b6e03aSAndrey V. Elsukov.It Dv PKT_ALIAS_SKIP_GLOBAL 25762b6e03aSAndrey V. ElsukovThis option is used by 25862b6e03aSAndrey V. Elsukov.Pa ipfw_nat 259ff19f85dSGlen Barberonly. 260ff19f85dSGlen BarberSpecifying it as a flag to 26162b6e03aSAndrey V. Elsukov.Fn LibAliasSetMode 262ff19f85dSGlen Barberhas no effect. 263ff19f85dSGlen BarberSee section 26462b6e03aSAndrey V. Elsukov.Sx NETWORK ADDRESS TRANSLATION 26562b6e03aSAndrey V. Elsukovin 26662b6e03aSAndrey V. Elsukov.Xr ipfw 8 26762b6e03aSAndrey V. Elsukovfor more details. 2683efa11bbSBrian Somers.El 269a2900666SRuslan Ermilov.Ed 270a2900666SRuslan Ermilov.Pp 2718ddc51bcSEivind Eklund.Ft void 2725e289f9eSPoul-Henning Kamp.Fn LibAliasSetFWBase "struct libalias *" "unsigned int base" "unsigned int num" 273a2900666SRuslan Ermilov.Bd -ragged -offset indent 274ff19f85dSGlen BarberSet the firewall range allocated for punching firewall holes (with the 275a2900666SRuslan Ermilov.Dv PKT_ALIAS_PUNCH_FW 276a2900666SRuslan Ermilovflag). 277ff19f85dSGlen BarberThe range is cleared for all rules on initialization. 278a2900666SRuslan Ermilov.Ed 279b07fbc17SJoe Marcus Clarke.Pp 280b07fbc17SJoe Marcus Clarke.Ft void 2815e289f9eSPoul-Henning Kamp.Fn LibAliasSkinnyPort "struct libalias *" "unsigned int port" 282b07fbc17SJoe Marcus Clarke.Bd -ragged -offset indent 283b07fbc17SJoe Marcus ClarkeSet the TCP port used by the Skinny Station protocol. 284b07fbc17SJoe Marcus ClarkeSkinny is used by Cisco IP phones to communicate with 285b07fbc17SJoe Marcus ClarkeCisco Call Managers to set up voice over IP calls. 286b07fbc17SJoe Marcus ClarkeIf this is not set, Skinny aliasing will not be done. 287b07fbc17SJoe Marcus ClarkeThe typical port used by Skinny is 2000. 288b07fbc17SJoe Marcus Clarke.Ed 289a2900666SRuslan Ermilov.Sh PACKET HANDLING 290a2900666SRuslan ErmilovThe packet handling functions are used to modify incoming (remote to local) 291a2900666SRuslan Ermilovand outgoing (local to remote) packets. 292a2900666SRuslan ErmilovThe calling program is responsible for receiving and sending packets via 293a2900666SRuslan Ermilovnetwork interfaces. 294a2900666SRuslan Ermilov.Pp 295a2900666SRuslan ErmilovAlong with 2965e289f9eSPoul-Henning Kamp.Fn LibAliasInit 297a2900666SRuslan Ermilovand 2985e289f9eSPoul-Henning Kamp.Fn LibAliasSetAddress , 299a2900666SRuslan Ermilovthe two packet handling functions, 3005e289f9eSPoul-Henning Kamp.Fn LibAliasIn 301a2900666SRuslan Ermilovand 3025e289f9eSPoul-Henning Kamp.Fn LibAliasOut , 303ff19f85dSGlen Barbercomprise the minimal set of functions needed for a basic IP masquerading 304a2900666SRuslan Ermilovimplementation. 305a2900666SRuslan Ermilov.Pp 3063efa11bbSBrian Somers.Ft int 3075e289f9eSPoul-Henning Kamp.Fn LibAliasIn "struct libalias *" "char *buffer" "int maxpacketsize" 308a2900666SRuslan Ermilov.Bd -ragged -offset indent 309a2900666SRuslan ErmilovAn incoming packet coming from a remote machine to the local network is 310a2900666SRuslan Ermilovde-aliased by this function. 3113efa11bbSBrian SomersThe IP packet is pointed to by 312a2900666SRuslan Ermilov.Fa buffer , 3133efa11bbSBrian Somersand 314a2900666SRuslan Ermilov.Fa maxpacketsize 315a2900666SRuslan Ermilovindicates the size of the data structure containing the packet and should 316a2900666SRuslan Ermilovbe at least as large as the actual packet size. 317a2900666SRuslan Ermilov.Pp 3183efa11bbSBrian SomersReturn codes: 319a2900666SRuslan Ermilov.Bl -tag -width indent 320a2900666SRuslan Ermilov.It Dv PKT_ALIAS_OK 3213efa11bbSBrian SomersThe packet aliasing process was successful. 322a2900666SRuslan Ermilov.It Dv PKT_ALIAS_IGNORED 3233efa11bbSBrian SomersThe packet was ignored and not de-aliased. 324ff19f85dSGlen BarberThis can happen if the protocol is unrecognized, as for an ICMP message 325ff19f85dSGlen Barbertype that is not handled, or if incoming packets for new connections are being 326ff19f85dSGlen Barberignored (if the 327a2900666SRuslan Ermilov.Dv PKT_ALIAS_DENY_INCOMING 328ff19f85dSGlen Barbermode bit was set using 3295e289f9eSPoul-Henning Kamp.Fn LibAliasSetMode ) . 330a2900666SRuslan Ermilov.It Dv PKT_ALIAS_UNRESOLVED_FRAGMENT 331a2900666SRuslan ErmilovThis is returned when a fragment cannot be resolved because the header 332a2900666SRuslan Ermilovfragment has not been sent yet. 333a2900666SRuslan ErmilovIn this situation, fragments must be saved with 3345e289f9eSPoul-Henning Kamp.Fn LibAliasSaveFragment 3353efa11bbSBrian Somersuntil a header fragment is found. 336a2900666SRuslan Ermilov.It Dv PKT_ALIAS_FOUND_HEADER_FRAGMENT 337a2900666SRuslan ErmilovThe packet aliasing process was successful, and a header fragment was found. 338a2900666SRuslan ErmilovThis is a signal to retrieve any unresolved fragments with 3395e289f9eSPoul-Henning Kamp.Fn LibAliasGetFragment 340a2900666SRuslan Ermilovand de-alias them with 3415e289f9eSPoul-Henning Kamp.Fn LibAliasFragmentIn . 342a2900666SRuslan Ermilov.It Dv PKT_ALIAS_ERROR 343a2900666SRuslan ErmilovAn internal error within the packet aliasing engine occurred. 3443efa11bbSBrian Somers.El 345a2900666SRuslan Ermilov.Ed 346a2900666SRuslan Ermilov.Pp 3473efa11bbSBrian Somers.Ft int 3485e289f9eSPoul-Henning Kamp.Fn LibAliasOut "struct libalias *" "char *buffer" "int maxpacketsize" 349a2900666SRuslan Ermilov.Bd -ragged -offset indent 350a2900666SRuslan ErmilovAn outgoing packet coming from the local network to a remote machine is 351a2900666SRuslan Ermilovaliased by this function. 3523efa11bbSBrian SomersThe IP packet is pointed to by 353a2900666SRuslan Ermilov.Fa buffer , 3543efa11bbSBrian Somersand 355a2900666SRuslan Ermilov.Fa maxpacketsize 356a2900666SRuslan Ermilovindicates the maximum packet size permissible should the packet length be 357a2900666SRuslan Ermilovchanged. 358a2900666SRuslan ErmilovIP encoding protocols place address and port information in the encapsulated 359a2900666SRuslan Ermilovdata stream which has to be modified and can account for changes in packet 360a2900666SRuslan Ermilovlength. 361a2900666SRuslan ErmilovWell known examples of such protocols are FTP and IRC DCC. 362a2900666SRuslan Ermilov.Pp 3633efa11bbSBrian SomersReturn codes: 364a2900666SRuslan Ermilov.Bl -tag -width indent 365a2900666SRuslan Ermilov.It Dv PKT_ALIAS_OK 3663efa11bbSBrian SomersThe packet aliasing process was successful. 367a2900666SRuslan Ermilov.It Dv PKT_ALIAS_IGNORED 368a2900666SRuslan ErmilovThe packet was ignored and not aliased. 369a2900666SRuslan ErmilovThis can happen if the protocol is unrecognized, or possibly an ICMP message 370a2900666SRuslan Ermilovtype is not handled. 371a2900666SRuslan Ermilov.It Dv PKT_ALIAS_ERROR 372a2900666SRuslan ErmilovAn internal error within the packet aliasing engine occurred. 3733efa11bbSBrian Somers.El 374a2900666SRuslan Ermilov.Ed 375a2900666SRuslan Ermilov.Sh PORT AND ADDRESS REDIRECTION 376a2900666SRuslan ErmilovThe functions described in this section allow machines on the local network 377a2900666SRuslan Ermilovto be accessible in some degree to new incoming connections from the external 378a2900666SRuslan Ermilovnetwork. 379a2900666SRuslan ErmilovIndividual ports can be re-mapped or static network address translations can 380a2900666SRuslan Ermilovbe designated. 381a2900666SRuslan Ermilov.Pp 3823efa11bbSBrian Somers.Ft struct alias_link * 3835e289f9eSPoul-Henning Kamp.Fo LibAliasRedirectPort 3845e289f9eSPoul-Henning Kamp.Fa "struct libalias *" 3853efa11bbSBrian Somers.Fa "struct in_addr local_addr" 3863efa11bbSBrian Somers.Fa "u_short local_port" 3873efa11bbSBrian Somers.Fa "struct in_addr remote_addr" 3883efa11bbSBrian Somers.Fa "u_short remote_port" 3893efa11bbSBrian Somers.Fa "struct in_addr alias_addr" 3903efa11bbSBrian Somers.Fa "u_short alias_port" 3913efa11bbSBrian Somers.Fa "u_char proto" 3923efa11bbSBrian Somers.Fc 393a2900666SRuslan Ermilov.Bd -ragged -offset indent 394a2900666SRuslan ErmilovThis function specifies that traffic from a given remote address/port to 395a2900666SRuslan Ermilovan alias address/port be redirected to a specified local address/port. 3969c727d2cSJoseph KoshyThe parameter 397a2900666SRuslan Ermilov.Fa proto 398a2900666SRuslan Ermilovcan be either 399a2900666SRuslan Ermilov.Dv IPPROTO_TCP 4003efa11bbSBrian Somersor 401a2900666SRuslan Ermilov.Dv IPPROTO_UDP , 402a2900666SRuslan Ermilovas defined in 403fe08efe6SRuslan Ermilov.In netinet/in.h . 404a2900666SRuslan Ermilov.Pp 4053efa11bbSBrian SomersIf 406a2900666SRuslan Ermilov.Fa local_addr 407a2900666SRuslan Ermilovor 408a2900666SRuslan Ermilov.Fa alias_addr 409a2900666SRuslan Ermilovis zero, this indicates that the packet aliasing address as established 410a2900666SRuslan Ermilovby 4115e289f9eSPoul-Henning Kamp.Fn LibAliasSetAddress 412a2900666SRuslan Ermilovis to be used. 413a2900666SRuslan ErmilovEven if 4145e289f9eSPoul-Henning Kamp.Fn LibAliasSetAddress 415a2900666SRuslan Ermilovis called to change the address after 4165e289f9eSPoul-Henning Kamp.Fn LibAliasRedirectPort 417a2900666SRuslan Ermilovis called, a zero reference will track this change. 418a2900666SRuslan Ermilov.Pp 419ff19f85dSGlen BarberIf the link is further set up to operate with load sharing, then 4206d20a774SRuslan Ermilov.Fa local_addr 4216d20a774SRuslan Ermilovand 4226d20a774SRuslan Ermilov.Fa local_port 4236d20a774SRuslan Ermilovare ignored, and are selected dynamically from the server pool, as described in 4245e289f9eSPoul-Henning Kamp.Fn LibAliasAddServer 4256d20a774SRuslan Ermilovbelow. 4266d20a774SRuslan Ermilov.Pp 427a2900666SRuslan ErmilovIf 428a2900666SRuslan Ermilov.Fa remote_addr 429a2900666SRuslan Ermilovis zero, this indicates to redirect packets from any remote address. 430a2900666SRuslan ErmilovLikewise, if 431a2900666SRuslan Ermilov.Fa remote_port 432a2900666SRuslan Ermilovis zero, this indicates to redirect packets originating from any remote 433a2900666SRuslan Ermilovport number. 434ff19f85dSGlen BarberThe remote port specification will almost always be zero, but non-zero 435a2900666SRuslan Ermilovremote addresses can sometimes be useful for firewalling. 436a2900666SRuslan ErmilovIf two calls to 4375e289f9eSPoul-Henning Kamp.Fn LibAliasRedirectPort 438a2900666SRuslan Ermilovoverlap in their address/port specifications, then the most recent call 439a2900666SRuslan Ermilovwill have precedence. 440a2900666SRuslan Ermilov.Pp 441a2900666SRuslan ErmilovThis function returns a pointer which can subsequently be used by 4425e289f9eSPoul-Henning Kamp.Fn LibAliasRedirectDelete . 443a2900666SRuslan ErmilovIf 444a2900666SRuslan Ermilov.Dv NULL 445a2900666SRuslan Ermilovis returned, then the function call did not complete successfully. 446a2900666SRuslan Ermilov.Pp 447a2900666SRuslan ErmilovAll port numbers should be in network address byte order, so it is necessary 448a2900666SRuslan Ermilovto use 449a2900666SRuslan Ermilov.Xr htons 3 450a2900666SRuslan Ermilovto convert these parameters from internally readable numbers to network byte 451a2900666SRuslan Ermilovorder. 452a2900666SRuslan ErmilovAddresses are also in network byte order, which is implicit in the use of the 453a2900666SRuslan Ermilov.Fa struct in_addr 4543efa11bbSBrian Somersdata type. 455a2900666SRuslan Ermilov.Ed 456a2900666SRuslan Ermilov.Pp 4573efa11bbSBrian Somers.Ft struct alias_link * 4585e289f9eSPoul-Henning Kamp.Fo LibAliasRedirectAddr 4595e289f9eSPoul-Henning Kamp.Fa "struct libalias *" 4603efa11bbSBrian Somers.Fa "struct in_addr local_addr" 4613efa11bbSBrian Somers.Fa "struct in_addr alias_addr" 4623efa11bbSBrian Somers.Fc 463a2900666SRuslan Ermilov.Bd -ragged -offset indent 464a2900666SRuslan ErmilovThis function designates that all incoming traffic to 465a2900666SRuslan Ermilov.Fa alias_addr 4663efa11bbSBrian Somersbe redirected to 467a2900666SRuslan Ermilov.Fa local_addr . 4683efa11bbSBrian SomersSimilarly, all outgoing traffic from 469a2900666SRuslan Ermilov.Fa local_addr 4703efa11bbSBrian Somersis aliased to 471a2900666SRuslan Ermilov.Fa alias_addr . 472a2900666SRuslan Ermilov.Pp 4733efa11bbSBrian SomersIf 474a2900666SRuslan Ermilov.Fa local_addr 4753efa11bbSBrian Somersor 476a2900666SRuslan Ermilov.Fa alias_addr 477a2900666SRuslan Ermilovis zero, this indicates that the packet aliasing address as established by 4785e289f9eSPoul-Henning Kamp.Fn LibAliasSetAddress 479a2900666SRuslan Ermilovis to be used. 480a2900666SRuslan ErmilovEven if 4815e289f9eSPoul-Henning Kamp.Fn LibAliasSetAddress 482a2900666SRuslan Ermilovis called to change the address after 4835e289f9eSPoul-Henning Kamp.Fn LibAliasRedirectAddr 4843efa11bbSBrian Somersis called, a zero reference will track this change. 485a2900666SRuslan Ermilov.Pp 486ff19f85dSGlen BarberIf the link is further set up to operate with load sharing, then the 4876d20a774SRuslan Ermilov.Fa local_addr 488ff19f85dSGlen Barberargument is ignored, and is selected dynamically from the server pool, 489ff19f85dSGlen Barberas described in 4905e289f9eSPoul-Henning Kamp.Fn LibAliasAddServer 4916d20a774SRuslan Ermilovbelow. 4926d20a774SRuslan Ermilov.Pp 493a2900666SRuslan ErmilovIf subsequent calls to 4945e289f9eSPoul-Henning Kamp.Fn LibAliasRedirectAddr 495a2900666SRuslan Ermilovuse the same aliasing address, all new incoming traffic to this aliasing 496a2900666SRuslan Ermilovaddress will be redirected to the local address made in the last function 497a2900666SRuslan Ermilovcall. 498a2900666SRuslan ErmilovNew traffic generated by any of the local machines, designated in the 499a2900666SRuslan Ermilovseveral function calls, will be aliased to the same address. 500a2900666SRuslan ErmilovConsider the following example: 5016ae742a5SJoel Dahl.Pp 502c9a24641SRuslan ErmilovLibAliasRedirectAddr(la, inet_aton("192.168.0.2"), 5033efa11bbSBrian Somers inet_aton("141.221.254.101")); 504c9a24641SRuslan ErmilovLibAliasRedirectAddr(la, inet_aton("192.168.0.3"), 5053efa11bbSBrian Somers inet_aton("141.221.254.101")); 506c9a24641SRuslan ErmilovLibAliasRedirectAddr(la, inet_aton("192.168.0.4"), 5073efa11bbSBrian Somers inet_aton("141.221.254.101")); 508a2900666SRuslan Ermilov.Pp 509a2900666SRuslan ErmilovAny outgoing connections such as 510a2900666SRuslan Ermilov.Xr telnet 1 511a2900666SRuslan Ermilovor 512a2900666SRuslan Ermilov.Xr ftp 1 513a2900666SRuslan Ermilovfrom 192.168.0.2, 192.168.0.3 and 192.168.0.4 will appear to come from 514a2900666SRuslan Ermilov141.221.254.101. 515a2900666SRuslan ErmilovAny incoming connections to 141.221.254.101 will be directed to 192.168.0.4. 516a2900666SRuslan Ermilov.Pp 517a2900666SRuslan ErmilovAny calls to 5185e289f9eSPoul-Henning Kamp.Fn LibAliasRedirectPort 519a2900666SRuslan Ermilovwill have precedence over address mappings designated by 5205e289f9eSPoul-Henning Kamp.Fn LibAliasRedirectAddr . 521a2900666SRuslan Ermilov.Pp 522a2900666SRuslan ErmilovThis function returns a pointer which can subsequently be used by 5235e289f9eSPoul-Henning Kamp.Fn LibAliasRedirectDelete . 524a2900666SRuslan ErmilovIf 525a2900666SRuslan Ermilov.Dv NULL 526a2900666SRuslan Ermilovis returned, then the function call did not complete successfully. 527a2900666SRuslan Ermilov.Ed 528a2900666SRuslan Ermilov.Pp 5296d20a774SRuslan Ermilov.Ft int 5305e289f9eSPoul-Henning Kamp.Fo LibAliasAddServer 5315e289f9eSPoul-Henning Kamp.Fa "struct libalias *" 5326d20a774SRuslan Ermilov.Fa "struct alias_link *link" 5336d20a774SRuslan Ermilov.Fa "struct in_addr addr" 5346d20a774SRuslan Ermilov.Fa "u_short port" 5356d20a774SRuslan Ermilov.Fc 5366d20a774SRuslan Ermilov.Bd -ragged -offset indent 5376d20a774SRuslan ErmilovThis function sets the 5386d20a774SRuslan Ermilov.Fa link 5396d20a774SRuslan Ermilovup for Load Sharing using IP Network Address Translation (RFC 2391, LSNAT). 5406d20a774SRuslan ErmilovLSNAT operates as follows. 5416d20a774SRuslan ErmilovA client attempts to access a server by using the server virtual address. 5426d20a774SRuslan ErmilovThe LSNAT router transparently redirects the request to one of the hosts 543ff19f85dSGlen Barberin the server pool, using a real-time load sharing algorithm. 5446d20a774SRuslan ErmilovMultiple sessions may be initiated from the same client, and each session 545ff19f85dSGlen Barbercould be directed to a different host based on the load balance across server 546ff19f85dSGlen Barberpool hosts when the sessions are initiated. 547ff19f85dSGlen BarberIf load sharing is desired for just a few specific services, the configuration 548ff19f85dSGlen Barberon LSNAT could be defined to restrict load sharing to just the services 5496d20a774SRuslan Ermilovdesired. 5506d20a774SRuslan Ermilov.Pp 5516d20a774SRuslan ErmilovCurrently, only the simplest selection algorithm is implemented, where a 5526d20a774SRuslan Ermilovhost is selected on a round-robin basis only, without regard to load on 5536d20a774SRuslan Ermilovthe host. 5546d20a774SRuslan Ermilov.Pp 5556d20a774SRuslan ErmilovFirst, the 5566d20a774SRuslan Ermilov.Fa link 5576d20a774SRuslan Ermilovis created by either 5585e289f9eSPoul-Henning Kamp.Fn LibAliasRedirectPort 5596d20a774SRuslan Ermilovor 5605e289f9eSPoul-Henning Kamp.Fn LibAliasRedirectAddr . 5616d20a774SRuslan ErmilovThen, 5625e289f9eSPoul-Henning Kamp.Fn LibAliasAddServer 5636d20a774SRuslan Ermilovis called multiple times to add entries to the 5646d20a774SRuslan Ermilov.Fa link Ns 's 5656d20a774SRuslan Ermilovserver pool. 5666d20a774SRuslan Ermilov.Pp 5676d20a774SRuslan ErmilovFor links created with 5685e289f9eSPoul-Henning Kamp.Fn LibAliasRedirectAddr , 5696d20a774SRuslan Ermilovthe 5706d20a774SRuslan Ermilov.Fa port 5711a0a9345SRuslan Ermilovargument is ignored and could have any value, e.g.\& htons(~0). 5726d20a774SRuslan Ermilov.Pp 573234dfc90SRuslan ErmilovThis function returns 0 on success, \-1 otherwise. 574234dfc90SRuslan Ermilov.Ed 575234dfc90SRuslan Ermilov.Pp 576234dfc90SRuslan Ermilov.Ft int 5775e289f9eSPoul-Henning Kamp.Fn LibAliasRedirectDynamic "struct libalias *" "struct alias_link *link" 578234dfc90SRuslan Ermilov.Bd -ragged -offset indent 579234dfc90SRuslan ErmilovThis function marks the specified static redirect rule entered by 5805e289f9eSPoul-Henning Kamp.Fn LibAliasRedirectPort 581234dfc90SRuslan Ermilovas dynamic. 5821a0a9345SRuslan ErmilovThis can be used to e.g.\& dynamically redirect a single TCP connection, 583234dfc90SRuslan Ermilovafter which the rule is removed. 584234dfc90SRuslan ErmilovOnly fully specified links can be made dynamic. 585234dfc90SRuslan Ermilov(See the 586234dfc90SRuslan Ermilov.Sx STATIC AND DYNAMIC LINKS 587234dfc90SRuslan Ermilovand 588234dfc90SRuslan Ermilov.Sx PARTIALLY SPECIFIED ALIASING LINKS 5891a0a9345SRuslan Ermilovsections below for a definition of static vs.\& dynamic, 5901a0a9345SRuslan Ermilovand partially vs.\& fully specified links.) 591234dfc90SRuslan Ermilov.Pp 592234dfc90SRuslan ErmilovThis function returns 0 on success, \-1 otherwise. 5936d20a774SRuslan Ermilov.Ed 5946d20a774SRuslan Ermilov.Pp 5953efa11bbSBrian Somers.Ft void 5965e289f9eSPoul-Henning Kamp.Fn LibAliasRedirectDelete "struct libalias *" "struct alias_link *link" 597a2900666SRuslan Ermilov.Bd -ragged -offset indent 598a2900666SRuslan ErmilovThis function will delete a specific static redirect rule entered by 5995e289f9eSPoul-Henning Kamp.Fn LibAliasRedirectPort 600a2900666SRuslan Ermilovor 6015e289f9eSPoul-Henning Kamp.Fn LibAliasRedirectAddr . 602a2900666SRuslan ErmilovThe parameter 603a2900666SRuslan Ermilov.Fa link 604a2900666SRuslan Ermilovis the pointer returned by either of the redirection functions. 605a2900666SRuslan ErmilovIf an invalid pointer is passed to 6065e289f9eSPoul-Henning Kamp.Fn LibAliasRedirectDelete , 607ff19f85dSGlen Barberthen a program crash or unpredictable operation could result, so 608ff19f85dSGlen Barbercare is needed when using this function. 609a2900666SRuslan Ermilov.Ed 610a2900666SRuslan Ermilov.Pp 611619d1a30SBrian Somers.Ft int 6125e289f9eSPoul-Henning Kamp.Fn LibAliasProxyRule "struct libalias *" "const char *cmd" 613a2900666SRuslan Ermilov.Bd -ragged -offset indent 614619d1a30SBrian SomersThe passed 615a2900666SRuslan Ermilov.Fa cmd 616a2900666SRuslan Ermilovstring consists of one or more pairs of words. 617a2900666SRuslan ErmilovThe first word in each pair is a token and the second is the value that 618a2900666SRuslan Ermilovshould be applied for that token. 619a2900666SRuslan ErmilovTokens and their argument types are as follows: 620a2900666SRuslan Ermilov.Bl -tag -width indent 621a2900666SRuslan Ermilov.It Cm type encode_ip_hdr | encode_tcp_stream | no_encode 622619d1a30SBrian SomersIn order to support transparent proxying, it is necessary to somehow 623619d1a30SBrian Somerspass the original address and port information into the new destination 624a2900666SRuslan Ermilovserver. 625a2900666SRuslan ErmilovIf 626a2900666SRuslan Ermilov.Cm encode_ip_hdr 62771760898SRuslan Ermilovis specified, the original destination address and port are passed 62871760898SRuslan Ermilovas an extra IP option. 629a2900666SRuslan ErmilovIf 630a2900666SRuslan Ermilov.Cm encode_tcp_stream 63171760898SRuslan Ermilovis specified, the original destination address and port are passed 63271760898SRuslan Ermilovas the first piece of data in the TCP stream in the format 63371760898SRuslan Ermilov.Dq Li DEST Ar IP port . 634a2900666SRuslan Ermilov.It Cm port Ar portnum 635619d1a30SBrian SomersOnly packets with the destination port 636619d1a30SBrian Somers.Ar portnum 637619d1a30SBrian Somersare proxied. 6389c88dc88SRuslan Ermilov.It Cm server Ar host Ns Op : Ns Ar portnum 639619d1a30SBrian SomersThis specifies the 640619d1a30SBrian Somers.Ar host 641619d1a30SBrian Somersand 642619d1a30SBrian Somers.Ar portnum 643ac8e3334SBrian Somersthat the data is to be redirected to. 644ac8e3334SBrian Somers.Ar host 645a2900666SRuslan Ermilovmust be an IP address rather than a DNS host name. 646a2900666SRuslan ErmilovIf 647619d1a30SBrian Somers.Ar portnum 648619d1a30SBrian Somersis not specified, the destination port number is not changed. 649619d1a30SBrian Somers.Pp 650619d1a30SBrian SomersThe 651619d1a30SBrian Somers.Ar server 652619d1a30SBrian Somersspecification is mandatory unless the 653a2900666SRuslan Ermilov.Cm delete 654619d1a30SBrian Somerscommand is being used. 655a2900666SRuslan Ermilov.It Cm rule Ar index 656619d1a30SBrian SomersNormally, each call to 6575e289f9eSPoul-Henning Kamp.Fn LibAliasProxyRule 658a2900666SRuslan Ermilovinserts the next rule at the start of a linear list of rules. 659a2900666SRuslan ErmilovIf an 660619d1a30SBrian Somers.Ar index 661619d1a30SBrian Somersis specified, the new rule will be checked after all rules with lower 662a2900666SRuslan Ermilovindices. 663a2900666SRuslan ErmilovCalls to 6645e289f9eSPoul-Henning Kamp.Fn LibAliasProxyRule 665619d1a30SBrian Somersthat do not specify a rule are assigned rule 0. 666a2900666SRuslan Ermilov.It Cm delete Ar index 667a2900666SRuslan ErmilovThis token and its argument MUST NOT be used with any other tokens. 668a2900666SRuslan ErmilovWhen used, all existing rules with the given 669619d1a30SBrian Somers.Ar index 670619d1a30SBrian Somersare deleted. 671a2900666SRuslan Ermilov.It Cm proto tcp | udp 672619d1a30SBrian SomersIf specified, only packets of the given protocol type are matched. 6739c88dc88SRuslan Ermilov.It Cm src Ar IP Ns Op / Ns Ar bits 674619d1a30SBrian SomersIf specified, only packets with a source address matching the given 675619d1a30SBrian Somers.Ar IP 676a2900666SRuslan Ermilovare matched. 677a2900666SRuslan ErmilovIf 678619d1a30SBrian Somers.Ar bits 679619d1a30SBrian Somersis also specified, then the first 680619d1a30SBrian Somers.Ar bits 681619d1a30SBrian Somersbits of 682619d1a30SBrian Somers.Ar IP 683619d1a30SBrian Somersare taken as a network specification, and all IP addresses from that 684619d1a30SBrian Somersnetwork will be matched. 6859c88dc88SRuslan Ermilov.It Cm dst Ar IP Ns Op / Ns Ar bits 686619d1a30SBrian SomersIf specified, only packets with a destination address matching the given 687619d1a30SBrian Somers.Ar IP 688a2900666SRuslan Ermilovare matched. 689a2900666SRuslan ErmilovIf 690619d1a30SBrian Somers.Ar bits 691619d1a30SBrian Somersis also specified, then the first 692619d1a30SBrian Somers.Ar bits 693619d1a30SBrian Somersbits of 694619d1a30SBrian Somers.Ar IP 695619d1a30SBrian Somersare taken as a network specification, and all IP addresses from that 696619d1a30SBrian Somersnetwork will be matched. 697619d1a30SBrian Somers.El 698a2900666SRuslan Ermilov.Pp 699619d1a30SBrian SomersThis function is usually used to redirect outgoing connections for 700619d1a30SBrian Somersinternal machines that are not permitted certain types of internet 701619d1a30SBrian Somersaccess, or to restrict access to certain external machines. 702a2900666SRuslan Ermilov.Ed 703a2900666SRuslan Ermilov.Pp 704483d2f22SRuslan Ermilov.Ft struct alias_link * 7055e289f9eSPoul-Henning Kamp.Fo LibAliasRedirectProto 7065e289f9eSPoul-Henning Kamp.Fa "struct libalias *" 707483d2f22SRuslan Ermilov.Fa "struct in_addr local_addr" 708483d2f22SRuslan Ermilov.Fa "struct in_addr remote_addr" 709483d2f22SRuslan Ermilov.Fa "struct in_addr alias_addr" 71080607605SRuslan Ermilov.Fa "u_char proto" 711483d2f22SRuslan Ermilov.Fc 712483d2f22SRuslan Ermilov.Bd -ragged -offset indent 71380607605SRuslan ErmilovThis function specifies that any IP packet with protocol number of 71480607605SRuslan Ermilov.Fa proto 715ff19f85dSGlen Barberfrom a given remote address to an alias address will be 716483d2f22SRuslan Ermilovredirected to a specified local address. 717483d2f22SRuslan Ermilov.Pp 718483d2f22SRuslan ErmilovIf 719483d2f22SRuslan Ermilov.Fa local_addr 720483d2f22SRuslan Ermilovor 721483d2f22SRuslan Ermilov.Fa alias_addr 722483d2f22SRuslan Ermilovis zero, this indicates that the packet aliasing address as established 723483d2f22SRuslan Ermilovby 7245e289f9eSPoul-Henning Kamp.Fn LibAliasSetAddress 725483d2f22SRuslan Ermilovis to be used. 726483d2f22SRuslan ErmilovEven if 7275e289f9eSPoul-Henning Kamp.Fn LibAliasSetAddress 728483d2f22SRuslan Ermilovis called to change the address after 7295e289f9eSPoul-Henning Kamp.Fn LibAliasRedirectProto 730483d2f22SRuslan Ermilovis called, a zero reference will track this change. 731483d2f22SRuslan Ermilov.Pp 732483d2f22SRuslan ErmilovIf 733483d2f22SRuslan Ermilov.Fa remote_addr 73480607605SRuslan Ermilovis zero, this indicates to redirect packets from any remote address. 735483d2f22SRuslan ErmilovNon-zero remote addresses can sometimes be useful for firewalling. 736483d2f22SRuslan Ermilov.Pp 737483d2f22SRuslan ErmilovIf two calls to 7385e289f9eSPoul-Henning Kamp.Fn LibAliasRedirectProto 739483d2f22SRuslan Ermilovoverlap in their address specifications, then the most recent call 740483d2f22SRuslan Ermilovwill have precedence. 741483d2f22SRuslan Ermilov.Pp 742483d2f22SRuslan ErmilovThis function returns a pointer which can subsequently be used by 7435e289f9eSPoul-Henning Kamp.Fn LibAliasRedirectDelete . 744483d2f22SRuslan ErmilovIf 745483d2f22SRuslan Ermilov.Dv NULL 746483d2f22SRuslan Ermilovis returned, then the function call did not complete successfully. 747483d2f22SRuslan Ermilov.Ed 748a2900666SRuslan Ermilov.Sh FRAGMENT HANDLING 749a2900666SRuslan ErmilovThe functions in this section are used to deal with incoming fragments. 750a2900666SRuslan Ermilov.Pp 751a2900666SRuslan ErmilovOutgoing fragments are handled within 7525e289f9eSPoul-Henning Kamp.Fn LibAliasOut 753a2900666SRuslan Ermilovby changing the address according to any applicable mapping set by 7545e289f9eSPoul-Henning Kamp.Fn LibAliasRedirectAddr , 7551855100fSAlexey Zelkinor the default aliasing address set by 7565e289f9eSPoul-Henning Kamp.Fn LibAliasSetAddress . 757a2900666SRuslan Ermilov.Pp 7581855100fSAlexey ZelkinIncoming fragments are handled in one of two ways. 759a2900666SRuslan ErmilovIf the header of a fragmented IP packet has already been seen, then all 760a2900666SRuslan Ermilovsubsequent fragments will be re-mapped in the same manner the header 761a2900666SRuslan Ermilovfragment was. 762a2900666SRuslan ErmilovFragments which arrive before the header are saved and then retrieved 763a2900666SRuslan Ermilovonce the header fragment has been resolved. 764a2900666SRuslan Ermilov.Pp 7653efa11bbSBrian Somers.Ft int 7665e289f9eSPoul-Henning Kamp.Fn LibAliasSaveFragment "struct libalias *" "char *ptr" 767a2900666SRuslan Ermilov.Bd -ragged -offset indent 768a2900666SRuslan ErmilovWhen 7695e289f9eSPoul-Henning Kamp.Fn LibAliasIn 770a2900666SRuslan Ermilovreturns 771a2900666SRuslan Ermilov.Dv PKT_ALIAS_UNRESOLVED_FRAGMENT , 772a2900666SRuslan Ermilovthis function can be used to save the pointer to the unresolved fragment. 773a2900666SRuslan Ermilov.Pp 7743efa11bbSBrian SomersIt is implicitly assumed that 775a2900666SRuslan Ermilov.Fa ptr 7763efa11bbSBrian Somerspoints to a block of memory allocated by 777a2900666SRuslan Ermilov.Xr malloc 3 . 778a2900666SRuslan ErmilovIf the fragment is never resolved, the packet aliasing engine will 779a2900666SRuslan Ermilovautomatically free the memory after a timeout period. 780a2900666SRuslan Ermilov[Eventually this function should be modified so that a callback function 781a2900666SRuslan Ermilovfor freeing memory is passed as an argument.] 782a2900666SRuslan Ermilov.Pp 783a2900666SRuslan ErmilovThis function returns 784a2900666SRuslan Ermilov.Dv PKT_ALIAS_OK 785a2900666SRuslan Ermilovif it was successful and 786a2900666SRuslan Ermilov.Dv PKT_ALIAS_ERROR 787a2900666SRuslan Ermilovif there was an error. 788a2900666SRuslan Ermilov.Ed 789a2900666SRuslan Ermilov.Pp 7903efa11bbSBrian Somers.Ft char * 7915e289f9eSPoul-Henning Kamp.Fn LibAliasGetFragment "struct libalias *" "char *buffer" 792a2900666SRuslan Ermilov.Bd -ragged -offset indent 793a2900666SRuslan ErmilovThis function can be used to retrieve fragment pointers saved by 7945e289f9eSPoul-Henning Kamp.Fn LibAliasSaveFragment . 7953efa11bbSBrian SomersThe IP header fragment pointed to by 796a2900666SRuslan Ermilov.Fa buffer 7973efa11bbSBrian Somersis the header fragment indicated when 7985e289f9eSPoul-Henning Kamp.Fn LibAliasIn 799a2900666SRuslan Ermilovreturns 800a2900666SRuslan Ermilov.Dv PKT_ALIAS_FOUND_HEADER_FRAGMENT . 801a2900666SRuslan ErmilovOnce a fragment pointer is retrieved, it becomes the calling program's 802a2900666SRuslan Ermilovresponsibility to free the dynamically allocated memory for the fragment. 803a2900666SRuslan Ermilov.Pp 8049703a107SPhilippe CharnierThe 8055e289f9eSPoul-Henning Kamp.Fn LibAliasGetFragment 8069703a107SPhilippe Charnierfunction can be called sequentially until there are no more fragments 8079703a107SPhilippe Charnieravailable, at which time it returns 808a2900666SRuslan Ermilov.Dv NULL . 809a2900666SRuslan Ermilov.Ed 810a2900666SRuslan Ermilov.Pp 8113efa11bbSBrian Somers.Ft void 8125e289f9eSPoul-Henning Kamp.Fn LibAliasFragmentIn "struct libalias *" "char *header" "char *fragment" 813a2900666SRuslan Ermilov.Bd -ragged -offset indent 8143efa11bbSBrian SomersWhen a fragment is retrieved with 8155e289f9eSPoul-Henning Kamp.Fn LibAliasGetFragment , 816a2900666SRuslan Ermilovit can then be de-aliased with a call to 8175e289f9eSPoul-Henning Kamp.Fn LibAliasFragmentIn . 818a2900666SRuslan ErmilovThe 819a2900666SRuslan Ermilov.Fa header 820a2900666SRuslan Ermilovargument is the pointer to a header fragment used as a template, and 821a2900666SRuslan Ermilov.Fa fragment 8223efa11bbSBrian Somersis the pointer to the packet to be de-aliased. 823a2900666SRuslan Ermilov.Ed 824a2900666SRuslan Ermilov.Sh MISCELLANEOUS FUNCTIONS 82505116753SAndrey V. Elsukov.Ft struct alias_link * 82605116753SAndrey V. Elsukov.Fn AddLink "struct libalias *" "struct in_addr src_addr" "struct in_addr dst_addr" \ 82705116753SAndrey V. Elsukov"struct in_addr alias_addr" "u_short src_port" "u_short dst_port" \ 82805116753SAndrey V. Elsukov"int alias_param" "int link_type" 82905116753SAndrey V. Elsukov.Bd -ragged -offset indent 830ff19f85dSGlen BarberThis function adds new state to the instance hash table. 831ff19f85dSGlen BarberThe dst_address and/or dst_port may be given as zero, which 832ff19f85dSGlen Barberintroduces some dynamic character into the link, since 833ff19f85dSGlen BarberLibAliasSetAddress can change the address that is used. 834ff19f85dSGlen BarberHowever, in the current implementation, such links can only be used 835ff19f85dSGlen Barberfor inbound (ext -> int) traffic. 83605116753SAndrey V. Elsukov.Ed 83705116753SAndrey V. Elsukov.Pp 8383efa11bbSBrian Somers.Ft void 8395e289f9eSPoul-Henning Kamp.Fn LibAliasSetTarget "struct libalias *" "struct in_addr addr" 840a2900666SRuslan Ermilov.Bd -ragged -offset indent 841a2900666SRuslan ErmilovWhen an incoming packet not associated with any pre-existing aliasing link 842a2900666SRuslan Ermilovarrives at the host machine, it will be sent to the address indicated by a 843a2900666SRuslan Ermilovcall to 8445e289f9eSPoul-Henning Kamp.Fn LibAliasSetTarget . 845a2900666SRuslan Ermilov.Pp 846151682eaSBrian SomersIf this function is called with an 847a2900666SRuslan Ermilov.Dv INADDR_NONE 848a2900666SRuslan Ermilovaddress argument, then all new incoming packets go to the address set by 8495e289f9eSPoul-Henning Kamp.Fn LibAliasSetAddress . 850a2900666SRuslan Ermilov.Pp 851151682eaSBrian SomersIf this function is not called, or is called with an 852a2900666SRuslan Ermilov.Dv INADDR_ANY 853a2900666SRuslan Ermilovaddress argument, then all new incoming packets go to the address specified 854a2900666SRuslan Ermilovin the packet. 855a2900666SRuslan ErmilovThis allows external machines to talk directly to internal machines if they 856a2900666SRuslan Ermilovcan route packets to the machine in question. 857a2900666SRuslan Ermilov.Ed 858a2900666SRuslan Ermilov.Pp 8593efa11bbSBrian Somers.Ft int 860fc1eaecfSRuslan Ermilov.Fn LibAliasCheckNewLink "struct libalias *" 861a2900666SRuslan Ermilov.Bd -ragged -offset indent 862a2900666SRuslan ErmilovThis function returns a non-zero value when a new aliasing link is created. 863a2900666SRuslan ErmilovIn circumstances where incoming traffic is being sequentially sent to 864a2900666SRuslan Ermilovdifferent local servers, this function can be used to trigger when 8655e289f9eSPoul-Henning Kamp.Fn LibAliasSetTarget 8663efa11bbSBrian Somersis called to change the default target address. 867a2900666SRuslan Ermilov.Ed 868a2900666SRuslan Ermilov.Pp 8693efa11bbSBrian Somers.Ft u_short 8705e289f9eSPoul-Henning Kamp.Fn LibAliasInternetChecksum "struct libalias *" "u_short *buffer" "int nbytes" 871a2900666SRuslan Ermilov.Bd -ragged -offset indent 872a2900666SRuslan ErmilovThis is a utility function that does not seem to be available elsewhere and 873a2900666SRuslan Ermilovis included as a convenience. 874a2900666SRuslan ErmilovIt computes the internet checksum, which is used in both IP and 875a2900666SRuslan Ermilovprotocol-specific headers (TCP, UDP, ICMP). 876a2900666SRuslan Ermilov.Pp 877a2900666SRuslan ErmilovThe 878a2900666SRuslan Ermilov.Fa buffer 879a2900666SRuslan Ermilovargument points to the data block to be checksummed, and 880a2900666SRuslan Ermilov.Fa nbytes 881a2900666SRuslan Ermilovis the number of bytes. 882a2900666SRuslan ErmilovThe 16-bit checksum field should be zeroed before computing the checksum. 883a2900666SRuslan Ermilov.Pp 884a2900666SRuslan ErmilovChecksums can also be verified by operating on a block of data including 885a2900666SRuslan Ermilovits checksum. 886a2900666SRuslan ErmilovIf the checksum is valid, 8875e289f9eSPoul-Henning Kamp.Fn LibAliasInternetChecksum 888a2900666SRuslan Ermilovwill return zero. 889a2900666SRuslan Ermilov.Ed 890642e43b3SArchie Cobbs.Pp 891642e43b3SArchie Cobbs.Ft int 8925e289f9eSPoul-Henning Kamp.Fn LibAliasUnaliasOut "struct libalias *" "char *buffer" "int maxpacketsize" 893642e43b3SArchie Cobbs.Bd -ragged -offset indent 89471845bffSSheldon HearnAn outgoing packet, which has already been aliased, 89571845bffSSheldon Hearnhas its private address/port information restored by this function. 896642e43b3SArchie CobbsThe IP packet is pointed to by 897642e43b3SArchie Cobbs.Fa buffer , 898642e43b3SArchie Cobbsand 899642e43b3SArchie Cobbs.Fa maxpacketsize 900642e43b3SArchie Cobbsis provided for error checking purposes. 901642e43b3SArchie CobbsThis function can be used if an already-aliased packet needs to have its 9021a0a9345SRuslan Ermilovoriginal IP header restored for further processing (e.g.\& logging). 903642e43b3SArchie Cobbs.Ed 904a2900666SRuslan Ermilov.Sh CONCEPTUAL BACKGROUND 905a2900666SRuslan ErmilovThis section is intended for those who are planning to modify the source 906a2900666SRuslan Ermilovcode or want to create somewhat esoteric applications using the packet 907a2900666SRuslan Ermilovaliasing functions. 908a2900666SRuslan Ermilov.Pp 909a2900666SRuslan ErmilovThe conceptual framework under which the packet aliasing engine operates 910a2900666SRuslan Ermilovis described here. 9113efa11bbSBrian SomersCentral to the discussion is the idea of an 912a2900666SRuslan Ermilov.Em aliasing link 913a2900666SRuslan Ermilovwhich describes the relationship for a given packet transaction between 914a2900666SRuslan Ermilovthe local machine, aliased identity and remote machine. 915a2900666SRuslan ErmilovIt is discussed how such links come into existence and are destroyed. 916a2900666SRuslan Ermilov.Ss ALIASING LINKS 917a2900666SRuslan ErmilovThere is a notion of an 918a2900666SRuslan Ermilov.Em aliasing link , 919a2900666SRuslan Ermilovwhich is a 7-tuple describing a specific translation: 9203efa11bbSBrian Somers.Bd -literal -offset indent 9213efa11bbSBrian Somers(local addr, local port, alias addr, alias port, 9223efa11bbSBrian Somers remote addr, remote port, protocol) 9233efa11bbSBrian Somers.Ed 924a2900666SRuslan Ermilov.Pp 925a2900666SRuslan ErmilovOutgoing packets have the local address and port number replaced with the 926a2900666SRuslan Ermilovalias address and port number. 927a2900666SRuslan ErmilovIncoming packets undergo the reverse process. 928a2900666SRuslan ErmilovThe packet aliasing engine attempts to match packets against an internal 929a2900666SRuslan Ermilovtable of aliasing links to determine how to modify a given IP packet. 930a2900666SRuslan ErmilovBoth the IP header and protocol dependent headers are modified as necessary. 931a2900666SRuslan ErmilovAliasing links are created and deleted as necessary according to network 932a2900666SRuslan Ermilovtraffic. 933a2900666SRuslan Ermilov.Pp 934a2900666SRuslan ErmilovProtocols can be TCP, UDP or even ICMP in certain circumstances. 935a2900666SRuslan Ermilov(Some types of ICMP packets can be aliased according to sequence or ID 936a2900666SRuslan Ermilovnumber which acts as an equivalent port number for identifying how 937a2900666SRuslan Ermilovindividual packets should be handled.) 938a2900666SRuslan Ermilov.Pp 939a2900666SRuslan ErmilovEach aliasing link must have a unique combination of the following five 940a2900666SRuslan Ermilovquantities: alias address/port, remote address/port and protocol. 941a2900666SRuslan ErmilovThis ensures that several machines on a local network can share the 942a2900666SRuslan Ermilovsame aliasing IP address. 943a2900666SRuslan ErmilovIn cases where conflicts might arise, the aliasing port is chosen so that 944a2900666SRuslan Ermilovuniqueness is maintained. 945a2900666SRuslan Ermilov.Ss STATIC AND DYNAMIC LINKS 9463efa11bbSBrian SomersAliasing links can either be static or dynamic. 947a2900666SRuslan ErmilovStatic links persist indefinitely and represent fixed rules for translating 948a2900666SRuslan ErmilovIP packets. 949a2900666SRuslan ErmilovDynamic links come into existence for a specific TCP connection or UDP 950a2900666SRuslan Ermilovtransaction or ICMP ECHO sequence. 951a2900666SRuslan ErmilovFor the case of TCP, the connection can be monitored to see when the 952a2900666SRuslan Ermilovassociated aliasing link should be deleted. 953a2900666SRuslan ErmilovAliasing links for UDP transactions (and ICMP ECHO and TIMESTAMP requests) 954a2900666SRuslan Ermilovwork on a simple timeout rule. 955a2900666SRuslan ErmilovWhen no activity is observed on a dynamic link for a certain amount of time 956a2900666SRuslan Ermilovit is automatically deleted. 957a2900666SRuslan ErmilovTimeout rules also apply to TCP connections which do not open or close 9583efa11bbSBrian Somersproperly. 959a2900666SRuslan Ermilov.Ss PARTIALLY SPECIFIED ALIASING LINKS 960a2900666SRuslan ErmilovAliasing links can be partially specified, meaning that the remote address 961a2900666SRuslan Ermilovand/or remote port are unknown. 962a2900666SRuslan ErmilovIn this case, when a packet matching the incomplete specification is found, 963a2900666SRuslan Ermilova fully specified dynamic link is created. 964a2900666SRuslan ErmilovIf the original partially specified link is dynamic, it will be deleted 965a2900666SRuslan Ermilovafter the fully specified link is created, otherwise it will persist. 966a2900666SRuslan Ermilov.Pp 967a2900666SRuslan ErmilovFor instance, a partially specified link might be 9683efa11bbSBrian Somers.Bd -literal -offset indent 9693efa11bbSBrian Somers(192.168.0.4, 23, 204.228.203.215, 8066, 0, 0, tcp) 9703efa11bbSBrian Somers.Ed 971a2900666SRuslan Ermilov.Pp 972a2900666SRuslan ErmilovThe zeros denote unspecified components for the remote address and port. 973a2900666SRuslan ErmilovIf this link were static it would have the effect of redirecting all 974a2900666SRuslan Ermilovincoming traffic from port 8066 of 204.228.203.215 to port 23 (telnet) 975a2900666SRuslan Ermilovof machine 192.168.0.4 on the local network. 976a2900666SRuslan ErmilovEach individual telnet connection would initiate the creation of a distinct 977a2900666SRuslan Ermilovdynamic link. 978a2900666SRuslan Ermilov.Ss DYNAMIC LINK CREATION 979a2900666SRuslan ErmilovIn addition to aliasing links, there are also address mappings that can be 980a2900666SRuslan Ermilovstored within the internal data table of the packet aliasing mechanism. 9813efa11bbSBrian Somers.Bd -literal -offset indent 9823efa11bbSBrian Somers(local addr, alias addr) 9833efa11bbSBrian Somers.Ed 984a2900666SRuslan Ermilov.Pp 985a2900666SRuslan ErmilovAddress mappings are searched when creating new dynamic links. 986a2900666SRuslan Ermilov.Pp 987a2900666SRuslan ErmilovAll outgoing packets from the local network automatically create a dynamic 988a2900666SRuslan Ermilovlink if they do not match an already existing fully specified link. 989a2900666SRuslan ErmilovIf an address mapping exists for the outgoing packet, this determines 990a2900666SRuslan Ermilovthe alias address to be used. 991a2900666SRuslan ErmilovIf no mapping exists, then a default address, usually the address of the 992a2900666SRuslan Ermilovpacket aliasing host, is used. 993a2900666SRuslan ErmilovIf necessary, this default address can be changed as often as each individual 994a2900666SRuslan Ermilovpacket arrives. 995a2900666SRuslan Ermilov.Pp 996a2900666SRuslan ErmilovThe aliasing port number is determined such that the new dynamic link does 997a2900666SRuslan Ermilovnot conflict with any existing links. 998a2900666SRuslan ErmilovIn the default operating mode, the packet aliasing engine attempts to set 999a2900666SRuslan Ermilovthe aliasing port equal to the local port number. 1000a2900666SRuslan ErmilovIf this results in a conflict, then port numbers are randomly chosen until 1001a2900666SRuslan Ermilova unique aliasing link can be established. 1002a2900666SRuslan ErmilovIn an alternate operating mode, the first choice of an aliasing port is also 1003a2900666SRuslan Ermilovrandom and unrelated to the local port number. 1004be4f3cd0SPaolo Pisati.Sh MODULAR ARCHITECTURE (AND Xr ipfw 4 Sh SUPPORT) 1005be4f3cd0SPaolo PisatiOne of the latest improvements to 1006f3d9aab3SPaolo Pisati.Nm 1007f3d9aab3SPaolo Pisatiwas to make its support 1008be4f3cd0SPaolo Pisatifor new protocols independent from the rest of the library, giving it 1009f3d9aab3SPaolo Pisatithe ability to load/unload support for new protocols at run-time. 1010be4f3cd0SPaolo PisatiTo achieve this feature, all the code for protocol handling was moved 1011be4f3cd0SPaolo Pisatito a series of modules outside of the main library. 1012f3d9aab3SPaolo PisatiThese modules are compiled from the same sources but work in 1013be4f3cd0SPaolo Pisatidifferent ways, depending on whether they are compiled to work inside a kernel 1014be4f3cd0SPaolo Pisatior as part of the userland library. 1015be4f3cd0SPaolo Pisati.Ss LIBALIAS MODULES IN KERNEL LAND 1016f3d9aab3SPaolo PisatiWhen compiled for the kernel, 1017f3d9aab3SPaolo Pisati.Nm 1018cc81ddd9SRuslan Ermilovmodules are plain KLDs recognizable with the 1019cc81ddd9SRuslan Ermilov.Pa alias_ 1020cc81ddd9SRuslan Ermilovprefix. 1021be4f3cd0SPaolo Pisati.Pp 1022f3d9aab3SPaolo PisatiTo add support for a new protocol, load the corresponding module. 1023f3d9aab3SPaolo PisatiFor example: 1024be4f3cd0SPaolo Pisati.Pp 1025f3d9aab3SPaolo Pisati.Dl "kldload alias_ftp" 1026be4f3cd0SPaolo Pisati.Pp 1027f3d9aab3SPaolo PisatiWhen support for a protocol is no longer needed, its module can be unloaded: 1028be4f3cd0SPaolo Pisati.Pp 1029f3d9aab3SPaolo Pisati.Dl "kldunload alias_ftp" 1030be4f3cd0SPaolo Pisati.Ss LIBALIAS MODULES IN USERLAND 1031f3d9aab3SPaolo PisatiDue to the differences between kernel and userland (no KLD mechanism, 1032f3d9aab3SPaolo Pisatimany different address spaces, etc.), we had to change a bit how to 1033f3d9aab3SPaolo Pisatihandle module loading/tracking/unloading in userland. 1034be4f3cd0SPaolo Pisati.Pp 1035be4f3cd0SPaolo PisatiWhile compiled for a userland 1036f3d9aab3SPaolo Pisati.Nm , 1037cc81ddd9SRuslan Ermilovall the modules are plain libraries, residing in 1038cc81ddd9SRuslan Ermilov.Pa /usr/lib , 1039cc81ddd9SRuslan Ermilovand recognizable with the 1040cc81ddd9SRuslan Ermilov.Pa libalias_ 1041cc81ddd9SRuslan Ermilovprefix. 1042be4f3cd0SPaolo Pisati.Pp 1043f3d9aab3SPaolo PisatiThere is a configuration file, 1044f3d9aab3SPaolo Pisati.Pa /etc/libalias.conf , 1045f3d9aab3SPaolo Pisatiwith the following contents (by default): 1046f3d9aab3SPaolo Pisati.Bd -literal -offset indent 1047f3d9aab3SPaolo Pisati/usr/lib/libalias_cuseeme.so 1048f3d9aab3SPaolo Pisati/usr/lib/libalias_ftp.so 1049f3d9aab3SPaolo Pisati/usr/lib/libalias_irc.so 1050f3d9aab3SPaolo Pisati/usr/lib/libalias_nbt.so 1051f3d9aab3SPaolo Pisati/usr/lib/libalias_pptp.so 1052f3d9aab3SPaolo Pisati/usr/lib/libalias_skinny.so 1053f3d9aab3SPaolo Pisati/usr/lib/libalias_smedia.so 1054f3d9aab3SPaolo Pisati.Ed 1055be4f3cd0SPaolo Pisati.Pp 1056f3d9aab3SPaolo PisatiThis file contains the paths to the modules that 1057f3d9aab3SPaolo Pisati.Nm 1058be4f3cd0SPaolo Pisatiwill load. 1059f3d9aab3SPaolo PisatiTo load/unload a new module, just add its path to 1060f3d9aab3SPaolo Pisati.Pa libalias.conf 1061cc81ddd9SRuslan Ermilovand call 1062cc81ddd9SRuslan Ermilov.Fn LibAliasRefreshModules 1063cc81ddd9SRuslan Ermilovfrom the program. 1064cc81ddd9SRuslan ErmilovIn case the application provides a 1065cc81ddd9SRuslan Ermilov.Dv SIGHUP 1066cc81ddd9SRuslan Ermilovsignal handler, add a call to 1067cc81ddd9SRuslan Ermilov.Fn LibAliasRefreshModules 1068cc81ddd9SRuslan Ermilovinside the handler, and everytime you want to refresh the loaded modules, 1069cc81ddd9SRuslan Ermilovsend it the 1070f3d9aab3SPaolo Pisati.Dv SIGHUP 1071f3d9aab3SPaolo Pisatisignal: 1072be4f3cd0SPaolo Pisati.Pp 1073f3d9aab3SPaolo Pisati.Dl "kill -HUP <process_pid>" 1074be4f3cd0SPaolo Pisati.Ss MODULAR ARCHITECURE: HOW IT WORKS 1075be4f3cd0SPaolo PisatiThe modular architecture of 1076f3d9aab3SPaolo Pisati.Nm 1077f3d9aab3SPaolo Pisatiworks similar whether it is running inside the 1078f3d9aab3SPaolo Pisatikernel or in userland. 1079f3d9aab3SPaolo PisatiFrom 1080f3d9aab3SPaolo Pisati.Pa alias_mod.c : 1081be4f3cd0SPaolo Pisati.Bd -literal 1082f3d9aab3SPaolo Pisati/* Protocol and userland module handlers chains. */ 1083cc81ddd9SRuslan ErmilovLIST_HEAD(handler_chain, proto_handler) handler_chain ... 1084f3d9aab3SPaolo Pisati\&... 1085cc81ddd9SRuslan ErmilovSLIST_HEAD(dll_chain, dll) dll_chain ... 1086f3d9aab3SPaolo Pisati.Ed 1087f3d9aab3SPaolo Pisati.Pp 1088f3d9aab3SPaolo Pisati.Va handler_chain 1089ff19f85dSGlen Barberkeeps track of all the protocol handlers loaded, while 1090f3d9aab3SPaolo Pisati.Va ddl_chain 1091ff19f85dSGlen Barbertracks which userland modules are loaded. 1092f3d9aab3SPaolo Pisati.Pp 1093f3d9aab3SPaolo Pisati.Va handler_chain 1094f3d9aab3SPaolo Pisatiis composed of 1095f3d9aab3SPaolo Pisati.Vt "struct proto_handler" 1096f3d9aab3SPaolo Pisatientries: 1097f3d9aab3SPaolo Pisati.Bd -literal 1098be4f3cd0SPaolo Pisatistruct proto_handler { 1099f3d9aab3SPaolo Pisati u_int pri; 1100be4f3cd0SPaolo Pisati int16_t dir; 1101f3d9aab3SPaolo Pisati uint8_t proto; 1102be4f3cd0SPaolo Pisati int (*fingerprint)(struct libalias *la, 1103be4f3cd0SPaolo Pisati struct ip *pip, struct alias_data *ah); 1104be4f3cd0SPaolo Pisati int (*protohandler)(struct libalias *la, 1105be4f3cd0SPaolo Pisati struct ip *pip, struct alias_data *ah); 1106*535e0a09SGleb Smirnoff TAILQ_ENTRY(proto_handler) link; 1107be4f3cd0SPaolo Pisati}; 1108be4f3cd0SPaolo Pisati.Ed 1109be4f3cd0SPaolo Pisati.Pp 1110be4f3cd0SPaolo Pisatiwhere: 1111f3d9aab3SPaolo Pisati.Bl -inset 1112f3d9aab3SPaolo Pisati.It Va pri 1113ff19f85dSGlen Barberis the priority assigned to a protocol handler; lower priority 1114be4f3cd0SPaolo Pisatiis better. 1115f3d9aab3SPaolo Pisati.It Va dir 1116f3d9aab3SPaolo Pisatiis the direction of packets: ingoing or outgoing. 1117f3d9aab3SPaolo Pisati.It Va proto 1118ff19f85dSGlen Barberindicates to which protocol this packet belongs: IP, TCP or UDP. 1119f3d9aab3SPaolo Pisati.It Va fingerprint 1120f3d9aab3SPaolo Pisatipoints to the fingerprint function while protohandler points 1121be4f3cd0SPaolo Pisatito the protocol handler function. 1122f3d9aab3SPaolo Pisati.El 1123be4f3cd0SPaolo Pisati.Pp 1124f3d9aab3SPaolo PisatiThe 1125f3d9aab3SPaolo Pisati.Va fingerprint 1126ff19f85dSGlen Barberfunction has the dual role of checking if the 1127ff19f85dSGlen Barberincoming packet is found, and if it belongs to any categories that this 1128be4f3cd0SPaolo Pisatimodule can handle. 1129be4f3cd0SPaolo Pisati.Pp 1130f3d9aab3SPaolo PisatiThe 1131f3d9aab3SPaolo Pisati.Va protohandler 1132f3d9aab3SPaolo Pisatifunction actually manipulates 1133be4f3cd0SPaolo Pisatithe packet to make 1134f3d9aab3SPaolo Pisati.Nm 1135f3d9aab3SPaolo Pisaticorrectly NAT it. 1136be4f3cd0SPaolo Pisati.Pp 1137be4f3cd0SPaolo PisatiWhen a packet enters 1138f3d9aab3SPaolo Pisati.Nm , 1139f3d9aab3SPaolo Pisatiif it meets a module hook, 1140f3d9aab3SPaolo Pisati.Va handler_chain 1141f3d9aab3SPaolo Pisatiis searched to see if there is an handler that matches 1142ff19f85dSGlen Barberthis type of a packet (it checks protocol and direction of packet). 1143ff19f85dSGlen BarberThen, if more than one handler is found, it starts with the module with 1144f3d9aab3SPaolo Pisatithe lowest priority number: it calls the 1145f3d9aab3SPaolo Pisati.Va fingerprint 1146f3d9aab3SPaolo Pisatifunction and interprets the result. 1147be4f3cd0SPaolo Pisati.Pp 1148f3d9aab3SPaolo PisatiIf the result value is equal to 0 then it calls the protocol handler 1149f3d9aab3SPaolo Pisatiof this handler and returns. 1150f3d9aab3SPaolo PisatiOtherwise, it proceeds to the next eligible module until the 1151f3d9aab3SPaolo Pisati.Va handler_chain 1152f3d9aab3SPaolo Pisatiis exhausted. 1153be4f3cd0SPaolo Pisati.Pp 1154be4f3cd0SPaolo PisatiInside 1155f3d9aab3SPaolo Pisati.Nm , 1156be4f3cd0SPaolo Pisatithe module hook looks like this: 1157f3d9aab3SPaolo Pisati.Bd -literal -offset indent 1158be4f3cd0SPaolo Pisatistruct alias_data ad = { 1159be4f3cd0SPaolo Pisati lnk, 1160be4f3cd0SPaolo Pisati &original_address, 1161be4f3cd0SPaolo Pisati &alias_address, 1162be4f3cd0SPaolo Pisati &alias_port, 1163be4f3cd0SPaolo Pisati &ud->uh_sport, /* original source port */ 1164be4f3cd0SPaolo Pisati &ud->uh_dport, /* original dest port */ 1165be4f3cd0SPaolo Pisati 256 /* maxpacketsize */ 1166be4f3cd0SPaolo Pisati}; 1167be4f3cd0SPaolo Pisati 1168f3d9aab3SPaolo Pisati\&... 1169be4f3cd0SPaolo Pisati 1170be4f3cd0SPaolo Pisati/* walk out chain */ 1171be4f3cd0SPaolo Pisatierr = find_handler(IN, UDP, la, pip, &ad); 1172be4f3cd0SPaolo Pisati.Ed 1173f3d9aab3SPaolo Pisati.Pp 1174f3d9aab3SPaolo PisatiAll data useful to a module are gathered together in an 1175f3d9aab3SPaolo Pisati.Vt alias_data 1176f3d9aab3SPaolo Pisatistructure, then 1177f3d9aab3SPaolo Pisati.Fn find_handler 1178f3d9aab3SPaolo Pisatiis called. 1179f3d9aab3SPaolo PisatiThe 1180f3d9aab3SPaolo Pisati.Fn find_handler 1181ff19f85dSGlen Barberfunction is responsible for walking the handler 1182ff19f85dSGlen Barberchain; it receives as input parameters: 1183f3d9aab3SPaolo Pisati.Bl -tag -width indent 1184f3d9aab3SPaolo Pisati.It Fa IN 1185f3d9aab3SPaolo Pisatidirection 1186f3d9aab3SPaolo Pisati.It Fa UDP 1187f3d9aab3SPaolo Pisatiworking protocol 1188f3d9aab3SPaolo Pisati.It Fa la 1189f3d9aab3SPaolo Pisatipointer to this instance of libalias 1190f3d9aab3SPaolo Pisati.It Fa pip 1191f3d9aab3SPaolo Pisatipointer to a 1192f3d9aab3SPaolo Pisati.Vt "struct ip" 1193f3d9aab3SPaolo Pisati.It Fa ad 1194f3d9aab3SPaolo Pisatipointer to 1195f3d9aab3SPaolo Pisati.Vt "struct alias_data" 1196f3d9aab3SPaolo Pisati(see above) 1197f3d9aab3SPaolo Pisati.El 1198be4f3cd0SPaolo Pisati.Pp 1199f3d9aab3SPaolo PisatiIn this case, 1200f3d9aab3SPaolo Pisati.Fn find_handler 1201f3d9aab3SPaolo Pisatiwill search only for modules registered for 1202be4f3cd0SPaolo Pisatisupporting INcoming UDP packets. 1203be4f3cd0SPaolo Pisati.Pp 1204f3d9aab3SPaolo PisatiAs was mentioned earlier, 1205f3d9aab3SPaolo Pisati.Nm 1206ff19f85dSGlen Barberin userland is a bit different, as 1207ff19f85dSGlen Barbercare must be taken in module handling as well (avoiding duplicate load of 1208ff19f85dSGlen Barbermodules, avoiding modules with same name, etc.) so 1209f3d9aab3SPaolo Pisati.Va dll_chain 1210f3d9aab3SPaolo Pisatiwas introduced. 1211be4f3cd0SPaolo Pisati.Pp 1212f3d9aab3SPaolo Pisati.Va dll_chain 1213f3d9aab3SPaolo Pisaticontains a list of all userland 1214f3d9aab3SPaolo Pisati.Nm 1215be4f3cd0SPaolo Pisatimodules loaded. 1216be4f3cd0SPaolo Pisati.Pp 1217f3d9aab3SPaolo PisatiWhen an application calls 1218f3d9aab3SPaolo Pisati.Fn LibAliasRefreshModules , 1219f3d9aab3SPaolo Pisati.Nm 1220f3d9aab3SPaolo Pisatifirst unloads all the loaded modules, then reloads all the modules listed in 1221f3d9aab3SPaolo Pisati.Pa /etc/libalias.conf : 1222ff19f85dSGlen Barberfor every module loaded, a new entry is added to 1223ff19f85dSGlen Barber.Va dll_chain . 1224be4f3cd0SPaolo Pisati.Pp 1225f3d9aab3SPaolo Pisati.Va dll_chain 1226f3d9aab3SPaolo Pisatiis composed of 1227f3d9aab3SPaolo Pisati.Vt "struct dll" 1228f3d9aab3SPaolo Pisatientries: 1229be4f3cd0SPaolo Pisati.Bd -literal 1230be4f3cd0SPaolo Pisatistruct dll { 1231be4f3cd0SPaolo Pisati /* name of module */ 1232be4f3cd0SPaolo Pisati char name[DLL_LEN]; 1233be4f3cd0SPaolo Pisati /* 1234be4f3cd0SPaolo Pisati * ptr to shared obj obtained through 1235be4f3cd0SPaolo Pisati * dlopen() - use this ptr to get access 1236be4f3cd0SPaolo Pisati * to any symbols from a loaded module 1237be4f3cd0SPaolo Pisati * via dlsym() 1238be4f3cd0SPaolo Pisati */ 1239be4f3cd0SPaolo Pisati void *handle; 1240be4f3cd0SPaolo Pisati struct dll *next; 1241be4f3cd0SPaolo Pisati}; 1242be4f3cd0SPaolo Pisati.Ed 1243f3d9aab3SPaolo Pisati.Bl -inset 1244f3d9aab3SPaolo Pisati.It Va name 1245a3fb6da9SGlen Barberis the name of the module. 1246f3d9aab3SPaolo Pisati.It Va handle 1247f3d9aab3SPaolo Pisatiis a pointer to the module obtained through 1248a3fb6da9SGlen Barber.Xr dlopen 3 . 1249f3d9aab3SPaolo Pisati.El 1250be4f3cd0SPaolo PisatiWhenever a module is loaded in userland, an entry is added to 1251f3d9aab3SPaolo Pisati.Va dll_chain , 1252f3d9aab3SPaolo Pisatithen every protocol handler present in that module 1253f3d9aab3SPaolo Pisatiis resolved and registered in 1254f3d9aab3SPaolo Pisati.Va handler_chain . 1255be4f3cd0SPaolo Pisati.Ss HOW TO WRITE A MODULE FOR LIBALIAS 1256f3d9aab3SPaolo PisatiThere is a module (called 1257f3d9aab3SPaolo Pisati.Pa alias_dummy.[ch] ) 1258f3d9aab3SPaolo Pisatiin 1259f3d9aab3SPaolo Pisati.Nm 1260ff19f85dSGlen Barberthat can be used as a skeleton for future work. 1261ff19f85dSGlen BarberHere we analyse some parts of that module. 1262f3d9aab3SPaolo PisatiFrom 1263f3d9aab3SPaolo Pisati.Pa alias_dummy.c : 1264be4f3cd0SPaolo Pisati.Bd -literal 1265*535e0a09SGleb Smirnoffstruct proto_handler handlers[] = { 1266*535e0a09SGleb Smirnoff { 1267*535e0a09SGleb Smirnoff .pri = 666, 1268*535e0a09SGleb Smirnoff .dir = IN|OUT, 1269*535e0a09SGleb Smirnoff .proto = UDP|TCP, 1270*535e0a09SGleb Smirnoff .fingerprint = fingerprint, 1271*535e0a09SGleb Smirnoff .protohandler= protohandler, 1272*535e0a09SGleb Smirnoff }, 1273*535e0a09SGleb Smirnoff { EOH } 1274*535e0a09SGleb Smirnoff}; 1275be4f3cd0SPaolo Pisati.Ed 1276be4f3cd0SPaolo Pisati.Pp 1277f3d9aab3SPaolo PisatiThe variable 1278f3d9aab3SPaolo Pisati.Va handlers 1279f3d9aab3SPaolo Pisatiis the 1280f3d9aab3SPaolo Pisati.Dq "most important thing" 1281f3d9aab3SPaolo Pisatiin a module 1282ff19f85dSGlen Barbersince it describes the handlers present and lets the outside world use 1283be4f3cd0SPaolo Pisatiit in an opaque way. 1284be4f3cd0SPaolo Pisati.Pp 1285be4f3cd0SPaolo PisatiIt must ALWAYS be present in every module, and it MUST retain 1286f3d9aab3SPaolo Pisatithe name 1287f3d9aab3SPaolo Pisati.Va handlers , 1288f3d9aab3SPaolo Pisatiotherwise attempting to load a module in userland will fail and 1289f3d9aab3SPaolo Pisaticomplain about missing symbols: for more information about module 1290f3d9aab3SPaolo Pisatiload/unload, please refer to 1291f3d9aab3SPaolo Pisati.Fn LibAliasRefreshModules , 1292f3d9aab3SPaolo Pisati.Fn LibAliasLoadModule 1293f3d9aab3SPaolo Pisatiand 1294f3d9aab3SPaolo Pisati.Fn LibAliasUnloadModule 1295f3d9aab3SPaolo Pisatiin 1296f3d9aab3SPaolo Pisati.Pa alias.c . 1297be4f3cd0SPaolo Pisati.Pp 1298f3d9aab3SPaolo Pisati.Va handlers 1299f3d9aab3SPaolo Pisaticontains all the 1300f3d9aab3SPaolo Pisati.Vt proto_handler 1301f3d9aab3SPaolo Pisatistructures present in a module. 1302be4f3cd0SPaolo Pisati.Bd -literal 1303be4f3cd0SPaolo Pisatistatic int 1304be4f3cd0SPaolo Pisatimod_handler(module_t mod, int type, void *data) 1305be4f3cd0SPaolo Pisati{ 1306be4f3cd0SPaolo Pisati int error; 1307be4f3cd0SPaolo Pisati 1308be4f3cd0SPaolo Pisati switch (type) { 1309be4f3cd0SPaolo Pisati case MOD_LOAD: 1310*535e0a09SGleb Smirnoff error = LibAliasAttachHandlers(handlers); 1311be4f3cd0SPaolo Pisati break; 1312be4f3cd0SPaolo Pisati case MOD_UNLOAD: 1313*535e0a09SGleb Smirnoff error = LibAliasDetachHandlers(handlers); 1314be4f3cd0SPaolo Pisati break; 1315be4f3cd0SPaolo Pisati default: 1316be4f3cd0SPaolo Pisati error = EINVAL; 1317be4f3cd0SPaolo Pisati } 1318be4f3cd0SPaolo Pisati return (error); 1319be4f3cd0SPaolo Pisati} 1320be4f3cd0SPaolo Pisati.Ed 1321f3d9aab3SPaolo PisatiWhen running as KLD, 1322f3d9aab3SPaolo Pisati.Fn mod_handler 1323ff19f85dSGlen Barberregisters/deregisters the module using 1324*535e0a09SGleb Smirnoff.Fn LibAliasAttachHandlers 1325f3d9aab3SPaolo Pisatiand 1326*535e0a09SGleb Smirnoff.Fn LibAliasDetachHandlers , 1327f3d9aab3SPaolo Pisatirespectively. 1328be4f3cd0SPaolo Pisati.Pp 1329be4f3cd0SPaolo PisatiEvery module must contain at least 2 functions: one fingerprint 1330be4f3cd0SPaolo Pisatifunction and a protocol handler function. 1331be4f3cd0SPaolo Pisati.Bd -literal 1332be4f3cd0SPaolo Pisati#ifdef _KERNEL 1333be4f3cd0SPaolo Pisatistatic 1334be4f3cd0SPaolo Pisati#endif 1335be4f3cd0SPaolo Pisatiint 1336be4f3cd0SPaolo Pisatifingerprint(struct libalias *la, struct ip *pip, struct alias_data *ah) 1337be4f3cd0SPaolo Pisati{ 1338be4f3cd0SPaolo Pisati 1339f3d9aab3SPaolo Pisati\&... 1340be4f3cd0SPaolo Pisati} 1341be4f3cd0SPaolo Pisati 1342be4f3cd0SPaolo Pisati#ifdef _KERNEL 1343be4f3cd0SPaolo Pisatistatic 1344be4f3cd0SPaolo Pisati#endif 1345be4f3cd0SPaolo Pisatiint 1346be4f3cd0SPaolo Pisatiprotohandler(struct libalias *la, struct ip *pip, 1347be4f3cd0SPaolo Pisati struct alias_data *ah) 1348be4f3cd0SPaolo Pisati{ 1349be4f3cd0SPaolo Pisati 1350f3d9aab3SPaolo Pisati\&... 1351be4f3cd0SPaolo Pisati} 1352be4f3cd0SPaolo Pisati.Ed 1353be4f3cd0SPaolo Pisatiand they must accept exactly these input parameters. 1354be4f3cd0SPaolo Pisati.Ss PATCHING AN APPLICATION FOR USERLAND LIBALIAS MODULES 1355f3d9aab3SPaolo PisatiTo add module support into an application that uses 1356f3d9aab3SPaolo Pisati.Nm , 1357f3d9aab3SPaolo Pisatithe following simple steps can be followed. 1358f3d9aab3SPaolo Pisati.Bl -enum 1359f3d9aab3SPaolo Pisati.It 1360f3d9aab3SPaolo PisatiFind the main file of an application 1361f3d9aab3SPaolo Pisati(let us call it 1362f3d9aab3SPaolo Pisati.Pa main.c ) . 1363f3d9aab3SPaolo Pisati.It 1364f3d9aab3SPaolo PisatiAdd this to the header section of 1365f3d9aab3SPaolo Pisati.Pa main.c , 1366f3d9aab3SPaolo Pisatiif not already present: 1367be4f3cd0SPaolo Pisati.Pp 1368f3d9aab3SPaolo Pisati.Dl "#include <signal.h>" 1369be4f3cd0SPaolo Pisati.Pp 1370f3d9aab3SPaolo Pisatiand this just after the header section: 1371be4f3cd0SPaolo Pisati.Pp 1372f3d9aab3SPaolo Pisati.Dl "static void signal_handler(int);" 1373f3d9aab3SPaolo Pisati.It 1374f3d9aab3SPaolo PisatiAdd the following line to the init function of an application or, 1375f3d9aab3SPaolo Pisatiif it does not have any init function, put it in 1376f3d9aab3SPaolo Pisati.Fn main : 1377be4f3cd0SPaolo Pisati.Pp 1378f3d9aab3SPaolo Pisati.Dl "signal(SIGHUP, signal_handler);" 1379be4f3cd0SPaolo Pisati.Pp 1380f3d9aab3SPaolo Pisatiand place the 1381f3d9aab3SPaolo Pisati.Fn signal_handler 1382f3d9aab3SPaolo Pisatifunction somewhere in 1383f3d9aab3SPaolo Pisati.Pa main.c : 1384f3d9aab3SPaolo Pisati.Bd -literal -offset indent 1385f3d9aab3SPaolo Pisatistatic void 1386f3d9aab3SPaolo Pisatisignal_handler(int sig) 1387f3d9aab3SPaolo Pisati{ 1388f3d9aab3SPaolo Pisati 1389f3d9aab3SPaolo Pisati LibAliasRefreshModules(); 1390f3d9aab3SPaolo Pisati} 1391be4f3cd0SPaolo Pisati.Ed 1392be4f3cd0SPaolo Pisati.Pp 1393f3d9aab3SPaolo PisatiOtherwise, if an application already traps the 1394f3d9aab3SPaolo Pisati.Dv SIGHUP 1395f3d9aab3SPaolo Pisatisignal, just add a call to 1396f3d9aab3SPaolo Pisati.Fn LibAliasRefreshModules 1397f3d9aab3SPaolo Pisatiin the signal handler function. 1398f3d9aab3SPaolo Pisati.El 1399f3d9aab3SPaolo PisatiFor example, to patch 1400f3d9aab3SPaolo Pisati.Xr natd 8 1401f3d9aab3SPaolo Pisatito use 1402f3d9aab3SPaolo Pisati.Nm 1403f3d9aab3SPaolo Pisatimodules, just add the following line to 1404f3d9aab3SPaolo Pisati.Fn RefreshAddr "int sig __unused" : 1405f3d9aab3SPaolo Pisati.Pp 1406f3d9aab3SPaolo Pisati.Dl "LibAliasRefreshModules()" 1407f3d9aab3SPaolo Pisati.Pp 1408f3d9aab3SPaolo Pisatirecompile and you are done. 1409f3d9aab3SPaolo Pisati.Ss LOGGING SUPPORT IN KERNEL LAND 1410f3d9aab3SPaolo PisatiWhen working as KLD, 1411f3d9aab3SPaolo Pisati.Nm 1412f3d9aab3SPaolo Pisatinow has log support that 1413f3d9aab3SPaolo Pisatihappens on a buffer allocated inside 1414f3d9aab3SPaolo Pisati.Vt "struct libalias" 1415f3d9aab3SPaolo Pisati(from 1416f3d9aab3SPaolo Pisati.Pa alias_local.h ) : 1417be4f3cd0SPaolo Pisati.Bd -literal 1418be4f3cd0SPaolo Pisatistruct libalias { 1419be4f3cd0SPaolo Pisati ... 1420be4f3cd0SPaolo Pisati 1421be4f3cd0SPaolo Pisati /* log descriptor */ 1422be4f3cd0SPaolo Pisati#ifdef KERNEL_LOG 1423be4f3cd0SPaolo Pisati char *logDesc; /* 1424be4f3cd0SPaolo Pisati * ptr to an auto-malloced 1425be4f3cd0SPaolo Pisati * memory buffer when libalias 1426be4f3cd0SPaolo Pisati * works as kld 1427be4f3cd0SPaolo Pisati */ 1428be4f3cd0SPaolo Pisati#else 1429be4f3cd0SPaolo Pisati FILE *logDesc; /* 1430be4f3cd0SPaolo Pisati * ptr to /var/log/alias.log 1431be4f3cd0SPaolo Pisati * when libalias runs as a 1432be4f3cd0SPaolo Pisati * userland lib 1433be4f3cd0SPaolo Pisati */ 1434be4f3cd0SPaolo Pisati#endif 1435be4f3cd0SPaolo Pisati 1436be4f3cd0SPaolo Pisati ... 1437be4f3cd0SPaolo Pisati} 1438be4f3cd0SPaolo Pisati.Ed 1439f3d9aab3SPaolo Pisatiso all applications using 1440f3d9aab3SPaolo Pisati.Nm 1441f3d9aab3SPaolo Pisatiwill be able to handle their 1442f3d9aab3SPaolo Pisatiown logs, if they want, accessing 1443f3d9aab3SPaolo Pisati.Va logDesc . 1444f3d9aab3SPaolo PisatiMoreover, every change to a log buffer is automatically added to 1445f3d9aab3SPaolo Pisati.Xr syslog 3 1446f3d9aab3SPaolo Pisatiwith the 1447f3d9aab3SPaolo Pisati.Dv LOG_SECURITY 1448f3d9aab3SPaolo Pisatifacility and the 1449f3d9aab3SPaolo Pisati.Dv LOG_INFO 1450f3d9aab3SPaolo Pisatilevel. 145149894437SGleb Smirnoff.Sh AUTHORS 145249894437SGleb Smirnoff.An Charles Mott Aq cm@linktel.net , 145349894437SGleb Smirnoffversions 1.0 - 1.8, 2.0 - 2.4. 145449894437SGleb Smirnoff.An Eivind Eklund Aq eivind@FreeBSD.org , 145549894437SGleb Smirnoffversions 1.8b, 1.9 and 2.5. 145649894437SGleb SmirnoffAdded IRC DCC support as well as contributing a number of architectural 145749894437SGleb Smirnoffimprovements; added the firewall bypass for FTP/IRC DCC. 145849894437SGleb Smirnoff.An Erik Salander Aq erik@whistle.com 145949894437SGleb Smirnoffadded support for PPTP and RTSP. 146049894437SGleb Smirnoff.An Junichi Satoh Aq junichi@junichi.org 146149894437SGleb Smirnoffadded support for RTSP/PNA. 146249894437SGleb Smirnoff.An Ruslan Ermilov Aq ru@FreeBSD.org 146349894437SGleb Smirnoffadded support for PPTP and LSNAT as well as general hacking. 146449894437SGleb Smirnoff.An Gleb Smirnoff Aq glebius@FreeBSD.org 146549894437SGleb Smirnoffported the library to kernel space. 146649894437SGleb Smirnoff.An Paolo Pisati Aq piso@FreeBSD.org 146749894437SGleb Smirnoffmade the library modular, moving support for all 146849894437SGleb Smirnoffprotocols (except for IP, TCP and UDP) to external modules. 146949894437SGleb Smirnoff.Sh ACKNOWLEDGEMENTS 147049894437SGleb SmirnoffListed below, in approximate chronological order, are individuals who 147149894437SGleb Smirnoffhave provided valuable comments and/or debugging assistance. 147249894437SGleb Smirnoff.Bd -ragged -offset indent 147349894437SGleb Smirnoff.An -split 147449894437SGleb Smirnoff.An Gary Roberts 147549894437SGleb Smirnoff.An Tom Torrance 147649894437SGleb Smirnoff.An Reto Burkhalter 147749894437SGleb Smirnoff.An Martin Renters 147849894437SGleb Smirnoff.An Brian Somers 147949894437SGleb Smirnoff.An Paul Traina 148049894437SGleb Smirnoff.An Ari Suutari 148149894437SGleb Smirnoff.An Dave Remien 148249894437SGleb Smirnoff.An J. Fortes 148349894437SGleb Smirnoff.An Andrzej Bialecki 148449894437SGleb Smirnoff.An Gordon Burditt 148549894437SGleb Smirnoff.Ed 1486