.\" $NetBSD: ipsec_set_policy.3,v 1.13 2006/09/09 16:22:09 manu Exp $
|
.\"
|
.\" $KAME: ipsec_set_policy.3,v 1.16 2003/01/06 21:59:03 sumikawa Exp $
|
.\"
|
.\" Copyright (C) 1995, 1996, 1997, 1998, and 1999 WIDE Project.
|
.\" All rights reserved.
|
.\"
|
.\" Redistribution and use in source and binary forms, with or without
|
.\" modification, are permitted provided that the following conditions
|
.\" are met:
|
.\" 1. Redistributions of source code must retain the above copyright
|
.\" notice, this list of conditions and the following disclaimer.
|
.\" 2. Redistributions in binary form must reproduce the above copyright
|
.\" notice, this list of conditions and the following disclaimer in the
|
.\" documentation and/or other materials provided with the distribution.
|
.\" 3. Neither the name of the project nor the names of its contributors
|
.\" may be used to endorse or promote products derived from this software
|
.\" without specific prior written permission.
|
.\"
|
.\" THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
|
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
.\" ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
|
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
.\" SUCH DAMAGE.
|
.\"
|
.Dd May 5, 1998
|
.Dt IPSEC_SET_POLICY 3
|
.Os
|
.Sh NAME
|
.Nm ipsec_set_policy ,
|
.Nm ipsec_get_policylen ,
|
.Nm ipsec_dump_policy
|
.Nd manipulate IPsec policy specification structure from human-readable policy string
|
.\"
|
.Sh LIBRARY
|
.Lb libipsec
|
.Sh SYNOPSIS
|
.In netinet6/ipsec.h
|
.Ft "char *"
|
.Fn ipsec_set_policy "char *policy" "int len"
|
.Ft int
|
.Fn ipsec_get_policylen "char *buf"
|
.Ft "char *"
|
.Fn ipsec_dump_policy "char *buf" "char *delim"
|
.Sh DESCRIPTION
|
.Fn ipsec_set_policy
|
generates an IPsec policy specification structure, namely
|
.Li struct sadb_x_policy
|
and/or
|
.Li struct sadb_x_ipsecrequest
|
from a human-readable policy specification.
|
The policy specification must be given as a C string
|
.Fa policy
|
and its length
|
.Fa len .
|
.Fn ipsec_set_policy
|
will return a buffer with the corresponding IPsec policy specification structure.
|
The buffer is dynamically allocated, and must be
|
.Xr free 3 Ap d
|
by the caller.
|
.Pp
|
You can get the length of the generated buffer with
|
.Fn ipsec_get_policylen
|
(i.e. for calling
|
.Xr setsockopt 2 ) .
|
.Pp
|
.Fn ipsec_dump_policy
|
converts an IPsec policy structure into human-readable form.
|
Therefore,
|
.Fn ipsec_dump_policy
|
can be regarded as the inverse function to
|
.Fn ipsec_set_policy .
|
.Fa buf
|
points to an IPsec policy structure,
|
.Li struct sadb_x_policy .
|
.Fa delim
|
is a delimiter string, which is usually a blank character.
|
If you set
|
.Fa delim
|
to
|
.Dv NULL ,
|
a single whitespace is assumed.
|
.Fn ipsec_dump_policy
|
returns a pointer to a dynamically allocated string.
|
It is the caller's responsibility to
|
.Xr free 3
|
it.
|
.Pp
|
.Fa policy
|
is formatted as either of the following:
|
.Bl -tag -width "discard"
|
.It Ar direction [priority specification] Li discard
|
.Ar direction
|
must be
|
.Li in ,
|
.Li out ,
|
or
|
.Li fwd .
|
.Ar direction
|
specifies in which direction the policy needs to be applied.
|
The non-standard direction
|
.Li fwd
|
is substituted with
|
.Li in
|
on platforms which do not support forward policies.
|
.Pp
|
.Ar priority specification
|
is used to control the placement of the policy within the SPD.
|
The policy position is determined by
|
a signed integer where higher priorities indicate the policy is placed
|
closer to the beginning of the list and lower priorities indicate the
|
policy is placed closer to the end of the list.
|
Policies with equal
|
priorities are added at the end of the group of such policies.
|
.Pp
|
Priority can only
|
be specified when libipsec has been compiled against kernel headers that
|
support policy priorities (Linux \*[Gt]= 2.6.6).
|
It takes one of the following formats:
|
.Bl -tag -width "discard"
|
.It Xo
|
.Ar {priority,prio} offset
|
.Xc
|
.Ar offset
|
is an integer in the range -2147483647..214783648.
|
.It Xo
|
.Ar {priority,prio} base {+,-} offset
|
.Xc
|
.Ar base
|
is either
|
.Li low (-1073741824) ,
|
.Li def (0) ,
|
or
|
.Li high (1073741824) .
|
.Pp
|
.Ar offset
|
is an unsigned integer.
|
It can be up to 1073741824 for
|
positive offsets, and up to 1073741823 for negative offsets.
|
.El
|
.Pp
|
The interpretation of policy priority in these functions and the
|
kernel DOES differ.
|
The relationship between the two can be described as
|
p(kernel) = 0x80000000 - p(func)
|
.Pp
|
With
|
.Li discard
|
policy, packets will be dropped if they match the policy.
|
.It Ar direction [priority specification] Li entrust
|
.Li entrust
|
means to consult the SPD defined by
|
.Xr setkey 8 .
|
.It Ar direction [priority specification] Li bypass
|
.Li bypass
|
means to bypass the IPsec processing.
|
.Pq the packet will be transmitted in clear .
|
This is for privileged sockets.
|
.It Xo
|
.Ar direction
|
.Bq Ar priority specification
|
.Li ipsec
|
.Ar request ...
|
.Xc
|
.Li ipsec
|
means that the matching packets are subject to IPsec processing.
|
.Li ipsec
|
can be followed by one or more
|
.Ar request
|
strings, which are formatted as below:
|
.Bl -tag -width "discard"
|
.It Xo
|
.Ar protocol
|
.Li /
|
.Ar mode
|
.Li /
|
.Ar src
|
.Li -
|
.Ar dst
|
.Op Ar /level
|
.Xc
|
.Ar protocol
|
is either
|
.Li ah ,
|
.Li esp ,
|
or
|
.Li ipcomp .
|
.Pp
|
.Ar mode
|
is either
|
.Li transport
|
or
|
.Li tunnel .
|
.Pp
|
.Ar src
|
and
|
.Ar dst
|
specifies the IPsec endpoint.
|
.Ar src
|
always means the
|
.Dq sending node
|
and
|
.Ar dst
|
always means the
|
.Dq receiving node .
|
Therefore, when
|
.Ar direction
|
is
|
.Li in ,
|
.Ar dst
|
is this node
|
and
|
.Ar src
|
is the other node
|
.Pq peer .
|
If
|
.Ar mode
|
is
|
.Li transport ,
|
Both
|
.Ar src
|
and
|
.Ar dst
|
can be omitted.
|
.Pp
|
.Ar level
|
must be set to one of the following:
|
.Li default , use , require ,
|
or
|
.Li unique .
|
.Li default
|
means that the kernel should consult the system default policy
|
defined by
|
.Xr sysctl 8 ,
|
such as
|
.Li net.inet.ipsec.esp_trans_deflev .
|
See
|
.Xr ipsec 4
|
regarding the system default.
|
.Li use
|
means that a relevant SA can be used when available,
|
since the kernel may perform IPsec operation against packets when possible.
|
In this case, packets can be transmitted in clear
|
.Pq when SA is not available ,
|
or encrypted
|
.Pq when SA is available .
|
.Li require
|
means that a relevant SA is required,
|
since the kernel must perform IPsec operation against packets.
|
.Li unique
|
is the same as
|
.Li require ,
|
but adds the restriction that the SA for outbound traffic is used
|
only for this policy.
|
You may need the identifier in order to relate the policy and the SA
|
when you define the SA by manual keying.
|
You can put the decimal number as the identifier after
|
.Li unique
|
like
|
.Li unique : number .
|
.Li number
|
must be between 1 and 32767 .
|
If the
|
.Ar request
|
string is kept unambiguous,
|
.Ar level
|
and slash prior to
|
.Ar level
|
can be omitted.
|
However, it is encouraged to specify them explicitly
|
to avoid unintended behavior.
|
If
|
.Ar level
|
is omitted, it will be interpreted as
|
.Li default .
|
.El
|
.Pp
|
Note that there are slight differences to the specification of
|
.Xr setkey 8 .
|
In the specification of
|
.Xr setkey 8 ,
|
both
|
.Li entrust
|
and
|
.Li bypass
|
are not used.
|
Refer to
|
.Xr setkey 8
|
for details.
|
.Pp
|
Here are several examples
|
.Pq long lines are wrapped for readability :
|
.Bd -literal -offset indent
|
in discard
|
out ipsec esp/transport//require
|
in ipsec ah/transport//require
|
out ipsec esp/tunnel/10.1.1.2-10.1.1.1/use
|
in ipsec ipcomp/transport//use
|
esp/transport//use
|
.Ed
|
.El
|
.Sh RETURN VALUES
|
.Fn ipsec_set_policy
|
returns a pointer to the allocated buffer with the policy specification
|
if successful; otherwise a
|
.Dv NULL
|
pointer is returned.
|
.Fn ipsec_get_policylen
|
returns a positive value
|
.Pq meaning the buffer size
|
on success, and a negative value on errors.
|
.Fn ipsec_dump_policy
|
returns a pointer to a dynamically allocated region on success,
|
and
|
.Dv NULL
|
on errors.
|
.Sh SEE ALSO
|
.Xr ipsec_strerror 3 ,
|
.Xr ipsec 4 ,
|
.Xr setkey 8
|
.Sh HISTORY
|
The functions first appeared in the WIDE/KAME IPv6 protocol stack kit.
|