summaryrefslogtreecommitdiff
path: root/usr/src/man/man7i/ipnat.7i
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/man/man7i/ipnat.7i')
-rw-r--r--usr/src/man/man7i/ipnat.7i436
1 files changed, 0 insertions, 436 deletions
diff --git a/usr/src/man/man7i/ipnat.7i b/usr/src/man/man7i/ipnat.7i
deleted file mode 100644
index 5aa277f05f..0000000000
--- a/usr/src/man/man7i/ipnat.7i
+++ /dev/null
@@ -1,436 +0,0 @@
-.\" Copyright (c) 2008, Sun Microsystems, Inc. All Rights Reserved
-.\" Copyright (c) 2017, Joyent, Inc.
-.\" The contents of this file are subject to the terms of the
-.\" Common Development and Distribution License (the "License").
-.\" You may not use this file except in compliance with the License.
-.\"
-.\" You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
-.\" or http://www.opensolaris.org/os/licensing.
-.\" See the License for the specific language governing permissions
-.\" and limitations under the License.
-.\"
-.\" When distributing Covered Code, include this CDDL HEADER in each
-.\" file and include the License file at usr/src/OPENSOLARIS.LICENSE.
-.\" If applicable, add the following below this CDDL HEADER, with the
-.\" fields enclosed by brackets "[]" replaced with your own identifying
-.\" information: Portions Copyright [yyyy] [name of copyright owner]
-.Dd October 23, 2017
-.Dt IPNAT 7I
-.Os
-.Sh NAME
-.Nm ipnat
-.Nd IP Filter/NAT module interface
-.Sh DESCRIPTION
-The
-.Sy ipnat
-device provides interfaction with the NAT features of the Solaris IPFilter.
-.Sh APPLICATION PROGRAMMING INTERFACE
-The NAT features programming model is a component of the Solaris IP Filter and
-is accessed via the NAT device file
-.Pa /dev/ipnat .
-Opening the device for
-reading or writing determines which ioctl calls can be successfully made.
-.Sh IOCTLS
-The caller must construct a
-.Vt ipfobj
-structure when issuing a
-.Sy SIOCGNATL
-or
-SIOCSTPUT
-ioctl.
-The
-.Vt ipfobj
-structure is then passed
-to the ioctl call and is filled out with
-.Fa ipfo_type
-set to
-.Dv IPFOBJ_ Ns value .
-.Dv IPFOBJ_ Ns value
-provides a matching name for the structure, while
-.Fa ipfo_size
-is set to the total size of the structure being passed and
-.Fa ipfo_ptr
-is set to the structure address.
-The
-.Fa ipfo_rev
-structure should be set to the current value of
-.Dv IPFILTER_VERSION ,
-while
-.Fa ipfo_offset
-and
-.Fa ipfo_xxxpad
-should be set to 0.
-.Bd -literal -offset 2n
-/*
- * Structure used with SIOCGNATL/SIOCSTPUT.
- */
-
-/*
- * Object structure description. For passing through in ioctls.
- */
-typedef struct ipfobj {
- u_32_t ipfo_rev; /* IPFilter version (IPFILTER_VERSION) */
- u_32_t ipfo_size; /* size of object at ipfo_ptr */
- void *ipfo_ptr; /* pointer to object */
- int ipfo_type; /* type of object being pointed to */
- int ipfo_offset; /* bytes from ipfo_ptr where to start */
- u_char ipfo_xxxpad[32]; /* reserved for future use */
-} ipfobj_t;
-
-#define IPFILTER_VERSION 4010901 /* IPFilter version */
-#define IPFOBJ_NATSAVE 8 /* struct nat_save */
-#define IPFOBJ_NATLOOKUP 9 /* struct natlookup */
-.Ed
-.Pp
-The following
-.Xr ioctl 2
-calls may be used to manipulate the ipnat sub-system inside of ipf.
-Note that the ipnat driver only accept calls from applications
-using the same data model as the kernel.
-In other words, 64-bit kernels can only accept calls from 64-bit applications.
-Calls from 32-bit applications fail
-with
-.Er EINVAL .
-.Bl -tag -width SIOCSTLCK
-.It Dv SIOCSTLCK
-Set or clear the NAT lock to prevent table updates attributable to packet
-flow-through.
-.It Dv SIOCGNATL
-Search the NAT table for the rdr entry that matches the fields in the natlookup
-structure.
-The caller must populate the structure with the address/port
-information of the accepted TCP connection
-.Pq Fa nl_inip , Fa nl_inport
-and the
-address/port information of the peer
-.Pq Fa nl_outip , Fa nl_outport .
-The
-.Fa nl_flags
-field must have the
-.Dv IPN_TCP
-option set.
-All other fields must be set to 0.
-If the call succeeds,
-.Fa nl_realip
-and
-.Fa nl_realport
-are set to the real destination address and port, respectively.
-The
-.Fa nl_inport
-and
-.Fa nl_outport
-fields must be in host byte order.
-If
-.Dv IPN_FINDFORWARD
-is set in
-.Fa nl_flags ,
-a check is made to see if it is
-possible to create an outgoing NAT session by checking if a packet coming from
-.Pq Fa nl_realip , Fa nl_realport
-and destined for
-.Pq Fa nl_outip , Fa nl_outport
-can be translated.
-If translation is possible, the flag remains set, otherwise it is
-cleared in the structure returned to the caller.
-.Bd -literal -offset indent
-/*
- * Structure used with SIOCGNATL.
- */
-typedef struct natlookup {
- i6addr_t nl_inipaddr;
- i6addr_t nl_outipaddr;
- i6addr_t nl_realipaddr;
- int nl_v;
- int nl_flags;
- u_short nl_inport;
- u_short nl_outport;
- u_short nl_realport;
-} natlookup_t
-
-#define nl_inip nl_inipaddr.in4
-#define nl_outip nl_outipaddr.in4
-#define nl_realip nl_realipaddr.in4
-#define nl_inip6 nl_inipaddr.in6
-#define nl_outip6 nl_outipaddr.in6
-#define nl_realip6 nl_realipaddr.in6
-
-/*
- * Accepted values for nl_flags
- */
-#define IPN_TCP 0x00001
-#define IPN_FINDFORWARD 0x400000
-.Ed
-.It Dv SIOCSTPUT
-Move a NAT mapping structure from user space into the kernel.
-This ioctl is used by
-.Xr ipfs 1M
-to restore NAT sessions saved in
-.Pa /var/db/ipf/ipnat.ipf .
-The
-.Vt nat_save
-structure must have its
-.Fa ipn_nat
-and
-.Fa ipn_ipnat
-structures filled out correctly.
-Fields not assigned a value must be initialised to 0.
-All pointer fields are adjusted, as appropriate, once the
-structure is passed into the kernel and none are preserved.
-.Pp
-To create a translation, the following fields must be set:
-.\" Force item bodies to next line using 2n width
-.Bl -tag -width 2n
-.It "Interface name"
-The interface name on which the host is to be exited must be
-set in
-.Fa nat_ifnames[0] .
-.It "Local IP address and port number"
-The connection's local IP address and port
-number are stored in network byte order using
-.Fa nat_inip Ns / Ns Fa nat_inport .
-.It "Destination address/port"
-The destination address/port are stored in
-.Fa nat_oip Ns / Ns Fa nat_oport .
-.It "Target address/port"
-The translation's target address/port is stored in
-.Fa nat_outip Ns / Ns Fa nat_outport .
-.El
-.Pp
-The caller must also precalculate the checksum adjustments necessary to
-complete the translation and store those values in
-.Fa nat_sumd
-(delta required for TCP header) and
-.Fa nat_ipsumd
-(delta required for IP header).
-.Bd -literal -offset indent
-/*
- * Structures used with SIOCSTPUT.
- */
-typedef struct nat_save {
- void *ipn_next;
- struct nat ipn_nat;
- struct ipnat ipn_ipnat;
- struct frentry ipn_fr;
- int ipn_dsize;
- char ipn_data[4];
-} nat_save_t;
-
-typedef struct nat {
- ipfmutex_t nat_lock;
- struct nat *nat_next;
- struct nat **nat_pnext;
- struct nat *nat_hnext[2];
- struct nat **nat_phnext[2];
- struct hostmap *nat_hm;
- void *nat_data;
- struct nat **nat_me;
- struct ipstate *nat_state;
- struct ap_session *nat_aps;
- frentry_t *nat_fr;
- struct ipnat *nat_ptr;
- void *nat_ifps[2];
- void *nat_sync;
- ipftqent_t nat_tqe;
- u_32_t nat_flags;
- u_32_t nat_sumd[2];
- u_32_t nat_ipsumd;
- u_32_t nat_mssclamp;
- i6addr_t nat_inip6;
- i6addr_t nat_outip6;
- i6addr_t nat_oip6;
- U_QUAD_T nat_pkts[2];
- U_QUAD_T nat_bytes[2];
- union {
- udpinfo_t nat_unu;
- tcpinfo_t nat_unt;
- icmpinfo_t nat_uni;
- greinfo_t nat_ugre;
- } nat_un;
- u_short nat_oport;
- u_short nat_use;
- u_char nat_p;
- int nat_dir;
- int nat_ref;
- int nat_hv[2];
- char nat_ifnames[2][LIFNAMSIZ];
- int nat_rev;
- int nat_v;
-} nat_t;
-
-#define nat_inip nat_inip6.in4
-#define nat_outip nat_outip6.in4
-#define nat_oip nat_oip6.in4
-#define nat_inport nat_un.nat_unt.ts_sport
-#define nat_outport nat_un.nat_unt.ts_dport
-/*
- * Values for nat_dir
- */
-#define NAT_INBOUND 0
-#define NAT_OUTBOUND 1
-/*
- * Definitions for nat_flags
- */
-#define NAT_TCP 0x0001 /* IPN_TCP */
-.Ed
-.El
-.Sh EXAMPLES
-The following example shows how to prepare and use
-.Fa SIOCSTPUT
-to insert a NAT session directly into the table.
-Note that the usual TCP/IP code is omitted is this example.
-.Pp
-In the code segment below,
-.Fa incoming_fd
-is the TCP connection file descriptor
-that is accepted as part of the redirect process, while
-.Fa remote_fd
-is the outgoing TCP connection to the remote server being translated back to the
-original IP address/port pair.
-.Pp
-Note \(em
-The following ipnat headers must be included before you can use the code shown
-in this example:
-.Bd -literal -offset 2n
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <net/if.h>
-#include <netinet/ipl.h>
-#include <netinet/ip_compat.h>
-#include <netinet/ip_fil.h>
-#include <netinet/ip_nat.h>
-#include <string.h>
-#include <fcntl.h>
-.Ed
-.Pp
-Note \(em
-In the example below, various code fragments have been excluded to enhance
-clarity.
-.Bd -literal -offset 2n
-int
-translate_connection(int incoming_fd)
-{
- struct sockaddr_in usin;
- struct natlookup nlp;
- struct nat_save ns;
- struct ipfobj obj;
- struct nat *nat;
- int remote_fd;
- int nat_fd;
- int onoff;
-
- memset(&ns, 0, sizeof(ns));
- nat = &ns.ipn_nat
-
- namelen = sizeof(usin);
- getsockname(remote_fd, (struct sockaddr *)&usin, &namelen);
-
- namelen = sizeof(sin);
- getpeername(incoming_fd, (struct sockaddr *) &sin, &namelen);
-
- namelen = sizeof(sloc);
- getsockname(incoming_fd, (struct sockaddr *) &sloc, &namelen);
-
- bzero((char *) &obi, sizeof(obj));
- obj.ipfo_rev = IPFILTER_VERSION;
- obj.ipfo_size = sizeof(nlp);
- obj.ipfo_ptr = &nip;
- obj.ipfo_type = IPFOBJ_NATLOOKUP;
-
- /*
- * Build up the NAT natlookup structure.
- */
- bzero((char *) &nlp, sizeof(nlp));
- nlp.nl_outip = sin.sin_addr;
- nlp.nl_inip = sloc.sin_addr;
- nlp.nl_flags = IPN_TCP;
- nlp.nl_outport = ntohs(sin.sin_port);
- nlp.nl_inport = ntohs(sloc.sin_port);
-
- /*
- * Open the NAT device and lookup the mapping pair.
- */
- nat_fd = open(IPNAT_NAME, O_RDWR);
- if (ioctl(nat_fd, SIOCGNATL, &obj) != 0)
- return -1;
-
- nat->nat_inip = usin.sin_addr;
- nat->nat_outip = nlp.nl_outip;
- nat->nat_oip = nlp.nl_realip;
-
- sum1 = LONG_SUM(ntohl(usin.sin_addr.s_addr)) +
- ntohs(usin.sin_port);
- sum2 = LONG_SUM(ntohl(nat->nat_outip.s_addr)) +
- ntohs(nlp.nl_outport);
- CALC_SUMD(sum1, sum2, sumd);
- nat->nat_sumd[0] = (sumd & 0xffff) + (sumd >> 16);
- nat->nat_sumd[1] = nat->nat_sumd[0];
-
- sum1 = LONG_SUM(ntohl(usin.sin_addr.s_addr));
- sum2 = LONG_SUM(ntohl(nat->nat_outip.s_addr));
- CALC_SUMD(sum1, sum2, sumd);
- nat->nat_ipsumd = (sumd & 0xffff) + (sumd >> 16);
-
- nat->nat_inport = usin.sin_port;
- nat->nat_outport = nlp.nl_outport;
- nat->nat_oport = nlp.nl_realport;
-
- nat->nat_flags = IPN_TCPUDP;
-
- /*
- * Prepare the ipfobj structure, accordingly.
- */
- bzero((char *)&obi, sizeof(obj));
- obj.ipfo_rev = IPFILTER_VERSION;
- obj.ipfo_size = sizeof(*nsp);
- obj.ipfo_ptr = nsp;
- obj.ipfo_type = IPFOBJ_NATSAVE;
-
- onoff = 1;
- if (ioctl(nat_fd, SIOCSTPUT, &obj) != 0)
- fprintf(stderr, "Error occurred\en");
-
- return connect(rem_fd, (struct sockaddr)&usin, sizeof(usin));
-}
-.Ed
-.Sh ERRORS
-.Bl -tag -width Er
-.It Er EPERM
-The device has been opened for reading only.
-To succeed, the ioctl call must be opened for both reading and writing.
-The call may be returned if it is
-privileged and the calling process did not assert
-.Brq Sy PRIV_SYS_NET_CONFIG
-in the effective set.
-.It Er ENOMEM
-More memory was allocated than the kernel can provide.
-The call may also be returned if the application inserts a NAT entry that
-exceeds the hash bucket chain's maximum length.
-.It Er EFAULT
-The calling process specified an invalid pointer in the ipfobj structure.
-.It Er EINVAL
-The calling process detected a parameter or field set to an unacceptable value.
-.It Er EEXIST
-The calling process, via
-.Dv SIOCSTPUT ,
-attempted to add a NAT entry that already exists in the NAT table.
-.It Er ESRCH
-The calling process called
-.Dv SIOCSTPUT
-before setting the
-.Dv SI_NEWFR
-flag and providing a pointer in the
-.Fa nat_fr
-field that cannot be found in the current rule set.
-.It Er EACESS
-The calling process issued a
-.Dv SIOCSTPUT
-before issuing a
-.Dv SIOCSTLCK .
-.El
-.Sh INTERFACE STABILITY
-Committed
-.Sh SEE ALSO
-.Xr ipfs 1M ,
-.Xr ipnat 1M ,
-.Xr ioctl 2 ,
-.Xr attributes 5