I'm sponsoring the following fast-track for Dan McDonald. Case times
out on 08/09/2007. Proposed release binding is Patch; it removes a
Project Private interface and introduces several Committed interfaces.
Title: "detangle" - Elimination of nattymod for IPsec NAT-Traversal, plus
new public interfaces for NAT-Traversal.
Description:
============
IPsec NAT Traversal (PSARC 2004/042) includes a nattymod STREAMS module
as a Project Private component, which intercepts inbound packets in the
kernel and shuffles them directly to ESP. This is tightly tied to our
IKE implementation and requires the use of undocumented and private
interfaces to plumb and initialize nattymod.
We have need for a Public interface to allow the use of NAT Traversal
with other key management daemons (see 6558864 and 6481450).
This project proposes to remove nattymod, and in its place add a Committed
interface to permit IPsec key management applications to enable
NAT-Traversal security associations they manage. The overall reduction in ON
code is approximately 575 lines (not including deleted Makefiles).
Interface Table:
================
Interface Commitment level Description
--------- ---------------- -----------
UDP_NAT_T_- Committed If applied to a UDP/IPv4 socket,
ENDPOINT outbound packets send via the socket
socket option will have the 0-SPI inserted and only
packets with a 0-SPI will be
delivered to the socket after it has
been stripped (per RFC 3948).
Also, non-0-SPI inbound packets will
be shuffled off to ESP for processing
if this socket option is enabled.
PF_KEY *_NATT_ Committed These will be better documented in
address exten- the pf_key(7P) man page to show
sions. how ESP-in-UDP SAs can be managed.
"nat_t_port" Project Private Test tool for UDP ports *other* than
ike.config(4) the specified UDP port 4500.
parameter.
NOTE: BOTH sides speaking IKE must
have matching nat_t_port settings for
this to work.
"ipsec-nat-t" Committed Per IANA. This should've been done
in /etc/services with 2004/042.
Documentation diffs:
====================
<Changes to pf_key(7P), udp(7P), ipsec(7P), and ipseckey(1M) will be needed,
and will be produced.>
pf_key(7P) additional text
--------------------------
The address extensions are represented with one to three
letters after the word "address," representing (S)RC, (D)ST,
(Nl)NAT-T local, (Nr)NAT-T remote, (Is)Inner source, and
(Id)Inner destination.
+ Source and destination address extensions reflect outer-header selectors
+ for an IPsec SA. An SA is inbound or outbound depending on which of
+ the source or destination address is local to the node. Inner-source
+ and inner-destination selectors represent inner-header selectors for
+ Tunnel Mode SAs. A Tunnel Mode SA MUST have in its outer-headers either
+ IPPROTO_ENCAP or IPPROTO_IPV6 as its protocol selector, in addition to
+ filled-in Inner-address extensions.
+
+ NAT-T local and NAT-T remote addresses store local and remote ports
+ used for ESP-in-UDP encapsulation. A non-zero local NAT-T address
+ extensions represents the local node's external IP address if it is not
+ equivalent to the SA's local address. A non-zero remote NAT-T address
+ represents a peer's behind-a-NAT address if it is not equivalent to the
+ SA's remote address. An SA with NAT-T extensions will be able to
+ protect-and-transmit outbound traffic. Processing of inbound NAT-T
+ traffic requires a UDP socket bound to the appropriate local port and it
+ MUST have the UDP_NAT_T_ENDPOINT (see udp(7P)) socket option enabled.
+
Note that when an error occurs, only the base header is
sent. Typical errors include:
<Add udp(7P) to SEE_ALSO.>
udp(7P) additional text
-----------------------
Options at the IP level may be used with UDP; see ip(7P) or
| ip6(7p). Additionally, there is one UDP-level option of interest
+ to IPsec Key Management applications (see ipsec(7P) and pf_key(7P):
+
+ UDP_NAT_T_ENDPOINT
+
+ If this boolean option is set, datagrams sent via this socket
+ will have a non-ESP marker inserted between the UDP header and
+ the data. Likewise, inbound packets that match the endpoint's
+ local-port will be demultiplexed between ESP or the endpoint itself
+ if a non-ESP marker is present. This option is only available on
+ IPv4 sockets (AF_INET), and the application must have sufficient
+ privilege to use PF_KEY sockets to also enable this option.
There are a variety of ways that a UDP packet can be lost or
<Add RFC 3948, pf_key(7P), and ipsec(7P) to SEE ALSO.>
ipsec(7P) additional text
-------------------------
NAT Traversal
IPsec's ESP can also encapsulate itself in UDP if IKE (see
in.iked(1M)) discovers a Network Address Translator (NAT)
between two communicating endpoints.
+ A UDP socket can be specified to be a NAT-Traversal endpoint.
+ See udp(7P) for details.
Security Associations
AH and ESP use Security Associations (SA). SA's are entities
<And add udp(7P) to the SEE ALSO list.>
ipseckey(1M)
------------
Replace nat_{loc,rem,lport,rport} keyword descriptions with these:
nat_loc <address>|<name>
If the local address in the SA (source or destination)
is behind a NAT, this extension indicates the NAT node's
globally-routable address.
This can match the SA's local address if there is a nat_lport (see
below) specified.
nat_rem <address>|<name>
If the remote address in the SA (source or destination)
is behind a NAT, this extension indicates that node's
internal (that is, behind-the-NAT) address.
This can match the SA's remote address if there is a nat_lport (see
below) specified.
nat_lport <portnum>
Identifies the local UDP port on which encapsulation of ESP occurs.
nat_rport <portnum>
Identifies the remote UDP port on which encapsulation of ESP occurs.