Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

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

NAME
       ipsec --	Internet Protocol Security protocol

SYNOPSIS
       options IPSEC
       options IPSEC_SUPPORT
       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
       (inet(4)	and inet6(4)).	ipsec is a set of protocols, ESP (for Encapsu-
       lating Security Payload)	AH (for	 Authentication	 Header),  and	IPComp
       (for  IP	 Payload  Compression Protocol)	that provide security services
       for IP datagrams.  AH both authenticates	and guarantees	the  integrity
       of  an  IP  packet by attaching a cryptographic checksum	computed using
       one-way hash functions.	ESP, in	addition, prevents  unauthorized  par-
       ties  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.  Transport mode is used to
       protect	peer-to-peer communication between end nodes.  Tunnel mode en-
       capsulates IP packets within other IP packets and is designed for secu-
       rity 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 in-
       bound.

       To  properly  filter on the inner packets of an ipsec tunnel with fire-
       walls, you can change the values	of the following sysctls

       Name				Default	   Enable
       net.inet.ipsec.filtertunnel	0	   1
       net.inet6.ipsec6.filtertunnel	0	   1

   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 asso-
       ciating keys with security associations,	also know as SAs.  Policy man-
       agement dictates	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,
       setsockopt(2) operations, and sysctl(3) interface.  The	kernel	imple-
       ments  an  extended version of the PF_KEY interface and allows the pro-
       grammer to define IPsec policies	which are similar  to  the  per-packet
       filters.	  The setsockopt(2) interface is used to define	per-socket be-
       havior, and sysctl(3) interface is used to define host-wide default be-
       havior.

       The kernel code does not	implement a dynamic  encryption	 key  exchange
       protocol	 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 config-
       uring kernel level packet filter-based policies using the PF_KEY	inter-
       face, 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.

       Depending on the	socket's address family,  IPPROTO_IP  or  IPPROTO_IPV6
       transport level and IP_IPSEC_POLICY or IPV6_IPSEC_POLICY	socket options
       may  be	used  to  configure per-socket security	policies.  A properly-
       formed IPsec  policy  specification  structure  can  be	created	 using
       ipsec_set_policy(3)  function  and  used	as socket option value for the
       setsockopt(2) call.

       When setting policies using the setkey(8) command, the "default"	option
       instructs the system to use its default policy, as explained below, for
       processing packets.  The	following sysctl variables are	available  for
       configuring the system's	IPsec behavior.	 The variables can have	one of
       two  values.   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 security	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
       default	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  in-
       cluded  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	On

       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.inet.ipsec.natt_cksum_policy	    integer	  yes
       net.inet.ipsec.check_policy_history  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  devices  that  implement RFC1826 AH.  It should be	set to
	       non-zero	(clear the type-of-service field) for RFC2402  confor-
	       mance.

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

       ipsec.dfbit
	       This variable configures	the kernel behavior on IPv4 IPsec tun-
	       nel  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  regardless	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/decapsula-
	       tion behavior will be friendly to ECN (explicit congestion  no-
	       tification),   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).

       ipsec.natt_cksum_policy
	       Controls	 how the kernel	handles	TCP and	UDP checksums when ESP
	       in UDP encapsulation is used for	IPsec transport	mode.  If  set
	       to  a non-zero value, the kernel	fully recomputes checksums for
	       inbound TCP segments and	UDP datagrams after they are  decapsu-
	       lated  and  decrypted.  If set to 0 and original	addresses were
	       configured for corresponding SA by the IKE daemon,  the	kernel
	       incrementally recomputes	checksums for inbound TCP segments and
	       UDP datagrams.  If addresses were not configured, the checksums
	       are ignored.

       ipsec.check_policy_history
	       Enables	strict	policy	checking  for inbound packets.	By de-
	       fault, inbound security policies	check that packets handled  by
	       IPsec  have been	decrypted and authenticated.  If this variable
	       is set to a non-zero value, each	packet	handled	 by  IPsec  is
	       checked	against	 the  history  of IPsec	security associations.
	       The IPsec security protocol, mode, and SA addresses must	match.

       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)	proto-
       cols  and  therefore  supports most of the protocols defined upon those
       IP-layer	protocols.  The	icmp(4)	and icmp6(4) protocols may behave dif-
       ferently	with ipsec because ipsec can prevent icmp(4) or	icmp6(4)  rou-
       tines from looking into the IP payload.

SEE ALSO
       ioctl(2),    socket(2),	  ipsec_set_policy(3),	  crypto(4),   enc(4),
       if_ipsec(4), icmp6(4), intro(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  implementa-
       tion  of	 the  IPsec protocols.	The policy management code was derived
       from the	KAME implementation  found  in	their  IPsec  protocols.   The
       fast_ipsec  implementation  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
       encapsulating	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	recep-
       tion, and AH authenticates encapsulating	(outer)	packet,	not the	encap-
       sulated (inner) packet (so for the receiving kernel there is no sign of
       authenticity).	The issue will be solved when we revamp	our policy en-
       gine to keep all	the packet decapsulation history.

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

       The IPcomp protocol may occasionally error because of zlib(3) problems.

       This documentation needs	more review.

FreeBSD	13.2		       February	6, 2017			      IPSEC(4)

NAME | SYNOPSIS | DESCRIPTION | PROTOCOLS | SEE ALSO | STANDARDS | HISTORY | BUGS

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=ipsec&sektion=4&manpath=FreeBSD+14.2-RELEASE+and+Ports>

home | help