One document matched: draft-ietf-behave-rfc3489bis-16.xml
<?xml version="1.0" encoding="US-ASCII"?>
<!DOCTYPE rfc SYSTEM "rfc2629.dtd">
<?rfc toc='yes'?>
<?rfc tocdepth='5'?>
<?rfc compact='yes'?>
<?rfc subcompact='no'?>
<?rfc symrefs="yes"?>
<rfc category="std" docName="draft-ietf-behave-rfc3489bis-16" ipr="full3978"
obsoletes="3489">
<!-- 484 handling?? -->
<!-- keepalive usage - should you decrease the refresh interval if you
are seeing changed IP addresses? what about attacks? -->
<!-- DNS open issue -->
<!-- for -06, from list, change padding for unknown attributes to
match everythign else. I.e., pad with zeroes and length indicates
number of valid things -->
<!-- Just email reminder that bis client will fail on trying to use 3489
server if the 3489 server follows the MUST insert CHANGED-ADDRESS, so
need to add text to ignore that one. Indeed need to ignore all of the
Comprehension-Required attributes -->
<!-- brian hibbard - clarify usage of nonces with short term
credentials -->
<!-- for -06 - need to clarify that when computing the FINGERPRINT
attribute, the length in the STUN message header is the length of the
message include the fingerprint itself. Kevin Johns, 1/11/07 -->
<!-- for -06, clarify what error responses are unrecoverable, make
sure its exhaustive -->
<front>
<title abbrev="STUN">Session Traversal Utilities for (NAT) (STUN)</title>
<author fullname="Jonathan Rosenberg" initials="J.R." surname="Rosenberg">
<organization>Cisco</organization>
<address>
<postal>
<city>Edison</city>
<region>NJ</region>
<country>US</country>
</postal>
<email>jdrosen@cisco.com</email>
<uri>http://www.jdrosen.net</uri>
</address>
</author>
<author fullname="Rohan Mahy" initials="R.M." surname="Mahy">
<organization>Plantronics</organization>
<address>
<postal>
<street>345 Encinal Street</street>
<city>Santa Cruz</city>
<region>CA</region>
<code>95060</code>
<country>US</country>
</postal>
<email>rohan@ekabal.com</email>
</address>
</author>
<author fullname="Philip Matthews" initials="P." surname="Matthews">
<organization>Avaya</organization>
<address>
<postal>
<street>1135 Innovation Drive</street>
<city>Ottawa</city>
<region>Ontario</region>
<code>K2K 3G7</code>
<country>Canada</country>
</postal>
<phone>+1 613 592 4343 x224</phone>
<facsimile></facsimile>
<email>philip_matthews@magma.ca</email>
<uri></uri>
</address>
</author>
<author fullname="Dan Wing" initials="D" surname="Wing">
<organization>Cisco</organization>
<address>
<postal>
<street>771 Alder Drive</street>
<city>San Jose</city>
<region>CA</region>
<code>95035</code>
<country>US</country>
</postal>
<email>dwing@cisco.com</email>
</address>
</author>
<date year="2008" />
<area>Transport</area>
<workgroup>BEHAVE Working Group</workgroup>
<keyword>SIPs</keyword>
<keyword>NAT</keyword>
<abstract>
<t>Session Traversal Utilities for NAT (STUN) is a protocol that serves
as a tool for other protocols in dealing with NAT traversal. It
can be used by an endpoint to determine the IP address and port allocated to it
by a NAT. It can also be used to check
connectivity between two endpoints, and as a keep-alive protocol to
maintain NAT bindings. STUN works with many existing NATs, and does not
require any special behavior from them.</t>
<t>STUN is not a NAT traversal solution by itself. Rather, it
is a tool to be used in the context of a NAT traversal solution. This is
an important change from the previous version of this specification
(RFC 3489), which presented STUN as a complete solution.</t>
<t>This document obsoletes RFC 3489.</t>
</abstract>
</front>
<middle>
<section title="Introduction">
<t>The protocol defined in this specification, Session Traversal
Utilities for NAT, provides a tool for dealing with
NATs. It provides a means for an endpoint to determine the IP address
and port allocated by a NAT that corresponds to its private IP address
and port. It also provides a way for an endpoint to keep a NAT binding
alive. With some extensions, the protocol can be used to do
connectivity checks between two endpoints
<xref target="I-D.ietf-mmusic-ice"/>, or to relay packets between two
endpoints <xref target="I-D.ietf-behave-turn"/>.</t>
<t>In keeping
with its tool nature, this specification defines an extensible
packet format, defines operation over several transport protocols,
and provides for two forms of authentication.
</t>
<t>STUN is intended to be used in context of one or more NAT
traversal solutions. These solutions are known as STUN
usages. Each usage describes how STUN is utilized to achieve
the NAT traversal solution. Typically, a usage indicates when
STUN messages get sent, which optional attributes to include,
what server is used, and what authentication mechanism is to
be used. Interactive Connectivity Establishment (ICE)
<xref target="I-D.ietf-mmusic-ice"/> is one usage of STUN. SIP
Outbound <xref target="I-D.ietf-sip-outbound"/> is another
usage of STUN. In some cases, a usage will require extensions
to STUN. A STUN extension can be in the form of new methods,
attributes, or error response codes. More information on STUN
usages can be found in <xref target="usages"/>.</t>
</section>
<section title="Evolution from RFC 3489">
<t>STUN was originally defined in RFC 3489
<xref target="RFC3489"/>. That specification, sometimes referred
to as "classic STUN", represented itself as a complete
solution to the NAT traversal problem. In that solution, a
client would discover whether it was behind a NAT, determine its
NAT type, discover its IP address and port on the public side of
the outermost NAT, and then utilize that IP address and port
within the body of protocols, such as the Session Initiation
Protocol (SIP) <xref target="RFC3261"/>. However, experience
since the publication of RFC 3489 has found that classic STUN simply does
not work sufficiently well to be a deployable solution. The
address and port learned through classic STUN are sometimes usable for
communications with a peer, and sometimes not. Classic STUN provided no
way to discover whether it would, in fact, work or
not, and it provided no remedy in cases where it did
not. Furthermore, classic STUN's algorithm for classification of NAT
types was found to be faulty, as many NATs did not fit cleanly
into the types defined there.
</t>
<t>
Classic STUN also had a security vulnerability - attackers
could provide the client with incorrect mapped addresses under
certain topologies and constraints, and this was fundamentally
not solvable through any cryptographic means. Though this
problem remains with this specification, those attacks are now
mitigated through the use of more complete solutions that make
use of STUN.
</t>
<t>
For these reasons, this specification obsoletes RFC 3489, and
instead describes STUN as a tool that is utilized as part of a
complete NAT traversal solution. ICE
<xref target="I-D.ietf-mmusic-ice"/> is a complete NAT
traversal solution for protocols based on the offer/answer
<xref target="RFC3264"/> methodology, such as SIP. SIP
Outbound <xref target="I-D.ietf-sip-outbound"/> is a complete
solution for traversal of SIP signaling, and it uses STUN in a
very different way. Though it is possible that a protocol may
be able to use STUN by itself (classic STUN) as a traversal
solution, such usage is not described here and is strongly
discouraged for the reasons described above.
</t>
<t>
The on-the-wire protocol described here is changed only
slightly from classic STUN. The protocol now runs over TCP in
addition to UDP. Extensibility was added to the protocol in a
more structured way. A magic-cookie mechanism for
demultiplexing STUN with application protocols was added by
stealing 32 bits from the 128 bit transaction ID defined in
RFC 3489, allowing the change to be backwards
compatible. Mapped addresses are encoded using a new
exclusive-or format. There are other, more minor changes. See
<xref target="sec-changes"/> for a more complete listing.
</t>
<t>
Due to the change in scope, STUN has also been renamed from
"Simple Traversal of UDP Through NAT" to "Session Traversal
Utilities for NAT". The acronym remains STUN, which is all
anyone ever remembers anyway.
</t>
</section>
<section title="Overview of Operation" anchor="sec:overview">
<t>This section is descriptive only.</t>
<figure anchor="fig:typical_stun_server"
title="One possible STUN Configuration">
<preamble></preamble>
<artwork align="center"><![CDATA[
/-----\
// STUN \\
| Server |
\\ //
\-----/
+--------------+ Public Internet
................| NAT 2 |.......................
+--------------+
+--------------+ Private NET 2
................| NAT 1 |.......................
+--------------+
/-----\
// STUN \\
| Client |
\\ // Private NET 1
\-----/
]]></artwork>
<postamble></postamble>
</figure>
<t>One possible STUN configuration is shown in Figure 1. In this configuration,
there are two entities (called STUN agents) that implement the STUN protocol.
The lower agent in the figure is the client, and is connected to
private network 1.
This network connects to private network
2 through NAT 1. Private network 2 connects to the public Internet
through NAT 2. The upper agent in the figure is the server, and resides on the public Internet.</t>
<t>STUN is a client-server protocol. It supports two types of
transactions. One is a request/response transaction in which a client
sends a request to a server, and the server returns a response. The
second is an indication transaction in which either agent -
client or server - sends an indication which generates no
response. Both types of transactions
include a transaction ID, which is a randomly selected 96-bit number.
For request/response
transactions, this transaction ID allows the client to associate the response
with the request that generated it; for indications, this simply serves
as a debugging aid.</t>
<t>All STUN messages start with a fixed header that includes a
method, a class, and the transaction ID. The method indicates
which of the various requests or indications this is; this
specification defines just one method, Binding, but other methods are
expected to be defined in other documents. The class indicates
whether this is a request, a success response, an error
response, or an indication. Following the fixed header comes
zero or more attributes, which are type-length-value extensions
that convey additional information for the specific message.</t>
<t>This document defines a single method called Binding. The
Binding method can be used either in request/response
transactions or in indication transactions. When used in
request/response transactions, the Binding method can be used to
determine the particular "binding" a NAT has allocated to a STUN
client. When used in either request/response or in indication
transactions, the Binding method can also be used to keep these
"bindings" alive.</t>
<t>In the Binding request/response transaction, a Binding
Request is sent from a STUN client to a STUN server. When the
Binding Request arrives at the STUN server, it may have passed
through one or more NATs between the STUN client and the STUN
server (in
<xref target="fig:typical_stun_server"></xref>, there were two
such NATs). As the Binding Request message passes through a NAT,
the NAT will modify the source transport address (that is, the
source IP address and the source port) of the packet. As a
result, the source transport address of the request received by
the server will be the public IP address and port created by the
NAT closest to the server. This is called a reflexive transport
address. The STUN server copies that source transport address
into an XOR-MAPPED-ADDRESS attribute in the STUN Binding
Response and sends the Binding Response back to the STUN
client. As this packet passes back through a NAT, the NAT will
modify the destination transport address in the IP header, but
the transport address in the XOR-MAPPED-ADDRESS attribute within
the body of the STUN response will remain untouched. In this
way, the client can learn its reflexive transport address
allocated by the outermost NAT with respect to the STUN
server.</t>
<t>In some usages, STUN must be multiplexed with other protocols
(e.g., <xref target="I-D.ietf-mmusic-ice"/>,
<xref target="I-D.ietf-sip-outbound"/>). In these usages, there
must be a way to inspect a packet and determine if it is a STUN
packet or not. STUN provides three fields in the STUN header with
fixed values that can be used for this purpose. If this is not
sufficient, then STUN packets can also contain a FINGERPRINT
value which can further be used to distinguish the packets.</t>
<t>STUN defines a set of optional procedures that a usage can
decide to use, called mechanisms. These mechanisms include DNS
discovery, a redirection technique to an alternate server, a
fingerprint attribute for demultiplexing, and two authentication
and message integrity exchanges. The authentication mechanisms
revolve around the use of a username, password, and
message-integrity value. Two authentication mechanisms, the long-term
credential mechanism and the short-term credential mechanism,
are defined in this specification. Each usage specifies the
mechanisms allowed with that usage.</t>
<t>In the long-term credential mechanism, the client and server
share a pre-provisioned username and password and perform a
digest challenge/response exchange inspired by (but differing
in details) to the one defined for HTTP
<xref target="RFC2617"/>. In the short-term credential
mechanism, the client and the server exchange a username and
password through some out-of-band method prior to the STUN
exchange. For example, in the ICE usage
<xref target="I-D.ietf-mmusic-ice"/> the two endpoints use
out-of-band signaling to exchange a username and
password. These are used to integrity protect and authenticate
the request and response. There is no challenge or nonce
used. </t>
</section>
<section title="Terminology">
<t>In this document, the key words "MUST", "MUST NOT", "REQUIRED",
"SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and
"OPTIONAL" are to be interpreted as described in <xref
target="RFC2119">BCP 14, RFC 2119</xref> and indicate requirement levels
for compliant STUN implementations.</t>
</section>
<section title="Definitions">
<list style="hanging">
<t hangText="STUN Agent:">An entity that implements the STUN
protocol. The entity can either be a STUN client or a STUN
server. </t>
<t hangText="STUN Client:">A STUN client is an entity that
sends STUN requests, and receives STUN responses. STUN clients
can also send indications. In this specification, the terms
STUN client and client are synonymous.
</t>
<t hangText="STUN Server:">
A STUN server is an entity that receives STUN requests and
sends STUN responses. A STUN server can also send
indications. In this specification, the terms STUN server and
server are synonymous.
</t>
<t hangText="Transport Address:">The combination of an IP address and
port number (such as a UDP or TCP port number).</t>
<t hangText="Reflexive Transport Address:">A transport address learned
by a client that identifies that client as seen by another host on an
IP network, typically a STUN server. When there is an intervening NAT
between the client and the other host, the reflexive transport address
represents the mapped address allocated to the client on the public
side of the NAT. Reflexive transport addresses are learned from the
mapped address attribute (MAPPED-ADDRESS or XOR-MAPPED-ADDRESS) in
STUN responses.</t>
<t hangText="Mapped Address:">Same meaning as Reflexive Address. This
term is retained only for for historic reasons and due to the naming
of the MAPPED-ADDRESS and XOR-MAPPED-ADDRESS attributes.</t>
<t hangText="Long Term Credential:">A username and associated password
that represent a shared secret between client and server. Long term
credentials are generally granted to the client when a subscriber
enrolls in a service and persist until the subscriber leaves the
service or explicitly changes the credential.</t>
<t hangText="Long Term Password:">The password from a long term
credential.</t>
<t hangText="Short Term Credential:">A temporary username and
associated password which represent a shared secret between
client and server. Short term credentials are obtained through
some kind of protocol mechanism between the client and server,
preceding the STUN exchange. A short term credential has an
explicit temporal scope, which may be based on a specific
amount of time (such as 5 minutes) or on an event (such as
termination of a SIP dialog). The specific scope of a short
term credential is defined by the application usage. </t>
<t hangText="Short Term Password:">The password component of a short
term credential.</t>
<t hangText="STUN Indication:">A STUN message that does not receive a
response</t>
<t hangText="Attribute:">The STUN term for a
Type-Length-Value (TLV) object that can be
added to a STUN message. Attributes are divided into two
types: comprehension-required and comprehension-optional. STUN
agents can safely ignore comprehension-optional attributes
they don't understand, but cannot successfully process a
message if it contains comprehension-required attributes that
are not understood.</t>
<t hangText="RTO:">Retransmission TimeOut, which defines the
initial period of time between transmission of a request and
the first retransmit of that request.</t>
</list>
</section>
<section anchor="message_structure" title="STUN Message Structure">
<t>STUN messages are encoded in binary using network-oriented format
(most significant byte or octet first,
also commonly known as big-endian). The transmission order is described
in detail in Appendix B of <xref target="RFC0791">RFC791</xref>. Unless
otherwise noted, numeric constants are in decimal (base 10).</t>
<figure anchor="stun_message_header"
title="Format of STUN Message Header">
<preamble>All STUN messages MUST start with a 20-byte
header followed by zero or more Attributes. The STUN header contains a STUN
message type, magic cookie, transaction ID, and message
length.</preamble>
<artwork align="center"><![CDATA[
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|0 0| STUN Message Type | Message Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Magic Cookie |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
| Transaction ID (96 bits) |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
]]></artwork>
</figure>
<t>The most significant two bits of every STUN message MUST be zeroes.
This can be used to differentiate STUN packets from other protocols when STUN is
multiplexed with other protocols on the same port.</t>
<t>The message type defines the message class (request, success
response, failure response, or indication) and the message method (the
primary function) of the STUN message. Although there are four message
classes, there are only two types of transactions in STUN:
request/response transactions (which consist of a request message and
a response message), and indication transactions (which consists of a
single indication message). Response classes are split into
error and success responses to aid
in quickly processing the STUN message.</t>
<figure anchor="stun_message_type"
title="Format of STUN Message Type Field">
<preamble>The message type field is decomposed further into the
following structure:</preamble>
<artwork align="center"><![CDATA[
0 1
2 3 4 5 6 7 8 9 0 1 2 3 4 5
+--+--+-+-+-+-+-+-+-+-+-+-+-+-+
|M |M |M|M|M|C|M|M|M|C|M|M|M|M|
|11|10|9|8|7|1|6|5|4|0|3|2|1|0|
+--+--+-+-+-+-+-+-+-+-+-+-+-+-+
]]></artwork>
</figure>
<t>Here the bits in the message type field are shown as most-significant (M11)
through least-significant (M0). M11 through M0 represent a 12-bit encoding
of the method. C1
and C0 represent a 2 bit encoding of the class. A class of 0b00 is
a Request, a class of 0b01 is an indication, a class of 0b10 is a
success response, and a class of 0b11 is an error response. This
specification defines a single method, Binding. The method
and class are orthogonal, so that for each method, a
request, success response, error response and indication
are defined for that method. </t>
<t>For example, a Binding Request has class=0b00 (request)
and method=0b000000000001 (Binding), and is encoded into the first 16 bits as
0x0001. A Binding response has class=0b10 (success response)
and method=0b000000000001, and is encoded into the first 16 bits as
0x0101.</t>
<t><list>
<t>Note: This unfortunate encoding is due to assignment of values
in <xref target="RFC3489"></xref> which did not consider encoding
Indications, Success, and Errors using bit fields.</t>
</list></t>
<t>The magic cookie field MUST contain the fixed value 0x2112A442
in network byte order. In RFC
3489 <xref target="RFC3489"></xref>, this field was part of
the transaction ID;
placing the magic cookie in this location allows a server to detect
if the client will understand certain attributes that were added in this
revised specification. In addition, it aids in distinguishing STUN packets
from packets of other protocols when STUN is multiplexed with those other
protocols on the same port.</t>
<t>The transaction ID is a 96 bit identifier, used to uniquely
identify STUN transactions. For request/response transactions,
the transaction ID is chosen by the STUN client for the
request and echoed by the server in the response. For
indications, it is chosen by the agent sending the
indication. It primarily serves to correlate requests with
responses, though it also plays a small role in helping to
prevent certain types of attacks. As such, the transaction ID
MUST be uniformly and randomly chosen from the interval 0
.. 2**96-1. Resends of the same request reuse the same
transaction ID, but the client MUST choose a new transaction
ID for new transactions unless the new request is bit-wise
identical to the previous request and sent from the same
transport address to the same IP address. Success and error
responses MUST carry the same transaction ID as their
corresponding request. When an agent is acting as a STUN
server and STUN client on the same port, the transaction IDs
in requests sent by the agent have no relationship to the
transaction IDs in requests received by the agent. </t>
<t>The message length MUST contain the size, in bytes, of the message
not including the 20 byte STUN header. Since all STUN attributes are
padded to a multiple of four bytes, the last two bits of this field
are always zero. This provides another way to distinguish STUN packets
from packets of other protocols.</t>
<t>Following the STUN fixed portion of the header are zero or
more attributes. Each attribute
is TLV (type-length-value) encoded. The details of the encoding, and
of the attributes themselves is given in
<xref target="attribute_details"/>.</t>
</section>
<section title="Base Protocol Procedures" anchor="sec:base-procedures">
<t>This section defines the base procedures of the STUN
protocol. It describes how messages are formed, how they are
sent, and how they are processed when they are received. It
also defines the detailed processing of the Binding
method. Other sections in this document describe optional
procedures that a usage may elect to use in certain
situations. Other documents may define other extensions to
STUN, by adding new methods, new attributes, or new error
response codes.</t>
<section title="Forming a Request or an Indication">
<t>When formulating a request or indication message, the
agent MUST follow the rules in
<xref target="message_structure"/> when creating the
header. In addition, the message class MUST be either
"Request" or "Indication" (as appropriate), and the method
must be either Binding or some method defined in another
document.</t>
<t>The agent then adds any attributes specified by the method
or the usage. For example, some usages may specify that the
agent use an authentication method
(<xref target="sec:authentication-mechanisms"/>) or the
FINGERPRINT attribute
(<xref target="sec:fingerprint-extension"/>). In addition, the
client SHOULD add a CLIENT attribute to the message.</t>
<t>For the Binding method with no authentication, no
attributes are required unless the usage specifies
otherwise.</t>
<t>All STUN messages sent over UDP SHOULD be less
than the path MTU, if known. If the path MTU is unknown, messages
SHOULD be the smaller of 576 bytes and the first-hop
MTU for IPv4 <xref target="RFC1122"/> and 1280 bytes for IPv6
<xref target="RFC2460"/>. This value corresponds to the overall
size of the IP packet. Consequently, for IPv4, the actual STUN
message would need to be less than 548 bytes (576 minus 20 bytes IP
header, minus 8 byte UDP header, assuming no IP options are
used). STUN provides no ability to handle the case where the
request is under the MTU but the response would be larger than the
MTU. It is not envisioned that this limitation will be an issue for
STUN. The MTU limitation is a SHOULD, and not a MUST, to account
for cases where STUN itself is being used to probe for MTU
characteristics
<xref target="I-D.ietf-behave-nat-behavior-discovery"/>. Outside
of this or similar applications, the MTU constraint MUST be
followed. </t>
</section>
<section title="Sending the Request or Indication">
<t>The agent then sends the request or indication. This
document specifies how to send STUN messages over UDP, TCP, or
TLS-over-TCP; other transport protocols may be added in the
future. The STUN usage must specify which transport protocol
is used, and how the agent determines the IP address and port
of the recipient. <xref target="client_discovery"/> describes a
DNS-based method of determining the IP address and port of a
server which a usage may elect to use. STUN may be used with
anycast addresses, but only with UDP and in usages where
authentication is not used. </t>
<t>At any time, a client MAY have multiple
outstanding STUN requests with the same STUN server (that is,
multiple transactions in progress, with different transaction
ids). Absent other limits to the rate of new transactions
(such as those specified by ICE for connectivity checks), a
client SHOULD space new transactions to a server by RTO and
SHOULD limit itself to ten outstanding transactions to the
same server. </t>
<section title="Sending over UDP">
<t>When running STUN over UDP it is possible that the STUN
message might be dropped by the network. Reliability of STUN
request/response transactions is accomplished through
retransmissions of the request message by the client
application itself. STUN indications are not retransmitted;
thus indication transactions over UDP are not reliable.</t>
<t>A client SHOULD retransmit a STUN request message starting with
an interval of RTO ("Retransmission TimeOut"), doubling after each
retransmission. The RTO is an estimate of the round-trip-time, and
is computed as described in RFC 2988 <xref target="RFC2988"/>, with
two exceptions. First, the initial value for RTO SHOULD be
configurable (rather than the 3s recommended in RFC 2988) and
SHOULD be greater than 500ms. The exception cases for this SHOULD
are when other mechanisms are used to derive congestion thresholds
(such as the ones defined in ICE for fixed rate streams), or when
STUN is used in non-Internet environments with known network
capacities. In fixed-line access links, a value
of 500ms is RECOMMENDED. Secondly, the value of RTO MUST NOT be
rounded up to the nearest second. Rather, a 1ms accuracy MUST be
maintained. As with TCP, the usage of Karn's algorithm is
RECOMMENDED <xref target="KARN87"/>. When applied to STUN, it means
that RTT estimates SHOULD NOT be computed from STUN transactions
which result in the retransmission of a request.</t>
<t>The value for RTO SHOULD be cached by a client after the completion
of the transaction, and used as the starting value for RTO for the
next transaction to the same server (based on equality of IP address).
The value SHOULD be considered stale and discarded after 10 minutes.</t>
<t>Retransmissions continue until a response is received, or until
a total of Rc requests have been sent. Rc SHOULD be configurable
and SHOULD have a default of 7. If, after the last request,
a duration equal to Rm times the RTO has passed without a response
(providing ample time to get a response if only this final request
actually succeeds), the client SHOULD consider the transaction to
have failed. Rm SHOULD be configurable and SHOULD have a default
of 16. A STUN transaction over UDP is also considered failed
if there has been a hard ICMP error <xref target="RFC1122"/>. For
example, assuming an RTO of 500ms, requests would be sent at times
0ms, 500ms, 1500ms, 3500ms, 7500ms, 15500ms, and 31500ms. If the
client has not received a response after 39500ms, the client will
consider the transaction to have timed out.</t>
<!--[[ Philip: Need to add a discussion of received ICMP
errors. ]]
-->
</section>
<section title="Sending over TCP or TLS-over-TCP">
<t>For TCP and TLS-over-TCP, the client opens a TCP connection to the
server.</t>
<t>
In some usages of STUN, STUN is sent as the only protocol over the TCP
connection. In this case, it can be sent without the aid of any
additional framing or demultiplexing. In other usages, or with other
extensions, it may be multiplexed with other data over a TCP
connection. In that case, STUN MUST be run on top of some kind of
framing protocol, specified by the usage or extension, which allows
for the agent to extract complete STUN messages and complete
application layer messages. The STUN service running on the well known
port or ports discovered through the the DNS procedures in
<xref target="client_discovery"/> is for STUN alone, and not for STUN
multiplexed with other data. Consequently, no framing protocols are
used in connections to those servers. When additional framing is
utilized, the usage will specify how the client knows to apply it and
what port to connect to. For example, in the case of ICE connectivity
checks, this information is learned through out-of-band negotiation
between client and server.
</t>
<t>When STUN is run by itself over TLS-over-TCP, the
TLS_RSA_WITH_AES_128_CBC_SHA ciphersuite MUST be supported at a
minimum. Implementations MAY also support any other ciphersuite.
When it receives the TLS Certificate message, the client SHOULD
verify the certificate and inspect the site identified by the
certificate. If the certificate is invalid, revoked, or if it does
not identify the appropriate party, the client MUST NOT send the
STUN message or otherwise proceed with the STUN transaction. The
client MUST verify the identity of the server. To do that, it
follows the identification procedures defined in Section 3.1 of RFC
2818 <xref target="RFC2818"/>. Those procedures assume the client
is dereferencing a URI. For purposes of usage with this
specification, the client treats the domain name or IP address used
in Section 8.1 as the host portion of the URI that has been
dereferenced. Alternatively, a client MAY be configured with a set
of domains or IP addresses that are trusted; if a certificate is
received that identifies one of those domains or IP addresses, the
client considers the identity of the server to be verified.</t>
<t>
When STUN is run multiplexed with other protocols over a
TLS-over-TCP connection, the mandatory ciphersuites and TLS
handling procedures operate as defined by those protocols.
</t>
<t>Reliability of STUN over TCP and TLS-over-TCP is handled by TCP
itself, and there are no retransmissions at the STUN protocol
level. However, for a request/response transaction, if the client
has not received a response by Ti seconds after it sent the SYN to
establish the connection, it considers the
transaction to have timed out. Ti SHOULD be configurable and SHOULD
have a default of 39.5s. This value has been chosen to
equalize the TCP and UDP timeouts for the default initial RTO.</t>
<t>
In addition, if the client is unable to establish the TCP
connection, or the TCP connection is reset or fails before a
response is received, any request/response transaction in
progress is considered to have failed
</t>
<t>The client MAY send multiple transactions over a single TCP
(or TLS-over-TCP) connection, and it MAY send another
request before receiving a response to the previous. The
client SHOULD keep the
connection open until it<list style="symbols">
<t>has no further STUN requests or indications to send over that
connection, and;</t>
<t>has no plans to use any resources (such as a mapped address
(MAPPED-ADDRESS or XOR-MAPPED-ADDRESS) or relayed address <xref
target="I-D.ietf-behave-turn"></xref>) that were learned though
STUN requests sent over that connection, and;</t>
<t>if multiplexing other application protocols over that port,
has finished using that other application, and;</t>
<t>if using that learned port with a remote peer, has
established communications with that remote peer, as is required
by some TCP NAT traversal techniques (e.g.,
<xref target="I-D.ietf-mmusic-ice-tcp"></xref>).</t>
</list></t>
<t>At the server end, the server SHOULD keep the connection
open, and let the client close it, unless the server has
determined that the connection has timed out (for example, due
to the client disconnecting from the network). Bindings
learned by the client will remain valid in intervening NATs
only while the connection remains open. Only the client knows
how long it needs the binding. The server SHOULD NOT close a
connection if a request was received over that connection for
which a response was not sent. A server MUST NOT ever open a
connection back towards the client in order to send a
response. Servers SHOULD follow best practices regarding
connection management in cases of overload. </t>
</section>
</section>
<section title="Receiving a STUN Message"
anchor="sec:receiving-a-stun-message">
<t>This section specifies the processing of a STUN
message. The processing specified here is for STUN
messages as defined in this specification; additional rules
for backwards compatibility are defined in
in <xref target="sec:backwards-compatibility"/>. Those
additional procedures are optional, and usages can elect to
utilize them. First, a set of processing operations are applied
that are independent of the class. This is followed by
class-specific processing, described in the subsections which
follow. </t>
<t>When a STUN agent receives a STUN message, it first checks
that the message obeys the rules of
<xref target="message_structure"/>. It checks
that the first two bits are 0, that the magic cookie field has
the correct value, that the message length is sensible, and
that the method value is a supported method. If the
message-class is Success
Response or Error Response, the agent checks that the
transaction ID matches a transaction that is still in
progress. If the FINGERPRINT extension is being used, the
agent checks that the FINGERPRINT attribute is present and
contains the correct value. If any errors are detected, the
message is silently discarded. In the case when STUN is being
multiplexed with another protocol, an error may indicate that
this is not really a STUN message; in this case, the agent
should try to parse the message as a different protocol.</t>
<t>The STUN agent then does any checks that are required by a
authentication mechanism that the usage has specified (see
<xref target="sec:authentication-mechanisms"/>.</t>
<t>Once the authentication checks are done, the STUN agent
checks for unknown attributes and known-but-unexpected
attributes in the message. Unknown comprehension-optional
attributes MUST be ignored by the agent. Known-but-unexpected
attributes SHOULD be ignored by the agent. Unknown
comprehension-required attributes cause processing that
depends on the message-class and is described below.</t>
<t>At this point, further processing depends on the message
class of the request.</t>
<section title="Processing a Request">
<t>If the request contains one or more unknown
comprehension-required attributes, the server replies with an
error response with an error code of 420 (Unknown Attribute),
and includes an UNKNOWN-ATTRIBUTES attribute in the response
that lists the unknown comprehension-required attributes.</t>
<t>The server then does any additional checking that the
method or the specific usage requires. If all the checks
succeed, the server formulates a success response as described
below.</t>
<t>If the request uses UDP transport and is a retransmission
of a request for which the server has already generated a
success response within the last 40 seconds, the server MUST
retransmit the same success response. One way for a server to
do this is to remember all transaction IDs received over UDP
and their corresponding responses in the last 40
seconds. Another way is to reprocess the request and recompute
the response. The latter technique MUST only be applied to
requests which are idempotent (a request is considered
idempotent when the same request can be safely repeated
without impacting the overall state of the system) and result
in the same success response for the same request. The Binding
method is considered to idempotent in this way (even though
certain rare network events could cause the reflexive
transport address value to change). Extensions to STUN SHOULD
state whether their request types have this property or
not.</t>
<section title="Forming a Success or Error Response">
<t>When forming the response (success or error), the server
follows the rules of section 6. The method of the response
is the same as that of the request, and the message class is
either "Success Response" or "Error Response".</t>
<t>For an error response, the server MUST add an ERROR-CODE
attribute containing the error code specified in the
processing above. The reason phrase is not fixed, but SHOULD
be something suitable for the error code. For certain errors,
additional attributes are added to the message. These
attributes are spelled out in the description where the error
code is specified. For example, for an error code of 420
(Unknown Attribute), the server MUST include an
UNKNOWN-ATTRIBUTES attribute. Certain authentication errors
also cause attributes to be added (see
<xref target="sec:authentication-mechanisms"/>). Extensions may
define other errors and/or additional attributes to add in
error cases.</t>
<t>If the server authenticated the request using an
authentication mechanism, then the server SHOULD add the
appropriate authentication attributes to the response (see
<xref target="sec:authentication-mechanisms"/>).</t>
<t>The server also adds any attributes required by the
specific method or usage. In addition, the server SHOULD add a
SERVER attribute to the message.</t>
<t>For the Binding method, no additional checking is required
unless the usage specifies otherwise. When forming the success
response, the server adds a XOR-MAPPED-ADDRESS attribute to
the response, where the contents of the attribute are the
source transport address of the request message. For UDP, this
is the source IP address and source UDP port of the request
message. For TCP and TLS-over-TCP, this is the source IP
address and source TCP port of the TCP connection as seen by
the server. </t>
</section>
<section title="Sending the Success or Error Response">
<t>The response (success or error) is sent over the same
transport as the request was received on. If the request was
received over UDP, the destination IP address and port of the
response is the source IP address and port of the received
request message, and the source IP address and port of the
response is equal to the destination IP address and port of
the received request message. If the request was received over
TCP or TLS-over-TCP, the response is sent back on the same TCP
connection as the request was received on.</t>
</section>
</section>
<section title="Processing an Indication">
<t>If the indication contains unknown comprehension-required
attributes, the indication is discarded and processing
ceases.</t>
<t>The agent then does any additional checking that the
method or the specific usage requires. If all the checks
succeed, the agent then processes the indication. No response
is generated for an indication.</t>
<t>For the Binding method, no additional checking or
processing is required, unless the usage specifies
otherwise. The mere receipt of the message by the agent has
refreshed the "bindings" in the intervening NATs.</t>
<t>Since indications are not re-transmitted over UDP (unlike
requests), there is no need to handle re-transmissions of
indications at the sending agent.</t>
</section>
<section anchor="sec-success-resp" title="Processing a Success Response">
<t>If the success response contains unknown
comprehension-required attributes, the response is discarded
and the transaction is considered to have failed.</t>
<t>The client then does any additional checking that the
method or the specific usage requires. If all the checks
succeed, the client then processes the success response.</t>
<t>For the Binding method, the client checks that the
XOR-MAPPED-ADDRESS attribute is present in the response. The
client checks
the address family specified. If it is an unsupported address
family, the attribute SHOULD be ignored. If it is an
unexpected but supported address family (for example, the
Binding transaction was sent over IPv4, but the address family
specified is IPv6), then the client MAY accept and use the
value. </t>
</section>
<section title="Processing an Error Response"
anchor="sec:processing-an-error-response">
<t>If the error response contains unknown
comprehension-required attributes, or if the error response
does not contain an ERROR-CODE attribute, then the transaction
is simply considered to have failed.</t>
<t>The client then does any processing specified by the
authentication mechanism (see
<xref target="sec:authentication-mechanisms"/>). This may
result in a new transaction attempt.</t>
<t>The processing at this point depends on the error-code, the
method, and the usage; the following are the default
rules:</t>
<list style="symbols">
<t>If the error code is 300 through 399, the client
SHOULD consider the transaction as failed unless the
ALTERNATE-SERVER extension is being used. See
<xref target="sec:alternate-server-extension"/>.</t>
<t> If the error code is 400 through 499, the client
declares the transaction failed; in the case of 420
(Unknown Attribute),
the response should contain a UNKNOWN-ATTRIBUTES
attribute that gives additional information.</t>
<t>If the error code is 500 through 599, the client
MAY resend the request; clients that do so MUST limit
the number of times they do this. </t>
</list>
<t>Any other error code
causes the client to consider the transaction
failed.</t>
</section>
</section>
</section>
<section title="FINGERPRINT Mechanism" anchor="sec:fingerprint-extension">
<t>This section describes an optional mechanism for STUN that aids in
distinguishing STUN messages from packets of other protocols when
the two are multiplexed on the same transport address. This
mechanism is optional, and a STUN usage must describe if and when
it is used. The FINGERPRINT mechanism is not backwards
compatible with RFC3489, and cannot be used in environments
where such compatibility is required.</t>
<t>In some usages, STUN messages are multiplexed on the same
transport address as other protocols, such as RTP. In order to
apply the processing described in
<xref target="sec:base-procedures"/>, STUN messages must first
be separated from the application
packets. <xref target="message_structure"/> describes three
fixed fields in the STUN header that can be used for this
purpose. However, in some cases, these three fixed fields may
not be sufficient.</t>
<t>When the FINGERPRINT extension is used, an agent includes
the FINGERPRINT attribute in messages it sends to another
agent. <xref target="sec:fingerprint"/> describes the
placement and value of this attribute. When the agent receives
what it believes is a STUN message, then, in addition to other
basic checks, the agent also checks that the message contains
a FINGERPRINT attribute and that the attribute contains the
correct value. <xref target="sec:receiving-a-stun-message"/>
describes when in the overall processing of a STUN message the
FINGERPRINT check is performed. This additional check helps
the agent detect messages of other protocols that might
otherwise seem to be STUN messages.</t>
</section>
<section anchor="client_discovery" title="DNS Discovery of a
Server">
<t>This section describes an optional procedure for STUN that allows a
client to use DNS to determine the IP address and port of a
server. A STUN usage must
describe if and when this extension is used. To use this
procedure, the client must know a server's domain name and a service
name; the usage must also describe how the client obtains
these. Hard-coding the domain-name of the server into
software is NOT RECOMMENDED in case the domain name is lost
or needs to change for legal or other reasons.</t>
<t>When a client wishes to locate a STUN server in the public
Internet that accepts Binding Request/Response transactions,
the SRV service name is "stun". When it wishes to locate a
STUN server which accepts Binding Request/Response
transactions over a TLS session, the SRV service name is
"stuns". STUN usages MAY define
additional DNS SRV service names.</t>
<t>The domain name is resolved to a transport address using
the SRV procedures specified in <xref target="RFC2782"/>. The
DNS SRV service name is the service name provided as input to
this procedure. The protocol in the SRV lookup is the
transport protocol the client will run STUN over: "udp" for
UDP and "tcp" for TCP. Note that only "tcp" is defined with
"stuns" at this time. </t>
<t>The procedures of RFC 2782 are followed to determine the
server to contact. RFC 2782 spells out the details of how a
set of SRV records are sorted and then tried. However, RFC2782
only states that the client should "try to connect to the
(protocol, address, service)" without giving any details on
what happens in the event of failure. When following these
procedures, if the STUN transaction times out without receipt
of a response, the client SHOULD retry the request to the next
server in the ordered defined by RFC 2782. Such a retry is
only possible for request/response transmissions, since
indication transactions generate no response or timeout. </t>
<t>The default port for STUN requests is 3478, for both TCP
and UDP. Administrators of STUN servers SHOULD use this port
in their SRV records for UDP and TCP. In
all cases, the port in DNS MUST reflect the one the server is
listening on. The default port for STUN over TLS is XXXX
[[NOTE TO RFC EDITOR: Replace with IANA registered port number
for stuns]]. Servers can run STUN over TLS on the same port as
STUN over TCP if the server software supports determining
whether the initial message is a TLS or STUN message. </t>
<t>If no SRV records were found, the client performs an A or
AAAA record lookup of the domain name. The result will be a
list of IP addresses, each of which can be contacted at the
default port using UDP or TCP, independent of the STUN
usage. For usages that require TLS, the client connects to
one of the IP addresses using the default STUN over TLS port. </t>
</section>
<section title="Authentication and Message-Integrity Mechanisms"
anchor="sec:authentication-mechanisms">
<t>This section defines two mechanisms for STUN that a client
and server can use to provide authentication and
message-integrity; these two mechanisms are known as the
short-term credential mechanism and the long-term credential
mechanism. These two mechanisms are optional, and each usage
must specify if and when these mechanisms are
used. Consequently, both clients and servers will know which
mechanism (if any) to follow based on knowledge of which usage
applies. For example, a STUN server on the public Internet
supporting ICE would have no authentication, whereas the STUN
server functionality in an agent supporting connectivity
checks would utilize short term credentials. An
overview of these two mechanisms is given in
<xref target="sec:overview"/>.</t>
<t> Each mechanism specifies the additional processing
required to use that mechanism, extending the processing
specified in <xref target="sec:base-procedures"/>. The
additional processing occurs in three different places: when
forming a message; when receiving a message immediately after
the basic checks have been performed; and when doing the
detailed processing of error responses.</t>
<section title="Short-Term Credential Mechanism">
<t>
The short-term credential mechanism assumes that, prior to the
STUN transaction, the client and server have used some other protocol
to exchange a credential in the form of a username and
password. This credential is time-limited. The time-limit is
defined by the usage. As an example, in the ICE usage
<xref target="I-D.ietf-mmusic-ice"/>, the two endpoints use
out-of-band signaling to agree on a username and password, and
this username and password is applicable for the duration of the
media session.</t>
<t>
This credential is used to form a message integrity check in each
request and in many responses. There is no challenge and response
as in the long term mechanism; consequently, replay is prevented
by virtue of the time-limited nature of the credential.
</t>
<section title="Forming a Request or Indication">
<t>For a request or indication message, the agent MUST include the
USERNAME and MESSAGE-INTEGRITY attributes in the message. The
HMAC for the MESSAGE-INTEGRITY attribute is computed as
described in <xref target="message_integrity"/>. Note that the
password is never
included in the request or indication.</t>
</section>
<section title="Receiving a Request or Indication">
<t>After the agent has done the basic processing of a message,
the agent performs the checks listed below in order
specified:</t>
<list style="symbols">
<t>If the message does not
contain both a MESSAGE-INTEGRITY and a USERNAME
attribute:
<list style="symbols">
<t>If the message is a request, the server MUST
reject the request with an error response. This
response MUST use an error code of 400 (Bad Request).
</t>
<t>If the message is an indication, the agent
MUST silently discard the indication.
</t>
</list>
</t>
<t>
If the USERNAME does not contain a username value
currently valid within the server:
<list style="symbols">
<t>
If the message is a request, the server MUST
reject the request with an error response. This
response MUST use an error code of 401 (Unauthorized).
</t>
<t>
If the message is an indication, the agent MUST
silently discard the indication.
</t>
</list>
</t>
<t>Using the password associated with the username,
compute the value for the message-integrity as
described in
<xref target="message_integrity"/>. If the
resulting value does not match the contents of the
MESSAGE-INTEGRITY attribute:
<list style="symbols">
<t>
If the message is a request, the server MUST
reject the request with an error response. This
response MUST use an error code of 401 (Unauthorized).
</t>
<t>
If the message is an indication, the agent MUST
silently discard the indication.
</t>
</list>
</t>
</list>
<t>If these checks pass, the agent continues to process the
request or indication. Any response generated by a server
MUST include the MESSAGE-INTEGRITY attribute, computed
using the password utilized to authenticate
the request. The response MUST NOT contain the USERNAME
attribute.</t>
<t>
If any of the checks fail, a server MUST NOT include a
MESSAGE-INTEGRITY or USERNAME attribute in the error
response. This is because, in these failure cases,
the server cannot determine the shared secret necessary to
compute MESSAGE-INTEGRITY.
</t>
</section>
<section title="Receiving a Response">
<t>
The client looks for the MESSAGE-INTEGRITY attribute in the
response. If present, the client computes the message integrity
over the response as defined in
<xref target="message_integrity"/>, using the same password it
utilized for the request. If the resulting value matches the
contents of the MESSAGE-INTEGRITY attribute, the response is
considered authenticated. If the value does not match, or if
MESSAGE-INTEGRITY was absent, the
response MUST be discarded, as if it was never received. This
means that retransmits, if applicable, will continue.
</t>
</section>
<!-- end short term -->
</section>
<section title="Long-term Credential Mechanism">
<t>
The long-term credential mechanism relies on a long term
credential, in the form of a username and password, that are
shared between client and server. The credential is considered
long-term since it is assumed that it is provisioned for a user,
and remains in effect until the user is no longer a subscriber of
the system, or is changed. This is basically a traditional
"log-in" username and password given to users.
</t>
<t>
Because these usernames and passwords are expected to be valid for
extended periods of time, replay prevention is provided in the
form of a digest challenge. In this mechanism, the client
initially sends a request, without offering any credentials or any
integrity checks. The server rejects this request, providing the
user a realm (used to guide the user or agent in selection of a
username and password) and a nonce. The nonce provides the replay
protection. It is a cookie, selected by the server, and encoded in
such a way as to indicate a duration of validity or client
identity from which it is valid. The client retries the request,
this time including its username, the realm, and echoing the nonce
provided by the server. The client also includes a
message-integrity, which provides an HMAC over the entire request,
including the nonce. The server validates the nonce, and checks
the message-integrity. If they match, the request is
authenticated. If the nonce is no longer valid, it is considered
"stale", and the server rejects the request, providing a new
nonce.
</t>
<t>
In subsequent requests to the same server, the client reuses the
nonce, username, realm and password it used previously. In this
way, subsequent requests are not rejected until the nonce becomes
invalid by the server, in which case the rejection provides a new
nonce to the client.
</t>
<t>Note that the long-term credential mechanism cannot be used
to protect indications, since indications cannot be
challenged. Usages utilizing indications must either use a
short-term credential, or omit authentication and message
integrity for them.</t>
<t>
Since the long-term credential mechanism is susceptible to offline
dictionary attacks, deployments SHOULD utilize strong passwords.
</t>
<section title="Forming a Request">
<t>
There are two cases when forming a request. In the first case, this is
the first request from the client to the server (as identified by its
IP address and port). In the second case, the client is submitting a
subsequent request once a previous request/response transaction has
completed successfully. Forming a request as a consequence of a 401 or
438 error response is covered in <xref target="sec-recv-resp-lterm"/>
and is not considered a "subsequent request" and thus does not utilize
the rules described in <xref target="sec-sub-req-lterm"/>.
</t>
<section title="First Request">
<t>
If the client has not completed a successful request/response
transaction with the server (as identified by hostname, if the DNS
procedures of <xref target="client_discovery"/> are used, else IP
address if not), it SHOULD omit the USERNAME,
MESSAGE-INTEGRITY, REALM, and NONCE attributes. In other words, the
very first request is sent as if there were no authentication or
message integrity applied. The exception to this rule are requests
sent to another server as a consequence of the ALTERNATE-SERVER
mechanism described in
<xref target="sec:alternate-server-extension"/>. Those requests do
include the USERNAME, REALM and NONCE from the original request, along
with a newly computed MESSAGE-INTEGRITY based on them.
</t>
</section>
<section anchor="sec-sub-req-lterm" title="Subsequent Requests">
<t>
Once a request/response transaction has completed successfully, the
client will have been been presented a realm and nonce by the server, and
selected a username and password with which it authenticated. The
client SHOULD cache the username, password, realm, and nonce for
subsequent communications with the server. When the client sends a
subsequent request, it SHOULD include the USERNAME, REALM, and NONCE
attributes with these cached values. It SHOULD include a
MESSAGE-INTEGRITY attribute, computed as described in
<xref target="message_integrity"/> using the cached password.
</t>
</section>
</section>
<section title="Receiving a Request">
<t>
After the server has done the basic processing of a request, it
performs the checks listed below in the order specified:
</t>
<list style="symbols">
<t>If the message does not contain a MESSAGE-INTEGRITY attribute,
the server MUST
generate an error response with an error code of
401 (Unauthorized). This response MUST include a REALM value. It is
RECOMMENDED that the REALM value be the domain name of
the provider of the STUN server. The response MUST
include a NONCE, selected by the server. The response SHOULD NOT
contain a USERNAME or MESSAGE-INTEGRITY attribute.
</t>
<t>
If the message contains a MESSAGE-INTEGRITY
attribute, but is missing the USERNAME, REALM or
NONCE attributes, the server MUST generate an error
response with an error code of 400 (Bad Request). This response
SHOULD NOT include a USERNAME, NONCE, REALM or MESSAGE-INTEGRITY
attribute.
</t>
<t>
If the NONCE is no longer valid, the server MUST
generate an error response with an error code of 438
(Stale Nonce). This response MUST include a NONCE and REALM
attribute and SHOULD NOT incude the USERNAME or MESSAGE-INTEGRITY
attribute. Servers can invalidate nonces in order to provide
additional security. See Section 4.3 of <xref target="RFC2617"/>
for guidelines.
</t>
<t>
If the username in the USERNAME attribute is not valid, the server
MUST generate an error response with an error code of
401 (Unauthorized). This response MUST include a REALM value. It is
RECOMMENDED that the REALM value be the domain name of
the provider of the STUN server. The response MUST
include a NONCE, selected by the server. The response SHOULD NOT
contain a USERNAME or MESSAGE-INTEGRITY attribute.
</t>
<t>Using the password associated with the username in
the USERNAME attribute,
compute the value for the message-integrity as
described in
<xref target="message_integrity"/>. If the
resulting value does not match the contents of the
MESSAGE-INTEGRITY attribute, the server MUST
reject the request with an error response. This
response MUST use an error code of 401 (Unauthorized). It MUST include a REALM
and NONCE attribute and SHOULD NOT include the USERNAME or
MESSAGE-INTEGRITY attribute.
</t>
</list>
<t>If these checks pass, the server continues to process the
request. Any response generated by the server (excepting the cases
described above)
MUST include the MESSAGE-INTEGRITY attribute, computed
using the username and password utilized to authenticate
the request. The REALM, NONCE, and USERNAME attributes SHOULD NOT
be included. </t>
</section>
<section anchor="sec-recv-resp-lterm" title="Receiving a Response">
<t>
If the response is an error response, with an error code of 401
(Unauthorized), the client SHOULD retry the request with a new
transaction. This request MUST contain a USERNAME, determined by
the client as the appropriate username for the REALM from the
error response. The request MUST contain the REALM, copied from
the error response. The request MUST contain the NONCE, copied
from the error response. The request MUST contain the
MESSAGE-INTEGRITY attribute, computed using the password
associated with the username in the USERNAME attribute. The client
MUST NOT perform this retry if it is not changing the USERNAME or
REALM or its associated password, from the previous attempt.
</t>
<t>
If the response is an error response with an error code of 438
(Stale Nonce),
the client MUST retry the request, using the new NONCE supplied in
the 438 (Stale Nonce) response. This retry MUST also include the USERNAME, REALM
and MESSAGE-INTEGRITY.
</t>
<t>
The client looks for the MESSAGE-INTEGRITY attribute in the
response (either success or failure). If present, the client
computes the message integrity
over the response as defined in
<xref target="message_integrity"/>, using the same password it
utilized for the request. If the resulting value matches the
contents of the MESSAGE-INTEGRITY attribute, the response is
considered authenticated. If the value does not match, or if
MESSAGE-INTEGRITY was absent, the
response MUST be discarded, as if it was never received. This
means that retransmits, if applicable, will continue.
</t>
</section>
<!-- end long term -->
</section>
<!-- end authentication-->
</section>
<section title="ALTERNATE-SERVER Mechanism"
anchor="sec:alternate-server-extension">
<t>This section describes a mechanism in STUN that allows a
server to redirect a client to another server. This extension
is optional, and a usage must define if and when this
extension is used. To prevent denial-of-service attacks, this
extension MUST only be used in situations where the client and
server are using an authentication and message-integrity
mechanism.</t>
<t>A server using this extension redirects a client to another
server by replying to a request message with an error response
message with an error code of 300 (Try Alternate). The server
MUST include a ALTERNATE-SERVER attribute in the error
response. The error response message MUST be authenticated,
which in practice means the request message must have passed
the authentication checks.</t>
<t>A client using this extension handles a 300 (Try Alternate)
error code as follows. If the error response has passed the
authentication checks, then the client looks for a
ALTERNATE-SERVER attribute in the error response. If one is
found, then the client considers the current transaction as
failed, and re-attempts the request with the server specified
in the attribute, using the same transport protocol used for
the previous request. The client SHOULD reuse any authentication
credentials from the old request in the new transaction. If
the server has been redirected to a server on which it has
already tried this request within the last five minutes, it
MUST ignore the redirection and consider the transaction to
have failed. This prevents infinite ping-ponging between
servers in case of redirection loops. </t>
</section>
<section title="Backwards Compatibility with RFC 3489"
anchor="sec:backwards-compatibility">
<t>This section defines procedures that allow a degree of
backwards compatible with the original protocol defined in
RFC 3489 <xref target="RFC3489"/>. This mechanism is
optional, meant to be utilized only in cases where a new
client can connect to an old server, or vice-a-versa. A
usage must define if and when this procedure is used.</t>
<t><xref target="sec-changes"/> lists all the changes between
this specification and RFC 3489 <xref target="RFC3489"/>. However, not
all of these differences are important, because "classic STUN"
was only used in a few specific ways. For the
purposes of this extension, the important changes are the
following. In RFC 3489:</t>
<list style="symbols">
<t>UDP was the only supported transport;</t>
<t>The field that is now the Magic Cookie field was a part of
the transaction id field, and transaction ids were 128
bits long;</t>
<t>The XOR-MAPPED-ADDRESS attribute
did not exist, and the Binding method used the
MAPPED-ADDRESS attribute instead;</t>
<t>There were three comprehension-required attributes,
RESPONSE-ADDRESS, CHANGE-REQUEST, and
CHANGED-ADDRESS that have been removed from this
specification;
<list>
<t>These attributes are now part of the NAT
Behavior Discovery
usage. <xref target="I-D.ietf-behave-nat-behavior-discovery"/></t>
</list></t>
</list>
<section title="Changes to Client Processing">
<t> A client that wants to interoperate with a
<xref target="RFC3489"/> server SHOULD send a request message that
uses the Binding method, contains no attributes, and uses UDP as the
transport protocol to the server. If successful, the success response
received from the server will contain a MAPPED-ADDRESS attribute
rather than an XOR-MAPPED-ADDRESS attribute. A client seeking to
interoperate with an older server MUST be prepared to receive
either. Furthermore, the client MUST ignore any Reserved
comprehension-required attributes which might appear in the
response. Of the Reserved attributes in in
<xref target="sec-iana-atts"/>, 0x0002,0x0004,0x0005 and 0x000B may
appear in Binding Responses from a server compliant to RFC 3489. Other
than this change, the processing of the response is identical to the
procedures described above.</t>
</section>
<section title="Changes to Server Processing">
<t>
A STUN server can detect when a given Binding Request message was sent
from an RFC 3489 <xref target="RFC3489"/> client by the absence of the
correct value in the Magic Cookie field. When the server detects an
RFC 3489 client, it SHOULD copy the value seen in the Magic Cookie
field in the Binding Request to the Magic Cookie field in the Binding
Response message, and insert a MAPPED-ADDRESS attribute instead of an
XOR-MAPPED-ADDRESS attribute.</t>
<t>The client might, in rare situations, include either the
RESPONSE-ADDRESS or CHANGE-REQUEST attributes. In these
situations, the server will view these as unknown
comprehension-required attributes and reply with an error
response. Since the mechanisms utilizing those attributes are
no longer supported, this behavior is acceptable.</t>
<t>The RFC 3489 version of STUN lacks both the Magic Cookie and the
FINGERPRINT attribute that allows for a very high probablility of
correctly identifying STUN messages when multiplexed with other
protocols. Therefore, STUN implementations that are backwards compatible
with RFC 3489 SHOULD NOT be used in cases where STUN will be multiplexed
with another protocol. However, that should not be an issues as such
multiplexing was not available in RFC 3489.
</t>
</section>
</section>
<section title="Basic Server Behavior">
<t>
This section defines the behavior of a basic, standalone STUN
server. A basic STUN server provides clients with server reflexive
transport addresses by receiving and replying to STUN Binding
Requests.
</t>
<t>
The STUN server MUST support the Binding method. It SHOULD NOT utilize
the short term or long term credential mechanism. This is because the
work involved in authenticating the request is more than the work in
simply processing it. It SHOULD NOT utilize the ALTERNATE-SERVER
mechanism for the same reason. It MUST support UDP and TCP. It MAY
support STUN over TCP/TLS, however TLS provides minimal security
benefits in this basic mode of operation. It MAY utilize the
FINGERPRINT mechanism but MUST NOT require it. Since the standalove
server only runs STUN, FINGERPRINT provides no benefit. Requiring it
would break compatibility with RFC 3489, and such compatibility is
desirable in a standalone server. Standalone STUN servers SHOULD support
backwards compatibility with <xref target="RFC3489"/> clients, as
described in <xref target="sec:backwards-compatibility"/>.
</t>
<t>
It is RECOMMENDED that administrators of STUN servers provide DNS
entries for those servers as described in
<xref target="client_discovery"/>.
</t>
<t>
A basic STUN server is not a solution for NAT traversal by
itself. However, it can be utilized as part of a solution through STUN
usages. This is discussed further in <xref target="usages"/>.
</t>
</section>
<section anchor="usages" title="STUN Usages">
<t>STUN by itself is not a solution to the NAT traversal
problem. Rather, STUN defines a tool that can
be used inside a larger solution. The term "STUN Usage" is
used for any solution that uses STUN as a component.</t>
<t>At the time of writing, three STUN usages are defined:
Interactive Connectivity Establishment (ICE)
<xref target="I-D.ietf-mmusic-ice"/>, Client-initiated
connections for SIP <xref target="I-D.ietf-sip-outbound"/>, and
NAT Behavior Discovery
<xref target="I-D.ietf-behave-nat-behavior-discovery"/>. Other
STUN usages may be defined in the future.</t>
<t>A STUN usage defines how STUN is actually utilized - when
to send requests, what to do with the responses, and which
optional procedures defined here (or in an extension to STUN) are
to be used. A usage would also define:</t>
<list style="symbols">
<t>Which STUN methods are used;</t>
<t>What authentication and message integrity
mechanisms are used;</t>
<t>The considerations around manual vs. automatic key
derivation for the integrity mechanism, as discussed
in <xref target="RFC4107"/>;</t>
<t>What mechanisms are used to distinguish STUN
messages from other messages. When STUN is run over
TCP, a framing mechanism may be required;</t>
<t>How a STUN client determines the IP address and
port of the STUN server;</t>
<t>Whether backwards compatibility to RFC 3489 is
required;</t>
<t>What optional attributes defined here (such as
FINGERPRINT and ALTERNATE-SERVER) or in other
extensions are required.</t>
</list>
<t>In addition, any STUN usage must consider the security
implications of using STUN in that usage. A number of attacks
against STUN are known (see the Security Considerations
section in this document) and any usage must consider how
these attacks can be thwarted or mitigated.</t>
<t>Finally, a usage must consider whether its usage of STUN is
an example of the Unilateral Self-Address Fixing approach to
NAT traversal, and if so, address the questions raised in RFC
3424. <xref target="RFC3424"/></t>
</section>
<section anchor="attribute_details" title="STUN Attributes">
<figure anchor="stun_attribute" title="Format of STUN Attributes">
<preamble>After the STUN header are zero or more attributes. Each
attribute MUST be TLV encoded, with a 16 bit type, 16 bit length,
and value. Each STUN attribute MUST end on a 32 bit
boundary. As mentioned above, all fields in an attribute are transmitted most
significant bit first.</preamble>
<artwork align="center"><![CDATA[
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Value (variable) ....
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
]]></artwork>
<postamble></postamble>
</figure>
<t>The value in the Length field MUST contain the length of the Value
part of the attribute, prior to padding, measured in bytes. Since STUN
aligns attributes on 32 bit boundaries, attributes whose content is
not a multiple of 4 bytes are padded with 1, 2 or 3 bytes of padding
so that its value contains a multiple of 4 bytes. The padding bits are
ignored, and may be any value.</t>
<t>Any attribute type MAY appear more than once in a STUN message.
Unless specified otherwise, the order of appearance is significant:
only the first occurance needs to be processed by a receiver, and any
duplicates MAY be ignored by a receiver.</t>
<t>To allow future revisions of this specification to add new
attributes if needed, the attribute space is divided into two
ranges. Attributes with type values between 0x0000 and 0x7FFF
are comprehension-required attributes, which means that the STUN
agent cannot successfully process the message unless it
understands the attribute. Attributes with type values between
0x8000 and 0xFFFF are comprehension-optional attributes, which
means that those attributes can be ignored by the STUN agent if
it does not understand them.</t>
<t>The set of STUN attribute types is maintained by IANA. The
initial set defined by this specification is found in
<xref target="sec-iana-atts"/>.
</t>
<t>The rest of this section describes the format of the various
attributes defined in this specification. </t>
<section anchor="mapped_address" title="MAPPED-ADDRESS">
<t>The MAPPED-ADDRESS attribute indicates a reflexive
transport address of the client. It consists of an eight bit
address family, and a sixteen bit port, followed by a fixed
length value representing the IP address. If the address
family is IPv4, the address MUST be 32 bits. If the address
family is IPv6, the address MUST be 128 bits. All fields must
be in network byte order.</t>
<figure anchor="mapped_address_syntax"
title="Format of MAPPED-ADDRESS attribute">
<preamble>The format of the MAPPED-ADDRESS attribute is:</preamble>
<artwork align="center"><![CDATA[
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|0 0 0 0 0 0 0 0| Family | Port |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
| Address (32 bits or 128 bits) |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
]]></artwork>
<postamble></postamble>
</figure>
<figure>
<preamble>The address family can take on the following
values:</preamble>
<artwork><![CDATA[
0x01:IPv4
0x02:IPv6
]]></artwork>
<postamble></postamble>
</figure>
<t>The first 8 bits of the MAPPED-ADDRESS MUST be set to 0 and
MUST be
ignored by receivers. These bits are present for aligning parameters
on natural 32 bit boundaries.</t>
<t>
This attribute is used only by servers for achieving
backwards compatibility with RFC 3489
<xref target="RFC3489"/> clients.
</t>
</section>
<section anchor="xor_mapped_address" title="XOR-MAPPED-ADDRESS">
<t>The XOR-MAPPED-ADDRESS attribute is identical to the
MAPPED-ADDRESS attribute, except that the reflexive transport
address is obfuscated through the XOR function.</t>
<figure anchor="xor_mapped_address_format"
title="Format of XOR-MAPPED-ADDRESS Attribute">
<preamble>The format of the XOR-MAPPED-ADDRESS is:</preamble>
<artwork><![CDATA[
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|x x x x x x x x| Family | X-Port |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| X-Address (Variable)
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
]]></artwork>
<postamble></postamble>
</figure>
<t>The Family represents the IP address family, and is encoded
identically to the Family in MAPPED-ADDRESS.</t>
<t>X-Port is computed by taking the mapped port in host byte order,
XOR'ing it with the most significant 16 bits of the magic cookie,
and then the converting the result to network byte order. If the
IP address family is IPv4, X-Address is computed by taking the
mapped IP address in host byte order, XOR'ing it with the magic
cookie, and converting the result to network byte order. If the IP
address family is IPv6, X-Address is computed by taking the mapped
IP address in host byte order, XOR'ing it with the concatenation of
the magic cookie and the 96-bit transaction ID, and converting the
result to network byte order.
</t>
<t>The rules for encoding and processing the first 8 bits of the
attribute's value, the rules for handling multiple occurrences of the
attribute, and the rules for processing addresses families are the
same as for MAPPED-ADDRESS.</t>
<t>NOTE: XOR-MAPPED-ADDRESS and MAPPED-ADDRESS differ only in their
encoding of the transport address. The former encodes the transport
address by exclusive-or'ing it with
the magic cookie. The latter encodes it directly in binary. RFC
3489 originally specified only MAPPED-ADDRESS. However, deployment
experience found that some NATs rewrite the 32-bit binary payloads
containing the NAT's public IP address, such as STUN's
MAPPED-ADDRESS attribute, in the well-meaning but misguided attempt
at providing a generic ALG function. Such behavior interferes with
the operation of STUN and also causes failure of STUN's message
integrity checking.</t>
</section>
<section title="USERNAME">
<t>The USERNAME attribute is used for message integrity. It
identifies the username and password combination used in the
message integrity check.
</t>
<t>The value of USERNAME is a variable length value. It
MUST contain a UTF-8 <xref target="RFC3629"/> encoded sequence
of less than 513
bytes, and MUST have been processed using SASLPrep
<xref target="RFC4013"/>. </t>
</section>
<section anchor="message_integrity" title="MESSAGE-INTEGRITY">
<t>The MESSAGE-INTEGRITY attribute contains an <xref
target="RFC2104">HMAC-SHA1</xref> of the STUN message. The
MESSAGE-INTEGRITY attribute can be present in any STUN message type.
Since it uses the SHA1 hash, the HMAC will be 20 bytes. The text used
as input to HMAC is the STUN message, including the header, up to and
including the attribute preceding the MESSAGE-INTEGRITY attribute.
With the exception of the FINGERPRINT attribute, which appears after
MESSAGE-INTEGRITY, agents MUST ignore all other attributes that
follow MESSAGE-INTEGRITY.</t>
<t>
The key for the HMAC depends on whether long term or short term credentials are in use. For long term credentials, the key is 16 bytes:
</t>
<figure>
<artwork align="center"><![CDATA[
key = MD5(username ":" realm ":" SASLPrep(password))
]]></artwork>
</figure>
<t>That is, the 16 byte key is formed by taking the MD5 hash of the
result of concatenating the following five fields: (1) The username,
with any quotes and trailing nulls removed, as taken from the USERNAME
attribute (in which case SASLPrep has already been applied) (2) A
single colon, (3) The realm, with any quotes and trailing nulls
removed, (4) A single colon, and (5) the password, with any trailing
nulls removed and after processing using SASLPrep. For example, if the
username was 'user', the realm was 'realm', and the password was
'pass', then the 16-byte HMAC key would be the result of performing an
MD5 hash on the string 'user:realm:pass', the resulting hash being
0x8493fbc53ba582fb4c044c456bdc40eb.
</t>
<t>For short term credentials:</t>
<figure>
<artwork align="center"><![CDATA[
key = SASLPrep(password)
]]></artwork>
</figure>
<t>Where MD5 is defined in RFC 1321 <xref target="RFC1321"/> and
SASLPrep() is defined in <xref target="RFC4013"/>.
</t>
<t>
The structure of the key when used with long term credentials
facilitates deployment in systems that also utilize
SIP. Typically, SIP systems utilizing SIP's
digest authentication mechanism do not actually store the password
in the database. Rather, they store a value called H(A1), which is
equal to the key defined above.
</t>
<t>Based on the rules above, the hash includes the length
field from the STUN message header. Prior to performing the
hash, the MESSAGE-INTEGRITY
attribute MUST be inserted into the message (with dummy
content). The length MUST then be set to point to the length of the
message up to, and including, the MESSAGE-INTEGRITY attribute
itself, but excluding any attributes after it. Once
the computation is performed, the value of the
MESSAGE-INTEGRITY attribute can
be filled in, and the value of the length in the STUN header
can be set to its correct value - the length of the entire
message. Similarly, when validating the
MESSAGE-INTEGRITY, the length field should be adjusted to
point to the end of the MESSAGE-INTEGRITY attribute prior to
calculating the HMAC. Such adjustment is necessary when
attributes, such as FINGERPRINT, appear after
MESSAGE-INTEGRITY. </t>
</section>
<section anchor="sec:fingerprint" title="FINGERPRINT">
<t>The FINGERPRINT attribute MAY be present in all STUN
messages. The value of the attribute is computed as the CRC-32
of the STUN message up to (but excluding) the FINGERPRINT
attribute itself, xor-d with the 32 bit value 0x5354554e (the
XOR helps in cases where an application packet is also using
CRC-32 in it). The 32 bit CRC is the one defined in ITU V.42
<xref target="ITU.V42.2002"></xref>, which has a generator polynomial
of x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1. When present,
the FINGERPRINT attribute MUST be the last attribute in the
message, and thus will appear after MESSAGE-INTEGRITY.</t>
<t>The FINGERPRINT attribute can aid in distinguishing STUN packets
from packets of other protocols. See <xref target="sec:fingerprint-extension"/>.</t>
<t>As with MESSAGE-INTEGRITY, the CRC used in the FINGERPRINT
attribute covers the length field from the STUN message
header. Therefore, this value must be correct, and include the
CRC attribute as part of the message length, prior to
computation of the CRC. When using the FINGERPRINT attribute
in a message,
the attribute is first placed into the message with a dummy value,
then the CRC is computed, and then the value of the attribute is updated.
If the MESSAGE-INTEGRITY attribute is also present, then it must be
present with the correct message-integrity value before the CRC is
computed, since the CRC is done over the value of the MESSAGE-INTEGRITY
attribute as well.</t>
</section>
<section title="ERROR-CODE" anchor="sec:error-code">
<t>The ERROR-CODE attribute is used in Error Response messages.
It contains a numeric error code value in the range
of 300 to 699 plus a textual reason phrase encoded in UTF-8
<xref target="RFC3629"/>, and is
consistent in its code assignments and semantics with <xref
target="RFC3261">SIP</xref> and <xref target="RFC2616">HTTP</xref>.
The reason phrase is meant for user consumption, and can be anything
appropriate for the error code. Recommended reason phrases for the
defined error codes are presented below. The reason phrase
MUST be a UTF-8 <xref target="RFC3629"/> encoded sequence of
less than 128 characters
(which can be as long as 763 bytes).</t>
<figure anchor="fig-err" title="ERROR-CODE Attribute">
<artwork align="center"><![CDATA[
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Reserved, should be 0 |Class| Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Reason Phrase (variable) ..
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
]]></artwork>
</figure>
<t>To facilitate processing, the class of the error code (the
hundreds digit) is encoded separately from the rest of the
code, as shown in <xref target="fig-err"/>.</t>
<t>The Reserved bits SHOULD be 0, and are for alignment on
32-bit boundaries. Receivers MUST ignore these bits. The Class
represents the hundreds digit of the error code. The value MUST
be between 3 and 6. The number represents the error code modulo
100, and its value MUST be between 0 and 99.</t>
<t>The following error codes, along with their recommended
reason phrases are defined:</t>
<t><list hangIndent="5" style="hanging">
<t hangText="300">Try Alternate: The client should contact an
alternate server for this request. This error response MUST only
be sent if the request included a USERNAME attribute and a valid
MESSAGE-INTEGRITY attribute; otherwise it MUST NOT be sent and
error code 400 (Bad Request) is suggested. This error response MUST be protected
with the MESSAGE-INTEGRITY attribute, and receivers MUST validate
the MESSAGE-INTEGRITY of this response before redirecting
themselves to an alternate server.<list style="empty">
<t>Note: failure to generate and validate message-integrity
for a 300 response allows an on-path attacker to falsify a 300
response thus causing subsequent STUN messages to be sent to a
victim.</t>
</list></t>
<t hangText="400">Bad Request: The request was malformed. The
client SHOULD NOT retry the request without modification from the
previous attempt. The server may not be able to generate a valid
MESSAGE-INTEGRITY for this error, so the client MUST NOT expect a
valid MESSAGE-INTEGRITY attribute on this response.</t>
<t hangText="401">Unauthorized: The request did not contain the
correct credentials to proceed. The client should retry
the request with proper credentials.</t>
<t hangText="420">Unknown Attribute: The server received STUN
packet containing a comprehension-required attribute which it did not
understand. The server MUST put this unknown attribute in the
UNKNOWN-ATTRIBUTE attribute of its error response.</t>
<t hangText="438">Stale Nonce: The NONCE used by the
client was no longer valid. The client should retry,
using the NONCE provided in the response. </t>
<t hangText="500">Server Error: The server has suffered a
temporary error. The client should try again.</t>
</list></t>
</section>
<section title="REALM">
<t>The REALM attribute may be present in requests and responses. It
contains text which meets the grammar for "realm-value" as described in
<xref target="RFC3261">RFC 3261</xref> but without the double
quotes and their surrounding whitespace. That is, it is an
unquoted realm-value (and is therefore a sequence of qdtext or
quoted-pair). It MUST be a UTF-8 <xref target="RFC3629"/>
encoded sequence of less than 128 characters (which can be as
long as 763 bytes), and MUST have been processed using SASLPrep
<xref target="RFC4013"/>. </t>
<t>Presence of the REALM attribute in a request indicates that
long-term credentials are being used for authentication. Presence in
certain error responses indicates that the server wishes the client to
use a long-term credential for authentication.</t>
</section>
<section title="NONCE">
<t>The NONCE attribute may be present in requests and responses. It
contains a sequence of qdtext or quoted-pair, which are defined in
<xref target="RFC3261">RFC 3261</xref>. Note that this means
that the NONCE attribute will not contain actual quote
characters. See <xref target="RFC2617">RFC
2617</xref>, Section 4.3, for guidance on selection of nonce
values in a server. It MUST be less than 128 characters (which
can be as long as 763 bytes).</t>
</section>
<section title="UNKNOWN-ATTRIBUTES">
<t>The UNKNOWN-ATTRIBUTES attribute is present only in an error
response when the response code in the ERROR-CODE attribute is
420.</t>
<figure anchor="unknown_attribute_format"
title="Format of UNKNOWN-ATTRIBUTES attribute">
<preamble>The attribute contains a list of 16 bit values, each of
which represents an attribute type that was not understood by the
server.</preamble>
<artwork align="center"><![CDATA[
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Attribute 1 Type | Attribute 2 Type |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Attribute 3 Type | Attribute 4 Type ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
]]></artwork>
<postamble></postamble>
</figure>
<t><list style="empty">
<t>Note: In <xref target="RFC3489"></xref>, this field was padded
to 32 by duplicating the last attribute. In this version of the specification,
the normal padding rules for attributes are used instead.</t>
</list></t>
</section>
<section title="SERVER">
<t>The server attribute contains a textual description of the software
being used by the server. This SHOULD include manufacturer and
version number.
The attribute has no impact on operation of the protocol, and serves
only as a tool for diagnostic and debugging purposes. The value of
SERVER is variable length. It MUST be a UTF-8
<xref target="RFC3629"/> encoded sequence
of less than 128 characters (which can be as long as 763
bytes). </t>
</section>
<section title="CLIENT">
<t>The client attribute contains a textual description of the software
being used by the client. This SHOULD include manufacturer and
version number.
The attribute has no impact on operation of the protocol, and serves
only as a tool for diagnostic and debugging purposes. The value of
CLIENT is variable length. It MUST be a UTF-8
<xref target="RFC3629"/> encoded
sequence of less than 128 characters (which can be as long as 763
bytes).</t>
</section>
<section title="ALTERNATE-SERVER">
<t>The alternate server represents an alternate transport address
identifying a different STUN server which the STUN client should
try.</t>
<t>It is encoded in the same way as MAPPED-ADDRESS, and thus
refers to a single server by IP address. The IP address
family MUST be identical to that of the source IP address of
the request. </t>
<t>This attribute MUST only appear in an error response that
contains a MESSAGE-INTEGRITY attribute. This prevents it from
being used in denial-of-service attacks.</t>
</section>
</section>
<section anchor="security_considerations" title="Security
Considerations">
<section title="Attacks against the Protocol">
<section title="Outside Attacks">
<t>
An attacker can try to modify STUN messages in transit, in
order to cause a failure in STUN operation. These attacks
are detected for both requests and responses through the
message integrity mechanism, using either a short term or
long term credential. Of course, once detected, the
manipulated packets will be dropped, causing the STUN
transaction to effectively fail. This attack is possible
only by an on-path attacker.
</t>
<t>
An attacker that can observe, but not modify STUN messages
in-transit (for example, an attacker present on a shared
access medium, such as Wi-Fi), can see a STUN request, and
then immediately send a STUN response, typically an error
response, in order to disrupt STUN processing. This attack
is also prevented for messages that utilize
MESSAGE-INTEGRITY. However, some error responses, those
related to authentication in particular, cannot be protected
by MESSAGE-INTEGRITY. When STUN itself is run over a secure
transport protocol (e.g., TLS), these attacks are
completely mitigated.
</t>
<t>
Depending on the STUN usage, these attacks may be of minimal
consequence and thus do not require message integrity to
mitigate. For example, when STUN is used to a basic STUN
server to discover a server reflexive candidate for usage
with ICE, authentication and message integrity are not
required since these attacks are detected during the
connectivity check phase. The connectivity checks
themselves, however, require protection for proper operation
of ICE overall. As described in <xref target="usages"/>,
STUN usages describe when authentication and message
integrity are needed.
</t>
<t>
Since STUN uses the HMAC of a shared secret for
authentication and integrity protection, it is subject to
offline dictionary attacks. When authentication is utilized,
it SHOULD be with a strong password that is not readily
subject to offline dictionary attacks. Protection of the
channel itself, using TLS, mitigates these attacks. However,
STUN is most often run over UDP and in those cases, strong
passwords are the only way to protect against these
attacks.
</t>
</section>
<section title="Inside Attacks">
<t>
A rogue client may try to launch a DoS attack against a
server by sending it a large number of STUN
requests. Fortunately, STUN requests can be processed
statelessly by a server, making such attacks hard to
launch.
</t>
<t>
A rogue client may use a STUN server as a reflector,
sending it requests with a falsified source IP address and
port. In such a case, the response would be delivered to
that source IP and port. There is no amplification of the
number of packets with this attack (the STUN server sends
one packet for each packet sent by the client), though
there is a small increase in the amount of data, since
STUN responses are typically larger than requests. This
attack is mitigated by ingress source address
filtering. </t>
<t>
Revealing the specific software version of the server or
client through the SERVER and CLIENT attributes might allow
them to become more vulnerable to attacks against software
that is known to contain security holes. Implementers SHOULD make
the CLIENT and SERVER attributes a configurable option.
</t>
</section>
</section>
<section title="Attacks Affecting the Usage">
<t>This section lists attacks that might be launched against a
usage of STUN. Each STUN usage must consider whether these
attacks are applicable to it, and if so, discuss
counter-measures.</t>
<t>Most of the attacks in this section revolve around an
attacker modifying the reflexive address learned by a STUN
client through a Binding Request/Binding Response
transaction. Since the usage of the reflexive address is a
function of the usage, the applicability and remediation of
these attacks is usage-specific. In common situations,
modification of the reflexive address by an on-path attacker is
easy to do. Consider, for example, the common situation where
STUN is run directly over UDP. In this case, an on-path attacker
can modify the source IP address of the Binding Request before
it arrives at the STUN server. The STUN server will then return
this IP address in the XOR-MAPPED-ADDRESS attribute to the
client, and send the response back to that (falsified) IP
address and port. If the attacker can also intercept this
response, it can direct it back towards the client. Protecting
against this attack by using a message-integrity check is
impossible, since a message-integrity value cannot cover the
source IP address, since the intervening NAT must be able to
modify this value. Instead, one solution to preventing the
attacks listed below is for the client to verify the reflexive
address learned, as is done in ICE
<xref target="I-D.ietf-mmusic-ice"/>. Other usages may use other
means to prevent these attacks.</t>
<section anchor="ddos" title="Attack I: DDoS Against a Target">
<t>In this attack, the attacker provides one or more clients
with the same faked reflexive address that points to the intended
target. This will trick the STUN clients into thinking that
their reflexive addresses are equal to that of the target.
If the clients hand out that reflexive address in order to receive
traffic on it (for example, in SIP messages), the traffic will
instead be sent to the target. This attack can provide
substantial amplification, especially when used with clients that
are using STUN to enable multimedia applications. However,
it can only be launched against targets for which packets
from the STUN server to the target pass through the
attacker, limiting the cases in which it is possible</t>
</section>
<section title="Attack II: Silencing a Client">
<t>In this attack, the attacker provides
a STUN client with a faked reflexive address. The reflexive address it
provides is a transport address that routes to nowhere. As a result,
the client won't receive any of the packets it expects to receive
when it hands out the reflexive address. This exploitation is not
very interesting for the attacker. It impacts a single client, which
is frequently not the desired target. Moreover, any attacker that
can mount the attack could also deny service to the client by other
means, such as preventing the client from receiving any response
from the STUN server, or even a DHCP server. As with the
attack in <xref target="ddos"/>, this attack is only
possible when the attacker is on path for packets sent from
the STUN server towards this unused IP address.</t>
</section>
<section title="Attack III: Assuming the Identity of a Client">
<t>This attack is similar to attack II. However, the faked reflexive
address points to the attacker itself. This allows the attacker to
receive traffic which was destined for the client.</t>
</section>
<section title="Attack IV: Eavesdropping">
<t>In this attack, the attacker forces the client to use a reflexive
address that routes to itself. It then forwards any packets it
receives to the client. This attack would allow the attacker to
observe all packets sent to the client. However, in order to launch
the attack, the attacker must have already been able to observe
packets from the client to the STUN server. In most cases (such as
when the attack is launched from an access network), this means that
the attacker could already observe packets sent to the client. This
attack is, as a result, only useful for observing traffic by
attackers on the path from the client to the STUN server, but not
generally on the path of packets being routed towards the
client.</t>
</section>
</section>
<section title="Hash Agility Plan">
<t>
This specification uses HMAC-SHA-1 for computation of the message
integrity. If, at a later time, HMAC-SHA-1 is found to be
compromised, the following is the remedy that will be
applied.
</t>
<t>
We will define a STUN extension which introduces a new
message integrity attribute, computed using a new
hash. Clients would be required to include both the new and
old message integrity attributes in their requests or
indications. A new server will utilize the new message
integrity attribute, and an old one, the old. After a
transition period where mixed implementations are in
deployment, the old message-integrity attribute will be
deprecated by another specification, and clients will cease
including it in requests.
</t>
</section>
</section>
<section anchor="iab_considerations" title="IAB Considerations">
<t>The IAB has studied the problem of "Unilateral Self Address Fixing"
(UNSAF), which is the general process by which a client attempts to
determine its address in another realm on the other side of a NAT
through a collaborative protocol reflection mechanism (<xref
target="RFC3424">RFC3424</xref>). STUN can be used to perform this function
using a Binding Request/Response transaction if one agent is behind
a NAT and the other is on the public side of the NAT.</t>
<t>The IAB has mandated that protocols developed for this
purpose document a specific set of considerations. Because
some STUN usages provide UNSAF functions (such as ICE
<xref target="I-D.ietf-mmusic-ice"/> ), and
others do not (such as SIP Outbound
<xref target="I-D.ietf-sip-outbound"/>), answers to these
considerations need to be addressed by the usages themselves.
</t>
</section>
<section anchor="iana_considerations" title="IANA Considerations">
<t>IANA is hereby requested to create three new registries: a
"STUN Methods Registry", a "STUN Attributes Registry", and a "STUN
Error Codes registry". IANA is also requested to change the name
of the assigned IANA port for STUN from "nat-stun-port" to
"stun". </t>
<section title="STUN Methods Registry">
<t>A STUN method is a hex number in the range 0x000 - 0x3FF.
The encoding of STUN method into a STUN message is described in
<xref target="message_structure"/>.</t>
<figure>
<preamble>The initial STUN methods are:</preamble>
<artwork><![CDATA[
0x000: (Reserved)
0x001: Binding
0x002: (Reserved; was SharedSecret)
]]></artwork>
</figure>
<t>STUN methods in the range 0x000 - 0x1FF
are assigned by IETF Review <xref target="RFC5226"/>.
STUN methods in the range 0x200 - 0x3FF are assigned by
Designated Expert <xref target="RFC5226"/></t>. The
responsibility of the expert is to verify that the selected
codepoint(s) are not in use, and that the request is not for
an abnormally large number of codepoints. Technical review
of the extension itself is outside the scope of the
designated expert responsibility.
</section>
<section anchor="sec-iana-atts" title="STUN Attribute Registry">
<t>A STUN Attribute type is a hex number in the range 0x0000 - 0xFFFF.
STUN attribute types in the range 0x0000 - 0x7FFF
are considered comprehension-required;
STUN attribute types in the range 0x8000 - 0xFFFF
are considered comprehension-optional.
A STUN agent handles unknown comprehension-required and
comprehension-optional attributes differently.</t>
<figure>
<preamble>The initial STUN Attributes types are:</preamble>
<artwork><![CDATA[
Comprehension-required range (0x0000-0x7FFF):
0x0000: (Reserved)
0x0001: MAPPED-ADDRESS
0x0002: (Reserved; was RESPONSE-ADDRESS)
0x0004: (Reserved; was SOURCE-ADDRESS)
0x0005: (Reserved; was CHANGED-ADDRESS)
0x0006: USERNAME
0x0007: (Reserved; was PASSWORD)
0x0008: MESSAGE-INTEGRITY
0x0009: ERROR-CODE
0x000A: UNKNOWN-ATTRIBUTES
0x000B: (Reserved; was REFLECTED-FROM)
0x0014: REALM
0x0015: NONCE
0x0020: XOR-MAPPED-ADDRESS
Comprehension-optional range (0x8000-0xFFFF)
0x8022: SERVER
0x8023: ALTERNATE-SERVER
0x8028: FINGERPRINT
0x8030: CLIENT
]]></artwork>
</figure>
<t>STUN Attribute types in the first half of the comprehension-required range
(0x0000 - 0x3FFF) and in the first half of the comprehension-optional range
(0x8000 - 0xBFFF) are assigned
by IETF Review <xref target="RFC5226"/>.
STUN Attribute types in the second half of the comprehension-required range
(0x4000 - 0x7FFF)
and in the second half of the comprehension-optional range
(0xC000 - 0xFFFF) are assigned by Designated Expert
<xref target="RFC5226"/>. The
responsibility of the expert is to verify that the selected
codepoint(s) are not in use, and that the request is not for
an abnormally large number of codepoints. Technical review
of the extension itself is outside the scope of the
designated expert responsibility.</t>
</section>
<section title="STUN Error Code Registry">
<t>A STUN Error code is a number in the range 0 - 699.
STUN error codes are accompanied by a textual reason phrase
in UTF-8 <xref target="RFC3629"/>
which is intended only for human consumption and can be anything
appropriate; this document proposes only suggested values.</t>
<t>STUN error codes are consistent in codepoint assignments and semantics with <xref
target="RFC3261">SIP</xref> and <xref target="RFC2616">HTTP</xref>.</t>
<t>The initial values in this registry are given in <xref target="sec:error-code"/>.</t>
<t>New STUN error codes are assigned based on IETF Review
<xref target="RFC5226"/>. The specification must carefully
consider how clients that do not understand this error code
will process it before granting the request. See the rules in
<xref target="sec:processing-an-error-response"/>.</t>
</section>
<section title="STUN UDP and TCP Port Numbers">
<t>
IANA has previously assigned port 3478 for STUN. This port appears in
the IANA registry under the moniker "nat-stun-port". In order to align
the DNS SRV procedures with the registered protocol service, IANA is
requested to change the name of protocol assigned to port 3478 from
"nat-stun-port" to "stun", and the textual name from "Simple Traversal
of UDP Through NAT (STUN)" to "Session Traversal Utilities for NAT",
so that the IANA port registry would read:
</t>
<figure><artwork><![CDATA[
stun 3478/tcp Session Traversal Utilities for NAT (STUN) port
stun 3478/udp Session Traversal Utilities for NAT (STUN) port
]]></artwork></figure>
<t>
In addition, IANA is requested to assign port numbers for the "stuns"
service, defined over TCP and UDP. The UDP port is not currently
defined however is reserved for future use.
</t>
</section>
</section>
<section anchor="sec-changes" title="Changes Since RFC 3489">
<t>This specification obsoletes <xref target="RFC3489">RFC3489</xref>.
This specification differs from RFC3489 in the following ways:</t>
<list style="symbols">
<t>Removed the notion that STUN is a complete NAT traversal solution.
STUN is now a tool that can be used to produce a NAT traversal solution. As a consequence, changed the name of the protocol to Session Traversal Utilities for NAT.</t>
<t>Introduced the concept of STUN usages, and described what a usage
of STUN must document.</t>
<t>Removed the usage of STUN for NAT type detection and binding
lifetime discovery. These techniques have proven overly brittle due to
wider variations in the types of NAT devices than described in this
document. Removed the RESPONSE-ADDRESS, CHANGED-ADDRESS,
CHANGE-REQUEST, SOURCE-ADDRESS, and REFLECTED-FROM attributes.</t>
<t>Added a fixed 32-bit magic cookie and reduced length of transaction
ID by 32 bits. The magic cookie begins at the same offset as the
original transaction ID.</t>
<t>Added the XOR-MAPPED-ADDRESS attribute, which is included in
Binding Responses if the magic cookie is present in the request.
Otherwise the RFC3489 behavior is retained (that is, Binding Response
includes MAPPED-ADDRESS). See discussion in XOR-MAPPED-ADDRESS
regarding this change.</t>
<t>Introduced formal structure into the Message Type header field,
with an explicit pair of bits for indication of request, response,
error response or indication. Consequently, the message type field is
split into the class (one of the previous four) and method.</t>
<t>Explicitly point out that the most significant two bits of STUN are
0b00, allowing easy differentiation with RTP packets when used with
ICE.</t>
<t>Added the FINGERPRINT attribute to provide a method of definitely
detecting the difference between STUN and another protocol when the
two protocols are multiplexed together.</t>
<t>Added support for IPv6. Made it clear that an IPv4 client could get
a v6 mapped address, and vice-a-versa.</t>
<t>Added long-term credential-based authentication.</t>
<t>Added the SERVER, REALM, NONCE, and ALTERNATE-SERVER
attributes.</t>
<t>Removed the SharedSecret method, and thus the PASSWORD attribute.
This method was almost never implemented and is not needed with current
usages.</t>
<t>Removed recommendation to continue listening for STUN Responses for
10 seconds in an attempt to recognize an attack.</t>
<t>Changed transaction timers to be more TCP friendly.</t>
<t>Removed the STUN example that centered around the separation of the
control and media planes. Instead, provided more information on using
STUN with protocols.</t>
<t>
Defined a generic padding mechanism that changes the
interpretation of the length attribute. This would, in
theory, break backwards compatibility. However, the
mechanism in RFC 3489 never worked for the few attributes
that weren't aligned naturally on 32 bit boundaries.
</t>
<t>
REALM, SERVER, reason phrases and NONCE limited to
127 characters. USERNAME to 513 bytes.
</t>
<t>
Changed the DNS SRV procedures for TCP and TLS. UDP remains
the same as before.
</t>
</list>
</section>
<section title="Contributors">
<t>
Christian Huitema and Joel Weinberger were original co-authors of
RFC 3489.
</t>
</section>
<section title="Acknowledgements">
<t>The authors would like to thank Cedric Aoun, Pete Cordell, Cullen
Jennings, Bob Penfield, Xavier Marjou, Magnus Westerlund, Miguel
Garcia, Bruce Lowekamp and Chris Sullivan
for their comments, and Baruch Sterman and Alan Hawrylyshen for initial
implementations. Thanks for Leslie Daigle, Allison Mankin, Eric
Rescorla, and Henning Schulzrinne for IESG and IAB input on this
work.</t>
</section>
</middle>
<back>
<references title="Normative References">
<?rfc include='reference.RFC.2119'?>
<?rfc include='reference.RFC.0791'?>
<?rfc include='reference.RFC.2782'?>
<?rfc include='reference.RFC.2818'?>
<?rfc include='reference.RFC.1122'?>
<?rfc include='reference.RFC.2460'?>
<?rfc include='reference.RFC.2617'?>
<?rfc include='reference.RFC.2988'?>
<?rfc include='reference.RFC.2104'?>
<?rfc include='reference.ITU.V42.2002'?>
<?rfc include='reference.RFC.3629'?>
<?rfc include='reference.RFC.1321'?>
<?rfc include='reference.RFC.4013'?>
</references>
<references title="Informational References">
<?rfc include='reference.RFC.3261'?>
<?rfc include='reference.RFC.2616'?>
<?rfc include='reference.RFC.4107'?>
<?rfc include='reference.I-D.ietf-mmusic-ice'?>
<?rfc include='reference.RFC.3489'?>
<?rfc include='reference.I-D.ietf-behave-turn'?>
<?rfc include='reference.I-D.ietf-sip-outbound'?>
<?rfc include='reference.I-D.ietf-behave-nat-behavior-discovery'?>
<?rfc include='reference.I-D.ietf-mmusic-ice-tcp'?>
<?rfc include='reference.RFC.3264'?>
<?rfc include='reference.RFC.3424'?>
<?rfc include='reference.RFC.5226'?>
<reference anchor='KARN87'>
<front>
<title>Improving Round-Trip Time Estimates in Reliable
Transport Protocols</title>
<author initials='P.' surname='Karn'
fullname='Phil Karn'>
</author>
<author initials='C.' surname='Partridge'
fullname='Craig Partridge'>
</author>
<date month='August' year='1987' />
</front>
<seriesInfo name='SIGCOMM' value='1987' />
</reference>
</references>
<section title="C Snippet to Determine STUN Message Types ">
<figure>
<preamble>Given an 16-bit STUN message type value in host byte order
in msg_type parameter, below are C macros to determine the STUN
message types:</preamble>
<artwork><![CDATA[
#define IS_REQUEST(msg_type) (((msg_type) & 0x0110) == 0x0000)
#define IS_INDICATION(msg_type) (((msg_type) & 0x0110) == 0x0010)
#define IS_SUCCESS_RESP(msg_type) (((msg_type) & 0x0110) == 0x0100)
#define IS_ERR_RESP(msg_type) (((msg_type) & 0x0110) == 0x0110)
]]></artwork>
<postamble></postamble>
</figure>
<t></t>
</section>
</back>
</rfc>
| PAFTECH AB 2003-2026 | 2026-04-22 17:37:31 |