home | help
IPSEC(4)		     Kernel Interfaces Manual			IPSEC(4)

NAME
     IPsec -- Internet Protocol Security protocol

SYNOPSIS
     options IPSEC
     options IPSEC_FILTERTUNNEL
     device crypto

     #include <sys/types.h>
     #include <netinet/in.h>
     #include <netipsec/ipsec.h>
     #include <netipsec/ipsec6.h>

DESCRIPTION
     IPsec is a security protocol implemented within the Internet Protocol layer
     of  the  networking  stack.   IPsec  is  defined for both IPv4 and IPv6 and
     inet6(4)).  IPsec is a set of protocols, ESP  (for  Encapsulating	Security
     Payload)  AH  (for  Authentication Header), and IPComp (for IP Payload Com-
     pression Protocol) that provide security services	for  IP  datagrams.   AH
     both  authenticates and guarantees the integrity of an IP packet by attach-
     ing a cryptographic checksum computed using one-way hash  functions.   ESP,
     in  addition,  prevents unauthorized parties from reading the payload of an
     IP packet by also encrypting it.  IPComp tries  to  increase  communication
     performance  by  compressing  IP  payload, thus reducing the amount of data
     sent.  This will help nodes on slow links but with enough computing  power.
     IPsec  operates in one of two modes: transport mode or tunnel mode.  Trans-
     port mode is used to protect peer-to-peer communication between end  nodes.
     Tunnel mode encapsulates IP packets within other IP packets and is designed
     for security gateways such as VPN endpoints.

     System configuration requires the crypto(4) subsystem.

     The  packets can be passed to a virtual enc(4) interface, to perform packet
     filtering before outbound encryption and after decapsulation inbound.

     To properly filter on the inner packets of an IPsec tunnel with  firewalls,
     add options IPSEC_FILTERTUNNEL to the kernel configuration file.

   Kernel interface
     IPsec  is	controlled by a key management and policy engine, that reside in
     the operating system kernel.  Key management is the process of  associating
     keys  with security associations, also know as SAs.  Policy management dic-
     tates when new security associations created or destroyed.

     The key management engine can be accessed from  userland  by  using  PF_KEY
     sockets.  The PF_KEY socket API is defined in RFC2367.

     The policy engine is controlled by an extension to the PF_KEY API, setsock-
     opt(2)  operations,  and sysctl(3) interface.  The kernel implements an ex-
     tended version of the PF_KEY interface and allows the programmer to  define
     IPsec  policies  which are similar to the per-packet filters.  The setsock-
     opt(2) interface is used to define per-socket behavior, and  sysctl(3)  in-
     terface is used to define host-wide default behavior.

     The kernel code does not implement a dynamic encryption key exchange proto-
     col such as IKE (Internet Key Exchange).  Key exchange protocols are beyond
     what  is  necessary  in  the  kernel  and	should	be implemented as daemon
     processes which call the APIs.

   Policy management
     IPsec policies can be managed in one of two  ways,  either  by  configuring
     per-socket policies using the setsockopt(2) system calls, or by configuring
     kernel  level  packet filter-based policies using the PF_KEY interface, via
     the setkey(8) you can define IPsec policies  against  packets  using  rules
     similar to packet filtering rules.  Refer to setkey(8) on how to use it.

     When setting policies using the setkey(8) command, the "default" option in-
     structs  the system to use its default policy, as explained below, for pro-
     cessing packets.  The following sysctl variables are available for  config-
     uring  the system's IPsec behavior.  The variables can have one of two val-
     ues.  A 1 means "use", which means that if there is a security  association
     then  use	it  but  if  there  is not then the packets are not processed by
     IPsec.  The value 2 is synonymous with "require", which requires that a se-
     curity association must exist for the packets to move, and not be	dropped.
     These terms are defined in ipsec_set_policy(8).

     Name				  Type		Changeable
     net.inet.ipsec.esp_trans_deflev	  integer	yes
     net.inet.ipsec.esp_net_deflev	  integer	yes
     net.inet.ipsec.ah_trans_deflev	  integer	yes
     net.inet.ipsec.ah_net_deflev	  integer	yes
     net.inet6.ipsec6.esp_trans_deflev	  integer	yes
     net.inet6.ipsec6.esp_net_deflev	  integer	yes
     net.inet6.ipsec6.ah_trans_deflev	  integer	yes
     net.inet6.ipsec6.ah_net_deflev	  integer	yes

     If  the  kernel  does not find a matching, system wide, policy then the de-
     fault value is applied.  The system wide default policy is specified by the
     following sysctl(8) variables.  0 means "discard" which asks the kernel  to
     drop the packet.  1 means "none".

     Name			    Type	  Changeable
     net.inet.ipsec.def_policy	    integer	  yes
     net.inet6.ipsec6.def_policy    integer	  yes

   Miscellaneous sysctl variables
     When the IPsec protocols are configured for use, all protocols are included
     in the system.  To selectively enable/disable protocols, use sysctl(8).

     Name			      Default
     net.inet.esp.esp_enable	      On
     net.inet.ah.ah_enable	      On
     net.inet.ipcomp.ipcomp_enable    Off

     In  addition  the	following  variables  are  accessible via sysctl(8), for
     tweaking the kernel's IPsec behavior:

     Name				  Type		Changeable
     net.inet.ipsec.ah_cleartos 	  integer	yes
     net.inet.ipsec.ah_offsetmask	  integer	yes
     net.inet.ipsec.dfbit		  integer	yes
     net.inet.ipsec.ecn 		  integer	yes
     net.inet.ipsec.debug		  integer	yes
     net.inet6.ipsec6.ecn		  integer	yes
     net.inet6.ipsec6.debug		  integer	yes

     The variables are interpreted as follows:

     ipsec.ah_cleartos
	     If set to non-zero, the kernel clears the type-of-service field  in
	     the  IPv4	header	during AH authentication data computation.  This
	     variable is used to get current systems to inter-operate  with  de-
	     vices  that  implement  RFC1826  AH.   It should be set to non-zero
	     (clear the type-of-service field) for RFC2402 conformance.

     ipsec.ah_offsetmask
	     During AH authentication data computation, the kernel will  include
	     a	16bit  fragment  offset  field (including flag bits) in the IPv4
	     header, after computing logical AND with the variable.   The  vari-
	     able  is  used  for  inter-operating  with  devices  that implement
	     RFC1826 AH.  It should be set to zero (clear  the	fragment  offset
	     field during computation) for RFC2402 conformance.

     ipsec.dfbit
	     This  variable  configures the kernel behavior on IPv4 IPsec tunnel
	     encapsulation.  If set to 0, the DF bit on the  outer  IPv4  header
	     will  be cleared while 1 means that the outer DF bit is set regard-
	     less from the inner DF bit and 2  indicates  that	the  DF  bit  is
	     copied  from  the	inner  header to the outer one.  The variable is
	     supplied to conform to RFC2401 chapter 6.1.

     ipsec.ecn
	     If set to non-zero, IPv4 IPsec  tunnel  encapsulation/decapsulation
	     behavior  will  be  friendly  to ECN (explicit congestion notifica-
	     tion), as documented in draft-ietf-ipsec-ecn-02.txt.  gif(4)  talks
	     more about the behavior.

     ipsec.debug
	     If set to non-zero, debug messages will be generated via syslog(3).

     Variables	under  the  net.inet6.ipsec6 tree have similar meanings to those
     described above.

PROTOCOLS
     The IPsec protocol acts as a plug-in to the inet(4) and inet6(4)  protocols
     and  therefore  supports  most of the protocols defined upon those IP-layer
     protocols.  The icmp(4) and icmp6(4) protocols may behave differently  with
     IPsec  because  IPsec can prevent icmp(4) or icmp6(4) routines from looking
     into the IP payload.

SEE ALSO
     ioctl(2), socket(2), ipsec_set_policy(3), crypto(4), enc(4), icmp6(4),  in-
     tro(4), ip6(4), setkey(8), sysctl(8)

     S. Kent and R. Atkinson, IP Authentication Header, RFC 2404.

     S. Kent and R. Atkinson, IP Encapsulating Security Payload (ESP), RFC 2406.

STANDARDS
     Daniel L. McDonald, Craig Metz, and Bao G. Phan, PF_KEY Key Management API,
     Version 2, RFC, 2367.

     D. L. McDonald, A Simple IP Security API Extension to BSD Sockets, internet
     draft, draft-mcdonald-simple-ipsec-api-03.txt, work in progress material.

HISTORY
     The  original  IPsec  implementation  appeared  in the WIDE/KAME IPv6/IPsec
     stack.

     For FreeBSD 5.0 a fully locked IPsec implementation called  fast_ipsec  was
     brought  in.   The  protocols drew heavily on the OpenBSD implementation of
     the IPsec protocols.  The policy management code was derived from the  KAME
     implementation  found in their IPsec protocols.  The fast_ipsec implementa-
     tion lacked ip6(4) support but made use of the crypto(4) subsystem.

     For FreeBSD 7.0 ip6(4) support was added to fast_ipsec.  After this the old
     KAME IPsec implementation was dropped and fast_ipsec became what now is the
     only IPsec implementation in FreeBSD.

BUGS
     There is no single standard for the policy engine API, so the policy engine
     API described herein is just for this implementation.

     AH and tunnel mode encapsulation may not work as you might expect.  If  you
     configure	inbound "require" policy with an AH tunnel or any IPsec encapsu-
     lating policy with AH (like "esp/tunnel/A-B/use ah/transport/A-B/require"),
     tunnelled packets will be rejected.  This is because the  policy  check  is
     enforced on the inner packet on reception, and AH authenticates encapsulat-
     ing (outer) packet, not the encapsulated (inner) packet (so for the receiv-
     ing  kernel  there  is  no sign of authenticity).	The issue will be solved
     when we revamp our policy engine to keep all the packet decapsulation  his-
     tory.

     When  a  large  database of security associations or policies is present in
     the kernel the SADB_DUMP and SADB_SPDDUMP operations on PF_KEY sockets  may
     fail due to lack of space.  Increasing the socket buffer size may alleviate
     this problem.

     The IPcomp protocol support is currently broken.

     This documentation needs more review.

FreeBSD 7.0			 August 5, 2007 			IPSEC(4)

home | help