forked from Mirrors/freeswitch
2636 lines
115 KiB
Plaintext
2636 lines
115 KiB
Plaintext
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Network Working Group J. Rosenberg
|
|||
|
Request for Comments: 3489 J. Weinberger
|
|||
|
Category: Standards Track dynamicsoft
|
|||
|
C. Huitema
|
|||
|
Microsoft
|
|||
|
R. Mahy
|
|||
|
Cisco
|
|||
|
March 2003
|
|||
|
|
|||
|
|
|||
|
STUN - Simple Traversal of User Datagram Protocol (UDP)
|
|||
|
Through Network Address Translators (NATs)
|
|||
|
|
|||
|
Status of this Memo
|
|||
|
|
|||
|
This document specifies an Internet standards track protocol for the
|
|||
|
Internet community, and requests discussion and suggestions for
|
|||
|
improvements. Please refer to the current edition of the "Internet
|
|||
|
Official Protocol Standards" (STD 1) for the standardization state
|
|||
|
and status of this protocol. Distribution of this memo is unlimited.
|
|||
|
|
|||
|
Copyright Notice
|
|||
|
|
|||
|
Copyright (C) The Internet Society (2003). All Rights Reserved.
|
|||
|
|
|||
|
Abstract
|
|||
|
|
|||
|
Simple Traversal of User Datagram Protocol (UDP) Through Network
|
|||
|
Address Translators (NATs) (STUN) is a lightweight protocol that
|
|||
|
allows applications to discover the presence and types of NATs and
|
|||
|
firewalls between them and the public Internet. It also provides the
|
|||
|
ability for applications to determine the public Internet Protocol
|
|||
|
(IP) addresses allocated to them by the NAT. STUN works with many
|
|||
|
existing NATs, and does not require any special behavior from them.
|
|||
|
As a result, it allows a wide variety of applications to work through
|
|||
|
existing NAT infrastructure.
|
|||
|
|
|||
|
Table of Contents
|
|||
|
|
|||
|
1. Applicability Statement ................................... 3
|
|||
|
2. Introduction .............................................. 3
|
|||
|
3. Terminology ............................................... 4
|
|||
|
4. Definitions ............................................... 5
|
|||
|
5. NAT Variations ............................................ 5
|
|||
|
6. Overview of Operation ..................................... 6
|
|||
|
7. Message Overview .......................................... 8
|
|||
|
8. Server Behavior ........................................... 10
|
|||
|
8.1 Binding Requests .................................... 10
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Rosenberg, et al. Standards Track [Page 1]
|
|||
|
|
|||
|
RFC 3489 STUN March 2003
|
|||
|
|
|||
|
|
|||
|
8.2 Shared Secret Requests .............................. 13
|
|||
|
9. Client Behavior ........................................... 14
|
|||
|
9.1 Discovery ........................................... 15
|
|||
|
9.2 Obtaining a Shared Secret ........................... 15
|
|||
|
9.3 Formulating the Binding Request ..................... 17
|
|||
|
9.4 Processing Binding Responses ........................ 17
|
|||
|
10. Use Cases ................................................. 19
|
|||
|
10.1 Discovery Process ................................... 19
|
|||
|
10.2 Binding Lifetime Discovery .......................... 21
|
|||
|
10.3 Binding Acquisition ................................. 23
|
|||
|
11. Protocol Details .......................................... 24
|
|||
|
11.1 Message Header ...................................... 25
|
|||
|
11.2 Message Attributes .................................. 26
|
|||
|
11.2.1 MAPPED-ADDRESS .............................. 27
|
|||
|
11.2.2 RESPONSE-ADDRESS ............................ 27
|
|||
|
11.2.3 CHANGED-ADDRESS ............................. 28
|
|||
|
11.2.4 CHANGE-REQUEST .............................. 28
|
|||
|
11.2.5 SOURCE-ADDRESS .............................. 28
|
|||
|
11.2.6 USERNAME .................................... 28
|
|||
|
11.2.7 PASSWORD .................................... 29
|
|||
|
11.2.8 MESSAGE-INTEGRITY ........................... 29
|
|||
|
11.2.9 ERROR-CODE .................................. 29
|
|||
|
11.2.10 UNKNOWN-ATTRIBUTES .......................... 31
|
|||
|
11.2.11 REFLECTED-FROM .............................. 31
|
|||
|
12. Security Considerations ................................... 31
|
|||
|
12.1 Attacks on STUN ..................................... 31
|
|||
|
12.1.1 Attack I: DDOS Against a Target ............. 32
|
|||
|
12.1.2 Attack II: Silencing a Client ............... 32
|
|||
|
12.1.3 Attack III: Assuming the Identity of a Client 32
|
|||
|
12.1.4 Attack IV: Eavesdropping .................... 33
|
|||
|
12.2 Launching the Attacks ............................... 33
|
|||
|
12.2.1 Approach I: Compromise a Legitimate
|
|||
|
STUN Server ................................. 33
|
|||
|
12.2.2 Approach II: DNS Attacks .................... 34
|
|||
|
12.2.3 Approach III: Rogue Router or NAT ........... 34
|
|||
|
12.2.4 Approach IV: MITM ........................... 35
|
|||
|
12.2.5 Approach V: Response Injection Plus DoS ..... 35
|
|||
|
12.2.6 Approach VI: Duplication .................... 35
|
|||
|
12.3 Countermeasures ..................................... 36
|
|||
|
12.4 Residual Threats .................................... 37
|
|||
|
13. IANA Considerations ....................................... 38
|
|||
|
14. IAB Considerations ........................................ 38
|
|||
|
14.1 Problem Definition .................................. 38
|
|||
|
14.2 Exit Strategy ....................................... 39
|
|||
|
14.3 Brittleness Introduced by STUN ...................... 40
|
|||
|
14.4 Requirements for a Long Term Solution ............... 42
|
|||
|
14.5 Issues with Existing NAPT Boxes ..................... 43
|
|||
|
14.6 In Closing .......................................... 43
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Rosenberg, et al. Standards Track [Page 2]
|
|||
|
|
|||
|
RFC 3489 STUN March 2003
|
|||
|
|
|||
|
|
|||
|
15. Acknowledgments ........................................... 44
|
|||
|
16. Normative References ...................................... 44
|
|||
|
17. Informative References .................................... 44
|
|||
|
18. Authors' Addresses ........................................ 46
|
|||
|
19. Full Copyright Statement................................... 47
|
|||
|
|
|||
|
1. Applicability Statement
|
|||
|
|
|||
|
This protocol is not a cure-all for the problems associated with NAT.
|
|||
|
It does not enable incoming TCP connections through NAT. It allows
|
|||
|
incoming UDP packets through NAT, but only through a subset of
|
|||
|
existing NAT types. In particular, STUN does not enable incoming UDP
|
|||
|
packets through symmetric NATs (defined below), which are common in
|
|||
|
large enterprises. STUN's discovery procedures are based on
|
|||
|
assumptions on NAT treatment of UDP; such assumptions may prove
|
|||
|
invalid down the road as new NAT devices are deployed. STUN does not
|
|||
|
work when it is used to obtain an address to communicate with a peer
|
|||
|
which happens to be behind the same NAT. STUN does not work when the
|
|||
|
STUN server is not in a common shared address realm. For a more
|
|||
|
complete discussion of the limitations of STUN, see Section 14.
|
|||
|
|
|||
|
2. Introduction
|
|||
|
|
|||
|
Network Address Translators (NATs), while providing many benefits,
|
|||
|
also come with many drawbacks. The most troublesome of those
|
|||
|
drawbacks is the fact that they break many existing IP applications,
|
|||
|
and make it difficult to deploy new ones. Guidelines have been
|
|||
|
developed [8] that describe how to build "NAT friendly" protocols,
|
|||
|
but many protocols simply cannot be constructed according to those
|
|||
|
guidelines. Examples of such protocols include almost all peer-to-
|
|||
|
peer protocols, such as multimedia communications, file sharing and
|
|||
|
games.
|
|||
|
|
|||
|
To combat this problem, Application Layer Gateways (ALGs) have been
|
|||
|
embedded in NATs. ALGs perform the application layer functions
|
|||
|
required for a particular protocol to traverse a NAT. Typically,
|
|||
|
this involves rewriting application layer messages to contain
|
|||
|
translated addresses, rather than the ones inserted by the sender of
|
|||
|
the message. ALGs have serious limitations, including scalability,
|
|||
|
reliability, and speed of deploying new applications. To resolve
|
|||
|
these problems, the Middlebox Communications (MIDCOM) protocol is
|
|||
|
being developed [9]. MIDCOM allows an application entity, such as an
|
|||
|
end client or network server of some sort (like a Session Initiation
|
|||
|
Protocol (SIP) proxy [10]) to control a NAT (or firewall), in order
|
|||
|
to obtain NAT bindings and open or close pinholes. In this way, NATs
|
|||
|
and applications can be separated once more, eliminating the need for
|
|||
|
embedding ALGs in NATs, and resolving the limitations imposed by
|
|||
|
current architectures.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Rosenberg, et al. Standards Track [Page 3]
|
|||
|
|
|||
|
RFC 3489 STUN March 2003
|
|||
|
|
|||
|
|
|||
|
Unfortunately, MIDCOM requires upgrades to existing NAT and
|
|||
|
firewalls, in addition to application components. Complete upgrades
|
|||
|
of these NAT and firewall products will take a long time, potentially
|
|||
|
years. This is due, in part, to the fact that the deployers of NAT
|
|||
|
and firewalls are not the same people who are deploying and using
|
|||
|
applications. As a result, the incentive to upgrade these devices
|
|||
|
will be low in many cases. Consider, for example, an airport
|
|||
|
Internet lounge that provides access with a NAT. A user connecting
|
|||
|
to the NATed network may wish to use a peer-to-peer service, but
|
|||
|
cannot, because the NAT doesn't support it. Since the administrators
|
|||
|
of the lounge are not the ones providing the service, they are not
|
|||
|
motivated to upgrade their NAT equipment to support it, using either
|
|||
|
an ALG, or MIDCOM.
|
|||
|
|
|||
|
Another problem is that the MIDCOM protocol requires that the agent
|
|||
|
controlling the middleboxes know the identity of those middleboxes,
|
|||
|
and have a relationship with them which permits control. In many
|
|||
|
configurations, this will not be possible. For example, many cable
|
|||
|
access providers use NAT in front of their entire access network.
|
|||
|
This NAT could be in addition to a residential NAT purchased and
|
|||
|
operated by the end user. The end user will probably not have a
|
|||
|
control relationship with the NAT in the cable access network, and
|
|||
|
may not even know of its existence.
|
|||
|
|
|||
|
Many existing proprietary protocols, such as those for online games
|
|||
|
(such as the games described in RFC 3027 [11]) and Voice over IP,
|
|||
|
have developed tricks that allow them to operate through NATs without
|
|||
|
changing those NATs. This document is an attempt to take some of
|
|||
|
those ideas, and codify them into an interoperable protocol that can
|
|||
|
meet the needs of many applications.
|
|||
|
|
|||
|
The protocol described here, Simple Traversal of UDP Through NAT
|
|||
|
(STUN), allows entities behind a NAT to first discover the presence
|
|||
|
of a NAT and the type of NAT, and then to learn the addresses
|
|||
|
bindings allocated by the NAT. STUN requires no changes to NATs, and
|
|||
|
works with an arbitrary number of NATs in tandem between the
|
|||
|
application entity and the public Internet.
|
|||
|
|
|||
|
3. Terminology
|
|||
|
|
|||
|
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 BCP 14, RFC 2119
|
|||
|
[1] and indicate requirement levels for compliant STUN
|
|||
|
implementations.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Rosenberg, et al. Standards Track [Page 4]
|
|||
|
|
|||
|
RFC 3489 STUN March 2003
|
|||
|
|
|||
|
|
|||
|
4. Definitions
|
|||
|
|
|||
|
STUN Client: A STUN client (also just referred to as a client)
|
|||
|
is an entity that generates STUN requests. A STUN client can
|
|||
|
execute on an end system, such as a user's PC, or can run in a
|
|||
|
network element, such as a conferencing server.
|
|||
|
|
|||
|
STUN Server: A STUN Server (also just referred to as a server)
|
|||
|
is an entity that receives STUN requests, and sends STUN
|
|||
|
responses. STUN servers are generally attached to the public
|
|||
|
Internet.
|
|||
|
|
|||
|
5. NAT Variations
|
|||
|
|
|||
|
It is assumed that the reader is familiar with NATs. It has been
|
|||
|
observed that NAT treatment of UDP varies among implementations. The
|
|||
|
four treatments observed in implementations are:
|
|||
|
|
|||
|
Full Cone: A full cone NAT is one where all requests from the
|
|||
|
same internal IP address and port are mapped to the same external
|
|||
|
IP address and port. Furthermore, any external host can send a
|
|||
|
packet to the internal host, by sending a packet to the mapped
|
|||
|
external address.
|
|||
|
|
|||
|
Restricted Cone: A restricted cone NAT is one where all requests
|
|||
|
from the same internal IP address and port are mapped to the same
|
|||
|
external IP address and port. Unlike a full cone NAT, an external
|
|||
|
host (with IP address X) can send a packet to the internal host
|
|||
|
only if the internal host had previously sent a packet to IP
|
|||
|
address X.
|
|||
|
|
|||
|
Port Restricted Cone: A port restricted cone NAT is like a
|
|||
|
restricted cone NAT, but the restriction includes port numbers.
|
|||
|
Specifically, an external host can send a packet, with source IP
|
|||
|
address X and source port P, to the internal host only if the
|
|||
|
internal host had previously sent a packet to IP address X and
|
|||
|
port P.
|
|||
|
|
|||
|
Symmetric: A symmetric NAT is one where all requests from the
|
|||
|
same internal IP address and port, to a specific destination IP
|
|||
|
address and port, are mapped to the same external IP address and
|
|||
|
port. If the same host sends a packet with the same source
|
|||
|
address and port, but to a different destination, a different
|
|||
|
mapping is used. Furthermore, only the external host that
|
|||
|
receives a packet can send a UDP packet back to the internal host.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Rosenberg, et al. Standards Track [Page 5]
|
|||
|
|
|||
|
RFC 3489 STUN March 2003
|
|||
|
|
|||
|
|
|||
|
Determining the type of NAT is important in many cases. Depending on
|
|||
|
what the application wants to do, it may need to take the particular
|
|||
|
behavior into account.
|
|||
|
|
|||
|
6. Overview of Operation
|
|||
|
|
|||
|
This section is descriptive only. Normative behavior is described in
|
|||
|
Sections 8 and 9.
|
|||
|
|
|||
|
/-----\
|
|||
|
// STUN \\
|
|||
|
| Server |
|
|||
|
\\ //
|
|||
|
\-----/
|
|||
|
|
|||
|
|
|||
|
+--------------+ Public Internet
|
|||
|
................| NAT 2 |.......................
|
|||
|
+--------------+
|
|||
|
|
|||
|
|
|||
|
+--------------+ Private NET 2
|
|||
|
................| NAT 1 |.......................
|
|||
|
+--------------+
|
|||
|
|
|||
|
/-----\
|
|||
|
// STUN \\
|
|||
|
| Client |
|
|||
|
\\ // Private NET 1
|
|||
|
\-----/
|
|||
|
|
|||
|
Figure 1: STUN Configuration
|
|||
|
|
|||
|
The typical STUN configuration is shown in Figure 1. A STUN client
|
|||
|
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 STUN server resides on the public
|
|||
|
Internet.
|
|||
|
|
|||
|
STUN is a simple client-server protocol. A client sends a request to
|
|||
|
a server, and the server returns a response. There are two types of
|
|||
|
requests - Binding Requests, sent over UDP, and Shared Secret
|
|||
|
Requests, sent over TLS [2] over TCP. Shared Secret Requests ask the
|
|||
|
server to return a temporary username and password. This username
|
|||
|
and password are used in a subsequent Binding Request and Binding
|
|||
|
Response, for the purposes of authentication and message integrity.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Rosenberg, et al. Standards Track [Page 6]
|
|||
|
|
|||
|
RFC 3489 STUN March 2003
|
|||
|
|
|||
|
|
|||
|
Binding requests are used to determine the bindings allocated by
|
|||
|
NATs. The client sends a Binding Request to the server, over UDP.
|
|||
|
The server examines the source IP address and port of the request,
|
|||
|
and copies them into a response that is sent back to the client.
|
|||
|
There are some parameters in the request that allow the client to ask
|
|||
|
that the response be sent elsewhere, or that the server send the
|
|||
|
response from a different address and port. There are attributes for
|
|||
|
providing message integrity and authentication.
|
|||
|
|
|||
|
The trick is using STUN to discover the presence of NAT, and to learn
|
|||
|
and use the bindings they allocate.
|
|||
|
|
|||
|
The STUN client is typically embedded in an application which needs
|
|||
|
to obtain a public IP address and port that can be used to receive
|
|||
|
data. For example, it might need to obtain an IP address and port to
|
|||
|
receive Real Time Transport Protocol (RTP) [12] traffic. When the
|
|||
|
application starts, the STUN client within the application sends a
|
|||
|
STUN Shared Secret Request to its server, obtains a username and
|
|||
|
password, and then sends it a Binding Request. STUN servers can be
|
|||
|
discovered through DNS SRV records [3], and it is generally assumed
|
|||
|
that the client is configured with the domain to use to find the STUN
|
|||
|
server. Generally, this will be the domain of the provider of the
|
|||
|
service the application is using (such a provider is incented to
|
|||
|
deploy STUN servers in order to allow its customers to use its
|
|||
|
application through NAT). Of course, a client can determine the
|
|||
|
address or domain name of a STUN server through other means. A STUN
|
|||
|
server can even be embedded within an end system.
|
|||
|
|
|||
|
The STUN Binding Request is used to discover the presence of a NAT,
|
|||
|
and to discover the public IP address and port mappings generated by
|
|||
|
the NAT. Binding Requests are sent to the STUN server using UDP.
|
|||
|
When a Binding Request arrives at the STUN server, it may have passed
|
|||
|
through one or more NATs between the STUN client and the STUN server.
|
|||
|
As a result, the source address of the request received by the server
|
|||
|
will be the mapped address created by the NAT closest to the server.
|
|||
|
The STUN server copies that source IP address and port into a STUN
|
|||
|
Binding Response, and sends it back to the source IP address and port
|
|||
|
of the STUN request. For all of the NAT types above, this response
|
|||
|
will arrive at the STUN client.
|
|||
|
|
|||
|
When the STUN client receives the STUN Binding Response, it compares
|
|||
|
the IP address and port in the packet with the local IP address and
|
|||
|
port it bound to when the request was sent. If these do not match,
|
|||
|
the STUN client is behind one or more NATs. In the case of a full-
|
|||
|
cone NAT, the IP address and port in the body of the STUN response
|
|||
|
are public, and can be used by any host on the public Internet to
|
|||
|
send packets to the application that sent the STUN request. An
|
|||
|
application need only listen on the IP address and port from which
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Rosenberg, et al. Standards Track [Page 7]
|
|||
|
|
|||
|
RFC 3489 STUN March 2003
|
|||
|
|
|||
|
|
|||
|
the STUN request was sent. Any packets sent by a host on the public
|
|||
|
Internet to the public address and port learned by STUN will be
|
|||
|
received by the application.
|
|||
|
|
|||
|
Of course, the host may not be behind a full-cone NAT. Indeed, it
|
|||
|
doesn't yet know what type of NAT it is behind. To determine that,
|
|||
|
the client uses additional STUN Binding Requests. The exact
|
|||
|
procedure is flexible, but would generally work as follows. The
|
|||
|
client would send a second STUN Binding Request, this time to a
|
|||
|
different IP address, but from the same source IP address and port.
|
|||
|
If the IP address and port in the response are different from those
|
|||
|
in the first response, the client knows it is behind a symmetric NAT.
|
|||
|
To determine if it's behind a full-cone NAT, the client can send a
|
|||
|
STUN Binding Request with flags that tell the STUN server to send a
|
|||
|
response from a different IP address and port than the request was
|
|||
|
received on. In other words, if the client sent a Binding Request to
|
|||
|
IP address/port A/B using a source IP address/port of X/Y, the STUN
|
|||
|
server would send the Binding Response to X/Y using source IP
|
|||
|
address/port C/D. If the client receives this response, it knows it
|
|||
|
is behind a full cone NAT.
|
|||
|
|
|||
|
STUN also allows the client to ask the server to send the Binding
|
|||
|
Response from the same IP address the request was received on, but
|
|||
|
with a different port. This can be used to detect whether the client
|
|||
|
is behind a port restricted cone NAT or just a restricted cone NAT.
|
|||
|
|
|||
|
It should be noted that the configuration in Figure 1 is not the only
|
|||
|
permissible configuration. The STUN server can be located anywhere,
|
|||
|
including within another client. The only requirement is that the
|
|||
|
STUN server is reachable by the client, and if the client is trying
|
|||
|
to obtain a publicly routable address, that the server reside on the
|
|||
|
public Internet.
|
|||
|
|
|||
|
7. Message Overview
|
|||
|
|
|||
|
STUN messages are TLV (type-length-value) encoded using big endian
|
|||
|
(network ordered) binary. All STUN messages start with a STUN
|
|||
|
header, followed by a STUN payload. The payload is a series of STUN
|
|||
|
attributes, the set of which depends on the message type. The STUN
|
|||
|
header contains a STUN message type, transaction ID, and length. The
|
|||
|
message type can be Binding Request, Binding Response, Binding Error
|
|||
|
Response, Shared Secret Request, Shared Secret Response, or Shared
|
|||
|
Secret Error Response. The transaction ID is used to correlate
|
|||
|
requests and responses. The length indicates the total length of the
|
|||
|
STUN payload, not including the header. This allows STUN to run over
|
|||
|
TCP. Shared Secret Requests are always sent over TCP (indeed, using
|
|||
|
TLS over TCP).
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Rosenberg, et al. Standards Track [Page 8]
|
|||
|
|
|||
|
RFC 3489 STUN March 2003
|
|||
|
|
|||
|
|
|||
|
Several STUN attributes are defined. The first is a MAPPED-ADDRESS
|
|||
|
attribute, which is an IP address and port. It is always placed in
|
|||
|
the Binding Response, and it indicates the source IP address and port
|
|||
|
the server saw in the Binding Request. There is also a RESPONSE-
|
|||
|
ADDRESS attribute, which contains an IP address and port. The
|
|||
|
RESPONSE-ADDRESS attribute can be present in the Binding Request, and
|
|||
|
indicates where the Binding Response is to be sent. It's optional,
|
|||
|
and when not present, the Binding Response is sent to the source IP
|
|||
|
address and port of the Binding Request.
|
|||
|
|
|||
|
The third attribute is the CHANGE-REQUEST attribute, and it contains
|
|||
|
two flags to control the IP address and port used to send the
|
|||
|
response. These flags are called "change IP" and "change port"
|
|||
|
flags. The CHANGE-REQUEST attribute is allowed only in the Binding
|
|||
|
Request. The "change IP" and "change port" flags are useful for
|
|||
|
determining whether the client is behind a restricted cone NAT or
|
|||
|
restricted port cone NAT. They instruct the server to send the
|
|||
|
Binding Responses from a different source IP address and port. The
|
|||
|
CHANGE-REQUEST attribute is optional in the Binding Request.
|
|||
|
|
|||
|
The fourth attribute is the CHANGED-ADDRESS attribute. It is present
|
|||
|
in Binding Responses. It informs the client of the source IP address
|
|||
|
and port that would be used if the client requested the "change IP"
|
|||
|
and "change port" behavior.
|
|||
|
|
|||
|
The fifth attribute is the SOURCE-ADDRESS attribute. It is only
|
|||
|
present in Binding Responses. It indicates the source IP address and
|
|||
|
port where the response was sent from. It is useful for detecting
|
|||
|
twice NAT configurations.
|
|||
|
|
|||
|
The sixth attribute is the USERNAME attribute. It is present in a
|
|||
|
Shared Secret Response, which provides the client with a temporary
|
|||
|
username and password (encoded in the PASSWORD attribute). The
|
|||
|
USERNAME is also present in Binding Requests, serving as an index to
|
|||
|
the shared secret used for the integrity protection of the Binding
|
|||
|
Request. The seventh attribute, PASSWORD, is only found in Shared
|
|||
|
Secret Response messages. The eight attribute is the MESSAGE-
|
|||
|
INTEGRITY attribute, which contains a message integrity check over
|
|||
|
the Binding Request or Binding Response.
|
|||
|
|
|||
|
The ninth attribute is the ERROR-CODE attribute. This is present in
|
|||
|
the Binding Error Response and Shared Secret Error Response. It
|
|||
|
indicates the error that has occurred. The tenth attribute is the
|
|||
|
UNKNOWN-ATTRIBUTES attribute, which is present in either the Binding
|
|||
|
Error Response or Shared Secret Error Response. It indicates the
|
|||
|
mandatory attributes from the request which were unknown. The
|
|||
|
eleventh attribute is the REFLECTED-FROM attribute, which is present
|
|||
|
in Binding Responses. It indicates the IP address and port of the
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Rosenberg, et al. Standards Track [Page 9]
|
|||
|
|
|||
|
RFC 3489 STUN March 2003
|
|||
|
|
|||
|
|
|||
|
sender of a Binding Request, used for traceability purposes to
|
|||
|
prevent certain denial-of-service attacks.
|
|||
|
|
|||
|
8. Server Behavior
|
|||
|
|
|||
|
The server behavior depends on whether the request is a Binding
|
|||
|
Request or a Shared Secret Request.
|
|||
|
|
|||
|
8.1 Binding Requests
|
|||
|
|
|||
|
A STUN server MUST be prepared to receive Binding Requests on four
|
|||
|
address/port combinations - (A1, P1), (A2, P1), (A1, P2), and (A2,
|
|||
|
P2). (A1, P1) represent the primary address and port, and these are
|
|||
|
the ones obtained through the client discovery procedures below.
|
|||
|
Typically, P1 will be port 3478, the default STUN port. A2 and P2
|
|||
|
are arbitrary. A2 and P2 are advertised by the server through the
|
|||
|
CHANGED-ADDRESS attribute, as described below.
|
|||
|
|
|||
|
It is RECOMMENDED that the server check the Binding Request for a
|
|||
|
MESSAGE-INTEGRITY attribute. If not present, and the server requires
|
|||
|
integrity checks on the request, it generates a Binding Error
|
|||
|
Response with an ERROR-CODE attribute with response code 401. If the
|
|||
|
MESSAGE-INTEGRITY attribute was present, the server computes the HMAC
|
|||
|
over the request as described in Section 11.2.8. The key to use
|
|||
|
depends on the shared secret mechanism. If the STUN Shared Secret
|
|||
|
Request was used, the key MUST be the one associated with the
|
|||
|
USERNAME attribute present in the request. If the USERNAME attribute
|
|||
|
was not present, the server MUST generate a Binding Error Response.
|
|||
|
The Binding Error Response MUST include an ERROR-CODE attribute with
|
|||
|
response code 432. If the USERNAME is present, but the server
|
|||
|
doesn't remember the shared secret for that USERNAME (because it
|
|||
|
timed out, for example), the server MUST generate a Binding Error
|
|||
|
Response. The Binding Error Response MUST include an ERROR-CODE
|
|||
|
attribute with response code 430. If the server does know the shared
|
|||
|
secret, but the computed HMAC differs from the one in the request,
|
|||
|
the server MUST generate a Binding Error Response with an ERROR-CODE
|
|||
|
attribute with response code 431. The Binding Error Response is sent
|
|||
|
to the IP address and port the Binding Request came from, and sent
|
|||
|
from the IP address and port the Binding Request was sent to.
|
|||
|
|
|||
|
Assuming the message integrity check passed, processing continues.
|
|||
|
The server MUST check for any attributes in the request with values
|
|||
|
less than or equal to 0x7fff which it does not understand. If it
|
|||
|
encounters any, the server MUST generate a Binding Error Response,
|
|||
|
and it MUST include an ERROR-CODE attribute with a 420 response code.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Rosenberg, et al. Standards Track [Page 10]
|
|||
|
|
|||
|
RFC 3489 STUN March 2003
|
|||
|
|
|||
|
|
|||
|
That response MUST contain an UNKNOWN-ATTRIBUTES attribute listing
|
|||
|
the attributes with values less than or equal to 0x7fff which were
|
|||
|
not understood. The Binding Error Response is sent to the IP address
|
|||
|
and port the Binding Request came from, and sent from the IP address
|
|||
|
and port the Binding Request was sent to.
|
|||
|
|
|||
|
Assuming the request was correctly formed, the server MUST generate a
|
|||
|
single Binding Response. The Binding Response MUST contain the same
|
|||
|
transaction ID contained in the Binding Request. The length in the
|
|||
|
message header MUST contain the total length of the message in bytes,
|
|||
|
excluding the header. The Binding Response MUST have a message type
|
|||
|
of "Binding Response".
|
|||
|
|
|||
|
The server MUST add a MAPPED-ADDRESS attribute to the Binding
|
|||
|
Response. The IP address component of this attribute MUST be set to
|
|||
|
the source IP address observed in the Binding Request. The port
|
|||
|
component of this attribute MUST be set to the source port observed
|
|||
|
in the Binding Request.
|
|||
|
|
|||
|
If the RESPONSE-ADDRESS attribute was absent from the Binding
|
|||
|
Request, the destination address and port of the Binding Response
|
|||
|
MUST be the same as the source address and port of the Binding
|
|||
|
Request. Otherwise, the destination address and port of the Binding
|
|||
|
Response MUST be the value of the IP address and port in the
|
|||
|
RESPONSE-ADDRESS attribute.
|
|||
|
|
|||
|
The source address and port of the Binding Response depend on the
|
|||
|
value of the CHANGE-REQUEST attribute and on the address and port the
|
|||
|
Binding Request was received on, and are summarized in Table 1.
|
|||
|
|
|||
|
Let Da represent the destination IP address of the Binding Request
|
|||
|
(which will be either A1 or A2), and Dp represent the destination
|
|||
|
port of the Binding Request (which will be either P1 or P2). Let Ca
|
|||
|
represent the other address, so that if Da is A1, Ca is A2. If Da is
|
|||
|
A2, Ca is A1. Similarly, let Cp represent the other port, so that if
|
|||
|
Dp is P1, Cp is P2. If Dp is P2, Cp is P1. If the "change port"
|
|||
|
flag was set in CHANGE-REQUEST attribute of the Binding Request, and
|
|||
|
the "change IP" flag was not set, the source IP address of the
|
|||
|
Binding Response MUST be Da and the source port of the Binding
|
|||
|
Response MUST be Cp. If the "change IP" flag was set in the Binding
|
|||
|
Request, and the "change port" flag was not set, the source IP
|
|||
|
address of the Binding Response MUST be Ca and the source port of the
|
|||
|
Binding Response MUST be Dp. When both flags are set, the source IP
|
|||
|
address of the Binding Response MUST be Ca and the source port of the
|
|||
|
Binding Response MUST be Cp. If neither flag is set, or if the
|
|||
|
CHANGE-REQUEST attribute is absent entirely, the source IP address of
|
|||
|
the Binding Response MUST be Da and the source port of the Binding
|
|||
|
Response MUST be Dp.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Rosenberg, et al. Standards Track [Page 11]
|
|||
|
|
|||
|
RFC 3489 STUN March 2003
|
|||
|
|
|||
|
|
|||
|
Flags Source Address Source Port CHANGED-ADDRESS
|
|||
|
none Da Dp Ca:Cp
|
|||
|
Change IP Ca Dp Ca:Cp
|
|||
|
Change port Da Cp Ca:Cp
|
|||
|
Change IP and
|
|||
|
Change port Ca Cp Ca:Cp
|
|||
|
|
|||
|
Table 1: Impact of Flags on Packet Source and CHANGED-ADDRESS
|
|||
|
|
|||
|
The server MUST add a SOURCE-ADDRESS attribute to the Binding
|
|||
|
Response, containing the source address and port used to send the
|
|||
|
Binding Response.
|
|||
|
|
|||
|
The server MUST add a CHANGED-ADDRESS attribute to the Binding
|
|||
|
Response. This contains the source IP address and port that would be
|
|||
|
used if the client had set the "change IP" and "change port" flags in
|
|||
|
the Binding Request. As summarized in Table 1, these are Ca and Cp,
|
|||
|
respectively, regardless of the value of the CHANGE-REQUEST flags.
|
|||
|
|
|||
|
If the Binding Request contained both the USERNAME and MESSAGE-
|
|||
|
INTEGRITY attributes, the server MUST add a MESSAGE-INTEGRITY
|
|||
|
attribute to the Binding Response. The attribute contains an HMAC
|
|||
|
[13] over the response, as described in Section 11.2.8. The key to
|
|||
|
use depends on the shared secret mechanism. If the STUN Shared
|
|||
|
Secret Request was used, the key MUST be the one associated with the
|
|||
|
USERNAME attribute present in the Binding Request.
|
|||
|
|
|||
|
If the Binding Request contained a RESPONSE-ADDRESS attribute, the
|
|||
|
server MUST add a REFLECTED-FROM attribute to the response. If the
|
|||
|
Binding Request was authenticated using a username obtained from a
|
|||
|
Shared Secret Request, the REFLECTED-FROM attribute MUST contain the
|
|||
|
source IP address and port where that Shared Secret Request came
|
|||
|
from. If the username present in the request was not allocated using
|
|||
|
a Shared Secret Request, the REFLECTED-FROM attribute MUST contain
|
|||
|
the source address and port of the entity which obtained the
|
|||
|
username, as best can be verified with the mechanism used to allocate
|
|||
|
the username. If the username was not present in the request, and
|
|||
|
the server was willing to process the request, the REFLECTED-FROM
|
|||
|
attribute SHOULD contain the source IP address and port where the
|
|||
|
request came from.
|
|||
|
|
|||
|
The server SHOULD NOT retransmit the response. Reliability is
|
|||
|
achieved by having the client periodically resend the request, each
|
|||
|
of which triggers a response from the server.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Rosenberg, et al. Standards Track [Page 12]
|
|||
|
|
|||
|
RFC 3489 STUN March 2003
|
|||
|
|
|||
|
|
|||
|
8.2 Shared Secret Requests
|
|||
|
|
|||
|
Shared Secret Requests are always received on TLS connections. When
|
|||
|
the server receives a request from the client to establish a TLS
|
|||
|
connection, it MUST proceed with TLS, and SHOULD present a site
|
|||
|
certificate. The TLS ciphersuite TLS_RSA_WITH_AES_128_CBC_SHA [4]
|
|||
|
SHOULD be used. Client TLS authentication MUST NOT be done, since
|
|||
|
the server is not allocating any resources to clients, and the
|
|||
|
computational burden can be a source of attacks.
|
|||
|
|
|||
|
If the server receives a Shared Secret Request, it MUST verify that
|
|||
|
the request arrived on a TLS connection. If it did not receive the
|
|||
|
request over TLS, it MUST generate a Shared Secret Error Response,
|
|||
|
and it MUST include an ERROR-CODE attribute with a 433 response code.
|
|||
|
The destination for the error response depends on the transport on
|
|||
|
which the request was received. If the Shared Secret Request was
|
|||
|
received over TCP, the Shared Secret Error Response is sent over the
|
|||
|
same connection the request was received on. If the Shared Secret
|
|||
|
Request was receive over UDP, the Shared Secret Error Response is
|
|||
|
sent to the source IP address and port that the request came from.
|
|||
|
|
|||
|
The server MUST check for any attributes in the request with values
|
|||
|
less than or equal to 0x7fff which it does not understand. If it
|
|||
|
encounters any, the server MUST generate a Shared Secret Error
|
|||
|
Response, and it MUST include an ERROR-CODE attribute with a 420
|
|||
|
response code. That response MUST contain an UNKNOWN-ATTRIBUTES
|
|||
|
attribute listing the attributes with values less than or equal to
|
|||
|
0x7fff which were not understood. The Shared Secret Error Response
|
|||
|
is sent over the TLS connection.
|
|||
|
|
|||
|
All Shared Secret Error Responses MUST contain the same transaction
|
|||
|
ID contained in the Shared Secret Request. The length in the message
|
|||
|
header MUST contain the total length of the message in bytes,
|
|||
|
excluding the header. The Shared Secret Error Response MUST have a
|
|||
|
message type of "Shared Secret Error Response" (0x0112).
|
|||
|
|
|||
|
Assuming the request was properly constructed, the server creates a
|
|||
|
Shared Secret Response. The Shared Secret Response MUST contain the
|
|||
|
same transaction ID contained in the Shared Secret Request. The
|
|||
|
length in the message header MUST contain the total length of the
|
|||
|
message in bytes, excluding the header. The Shared Secret Response
|
|||
|
MUST have a message type of "Shared Secret Response". The Shared
|
|||
|
Secret Response MUST contain a USERNAME attribute and a PASSWORD
|
|||
|
attribute. The USERNAME attribute serves as an index to the
|
|||
|
password, which is contained in the PASSWORD attribute. The server
|
|||
|
can use any mechanism it chooses to generate the username. However,
|
|||
|
the username MUST be valid for a period of at least 10 minutes.
|
|||
|
Validity means that the server can compute the password for that
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Rosenberg, et al. Standards Track [Page 13]
|
|||
|
|
|||
|
RFC 3489 STUN March 2003
|
|||
|
|
|||
|
|
|||
|
username. There MUST be a single password for each username. In
|
|||
|
other words, the server cannot, 10 minutes later, assign a different
|
|||
|
password to the same username. The server MUST hand out a different
|
|||
|
username for each distinct Shared Secret Request. Distinct, in this
|
|||
|
case, implies a different transaction ID. It is RECOMMENDED that the
|
|||
|
server explicitly invalidate the username after ten minutes. It MUST
|
|||
|
invalidate the username after 30 minutes. The PASSWORD contains the
|
|||
|
password bound to that username. The password MUST have at least 128
|
|||
|
bits. The likelihood that the server assigns the same password for
|
|||
|
two different usernames MUST be vanishingly small, and the passwords
|
|||
|
MUST be unguessable. In other words, they MUST be a
|
|||
|
cryptographically random function of the username.
|
|||
|
|
|||
|
These requirements can still be met using a stateless server, by
|
|||
|
intelligently computing the USERNAME and PASSWORD. One approach is
|
|||
|
to construct the USERNAME as:
|
|||
|
|
|||
|
USERNAME = <prefix,rounded-time,clientIP,hmac>
|
|||
|
|
|||
|
Where prefix is some random text string (different for each shared
|
|||
|
secret request), rounded-time is the current time modulo 20 minutes,
|
|||
|
clientIP is the source IP address where the Shared Secret Request
|
|||
|
came from, and hmac is an HMAC [13] over the prefix, rounded-time,
|
|||
|
and client IP, using a server private key.
|
|||
|
|
|||
|
The password is then computed as:
|
|||
|
|
|||
|
password = <hmac(USERNAME,anotherprivatekey)>
|
|||
|
|
|||
|
With this structure, the username itself, which will be present in
|
|||
|
the Binding Request, contains the source IP address where the Shared
|
|||
|
Secret Request came from. That allows the server to meet the
|
|||
|
requirements specified in Section 8.1 for constructing the
|
|||
|
REFLECTED-FROM attribute. The server can verify that the username
|
|||
|
was not tampered with, using the hmac present in the username.
|
|||
|
|
|||
|
The Shared Secret Response is sent over the same TLS connection the
|
|||
|
request was received on. The server SHOULD keep the connection open,
|
|||
|
and let the client close it.
|
|||
|
|
|||
|
9. Client Behavior
|
|||
|
|
|||
|
The behavior of the client is very straightforward. Its task is to
|
|||
|
discover the STUN server, obtain a shared secret, formulate the
|
|||
|
Binding Request, handle request reliability, and process the Binding
|
|||
|
Responses.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Rosenberg, et al. Standards Track [Page 14]
|
|||
|
|
|||
|
RFC 3489 STUN March 2003
|
|||
|
|
|||
|
|
|||
|
9.1 Discovery
|
|||
|
|
|||
|
Generally, the client will be configured with a domain name of the
|
|||
|
provider of the STUN servers. This domain name is resolved to an IP
|
|||
|
address and port using the SRV procedures specified in RFC 2782 [3].
|
|||
|
|
|||
|
Specifically, the service name is "stun". The protocol is "udp" for
|
|||
|
sending Binding Requests, or "tcp" for sending Shared Secret
|
|||
|
Requests. 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, it 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. Those details are described here for STUN.
|
|||
|
|
|||
|
For STUN requests, failure occurs if there is a transport failure of
|
|||
|
some sort (generally, due to fatal ICMP errors in UDP or connection
|
|||
|
failures in TCP). Failure also occurs if the transaction fails due
|
|||
|
to timeout. This occurs 9.5 seconds after the first request is sent,
|
|||
|
for both Shared Secret Requests and Binding Requests. See Section
|
|||
|
9.3 for details on transaction timeouts for Binding Requests. If a
|
|||
|
failure occurs, the client SHOULD create a new request, which is
|
|||
|
identical to the previous, but has a different transaction ID and
|
|||
|
MESSAGE INTEGRITY attribute (the HMAC will change because the
|
|||
|
transaction ID has changed). That request is sent to the next
|
|||
|
element in the list as specified by RFC 2782.
|
|||
|
|
|||
|
The default port for STUN requests is 3478, for both TCP and UDP.
|
|||
|
Administrators SHOULD use this port in their SRV records, but MAY use
|
|||
|
others.
|
|||
|
|
|||
|
If no SRV records were found, the client performs an A 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.
|
|||
|
|
|||
|
This would allow a firewall admin to open the STUN port, so hosts
|
|||
|
within the enterprise could access new applications. Whether they
|
|||
|
will or won't do this is a good question.
|
|||
|
|
|||
|
9.2 Obtaining a Shared Secret
|
|||
|
|
|||
|
As discussed in Section 12, there are several attacks possible on
|
|||
|
STUN systems. Many of these are prevented through integrity of
|
|||
|
requests and responses. To provide that integrity, STUN makes use of
|
|||
|
a shared secret between client and server, used as the keying
|
|||
|
material for an HMAC used in both the Binding Request and Binding
|
|||
|
Response. STUN allows for the shared secret to be obtained in any
|
|||
|
way (for example, Kerberos [14]). However, it MUST have at least 128
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Rosenberg, et al. Standards Track [Page 15]
|
|||
|
|
|||
|
RFC 3489 STUN March 2003
|
|||
|
|
|||
|
|
|||
|
bits of randomness. In order to ensure interoperability, this
|
|||
|
specification describes a TLS-based mechanism. This mechanism,
|
|||
|
described in this section, MUST be implemented by clients and
|
|||
|
servers.
|
|||
|
|
|||
|
First, the client determines the IP address and port that it will
|
|||
|
open a TCP connection to. This is done using the discovery
|
|||
|
procedures in Section 9.1. The client opens up the connection to
|
|||
|
that address and port, and immediately begins TLS negotiation [2].
|
|||
|
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 [5]. 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 9.1 as the host portion of
|
|||
|
the URI that has been dereferenced.
|
|||
|
|
|||
|
Once the connection is opened, the client sends a Shared Secret
|
|||
|
request. This request has no attributes, just the header. The
|
|||
|
transaction ID in the header MUST meet the requirements outlined for
|
|||
|
the transaction ID in a binding request, described in Section 9.3
|
|||
|
below. The server generates a response, which can either be a Shared
|
|||
|
Secret Response or a Shared Secret Error Response.
|
|||
|
|
|||
|
If the response was a Shared Secret Error Response, the client checks
|
|||
|
the response code in the ERROR-CODE attribute. Interpretation of
|
|||
|
those response codes is identical to the processing of Section 9.4
|
|||
|
for the Binding Error Response.
|
|||
|
|
|||
|
If a client receives a Shared Secret Response with an attribute whose
|
|||
|
type is greater than 0x7fff, the attribute MUST be ignored. If the
|
|||
|
client receives a Shared Secret Response with an attribute whose type
|
|||
|
is less than or equal to 0x7fff, the response is ignored.
|
|||
|
|
|||
|
If the response was a Shared Secret Response, it will contain a short
|
|||
|
lived username and password, encoded in the USERNAME and PASSWORD
|
|||
|
attributes, respectively.
|
|||
|
|
|||
|
The client MAY generate multiple Shared Secret Requests on the
|
|||
|
connection, and it MAY do so before receiving Shared Secret Responses
|
|||
|
to previous Shared Secret Requests. The client SHOULD close the
|
|||
|
connection as soon as it has finished obtaining usernames and
|
|||
|
passwords.
|
|||
|
|
|||
|
Section 9.3 describes how these passwords are used to provide
|
|||
|
integrity protection over Binding Requests, and Section 8.1 describes
|
|||
|
how it is used in Binding Responses.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Rosenberg, et al. Standards Track [Page 16]
|
|||
|
|
|||
|
RFC 3489 STUN March 2003
|
|||
|
|
|||
|
|
|||
|
9.3 Formulating the Binding Request
|
|||
|
|
|||
|
A Binding Request formulated by the client follows the syntax rules
|
|||
|
defined in Section 11. Any two requests that are not bit-wise
|
|||
|
identical, and not sent to the same server from the same IP address
|
|||
|
and port, MUST carry different transaction IDs. The transaction ID
|
|||
|
MUST be uniformly and randomly distributed between 0 and 2**128 - 1.
|
|||
|
The large range is needed because the transaction ID serves as a form
|
|||
|
of randomization, helping to prevent replays of previously signed
|
|||
|
responses from the server. The message type of the request MUST be
|
|||
|
"Binding Request".
|
|||
|
|
|||
|
The RESPONSE-ADDRESS attribute is optional in the Binding Request.
|
|||
|
It is used if the client wishes the response to be sent to a
|
|||
|
different IP address and port than the one the request was sent from.
|
|||
|
This is useful for determining whether the client is behind a
|
|||
|
firewall, and for applications that have separated control and data
|
|||
|
components. See Section 10.3 for more details. The CHANGE-REQUEST
|
|||
|
attribute is also optional. Whether it is present depends on what
|
|||
|
the application is trying to accomplish. See Section 10 for some
|
|||
|
example uses.
|
|||
|
|
|||
|
The client SHOULD add a MESSAGE-INTEGRITY and USERNAME attribute to
|
|||
|
the Binding Request. This MESSAGE-INTEGRITY attribute contains an
|
|||
|
HMAC [13]. The value of the username, and the key to use in the
|
|||
|
MESSAGE-INTEGRITY attribute depend on the shared secret mechanism.
|
|||
|
If the STUN Shared Secret Request was used, the USERNAME must be a
|
|||
|
valid username obtained from a Shared Secret Response within the last
|
|||
|
nine minutes. The shared secret for the HMAC is the value of the
|
|||
|
PASSWORD attribute obtained from the same Shared Secret Response.
|
|||
|
|
|||
|
Once formulated, the client sends the Binding Request. Reliability
|
|||
|
is accomplished through client retransmissions. Clients SHOULD
|
|||
|
retransmit the request starting with an interval of 100ms, doubling
|
|||
|
every retransmit until the interval reaches 1.6s. Retransmissions
|
|||
|
continue with intervals of 1.6s until a response is received, or a
|
|||
|
total of 9 requests have been sent. If no response is received by 1.6
|
|||
|
seconds after the last request has been sent, the client SHOULD
|
|||
|
consider the transaction to have failed. In other words, requests
|
|||
|
would be sent at times 0ms, 100ms, 300ms, 700ms, 1500ms, 3100ms,
|
|||
|
4700ms, 6300ms, and 7900ms. At 9500ms, the client considers the
|
|||
|
transaction to have failed if no response has been received.
|
|||
|
|
|||
|
9.4 Processing Binding Responses
|
|||
|
|
|||
|
The response can either be a Binding Response or Binding Error
|
|||
|
Response. Binding Error Responses are always received on the source
|
|||
|
address and port the request was sent from. A Binding Response will
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Rosenberg, et al. Standards Track [Page 17]
|
|||
|
|
|||
|
RFC 3489 STUN March 2003
|
|||
|
|
|||
|
|
|||
|
be received on the address and port placed in the RESPONSE-ADDRESS
|
|||
|
attribute of the request. If none was present, the Binding Responses
|
|||
|
will be received on the source address and port the request was sent
|
|||
|
from.
|
|||
|
|
|||
|
If the response is a Binding Error Response, the client checks the
|
|||
|
response code from the ERROR-CODE attribute of the response. For a
|
|||
|
400 response code, the client SHOULD display the reason phrase to the
|
|||
|
user. For a 420 response code, the client SHOULD retry the request,
|
|||
|
this time omitting any attributes listed in the UNKNOWN-ATTRIBUTES
|
|||
|
attribute of the response. For a 430 response code, the client
|
|||
|
SHOULD obtain a new shared secret, and retry the Binding Request with
|
|||
|
a new transaction. For 401 and 432 response codes, if the client had
|
|||
|
omitted the USERNAME or MESSAGE-INTEGRITY attribute as indicated by
|
|||
|
the error, it SHOULD try again with those attributes. For a 431
|
|||
|
response code, the client SHOULD alert the user, and MAY try the
|
|||
|
request again after obtaining a new username and password. For a 500
|
|||
|
response code, the client MAY wait several seconds and then retry the
|
|||
|
request. For a 600 response code, the client MUST NOT retry the
|
|||
|
request, and SHOULD display the reason phrase to the user. Unknown
|
|||
|
attributes between 400 and 499 are treated like a 400, unknown
|
|||
|
attributes between 500 and 599 are treated like a 500, and unknown
|
|||
|
attributes between 600 and 699 are treated like a 600. Any response
|
|||
|
between 100 and 399 MUST result in the cessation of request
|
|||
|
retransmissions, but otherwise is discarded.
|
|||
|
|
|||
|
If a client receives a response with an attribute whose type is
|
|||
|
greater than 0x7fff, the attribute MUST be ignored. If the client
|
|||
|
receives a response with an attribute whose type is less than or
|
|||
|
equal to 0x7fff, request retransmissions MUST cease, but the entire
|
|||
|
response is otherwise ignored.
|
|||
|
|
|||
|
If the response is a Binding Response, the client SHOULD check the
|
|||
|
response for a MESSAGE-INTEGRITY attribute. If not present, and the
|
|||
|
client placed a MESSAGE-INTEGRITY attribute into the request, it MUST
|
|||
|
discard the response. If present, the client computes the HMAC over
|
|||
|
the response as described in Section 11.2.8. The key to use depends
|
|||
|
on the shared secret mechanism. If the STUN Shared Secret Request
|
|||
|
was used, the key MUST be same as used to compute the MESSAGE-
|
|||
|
INTEGRITY attribute in the request. If the computed HMAC differs
|
|||
|
from the one in the response, the client MUST discard the response,
|
|||
|
and SHOULD alert the user about a possible attack. If the computed
|
|||
|
HMAC matches the one from the response, processing continues.
|
|||
|
|
|||
|
Reception of a response (either Binding Error Response or Binding
|
|||
|
Response) to a Binding Request will terminate retransmissions of that
|
|||
|
request. However, clients MUST continue to listen for responses to a
|
|||
|
Binding Request for 10 seconds after the first response. If it
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Rosenberg, et al. Standards Track [Page 18]
|
|||
|
|
|||
|
RFC 3489 STUN March 2003
|
|||
|
|
|||
|
|
|||
|
receives any responses in this interval with different message types
|
|||
|
(Binding Responses and Binding Error Responses, for example) or
|
|||
|
different MAPPED-ADDRESSes, it is an indication of a possible attack.
|
|||
|
The client MUST NOT use the MAPPED-ADDRESS from any of the responses
|
|||
|
it received (either the first or the additional ones), and SHOULD
|
|||
|
alert the user.
|
|||
|
|
|||
|
Furthermore, if a client receives more than twice as many Binding
|
|||
|
Responses as the number of Binding Requests it sent, it MUST NOT use
|
|||
|
the MAPPED-ADDRESS from any of those responses, and SHOULD alert the
|
|||
|
user about a potential attack.
|
|||
|
|
|||
|
If the Binding Response is authenticated, and the MAPPED-ADDRESS was
|
|||
|
not discarded because of a potential attack, the CLIENT MAY use the
|
|||
|
MAPPED-ADDRESS and SOURCE-ADDRESS attributes.
|
|||
|
|
|||
|
10. Use Cases
|
|||
|
|
|||
|
The rules of Sections 8 and 9 describe exactly how a client and
|
|||
|
server interact to send requests and get responses. However, they do
|
|||
|
not dictate how the STUN protocol is used to accomplish useful tasks.
|
|||
|
That is at the discretion of the client. Here, we provide some
|
|||
|
useful scenarios for applying STUN.
|
|||
|
|
|||
|
10.1 Discovery Process
|
|||
|
|
|||
|
In this scenario, a user is running a multimedia application which
|
|||
|
needs to determine which of the following scenarios applies to it:
|
|||
|
|
|||
|
o On the open Internet
|
|||
|
|
|||
|
o Firewall that blocks UDP
|
|||
|
|
|||
|
o Firewall that allows UDP out, and responses have to come back to
|
|||
|
the source of the request (like a symmetric NAT, but no
|
|||
|
translation. We call this a symmetric UDP Firewall)
|
|||
|
|
|||
|
o Full-cone NAT
|
|||
|
|
|||
|
o Symmetric NAT
|
|||
|
|
|||
|
o Restricted cone or restricted port cone NAT
|
|||
|
|
|||
|
Which of the six scenarios applies can be determined through the flow
|
|||
|
chart described in Figure 2. The chart refers only to the sequence
|
|||
|
of Binding Requests; Shared Secret Requests will, of course, be
|
|||
|
needed to authenticate each Binding Request used in the sequence.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Rosenberg, et al. Standards Track [Page 19]
|
|||
|
|
|||
|
RFC 3489 STUN March 2003
|
|||
|
|
|||
|
|
|||
|
The flow makes use of three tests. In test I, the client sends a
|
|||
|
STUN Binding Request to a server, without any flags set in the
|
|||
|
CHANGE-REQUEST attribute, and without the RESPONSE-ADDRESS attribute.
|
|||
|
This causes the server to send the response back to the address and
|
|||
|
port that the request came from. In test II, the client sends a
|
|||
|
Binding Request with both the "change IP" and "change port" flags
|
|||
|
from the CHANGE-REQUEST attribute set. In test III, the client sends
|
|||
|
a Binding Request with only the "change port" flag set.
|
|||
|
|
|||
|
The client begins by initiating test I. If this test yields no
|
|||
|
response, the client knows right away that it is not capable of UDP
|
|||
|
connectivity. If the test produces a response, the client examines
|
|||
|
the MAPPED-ADDRESS attribute. If this address and port are the same
|
|||
|
as the local IP address and port of the socket used to send the
|
|||
|
request, the client knows that it is not natted. It executes test
|
|||
|
II.
|
|||
|
|
|||
|
If a response is received, the client knows that it has open access
|
|||
|
to the Internet (or, at least, its behind a firewall that behaves
|
|||
|
like a full-cone NAT, but without the translation). If no response
|
|||
|
is received, the client knows its behind a symmetric UDP firewall.
|
|||
|
|
|||
|
In the event that the IP address and port of the socket did not match
|
|||
|
the MAPPED-ADDRESS attribute in the response to test I, the client
|
|||
|
knows that it is behind a NAT. It performs test II. If a response
|
|||
|
is received, the client knows that it is behind a full-cone NAT. If
|
|||
|
no response is received, it performs test I again, but this time,
|
|||
|
does so to the address and port from the CHANGED-ADDRESS attribute
|
|||
|
from the response to test I. If the IP address and port returned in
|
|||
|
the MAPPED-ADDRESS attribute are not the same as the ones from the
|
|||
|
first test I, the client knows its behind a symmetric NAT. If the
|
|||
|
address and port are the same, the client is either behind a
|
|||
|
restricted or port restricted NAT. To make a determination about
|
|||
|
which one it is behind, the client initiates test III. If a response
|
|||
|
is received, its behind a restricted NAT, and if no response is
|
|||
|
received, its behind a port restricted NAT.
|
|||
|
|
|||
|
This procedure yields substantial information about the operating
|
|||
|
condition of the client application. In the event of multiple NATs
|
|||
|
between the client and the Internet, the type that is discovered will
|
|||
|
be the type of the most restrictive NAT between the client and the
|
|||
|
Internet. The types of NAT, in order of restrictiveness, from most
|
|||
|
to least, are symmetric, port restricted cone, restricted cone, and
|
|||
|
full cone.
|
|||
|
|
|||
|
Typically, a client will re-do this discovery process periodically to
|
|||
|
detect changes, or look for inconsistent results. It is important to
|
|||
|
note that when the discovery process is redone, it should not
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Rosenberg, et al. Standards Track [Page 20]
|
|||
|
|
|||
|
RFC 3489 STUN March 2003
|
|||
|
|
|||
|
|
|||
|
generally be done from the same local address and port used in the
|
|||
|
previous discovery process. If the same local address and port are
|
|||
|
reused, bindings from the previous test may still be in existence,
|
|||
|
and these will invalidate the results of the test. Using a different
|
|||
|
local address and port for subsequent tests resolves this problem.
|
|||
|
An alternative is to wait sufficiently long to be confident that the
|
|||
|
old bindings have expired (half an hour should more than suffice).
|
|||
|
|
|||
|
10.2 Binding Lifetime Discovery
|
|||
|
|
|||
|
STUN can also be used to discover the lifetimes of the bindings
|
|||
|
created by the NAT. In many cases, the client will need to refresh
|
|||
|
the binding, either through a new STUN request, or an application
|
|||
|
packet, in order for the application to continue to use the binding.
|
|||
|
By discovering the binding lifetime, the client can determine how
|
|||
|
frequently it needs to refresh.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Rosenberg, et al. Standards Track [Page 21]
|
|||
|
|
|||
|
RFC 3489 STUN March 2003
|
|||
|
|
|||
|
|
|||
|
+--------+
|
|||
|
| Test |
|
|||
|
| I |
|
|||
|
+--------+
|
|||
|
|
|
|||
|
|
|
|||
|
V
|
|||
|
/\ /\
|
|||
|
N / \ Y / \ Y +--------+
|
|||
|
UDP <-------/Resp\--------->/ IP \------------->| Test |
|
|||
|
Blocked \ ? / \Same/ | II |
|
|||
|
\ / \? / +--------+
|
|||
|
\/ \/ |
|
|||
|
| N |
|
|||
|
| V
|
|||
|
V /\
|
|||
|
+--------+ Sym. N / \
|
|||
|
| Test | UDP <---/Resp\
|
|||
|
| II | Firewall \ ? /
|
|||
|
+--------+ \ /
|
|||
|
| \/
|
|||
|
V |Y
|
|||
|
/\ /\ |
|
|||
|
Symmetric N / \ +--------+ N / \ V
|
|||
|
NAT <--- / IP \<-----| Test |<--- /Resp\ Open
|
|||
|
\Same/ | I | \ ? / Internet
|
|||
|
\? / +--------+ \ /
|
|||
|
\/ \/
|
|||
|
| |Y
|
|||
|
| |
|
|||
|
| V
|
|||
|
| Full
|
|||
|
| Cone
|
|||
|
V /\
|
|||
|
+--------+ / \ Y
|
|||
|
| Test |------>/Resp\---->Restricted
|
|||
|
| III | \ ? /
|
|||
|
+--------+ \ /
|
|||
|
\/
|
|||
|
|N
|
|||
|
| Port
|
|||
|
+------>Restricted
|
|||
|
|
|||
|
Figure 2: Flow for type discovery process
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Rosenberg, et al. Standards Track [Page 22]
|
|||
|
|
|||
|
RFC 3489 STUN March 2003
|
|||
|
|
|||
|
|
|||
|
To determine the binding lifetime, the client first sends a Binding
|
|||
|
Request to the server from a particular socket, X. This creates a
|
|||
|
binding in the NAT. The response from the server contains a MAPPED-
|
|||
|
ADDRESS attribute, providing the public address and port on the NAT.
|
|||
|
Call this Pa and Pp, respectively. The client then starts a timer
|
|||
|
with a value of T seconds. When this timer fires, the client sends
|
|||
|
another Binding Request to the server, using the same destination
|
|||
|
address and port, but from a different socket, Y. This request
|
|||
|
contains a RESPONSE-ADDRESS address attribute, set to (Pa,Pp). This
|
|||
|
will create a new binding on the NAT, and cause the STUN server to
|
|||
|
send a Binding Response that would match the old binding, if it still
|
|||
|
exists. If the client receives the Binding Response on socket X, it
|
|||
|
knows that the binding has not expired. If the client receives the
|
|||
|
Binding Response on socket Y (which is possible if the old binding
|
|||
|
expired, and the NAT allocated the same public address and port to
|
|||
|
the new binding), or receives no response at all, it knows that the
|
|||
|
binding has expired.
|
|||
|
|
|||
|
The client can find the value of the binding lifetime by doing a
|
|||
|
binary search through T, arriving eventually at the value where the
|
|||
|
response is not received for any timer greater than T, but is
|
|||
|
received for any timer less than T.
|
|||
|
|
|||
|
This discovery process takes quite a bit of time, and is something
|
|||
|
that will typically be run in the background on a device once it
|
|||
|
boots.
|
|||
|
|
|||
|
It is possible that the client can get inconsistent results each time
|
|||
|
this process is run. For example, if the NAT should reboot, or be
|
|||
|
reset for some reason, the process may discover a lifetime than is
|
|||
|
shorter than the actual one. For this reason, implementations are
|
|||
|
encouraged to run the test numerous times, and be prepared to get
|
|||
|
inconsistent results.
|
|||
|
|
|||
|
10.3 Binding Acquisition
|
|||
|
|
|||
|
Consider once more the case of a VoIP phone. It used the discovery
|
|||
|
process above when it started up, to discover its environment. Now,
|
|||
|
it wants to make a call. As part of the discovery process, it
|
|||
|
determined that it was behind a full-cone NAT.
|
|||
|
|
|||
|
Consider further that this phone consists of two logically separated
|
|||
|
components - a control component that handles signaling, and a media
|
|||
|
component that handles the audio, video, and RTP [12]. Both are
|
|||
|
behind the same NAT. Because of this separation of control and
|
|||
|
media, we wish to minimize the communication required between them.
|
|||
|
In fact, they may not even run on the same host.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Rosenberg, et al. Standards Track [Page 23]
|
|||
|
|
|||
|
RFC 3489 STUN March 2003
|
|||
|
|
|||
|
|
|||
|
In order to make a voice call, the phone needs to obtain an IP
|
|||
|
address and port that it can place in the call setup message as the
|
|||
|
destination for receiving audio.
|
|||
|
|
|||
|
To obtain an address, the control component sends a Shared Secret
|
|||
|
Request to the server, obtains a shared secret, and then sends a
|
|||
|
Binding Request to the server. No CHANGE-REQUEST attribute is
|
|||
|
present in the Binding Request, and neither is the RESPONSE-ADDRESS
|
|||
|
attribute. The Binding Response contains a mapped address. The
|
|||
|
control component then formulates a second Binding Request. This
|
|||
|
request contains a RESPONSE-ADDRESS, which is set to the mapped
|
|||
|
address learned from the previous Binding Response. This Binding
|
|||
|
Request is passed to the media component, along with the IP address
|
|||
|
and port of the STUN server. The media component sends the Binding
|
|||
|
Request. The request goes to the STUN server, which sends the
|
|||
|
Binding Response back to the control component. The control
|
|||
|
component receives this, and now has learned an IP address and port
|
|||
|
that will be routed back to the media component that sent the
|
|||
|
request.
|
|||
|
|
|||
|
The client will be able to receive media from anywhere on this mapped
|
|||
|
address.
|
|||
|
|
|||
|
In the case of silence suppression, there may be periods where the
|
|||
|
client receives no media. In this case, the UDP bindings could
|
|||
|
timeout (UDP bindings in NATs are typically short; 30 seconds is
|
|||
|
common). To deal with this, the application can periodically
|
|||
|
retransmit the query in order to keep the binding fresh.
|
|||
|
|
|||
|
It is possible that both participants in the multimedia session are
|
|||
|
behind the same NAT. In that case, both will repeat this procedure
|
|||
|
above, and both will obtain public address bindings. When one sends
|
|||
|
media to the other, the media is routed to the NAT, and then turns
|
|||
|
right back around to come back into the enterprise, where it is
|
|||
|
translated to the private address of the recipient. This is not
|
|||
|
particularly efficient, and unfortunately, does not work in many
|
|||
|
commercial NATs. In such cases, the clients may need to retry using
|
|||
|
private addresses.
|
|||
|
|
|||
|
11. Protocol Details
|
|||
|
|
|||
|
This section presents the detailed encoding of a STUN message.
|
|||
|
|
|||
|
STUN is a request-response protocol. Clients send a request, and the
|
|||
|
server sends a response. There are two requests, Binding Request,
|
|||
|
and Shared Secret Request. The response to a Binding Request can
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Rosenberg, et al. Standards Track [Page 24]
|
|||
|
|
|||
|
RFC 3489 STUN March 2003
|
|||
|
|
|||
|
|
|||
|
either be the Binding Response or Binding Error Response. The
|
|||
|
response to a Shared Secret Request can either be a Shared Secret
|
|||
|
Response or a Shared Secret Error Response.
|
|||
|
|
|||
|
STUN messages are encoded using binary fields. All integer fields
|
|||
|
are carried in network byte order, that is, most significant byte
|
|||
|
(octet) first. This byte order is commonly known as big-endian. The
|
|||
|
transmission order is described in detail in Appendix B of RFC 791
|
|||
|
[6]. Unless otherwise noted, numeric constants are in decimal (base
|
|||
|
10).
|
|||
|
|
|||
|
11.1 Message Header
|
|||
|
|
|||
|
All STUN messages consist of a 20 byte header:
|
|||
|
|
|||
|
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
|
|||
|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|||
|
| STUN Message Type | Message Length |
|
|||
|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|||
|
|
|
|||
|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|||
|
|
|||
|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|||
|
Transaction ID
|
|||
|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|||
|
|
|
|||
|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|||
|
|
|||
|
The Message Types can take on the following values:
|
|||
|
|
|||
|
0x0001 : Binding Request
|
|||
|
0x0101 : Binding Response
|
|||
|
0x0111 : Binding Error Response
|
|||
|
0x0002 : Shared Secret Request
|
|||
|
0x0102 : Shared Secret Response
|
|||
|
0x0112 : Shared Secret Error Response
|
|||
|
|
|||
|
The message length is the count, in bytes, of the size of the
|
|||
|
message, not including the 20 byte header.
|
|||
|
|
|||
|
The transaction ID is a 128 bit identifier. It also serves as salt
|
|||
|
to randomize the request and the response. All responses carry the
|
|||
|
same identifier as the request they correspond to.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Rosenberg, et al. Standards Track [Page 25]
|
|||
|
|
|||
|
RFC 3489 STUN March 2003
|
|||
|
|
|||
|
|
|||
|
11.2 Message Attributes
|
|||
|
|
|||
|
After the header are 0 or more attributes. Each attribute is TLV
|
|||
|
encoded, with a 16 bit type, 16 bit length, and variable value:
|
|||
|
|
|||
|
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 ....
|
|||
|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|||
|
|
|||
|
The following types are defined:
|
|||
|
|
|||
|
0x0001: MAPPED-ADDRESS
|
|||
|
0x0002: RESPONSE-ADDRESS
|
|||
|
0x0003: CHANGE-REQUEST
|
|||
|
0x0004: SOURCE-ADDRESS
|
|||
|
0x0005: CHANGED-ADDRESS
|
|||
|
0x0006: USERNAME
|
|||
|
0x0007: PASSWORD
|
|||
|
0x0008: MESSAGE-INTEGRITY
|
|||
|
0x0009: ERROR-CODE
|
|||
|
0x000a: UNKNOWN-ATTRIBUTES
|
|||
|
0x000b: REFLECTED-FROM
|
|||
|
|
|||
|
To allow future revisions of this specification to add new attributes
|
|||
|
if needed, the attribute space is divided into optional and mandatory
|
|||
|
ones. Attributes with values greater than 0x7fff are optional, which
|
|||
|
means that the message can be processed by the client or server even
|
|||
|
though the attribute is not understood. Attributes with values less
|
|||
|
than or equal to 0x7fff are mandatory to understand, which means that
|
|||
|
the client or server cannot process the message unless it understands
|
|||
|
the attribute.
|
|||
|
|
|||
|
The MESSAGE-INTEGRITY attribute MUST be the last attribute within a
|
|||
|
message. Any attributes that are known, but are not supposed to be
|
|||
|
present in a message (MAPPED-ADDRESS in a request, for example) MUST
|
|||
|
be ignored.
|
|||
|
|
|||
|
Table 2 indicates which attributes are present in which messages. An
|
|||
|
M indicates that inclusion of the attribute in the message is
|
|||
|
mandatory, O means its optional, C means it's conditional based on
|
|||
|
some other aspect of the message, and N/A means that the attribute is
|
|||
|
not applicable to that message type.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Rosenberg, et al. Standards Track [Page 26]
|
|||
|
|
|||
|
RFC 3489 STUN March 2003
|
|||
|
|
|||
|
|
|||
|
Binding Shared Shared Shared
|
|||
|
Binding Binding Error Secret Secret Secret
|
|||
|
Att. Req. Resp. Resp. Req. Resp. Error
|
|||
|
Resp.
|
|||
|
_____________________________________________________________________
|
|||
|
MAPPED-ADDRESS N/A M N/A N/A N/A N/A
|
|||
|
RESPONSE-ADDRESS O N/A N/A N/A N/A N/A
|
|||
|
CHANGE-REQUEST O N/A N/A N/A N/A N/A
|
|||
|
SOURCE-ADDRESS N/A M N/A N/A N/A N/A
|
|||
|
CHANGED-ADDRESS N/A M N/A N/A N/A N/A
|
|||
|
USERNAME O N/A N/A N/A M N/A
|
|||
|
PASSWORD N/A N/A N/A N/A M N/A
|
|||
|
MESSAGE-INTEGRITY O O N/A N/A N/A N/A
|
|||
|
ERROR-CODE N/A N/A M N/A N/A M
|
|||
|
UNKNOWN-ATTRIBUTES N/A N/A C N/A N/A C
|
|||
|
REFLECTED-FROM N/A C N/A N/A N/A N/A
|
|||
|
|
|||
|
Table 2: Summary of Attributes
|
|||
|
|
|||
|
The length refers to the length of the value element, expressed as an
|
|||
|
unsigned integral number of bytes.
|
|||
|
|
|||
|
11.2.1 MAPPED-ADDRESS
|
|||
|
|
|||
|
The MAPPED-ADDRESS attribute indicates the mapped IP address and
|
|||
|
port. It consists of an eight bit address family, and a sixteen bit
|
|||
|
port, followed by a fixed length value representing the IP address.
|
|||
|
|
|||
|
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 | Port |
|
|||
|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|||
|
| Address |
|
|||
|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|||
|
|
|||
|
The port is a network byte ordered representation of the mapped port.
|
|||
|
The address family is always 0x01, corresponding to IPv4. The first
|
|||
|
8 bits of the MAPPED-ADDRESS are ignored, for the purposes of
|
|||
|
aligning parameters on natural boundaries. The IPv4 address is 32
|
|||
|
bits.
|
|||
|
|
|||
|
11.2.2 RESPONSE-ADDRESS
|
|||
|
|
|||
|
The RESPONSE-ADDRESS attribute indicates where the response to a
|
|||
|
Binding Request should be sent. Its syntax is identical to MAPPED-
|
|||
|
ADDRESS.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Rosenberg, et al. Standards Track [Page 27]
|
|||
|
|
|||
|
RFC 3489 STUN March 2003
|
|||
|
|
|||
|
|
|||
|
11.2.3 CHANGED-ADDRESS
|
|||
|
|
|||
|
The CHANGED-ADDRESS attribute indicates the IP address and port where
|
|||
|
responses would have been sent from if the "change IP" and "change
|
|||
|
port" flags had been set in the CHANGE-REQUEST attribute of the
|
|||
|
Binding Request. The attribute is always present in a Binding
|
|||
|
Response, independent of the value of the flags. Its syntax is
|
|||
|
identical to MAPPED-ADDRESS.
|
|||
|
|
|||
|
11.2.4 CHANGE-REQUEST
|
|||
|
|
|||
|
The CHANGE-REQUEST attribute is used by the client to request that
|
|||
|
the server use a different address and/or port when sending the
|
|||
|
response. The attribute is 32 bits long, although only two bits (A
|
|||
|
and B) are used:
|
|||
|
|
|||
|
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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 A B 0|
|
|||
|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|||
|
|
|||
|
The meaning of the flags is:
|
|||
|
|
|||
|
A: This is the "change IP" flag. If true, it requests the server
|
|||
|
to send the Binding Response with a different IP address than the
|
|||
|
one the Binding Request was received on.
|
|||
|
|
|||
|
B: This is the "change port" flag. If true, it requests the
|
|||
|
server to send the Binding Response with a different port than the
|
|||
|
one the Binding Request was received on.
|
|||
|
|
|||
|
11.2.5 SOURCE-ADDRESS
|
|||
|
|
|||
|
The SOURCE-ADDRESS attribute is present in Binding Responses. It
|
|||
|
indicates the source IP address and port that the server is sending
|
|||
|
the response from. Its syntax is identical to that of MAPPED-
|
|||
|
ADDRESS.
|
|||
|
|
|||
|
11.2.6 USERNAME
|
|||
|
|
|||
|
The USERNAME attribute is used for message integrity. It serves as a
|
|||
|
means to identify the shared secret used in the message integrity
|
|||
|
check. The USERNAME is always present in a Shared Secret Response,
|
|||
|
along with the PASSWORD. It is optionally present in a Binding
|
|||
|
Request when message integrity is used.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Rosenberg, et al. Standards Track [Page 28]
|
|||
|
|
|||
|
RFC 3489 STUN March 2003
|
|||
|
|
|||
|
|
|||
|
The value of USERNAME is a variable length opaque value. Its length
|
|||
|
MUST be a multiple of 4 (measured in bytes) in order to guarantee
|
|||
|
alignment of attributes on word boundaries.
|
|||
|
|
|||
|
11.2.7 PASSWORD
|
|||
|
|
|||
|
The PASSWORD attribute is used in Shared Secret Responses. It is
|
|||
|
always present in a Shared Secret Response, along with the USERNAME.
|
|||
|
|
|||
|
The value of PASSWORD is a variable length value that is to be used
|
|||
|
as a shared secret. Its length MUST be a multiple of 4 (measured in
|
|||
|
bytes) in order to guarantee alignment of attributes on word
|
|||
|
boundaries.
|
|||
|
|
|||
|
11.2.8 MESSAGE-INTEGRITY
|
|||
|
|
|||
|
The MESSAGE-INTEGRITY attribute contains an HMAC-SHA1 [13] of the
|
|||
|
STUN message. It can be present in Binding Requests or Binding
|
|||
|
Responses. 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. That text is then padded with zeroes so as to be
|
|||
|
a multiple of 64 bytes. As a result, the MESSAGE-INTEGRITY attribute
|
|||
|
MUST be the last attribute in any STUN message. The key used as
|
|||
|
input to HMAC depends on the context.
|
|||
|
|
|||
|
11.2.9 ERROR-CODE
|
|||
|
|
|||
|
The ERROR-CODE attribute is present in the Binding Error Response and
|
|||
|
Shared Secret Error Response. It is a numeric value in the range of
|
|||
|
100 to 699 plus a textual reason phrase encoded in UTF-8, and is
|
|||
|
consistent in its code assignments and semantics with SIP [10] and
|
|||
|
HTTP [15]. The reason phrase is meant for user consumption, and can
|
|||
|
be anything appropriate for the response code. The lengths of the
|
|||
|
reason phrases MUST be a multiple of 4 (measured in bytes). This can
|
|||
|
be accomplished by added spaces to the end of the text, if necessary.
|
|||
|
Recommended reason phrases for the defined response codes are
|
|||
|
presented below.
|
|||
|
|
|||
|
To facilitate processing, the class of the error code (the hundreds
|
|||
|
digit) is encoded separately from the rest of the code.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Rosenberg, et al. Standards Track [Page 29]
|
|||
|
|
|||
|
RFC 3489 STUN March 2003
|
|||
|
|
|||
|
|
|||
|
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 |Class| Number |
|
|||
|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|||
|
| Reason Phrase (variable) ..
|
|||
|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|||
|
|
|||
|
The class represents the hundreds digit of the response code. The
|
|||
|
value MUST be between 1 and 6. The number represents the response
|
|||
|
code modulo 100, and its value MUST be between 0 and 99.
|
|||
|
|
|||
|
The following response codes, along with their recommended reason
|
|||
|
phrases (in brackets) are defined at this time:
|
|||
|
|
|||
|
400 (Bad Request): The request was malformed. The client should not
|
|||
|
retry the request without modification from the previous
|
|||
|
attempt.
|
|||
|
|
|||
|
401 (Unauthorized): The Binding Request did not contain a MESSAGE-
|
|||
|
INTEGRITY attribute.
|
|||
|
|
|||
|
420 (Unknown Attribute): The server did not understand a mandatory
|
|||
|
attribute in the request.
|
|||
|
|
|||
|
430 (Stale Credentials): The Binding Request did contain a MESSAGE-
|
|||
|
INTEGRITY attribute, but it used a shared secret that has
|
|||
|
expired. The client should obtain a new shared secret and try
|
|||
|
again.
|
|||
|
|
|||
|
431 (Integrity Check Failure): The Binding Request contained a
|
|||
|
MESSAGE-INTEGRITY attribute, but the HMAC failed verification.
|
|||
|
This could be a sign of a potential attack, or client
|
|||
|
implementation error.
|
|||
|
|
|||
|
432 (Missing Username): The Binding Request contained a MESSAGE-
|
|||
|
INTEGRITY attribute, but not a USERNAME attribute. Both must be
|
|||
|
present for integrity checks.
|
|||
|
|
|||
|
433 (Use TLS): The Shared Secret request has to be sent over TLS, but
|
|||
|
was not received over TLS.
|
|||
|
|
|||
|
500 (Server Error): The server has suffered a temporary error. The
|
|||
|
client should try again.
|
|||
|
|
|||
|
600 (Global Failure:) The server is refusing to fulfill the request.
|
|||
|
The client should not retry.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Rosenberg, et al. Standards Track [Page 30]
|
|||
|
|
|||
|
RFC 3489 STUN March 2003
|
|||
|
|
|||
|
|
|||
|
11.2.10 UNKNOWN-ATTRIBUTES
|
|||
|
|
|||
|
The UNKNOWN-ATTRIBUTES attribute is present only in a Binding Error
|
|||
|
Response or Shared Secret Error Response when the response code in
|
|||
|
the ERROR-CODE attribute is 420.
|
|||
|
|
|||
|
The attribute contains a list of 16 bit values, each of which
|
|||
|
represents an attribute type that was not understood by the server.
|
|||
|
If the number of unknown attributes is an odd number, one of the
|
|||
|
attributes MUST be repeated in the list, so that the total length of
|
|||
|
the list is a multiple of 4 bytes.
|
|||
|
|
|||
|
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 ...
|
|||
|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|||
|
|
|||
|
11.2.11 REFLECTED-FROM
|
|||
|
|
|||
|
The REFLECTED-FROM attribute is present only in Binding Responses,
|
|||
|
when the Binding Request contained a RESPONSE-ADDRESS attribute. The
|
|||
|
attribute contains the identity (in terms of IP address) of the
|
|||
|
source where the request came from. Its purpose is to provide
|
|||
|
traceability, so that a STUN server cannot be used as a reflector for
|
|||
|
denial-of-service attacks.
|
|||
|
|
|||
|
Its syntax is identical to the MAPPED-ADDRESS attribute.
|
|||
|
|
|||
|
12. Security Considerations
|
|||
|
|
|||
|
12.1 Attacks on STUN
|
|||
|
|
|||
|
Generally speaking, attacks on STUN can be classified into denial of
|
|||
|
service attacks and eavesdropping attacks. Denial of service attacks
|
|||
|
can be launched against a STUN server itself, or against other
|
|||
|
elements using the STUN protocol.
|
|||
|
|
|||
|
STUN servers create state through the Shared Secret Request
|
|||
|
mechanism. To prevent being swamped with traffic, a STUN server
|
|||
|
SHOULD limit the number of simultaneous TLS connections it will hold
|
|||
|
open by dropping an existing connection when a new connection request
|
|||
|
arrives (based on an Least Recently Used (LRU) policy, for example).
|
|||
|
Similarly, it SHOULD limit the number of shared secrets it will
|
|||
|
store, in the event that the server is storing the shared secrets.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Rosenberg, et al. Standards Track [Page 31]
|
|||
|
|
|||
|
RFC 3489 STUN March 2003
|
|||
|
|
|||
|
|
|||
|
The attacks of greater interest are those in which the STUN server
|
|||
|
and client are used to launch DOS attacks against other entities,
|
|||
|
including the client itself.
|
|||
|
|
|||
|
Many of the attacks require the attacker to generate a response to a
|
|||
|
legitimate STUN request, in order to provide the client with a faked
|
|||
|
MAPPED-ADDRESS. The attacks that can be launched using such a
|
|||
|
technique include:
|
|||
|
|
|||
|
12.1.1 Attack I: DDOS Against a Target
|
|||
|
|
|||
|
In this case, the attacker provides a large number of clients with
|
|||
|
the same faked MAPPED-ADDRESS that points to the intended target.
|
|||
|
This will trick all the STUN clients into thinking that their
|
|||
|
addresses are equal to that of the target. The clients then hand out
|
|||
|
that address in order to receive traffic on it (for example, in SIP
|
|||
|
or H.323 messages). However, all of that traffic becomes focused at
|
|||
|
the intended target. The attack can provide substantial
|
|||
|
amplification, especially when used with clients that are using STUN
|
|||
|
to enable multimedia applications.
|
|||
|
|
|||
|
12.1.2 Attack II: Silencing a Client
|
|||
|
|
|||
|
In this attack, the attacker seeks to deny a client access to
|
|||
|
services enabled by STUN (for example, a client using STUN to enable
|
|||
|
SIP-based multimedia traffic). To do that, the attacker provides
|
|||
|
that client with a faked MAPPED-ADDRESS. The MAPPED-ADDRESS it
|
|||
|
provides is an IP 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 MAPPED-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.
|
|||
|
|
|||
|
12.1.3 Attack III: Assuming the Identity of a Client
|
|||
|
|
|||
|
This attack is similar to attack II. However, the faked MAPPED-
|
|||
|
ADDRESS points to the attacker themself. This allows the attacker to
|
|||
|
receive traffic which was destined for the client.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Rosenberg, et al. Standards Track [Page 32]
|
|||
|
|
|||
|
RFC 3489 STUN March 2003
|
|||
|
|
|||
|
|
|||
|
12.1.4 Attack IV: Eavesdropping
|
|||
|
|
|||
|
In this attack, the attacker forces the client to use a MAPPED-
|
|||
|
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.
|
|||
|
|
|||
|
12.2 Launching the Attacks
|
|||
|
|
|||
|
It is important to note that attacks of this nature (injecting
|
|||
|
responses with fake MAPPED-ADDRESSes) require that the attacker be
|
|||
|
capable of eavesdropping requests sent from the client to the server
|
|||
|
(or to act as a MITM for such attacks). This is because STUN
|
|||
|
requests contain a transaction identifier, selected by the client,
|
|||
|
which is random with 128 bits of entropy. The server echoes this
|
|||
|
value in the response, and the client ignores any responses that
|
|||
|
don't have a matching transaction ID. Therefore, in order for an
|
|||
|
attacker to provide a faked response that is accepted by the client,
|
|||
|
the attacker needs to know what the transaction ID in the request
|
|||
|
was. The large amount of randomness, combined with the need to know
|
|||
|
when the client sends a request, precludes attacks that involve
|
|||
|
guessing the transaction ID.
|
|||
|
|
|||
|
Since all of the above attacks rely on this one primitive - injecting
|
|||
|
a response with a faked MAPPED-ADDRESS - preventing the attacks is
|
|||
|
accomplished by preventing this one operation. To prevent it, we
|
|||
|
need to consider the various ways in which it can be accomplished.
|
|||
|
There are several:
|
|||
|
|
|||
|
12.2.1 Approach I: Compromise a Legitimate STUN Server
|
|||
|
|
|||
|
In this attack, the attacker compromises a legitimate STUN server
|
|||
|
through a virus or Trojan horse. Presumably, this would allow the
|
|||
|
attacker to take over the STUN server, and control the types of
|
|||
|
responses it generates.
|
|||
|
|
|||
|
Compromise of a STUN server can also lead to discovery of open ports.
|
|||
|
Knowledge of an open port creates an opportunity for DoS attacks on
|
|||
|
those ports (or DDoS attacks if the traversed NAT is a full cone
|
|||
|
NAT). Discovering open ports is already fairly trivial using port
|
|||
|
probing, so this does not represent a major threat.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Rosenberg, et al. Standards Track [Page 33]
|
|||
|
|
|||
|
RFC 3489 STUN March 2003
|
|||
|
|
|||
|
|
|||
|
12.2.2 Approach II: DNS Attacks
|
|||
|
|
|||
|
STUN servers are discovered using DNS SRV records. If an attacker
|
|||
|
can compromise the DNS, it can inject fake records which map a domain
|
|||
|
name to the IP address of a STUN server run by the attacker. This
|
|||
|
will allow it to inject fake responses to launch any of the attacks
|
|||
|
above.
|
|||
|
|
|||
|
12.2.3 Approach III: Rogue Router or NAT
|
|||
|
|
|||
|
Rather than compromise the STUN server, an attacker can cause a STUN
|
|||
|
server to generate responses with the wrong MAPPED-ADDRESS by
|
|||
|
compromising a router or NAT on the path from the client to the STUN
|
|||
|
server. When the STUN request passes through the rogue router or
|
|||
|
NAT, it rewrites the source address of the packet to be that of the
|
|||
|
desired MAPPED-ADDRESS. This address cannot be arbitrary. If the
|
|||
|
attacker is on the public Internet (that is, there are no NATs
|
|||
|
between it and the STUN server), and the attacker doesn't modify the
|
|||
|
STUN request, the address has to have the property that packets sent
|
|||
|
from the STUN server to that address would route through the
|
|||
|
compromised router. This is because the STUN server will send the
|
|||
|
responses back to the source address of the request. With a modified
|
|||
|
source address, the only way they can reach the client is if the
|
|||
|
compromised router directs them there. If the attacker is on the
|
|||
|
public Internet, but they can modify the STUN request, they can
|
|||
|
insert a RESPONSE-ADDRESS attribute into the request, containing the
|
|||
|
actual source address of the STUN request. This will cause the
|
|||
|
server to send the response to the client, independent of the source
|
|||
|
address the STUN server sees. This gives the attacker the ability to
|
|||
|
forge an arbitrary source address when it forwards the STUN request.
|
|||
|
|
|||
|
If the attacker is on a private network (that is, there are NATs
|
|||
|
between it and the STUN server), the attacker will not be able to
|
|||
|
force the server to generate arbitrary MAPPED-ADRESSes in responses.
|
|||
|
They will only be able force the STUN server to generate MAPPED-
|
|||
|
ADDRESSes which route to the private network. This is because the
|
|||
|
NAT between the attacker and the STUN server will rewrite the source
|
|||
|
address of the STUN request, mapping it to a public address that
|
|||
|
routes to the private network. Because of this, the attacker can
|
|||
|
only force the server to generate faked mapped addresses that route
|
|||
|
to the private network. Unfortunately, it is possible that a low
|
|||
|
quality NAT would be willing to map an allocated public address to
|
|||
|
another public address (as opposed to an internal private address),
|
|||
|
in which case the attacker could forge the source address in a STUN
|
|||
|
request to be an arbitrary public address. This kind of behavior
|
|||
|
from NATs does appear to be rare.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Rosenberg, et al. Standards Track [Page 34]
|
|||
|
|
|||
|
RFC 3489 STUN March 2003
|
|||
|
|
|||
|
|
|||
|
12.2.4 Approach IV: MITM
|
|||
|
|
|||
|
As an alternative to approach III, if the attacker can place an
|
|||
|
element on the path from the client to the server, the element can
|
|||
|
act as a man-in-the-middle. In that case, it can intercept a STUN
|
|||
|
request, and generate a STUN response directly with any desired value
|
|||
|
of the MAPPED-ADDRESS field. Alternatively, it can forward the STUN
|
|||
|
request to the server (after potential modification), receive the
|
|||
|
response, and forward it to the client. When forwarding the request
|
|||
|
and response, this attack is subject to the same limitations on the
|
|||
|
MAPPED-ADDRESS described in Section 12.2.3.
|
|||
|
|
|||
|
12.2.5 Approach V: Response Injection Plus DoS
|
|||
|
|
|||
|
In this approach, the attacker does not need to be a MITM (as in
|
|||
|
approaches III and IV). Rather, it only needs to be able to
|
|||
|
eavesdrop onto a network segment that carries STUN requests. This is
|
|||
|
easily done in multiple access networks such as ethernet or
|
|||
|
unprotected 802.11. To inject the fake response, the attacker
|
|||
|
listens on the network for a STUN request. When it sees one, it
|
|||
|
simultaneously launches a DoS attack on the STUN server, and
|
|||
|
generates its own STUN response with the desired MAPPED-ADDRESS
|
|||
|
value. The STUN response generated by the attacker will reach the
|
|||
|
client, and the DoS attack against the server is aimed at preventing
|
|||
|
the legitimate response from the server from reaching the client.
|
|||
|
Arguably, the attacker can do without the DoS attack on the server,
|
|||
|
so long as the faked response beats the real response back to the
|
|||
|
client, and the client uses the first response, and ignores the
|
|||
|
second (even though it's different).
|
|||
|
|
|||
|
12.2.6 Approach VI: Duplication
|
|||
|
|
|||
|
This approach is similar to approach V. The attacker listens on the
|
|||
|
network for a STUN request. When it sees it, it generates its own
|
|||
|
STUN request towards the server. This STUN request is identical to
|
|||
|
the one it saw, but with a spoofed source IP address. The spoofed
|
|||
|
address is equal to the one that the attacker desires to have placed
|
|||
|
in the MAPPED-ADDRESS of the STUN response. In fact, the attacker
|
|||
|
generates a flood of such packets. The STUN server will receive the
|
|||
|
one original request, plus a flood of duplicate fake ones. It
|
|||
|
generates responses to all of them. If the flood is sufficiently
|
|||
|
large for the responses to congest routers or some other equipment,
|
|||
|
there is a reasonable probability that the one real response is lost
|
|||
|
(along with many of the faked ones), but the net result is that only
|
|||
|
the faked responses are received by the STUN client. These responses
|
|||
|
are all identical and all contain the MAPPED-ADDRESS that the
|
|||
|
attacker wanted the client to use.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Rosenberg, et al. Standards Track [Page 35]
|
|||
|
|
|||
|
RFC 3489 STUN March 2003
|
|||
|
|
|||
|
|
|||
|
The flood of duplicate packets is not needed (that is, only one faked
|
|||
|
request is sent), so long as the faked response beats the real
|
|||
|
response back to the client, and the client uses the first response,
|
|||
|
and ignores the second (even though it's different).
|
|||
|
|
|||
|
Note that, in this approach, launching a DoS attack against the STUN
|
|||
|
server or the IP network, to prevent the valid response from being
|
|||
|
sent or received, is problematic. The attacker needs the STUN server
|
|||
|
to be available to handle its own request. Due to the periodic
|
|||
|
retransmissions of the request from the client, this leaves a very
|
|||
|
tiny window of opportunity. The attacker must start the DoS attack
|
|||
|
immediately after the actual request from the client, causing the
|
|||
|
correct response to be discarded, and then cease the DoS attack in
|
|||
|
order to send its own request, all before the next retransmission
|
|||
|
from the client. Due to the close spacing of the retransmits (100ms
|
|||
|
to a few seconds), this is very difficult to do.
|
|||
|
|
|||
|
Besides DoS attacks, there may be other ways to prevent the actual
|
|||
|
request from the client from reaching the server. Layer 2
|
|||
|
manipulations, for example, might be able to accomplish it.
|
|||
|
|
|||
|
Fortunately, Approach IV is subject to the same limitations
|
|||
|
documented in Section 12.2.3, which limit the range of MAPPED-
|
|||
|
ADDRESSes the attacker can cause the STUN server to generate.
|
|||
|
|
|||
|
12.3 Countermeasures
|
|||
|
|
|||
|
STUN provides mechanisms to counter the approaches described above,
|
|||
|
and additional, non-STUN techniques can be used as well.
|
|||
|
|
|||
|
First off, it is RECOMMENDED that networks with STUN clients
|
|||
|
implement ingress source filtering (RFC 2827 [7]). This is
|
|||
|
particularly important for the NATs themselves. As Section 12.2.3
|
|||
|
explains, NATs which do not perform this check can be used as
|
|||
|
"reflectors" in DDoS attacks. Most NATs do perform this check as a
|
|||
|
default mode of operation. We strongly advise people that purchase
|
|||
|
NATs to ensure that this capability is present and enabled.
|
|||
|
|
|||
|
Secondly, it is RECOMMENDED that STUN servers be run on hosts
|
|||
|
dedicated to STUN, with all UDP and TCP ports disabled except for the
|
|||
|
STUN ports. This is to prevent viruses and Trojan horses from
|
|||
|
infecting STUN servers, in order to prevent their compromise. This
|
|||
|
helps mitigate Approach I (Section 12.2.1).
|
|||
|
|
|||
|
Thirdly, to prevent the DNS attack of Section 12.2.2, Section 9.2
|
|||
|
recommends that the client verify the credentials provided by the
|
|||
|
server with the name used in the DNS lookup.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Rosenberg, et al. Standards Track [Page 36]
|
|||
|
|
|||
|
RFC 3489 STUN March 2003
|
|||
|
|
|||
|
|
|||
|
Finally, all of the attacks above rely on the client taking the
|
|||
|
mapped address it learned from STUN, and using it in application
|
|||
|
layer protocols. If encryption and message integrity are provided
|
|||
|
within those protocols, the eavesdropping and identity assumption
|
|||
|
attacks can be prevented. As such, applications that make use of
|
|||
|
STUN addresses in application protocols SHOULD use integrity and
|
|||
|
encryption, even if a SHOULD level strength is not specified for that
|
|||
|
protocol. For example, multimedia applications using STUN addresses
|
|||
|
to receive RTP traffic would use secure RTP [16].
|
|||
|
|
|||
|
The above three techniques are non-STUN mechanisms. STUN itself
|
|||
|
provides several countermeasures.
|
|||
|
|
|||
|
Approaches IV (Section 12.2.4), when generating the response locally,
|
|||
|
and V (Section 12.2.5) require an attacker to generate a faked
|
|||
|
response. This attack is prevented using the message integrity
|
|||
|
mechanism provided in STUN, described in Section 8.1.
|
|||
|
|
|||
|
Approaches III (Section 12.2.3) IV (Section 12.2.4), when using the
|
|||
|
relaying technique, and VI (12.2.6), however, are not preventable
|
|||
|
through server signatures. Both approaches are most potent when the
|
|||
|
attacker can modify the request, inserting a RESPONSE-ADDRESS that
|
|||
|
routes to the client. Fortunately, such modifications are
|
|||
|
preventable using the message integrity techniques described in
|
|||
|
Section 9.3. However, these three approaches are still functional
|
|||
|
when the attacker modifies nothing but the source address of the STUN
|
|||
|
request. Sadly, this is the one thing that cannot be protected
|
|||
|
through cryptographic means, as this is the change that STUN itself
|
|||
|
is seeking to detect and report. It is therefore an inherent
|
|||
|
weakness in NAT, and not fixable in STUN. To help mitigate these
|
|||
|
attacks, Section 9.4 provides several heuristics for the client to
|
|||
|
follow. The client looks for inconsistent or extra responses, both
|
|||
|
of which are signs of the attacks described above. However, these
|
|||
|
heuristics are just that - heuristics, and cannot be guaranteed to
|
|||
|
prevent attacks. The heuristics appear to prevent the attacks as we
|
|||
|
know how to launch them today. Implementors should stay posted for
|
|||
|
information on new heuristics that might be required in the future.
|
|||
|
Such information will be distributed on the IETF MIDCOM mailing list,
|
|||
|
midcom@ietf.org.
|
|||
|
|
|||
|
12.4 Residual Threats
|
|||
|
|
|||
|
None of the countermeasures listed above can prevent the attacks
|
|||
|
described in Section 12.2.3 if the attacker is in the appropriate
|
|||
|
network paths. Specifically, consider the case in which the attacker
|
|||
|
wishes to convince client C that it has address V. The attacker
|
|||
|
needs to have a network element on the path between A and the server
|
|||
|
(in order to modify the request) and on the path between the server
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Rosenberg, et al. Standards Track [Page 37]
|
|||
|
|
|||
|
RFC 3489 STUN March 2003
|
|||
|
|
|||
|
|
|||
|
and V so that it can forward the response to C. Furthermore, if
|
|||
|
there is a NAT between the attacker and the server, V must also be
|
|||
|
behind the same NAT. In such a situation, the attacker can either
|
|||
|
gain access to all the application-layer traffic or mount the DDOS
|
|||
|
attack described in Section 12.1.1. Note that any host which exists
|
|||
|
in the correct topological relationship can be DDOSed. It need not
|
|||
|
be using STUN.
|
|||
|
|
|||
|
13. IANA Considerations
|
|||
|
|
|||
|
STUN cannot be extended. Changes to the protocol are made through a
|
|||
|
standards track revision of this specification. As a result, no IANA
|
|||
|
registries are needed. Any future extensions will establish any
|
|||
|
needed registries.
|
|||
|
|
|||
|
14. IAB Considerations
|
|||
|
|
|||
|
The IAB has studied the problem of "Unilateral Self Address Fixing",
|
|||
|
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 (RFC 3424 [17]). STUN is
|
|||
|
an example of a protocol that performs this type of function. The
|
|||
|
IAB has mandated that any protocols developed for this purpose
|
|||
|
document a specific set of considerations. This section meets those
|
|||
|
requirements.
|
|||
|
|
|||
|
14.1 Problem Definition
|
|||
|
|
|||
|
From RFC 3424 [17], any UNSAF proposal must provide:
|
|||
|
|
|||
|
Precise definition of a specific, limited-scope problem that is to
|
|||
|
be solved with the UNSAF proposal. A short term fix should not be
|
|||
|
generalized to solve other problems; this is why "short term fixes
|
|||
|
usually aren't".
|
|||
|
|
|||
|
The specific problems being solved by STUN are:
|
|||
|
|
|||
|
o Provide a means for a client to detect the presence of one or more
|
|||
|
NATs between it and a server run by a service provider on the
|
|||
|
public Internet. The purpose of such detection is to determine
|
|||
|
additional steps that might be necessary in order to receive
|
|||
|
service from that particular provider.
|
|||
|
|
|||
|
o Provide a means for a client to detect the presence of one or more
|
|||
|
NATs between it and another client, where the second client is
|
|||
|
reachable from the first, but it is not known whether the second
|
|||
|
client resides on the public Internet.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Rosenberg, et al. Standards Track [Page 38]
|
|||
|
|
|||
|
RFC 3489 STUN March 2003
|
|||
|
|
|||
|
|
|||
|
o Provide a means for a client to obtain an address on the public
|
|||
|
Internet from a non-symmetric NAT, for the express purpose of
|
|||
|
receiving incoming UDP traffic from another host, targeted to that
|
|||
|
address.
|
|||
|
|
|||
|
STUN does not address TCP, either incoming or outgoing, and does not
|
|||
|
address outgoing UDP communications.
|
|||
|
|
|||
|
14.2 Exit Strategy
|
|||
|
|
|||
|
From [17], any UNSAF proposal must provide:
|
|||
|
|
|||
|
Description of an exit strategy/transition plan. The better short
|
|||
|
term fixes are the ones that will naturally see less and less use
|
|||
|
as the appropriate technology is deployed.
|
|||
|
|
|||
|
STUN comes with its own built in exit strategy. This strategy is the
|
|||
|
detection operation that is performed as a precursor to the actual
|
|||
|
UNSAF address-fixing operation. This discovery operation, documented
|
|||
|
in Section 10.1, attempts to discover the existence of, and type of,
|
|||
|
any NATS between the client and the service provider network. Whilst
|
|||
|
the detection of the specific type of NAT may be brittle, the
|
|||
|
discovery of the existence of NAT is itself quite robust. As NATs
|
|||
|
are phased out through the deployment of IPv6, the discovery
|
|||
|
operation will return immediately with the result that there is no
|
|||
|
NAT, and no further operations are required. Indeed, the discovery
|
|||
|
operation itself can be used to help motivate deployment of IPv6; if
|
|||
|
a user detects a NAT between themselves and the public Internet, they
|
|||
|
can call up their access provider and complain about it.
|
|||
|
|
|||
|
STUN can also help facilitate the introduction of midcom. As
|
|||
|
midcom-capable NATs are deployed, applications will, instead of using
|
|||
|
STUN (which also resides at the application layer), first allocate an
|
|||
|
address binding using midcom. However, it is a well-known limitation
|
|||
|
of midcom that it only works when the agent knows the middleboxes
|
|||
|
through which its traffic will flow. Once bindings have been
|
|||
|
allocated from those middleboxes, a STUN detection procedure can
|
|||
|
validate that there are no additional middleboxes on the path from
|
|||
|
the public Internet to the client. If this is the case, the
|
|||
|
application can continue operation using the address bindings
|
|||
|
allocated from midcom. If it is not the case, STUN provides a
|
|||
|
mechanism for self-address fixing through the remaining midcom-
|
|||
|
unaware middleboxes. Thus, STUN provides a way to help transition to
|
|||
|
full midcom-aware networks.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Rosenberg, et al. Standards Track [Page 39]
|
|||
|
|
|||
|
RFC 3489 STUN March 2003
|
|||
|
|
|||
|
|
|||
|
14.3 Brittleness Introduced by STUN
|
|||
|
|
|||
|
From [17], any UNSAF proposal must provide:
|
|||
|
|
|||
|
Discussion of specific issues that may render systems more
|
|||
|
"brittle". For example, approaches that involve using data at
|
|||
|
multiple network layers create more dependencies, increase
|
|||
|
debugging challenges, and make it harder to transition.
|
|||
|
|
|||
|
STUN introduces brittleness into the system in several ways:
|
|||
|
|
|||
|
o The discovery process assumes a certain classification of devices
|
|||
|
based on their treatment of UDP. There could be other types of
|
|||
|
NATs that are deployed that would not fit into one of these molds.
|
|||
|
Therefore, future NATs may not be properly detected by STUN. STUN
|
|||
|
clients (but not servers) would need to change to accommodate
|
|||
|
that.
|
|||
|
|
|||
|
o The binding acquisition usage of STUN does not work for all NAT
|
|||
|
types. It will work for any application for full cone NATs only.
|
|||
|
For restricted cone and port restricted cone NAT, it will work for
|
|||
|
some applications depending on the application. Application
|
|||
|
specific processing will generally be needed. For symmetric NATs,
|
|||
|
the binding acquisition will not yield a usable address. The
|
|||
|
tight dependency on the specific type of NAT makes the protocol
|
|||
|
brittle.
|
|||
|
|
|||
|
o STUN assumes that the server exists on the public Internet. If
|
|||
|
the server is located in another private address realm, the user
|
|||
|
may or may not be able to use its discovered address to
|
|||
|
communicate with other users. There is no way to detect such a
|
|||
|
condition.
|
|||
|
|
|||
|
o The bindings allocated from the NAT need to be continuously
|
|||
|
refreshed. Since the timeouts for these bindings is very
|
|||
|
implementation specific, the refresh interval cannot easily be
|
|||
|
determined. When the binding is not being actively used to
|
|||
|
receive traffic, but to wait for an incoming message, the binding
|
|||
|
refresh will needlessly consume network bandwidth.
|
|||
|
|
|||
|
o The use of the STUN server as an additional network element
|
|||
|
introduces another point of potential security attack. These
|
|||
|
attacks are largely prevented by the security measures provided by
|
|||
|
STUN, but not entirely.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Rosenberg, et al. Standards Track [Page 40]
|
|||
|
|
|||
|
RFC 3489 STUN March 2003
|
|||
|
|
|||
|
|
|||
|
o The use of the STUN server as an additional network element
|
|||
|
introduces another point of failure. If the client cannot locate
|
|||
|
a STUN server, or if the server should be unavailable due to
|
|||
|
failure, the application cannot function.
|
|||
|
|
|||
|
o The use of STUN to discover address bindings will result in an
|
|||
|
increase in latency for applications. For example, a Voice over
|
|||
|
IP application will see an increase of call setup delays equal to
|
|||
|
at least one RTT to the STUN server.
|
|||
|
|
|||
|
o The discovery of binding lifetimes is prone to error. It assumes
|
|||
|
that the same lifetime will exist for all bindings. This may not
|
|||
|
be true if the NAT uses dynamic binding lifetimes to handle
|
|||
|
overload, or if the NAT itself reboots during the discovery
|
|||
|
process.
|
|||
|
|
|||
|
o STUN imposes some restrictions on the network topologies for
|
|||
|
proper operation. If client A obtains an address from STUN server
|
|||
|
X, and sends it to client B, B may not be able to send to A using
|
|||
|
that IP address. The address will not work if any of the
|
|||
|
following is true:
|
|||
|
|
|||
|
- The STUN server is not in an address realm that is a common
|
|||
|
ancestor (topologically) of both clients A and B. For example,
|
|||
|
consider client A and B, both of which have residential NAT
|
|||
|
devices. Both devices connect them to their cable operators,
|
|||
|
but both clients have different providers. Each provider has a
|
|||
|
NAT in front of their entire network, connecting it to the
|
|||
|
public Internet. If the STUN server used by A is in A's cable
|
|||
|
operator's network, an address obtained by it will not be
|
|||
|
usable by B. The STUN server must be in the network which is a
|
|||
|
common ancestor to both - in this case, the public Internet.
|
|||
|
|
|||
|
- The STUN server is in an address realm that is a common
|
|||
|
ancestor to both clients, but both clients are behind the same
|
|||
|
NAT connecting to that address realm. For example, if the two
|
|||
|
clients in the previous example had the same cable operator,
|
|||
|
that cable operator had a single NAT connecting their network
|
|||
|
to the public Internet, and the STUN server was on the public
|
|||
|
Internet, the address obtained by A would not be usable by B.
|
|||
|
That is because some NATs will not accept an internal packet
|
|||
|
sent to a public IP address which is mapped back to an internal
|
|||
|
address. To deal with this, additional protocol mechanisms or
|
|||
|
configuration parameters need to be introduced which detect
|
|||
|
this case.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Rosenberg, et al. Standards Track [Page 41]
|
|||
|
|
|||
|
RFC 3489 STUN March 2003
|
|||
|
|
|||
|
|
|||
|
o Most significantly, STUN introduces potential security threats
|
|||
|
which cannot be eliminated. This specification describes
|
|||
|
heuristics that can be used to mitigate the problem, but it is
|
|||
|
provably unsolvable given what STUN is trying to accomplish.
|
|||
|
These security problems are described fully in Section 12.
|
|||
|
|
|||
|
14.4 Requirements for a Long Term Solution
|
|||
|
|
|||
|
From [17], any UNSAF proposal must provide:
|
|||
|
|
|||
|
Identify requirements for longer term, sound technical solutions
|
|||
|
-- contribute to the process of finding the right longer term
|
|||
|
solution.
|
|||
|
|
|||
|
Our experience with STUN has led to the following requirements for a
|
|||
|
long term solution to the NAT problem:
|
|||
|
|
|||
|
Requests for bindings and control of other resources in a NAT
|
|||
|
need to be explicit. Much of the brittleness in STUN derives from
|
|||
|
its guessing at the parameters of the NAT, rather than telling the
|
|||
|
NAT what parameters to use.
|
|||
|
|
|||
|
Control needs to be "in-band". There are far too many scenarios
|
|||
|
in which the client will not know about the location of
|
|||
|
middleboxes ahead of time. Instead, control of such boxes needs
|
|||
|
to occur in-band, traveling along the same path as the data will
|
|||
|
itself travel. This guarantees that the right set of middleboxes
|
|||
|
are controlled. This is only true for first-party controls;
|
|||
|
third-party controls are best handled using the midcom framework.
|
|||
|
|
|||
|
Control needs to be limited. Users will need to communicate
|
|||
|
through NATs which are outside of their administrative control.
|
|||
|
In order for providers to be willing to deploy NATs which can be
|
|||
|
controlled by users in different domains, the scope of such
|
|||
|
controls needs to be extremely limited - typically, allocating a
|
|||
|
binding to reach the address where the control packets are coming
|
|||
|
from.
|
|||
|
|
|||
|
Simplicity is Paramount. The control protocol will need to be
|
|||
|
implement in very simple clients. The servers will need to
|
|||
|
support extremely high loads. The protocol will need to be
|
|||
|
extremely robust, being the precursor to a host of application
|
|||
|
protocols. As such, simplicity is key.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Rosenberg, et al. Standards Track [Page 42]
|
|||
|
|
|||
|
RFC 3489 STUN March 2003
|
|||
|
|
|||
|
|
|||
|
14.5 Issues with Existing NAPT Boxes
|
|||
|
|
|||
|
From [17], any UNSAF proposal must provide:
|
|||
|
|
|||
|
Discussion of the impact of the noted practical issues with
|
|||
|
existing, deployed NA[P]Ts and experience reports.
|
|||
|
|
|||
|
Several of the practical issues with STUN involve future proofing -
|
|||
|
breaking the protocol when new NAT types get deployed. Fortunately,
|
|||
|
this is not an issue at the current time, since most of the deployed
|
|||
|
NATs are of the types assumed by STUN. The primary usage STUN has
|
|||
|
found is in the area of VoIP, to facilitate allocation of addresses
|
|||
|
for receiving RTP [12] traffic. In that application, the periodic
|
|||
|
keepalives are provided by the RTP traffic itself. However, several
|
|||
|
practical problems arise for RTP. First, RTP assumes that RTCP
|
|||
|
traffic is on a port one higher than the RTP traffic. This pairing
|
|||
|
property cannot be guaranteed through NATs that are not directly
|
|||
|
controllable. As a result, RTCP traffic may not be properly
|
|||
|
received. Protocol extensions to SDP have been proposed which
|
|||
|
mitigate this by allowing the client to signal a different port for
|
|||
|
RTCP [18]. However, there will be interoperability problems for some
|
|||
|
time.
|
|||
|
|
|||
|
For VoIP, silence suppression can cause a gap in the transmission of
|
|||
|
RTP packets. This could result in the loss of a binding in the
|
|||
|
middle of a call, if that silence period exceeds the binding timeout.
|
|||
|
This can be mitigated by sending occasional silence packets to keep
|
|||
|
the binding alive. However, the result is additional brittleness;
|
|||
|
proper operation depends on the silence suppression algorithm in use,
|
|||
|
the usage of a comfort noise codec, the duration of the silence
|
|||
|
period, and the binding lifetime in the NAT.
|
|||
|
|
|||
|
14.6 In Closing
|
|||
|
|
|||
|
The problems with STUN are not design flaws in STUN. The problems in
|
|||
|
STUN have to do with the lack of standardized behaviors and controls
|
|||
|
in NATs. The result of this lack of standardization has been a
|
|||
|
proliferation of devices whose behavior is highly unpredictable,
|
|||
|
extremely variable, and uncontrollable. STUN does the best it can in
|
|||
|
such a hostile environment. Ultimately, the solution is to make the
|
|||
|
environment less hostile, and to introduce controls and standardized
|
|||
|
behaviors into NAT. However, until such time as that happens, STUN
|
|||
|
provides a good short term solution given the terrible conditions
|
|||
|
under which it is forced to operate.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Rosenberg, et al. Standards Track [Page 43]
|
|||
|
|
|||
|
RFC 3489 STUN March 2003
|
|||
|
|
|||
|
|
|||
|
15. Acknowledgments
|
|||
|
|
|||
|
The authors would like to thank Cedric Aoun, Pete Cordell, Cullen
|
|||
|
Jennings, Bob Penfield 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.
|
|||
|
|
|||
|
16. Normative References
|
|||
|
|
|||
|
[1] Bradner, S., "Key words for use in RFCs to indicate requirement
|
|||
|
levels", BCP 14, RFC 2119, March 1997.
|
|||
|
|
|||
|
[2] Dierks, T. and C. Allen, "The TLS protocol Version 1.0", RFC
|
|||
|
2246, January 1999.
|
|||
|
|
|||
|
[3] Gulbrandsen, A., Vixie, P. and L. Esibov, "A DNS RR for
|
|||
|
specifying the location of services (DNS SRV)", RFC 2782,
|
|||
|
February 2000.
|
|||
|
|
|||
|
[4] Chown, P., "Advanced Encryption Standard (AES) Ciphersuites for
|
|||
|
Transport Layer Security (TLS)", RFC 3268, June 2002.
|
|||
|
|
|||
|
[5] Rescorla, E., "HTTP over TLS", RFC 2818, May 2000.
|
|||
|
|
|||
|
[6] Postel, J., "Internet Protocol", STD 5, RFC 791, September 1981.
|
|||
|
|
|||
|
[7] Ferguson, P. and D. Senie, "Network Ingress Filtering: Defeating
|
|||
|
Denial of Service Attacks which employ IP Source Address
|
|||
|
Spoofing", BCP 38, RFC 2827, May 2000.
|
|||
|
|
|||
|
17. Informative References
|
|||
|
|
|||
|
[8] Senie, D., "Network Address Translator (NAT)-Friendly
|
|||
|
Application Design Guidelines", RFC 3235, January 2002.
|
|||
|
|
|||
|
[9] Srisuresh, P., Kuthan, J., Rosenberg, J., Molitor, A. and A.
|
|||
|
Rayhan, "Middlebox Communication Architecture and Framework",
|
|||
|
RFC 3303, August 2002.
|
|||
|
|
|||
|
[10] Rosenberg, J., Schulzrinne, H., Camarillo, G., Johnston, A.,
|
|||
|
Peterson, J., Sparks, R., Handley, M. and E. Schooler, "SIP:
|
|||
|
Session Initiation Protocol", RFC 3261, June 2002.
|
|||
|
|
|||
|
[11] Holdrege, M. and P. Srisuresh, "Protocol Complications with the
|
|||
|
IP Network Address Translator", RFC 3027, January 2001.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Rosenberg, et al. Standards Track [Page 44]
|
|||
|
|
|||
|
RFC 3489 STUN March 2003
|
|||
|
|
|||
|
|
|||
|
[12] Schulzrinne, H., Casner, S., Frederick, R. and V. Jacobson,
|
|||
|
"RTP: A Transport Protocol for Real-Time Applications", RFC
|
|||
|
1889, January 1996.
|
|||
|
|
|||
|
[13] Krawczyk, H., Bellare, M. and R. Canetti, "HMAC: Keyed-Hashing
|
|||
|
for Message Authentication", RFC 2104, February 1997.
|
|||
|
|
|||
|
[14] Kohl, J. and C. Neuman, "The kerberos Network Authentication
|
|||
|
Service (V5)", RFC 1510, September 1993.
|
|||
|
|
|||
|
[15] Fielding, R., Gettys, J., Mogul, J., Frystyk, H., Masinter, L.,
|
|||
|
Leach, P. and T. Berners-Lee, "Hypertext Transfer Protocol --
|
|||
|
HTTP/1.1", RFC 2616, June 1999.
|
|||
|
|
|||
|
[16] Baugher M., et al., "The secure real-time transport protocol",
|
|||
|
Work in Progress.
|
|||
|
|
|||
|
[17] Daigle, L., Editor, "IAB Considerations for UNilateral Self-
|
|||
|
Address Fixing (UNSAF) Across Network Address Translation", RFC
|
|||
|
3424, November 2002.
|
|||
|
|
|||
|
[18] Huitema, C., "RTCP attribute in SDP", Work in Progress.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Rosenberg, et al. Standards Track [Page 45]
|
|||
|
|
|||
|
RFC 3489 STUN March 2003
|
|||
|
|
|||
|
|
|||
|
18. Authors' Addresses
|
|||
|
|
|||
|
Jonathan Rosenberg
|
|||
|
dynamicsoft
|
|||
|
72 Eagle Rock Avenue
|
|||
|
First Floor
|
|||
|
East Hanover, NJ 07936
|
|||
|
|
|||
|
EMail: jdrosen@dynamicsoft.com
|
|||
|
|
|||
|
|
|||
|
Joel Weinberger
|
|||
|
dynamicsoft
|
|||
|
72 Eagle Rock Avenue
|
|||
|
First Floor
|
|||
|
East Hanover, NJ 07936
|
|||
|
|
|||
|
EMail: jweinberger@dynamicsoft.com
|
|||
|
|
|||
|
|
|||
|
Christian Huitema
|
|||
|
Microsoft Corporation
|
|||
|
One Microsoft Way
|
|||
|
Redmond, WA 98052-6399
|
|||
|
|
|||
|
EMail: huitema@microsoft.com
|
|||
|
|
|||
|
|
|||
|
Rohan Mahy
|
|||
|
Cisco Systems
|
|||
|
101 Cooper St
|
|||
|
Santa Cruz, CA 95060
|
|||
|
|
|||
|
EMail: rohan@cisco.com
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Rosenberg, et al. Standards Track [Page 46]
|
|||
|
|
|||
|
RFC 3489 STUN March 2003
|
|||
|
|
|||
|
|
|||
|
19. Full Copyright Statement
|
|||
|
|
|||
|
Copyright (C) The Internet Society (2003). All Rights Reserved.
|
|||
|
|
|||
|
This document and translations of it may be copied and furnished to
|
|||
|
others, and derivative works that comment on or otherwise explain it
|
|||
|
or assist in its implementation may be prepared, copied, published
|
|||
|
and distributed, in whole or in part, without restriction of any
|
|||
|
kind, provided that the above copyright notice and this paragraph are
|
|||
|
included on all such copies and derivative works. However, this
|
|||
|
document itself may not be modified in any way, such as by removing
|
|||
|
the copyright notice or references to the Internet Society or other
|
|||
|
Internet organizations, except as needed for the purpose of
|
|||
|
developing Internet standards in which case the procedures for
|
|||
|
copyrights defined in the Internet Standards process must be
|
|||
|
followed, or as required to translate it into languages other than
|
|||
|
English.
|
|||
|
|
|||
|
The limited permissions granted above are perpetual and will not be
|
|||
|
revoked by the Internet Society or its successors or assigns.
|
|||
|
|
|||
|
This document and the information contained herein is provided on an
|
|||
|
"AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING
|
|||
|
TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING
|
|||
|
BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION
|
|||
|
HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF
|
|||
|
MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
|
|||
|
|
|||
|
Acknowledgement
|
|||
|
|
|||
|
Funding for the RFC Editor function is currently provided by the
|
|||
|
Internet Society.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Rosenberg, et al. Standards Track [Page 47]
|
|||
|
|