<?xml version="1.0" encoding="us-ascii"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc version 1.6.9 (Ruby 2.6.3) -->


<!DOCTYPE rfc  [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">

<!ENTITY RFC7478 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.7478.xml">
<!ENTITY RFC8489 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.8489.xml">
<!ENTITY RFC8656 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.8656.xml">
<!ENTITY RFC8445 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.8445.xml">
<!ENTITY RFC2119 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml">
<!ENTITY RFC8174 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml">
<!ENTITY RFC9000 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.9000.xml">
<!ENTITY RFC5780 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.5780.xml">
]>


<rfc ipr="trust200902" docName="draft-zeng-turn-cluster-03" category="info" tocInclude="true" sortRefs="true" symRefs="true">
  <front>
    <title abbrev="TURN-Cluster">TURN Cluster: Scale out TURN cluster by routable transaction id</title>

    <author initials="W." surname="Zeng" fullname="William Zeng">
      <organization>Ant Group</organization>
      <address>
        <email>william.zk@antfin.com</email>
      </address>
    </author>

    <date />

    
    <workgroup>tram</workgroup>
    <keyword>Internet-Draft</keyword>

    <abstract>


<t>The TURN protocol is designed to solve the connectivity problem of Peer-to-Peer
Communication when NAT devices exist, by allowing each peer to establish a data channel
on TURN servers. Since there are some specific requirements in the use of TURN, such as
RTP/RTCP connection pairs must be sent to the same TURN server,
it is not easy to scale a single TURN server into a TURN cluster.  In addition, a TURN
service cluster also needs to consider how to achieve good load balancing and
how to protect internal information security. Based on these demands, this specification
provides several standard means to implement a functional and secure TURN
cluster, and this specification also provides an overview and rationale of
the cluster architecture.</t>



    </abstract>



  </front>

  <middle>


<section anchor="intro"><name>Introduction</name>
<t>Interactive Connectivity Establishment(ICE)(described in <xref target="RFC8445"/> gives a standard way
for peers exchanging information and establishing a data channel between each others,
in the channel establishing progress, if a peer is located behind a NAT,
then it&#39;s impossible for that peer to communicate directly with
other peers, <xref target="RFC8656"/> proposal the TURN protocol to solve this
problem by offering a standard way to establish
relayed channel between peers.</t>

<t>TURN and ICE are widely used and the most typical scenario is
webrtc(described in <xref target="RFC7478"/>). Imagine a webrtc scenario with a large number
of users, when most users need to use relay service, a single TURN server
would become the bottleneck of the system. Setting a networking
load-balancing equipment that forwards the requests to a member of the
TURN servers group is the best and most efficient performance tuning approach,
it allows near-linear performance improvement. However,
TURN servers with a simple networking load-balancing equipment are not enough
to build a fully functional cluster, since a TURN cluster still meet these requirements:</t>

<t><list style="symbols">
  <t>For RTP/RTCP connection pairs and TCP relayed, client requests with different source
addresses must be forwarded to the same server, a TURN cluster SHOULD
achieve this condition.</t>
  <t>The recommended ICE candidate priority calculation formula is designed for all
clients connected to the same TURN server. When clients are connected to different TURN
servers in the cluster, there may be one more hop between TURN servers of the relayed channel,
then the formula is unreliable. a TURN cluster SHOULD avoid this problem.</t>
  <t>A TURN cluster SHOULD achieve good load balancing for all members of the cluster.</t>
</list></t>

<t><xref target="TURN-Load-balance"/> give some suggestions to solve these problem:
(1) DNS based load balancing (2) Using ALTERNATE-SERVER(defined in Section 10 of <xref target="RFC8489"/>)
to redirect requests to right server, while the DNS based load balancing is
unreliable and the ALTERNATE-SERVER mechanism is inefficient.
Moreover, these solutions are expensive and insecure, and are not suitable for large-scale
deployment in Internet Data Center(IDC) environments, because they require that each
TURN server in the cluster MUST have their own public network IP address and expose
a considerable number of ports to the outside network. In general, a TURN cluster
SHOULD meet the following requirements:</t>

<t><list style="symbols">
  <t>Meet the basic requirements for the use of all TURN protocols, including the specific scenarios
such as RTP/RTCP connection pairs.</t>
  <t>Easy to scale in/out the size of the cluster.</t>
  <t>The cluster SHOULD have a unified access portal, and the internal network information MUST be hidden.</t>
  <t>Easy to set up network security policies to defend against potential attacks.</t>
</list></t>

<t>This specification provides an architecture and corresponding interaction
process for easily building a TURN cluster that
meets all above requirements. Since TURN is always used in ICE,
this specification introduces related processes based on ICE for better illustration.
The remainder of this document is organized as follows:
<xref target="ice_process"/> briefly introduces how the relayed channel is established in the ICE process;
<xref target="arch_design"/> describes the overview of the architecture and the interaction process between
client and TURN cluster; <xref target="route-mech"/> introduce the generation and processing of
routing message, including:(1)How does a TURN server transmit routing message in a secure manner;
(2)How does a client generate routable transaction ID with the routing message; (3) How the TURN
cluster handles the transaction ID and corresponding packet.</t>

<section anchor="term"><name>Terminology</name>

<t>Although this document is not an IETF Standards Track publication it
adopts the conventions for normative language to provide clarity of
instructions to the implementer.</t>

<t>The key words &quot;MUST&quot;, &quot;MUST NOT&quot;, &quot;REQUIRED&quot;, &quot;SHALL&quot;, &quot;SHALL NOT&quot;,
&quot;SHOULD&quot;, &quot;SHOULD NOT&quot;, &quot;RECOMMENDED&quot;, &quot;MAY&quot;, and &quot;OPTIONAL&quot; in this
document are to be interpreted as described in BCP 14 <xref target="RFC2119"/>
<xref target="RFC8174"/> when, and only when, they appear in all capitals, as shown
here.</t>

<t>The following terms are used in this document:</t>

<t>concat(x0, ..., xN): Concatenation of byte strings.
      &quot;concat(0x01, 0x0203, 0x040506) = 0x010203040506&quot;.</t>

</section>
<section anchor="notation"><name>Notation</name>

<t>All wire formats will be depicted using the notation defined in Section 1.3 of
<xref target="RFC9000"/>. There is one addition: the function len() refers to the
length of a field which can serve as a limit on a different field, so that the
lengths of two fields can be concisely defined as limited to a sum, for example:</t>

<t>x(A..B)
y(C..B-len(x))</t>

<t>indicates that x can be of any length between A and B, and y can be of any
length between C and B provided that (len(x) + len(y)) does not exceed B.</t>

<t>The example below illustrates the basic framework:</t>

<figure title="Example Format" anchor="fig-ex-format"><artwork><![CDATA[
Example Structure {
  One-bit Field (1),
  7-bit Field with Fixed Value (7) = 61,
  Field with Variable-Length Integer (i),
  Arbitrary-Length Field (..),
  Variable-Length Field (8..24),
  Field With Minimum Length (16..),
  Field With Maximum Length (..128),
  [Optional Field (64)],
  Repeated Field (8) ...,
}
]]></artwork></figure>

</section>
</section>
<section anchor="ice_process"><name>Overview of an TURN ICE process</name>
<t>This section we would use an example to illustrate how clients
set up relayed channel through ICE and TURN, in the example,
clientA and clientB are all behind a symmetric NAT device, their
network topology is shown in figure below:</t>

<figure title="Example network topology" anchor="fig-peer-struct"><artwork><![CDATA[
                       +-------------+
                       | Turn Server |
                       +-------------+
                      10.11.252.43:3478
                          ^       ^
                          |       |
         +----------------+       +-----------------+
         |                                          |
10.243.22.200:23768                        10.243.21.133:12371
 +---------------+                          +---------------+
 | Symmetric NAT |                          | Symmetric NAT |
 +---------------+                          +---------------+
         ^                                          ^
         |                                          |
192.168.1.0:6677                          192.168.110.121:11202
    +---------+                                +---------+
    | clientA |                                | clientB |
    +---------+                                +---------+
]]></artwork></figure>

<t>Although in this example, the P2P data channel built based on STUN protocol cannot be used
because of the existence of symmetric NAT,
this document does not omit the STUN process of ICE, so that readers can
more clearly understand the whole ice process. A simplified TURN ICE
relayed channel establishing processing is depicted
in <xref target="fig-relayed-channel-est"/>.</t>

<figure title="Example relayed channel establishment" anchor="fig-relayed-channel-est"><artwork><![CDATA[
clientA                 TURN server                clientB
  |                         |                         |
  |------STUN/TURN Req----->|                         |
  |                         |                         |
  |<-----STUN/TURN Resp-----|                         |
  |                         |                         |
  |--ClientA ICE Candidate Info---------------------->|
  |                         |                         |
  |                         |<-----STUN/TURN Req------|
  |                         |                         |
  |                         |------STUN/TURN Resp---->|
  |                         |                         |
  |<----------------------ClientB ICE Candidate Info--|
  |                         |                         |
  |<--Connectivity Checks-->|<--Connectivity Checks-->|
  |                         |                         |
  |<---------Data---------->|<--------Data----------->|
  |                         |                         |
]]></artwork></figure>

<t>The related behavior in the Figure 1 are explained as follows:</t>

<t>STUN/TURN Req: The STUN requests send by clientA/clientB, which SHOULD be
Allocate request(defined in Section 7 of <xref target="RFC8656"/>)
or Bind request(defined in Section 2 of <xref target="RFC8489"/>) to TURN server.</t>

<t>STUN/TURN Resp: The STUN responses return by TURN server, which SHOULD include
these information: (1) XOR-RELAYED-ADDRESS(defined in Section 18.5 of <xref target="RFC8656"/>)
(2) XOR-MAPPED-ADDRESS(defined in Section 14.2 of <xref target="RFC8489"/>)</t>

<t>ClientA/ClientB ICE Candidate Info: The ICE Candidate Information(defined in Section 5.3 of <xref target="RFC8445"/>)
gathered by client, and client synchronizes it to peer by signaling server(defined in <xref target="RFC8445"/>).</t>

<t>Connectivity Checks: The connectivity check processing which is defined in Section 2 of <xref target="RFC8445"/>.
Take clientA for example, clientA first attempts to connect directly to clientB
through XOR-MAPPED-ADDRESS, because clientA and clientB are all behind a symmetric NAT device,
this process would fail, then clientA would try relayed channel, if clientA and clientB can
successfully bind to XOR-RELAYED-ADDRESS of peer, then there are 3 available channel:</t>

<t><list style="symbols">
  <t>srflxA2relayB: The channel of server-reflexive address of clientA to relayed address of
clientB, shown below:</t>
</list></t>

<figure title="Established srflxA2relayB Data Channel" anchor="fig-srflxA2relayB"><artwork><![CDATA[
 XOR-RELAYED-ADDRESS   +-------------+
 allocated for clientB | Turn Server |  10.11.252.43:3478
 10.11.252.43:55555    +-------------+
         ^                                     ^
         |                                     |
         v                                     v
 +---------------+                     +---------------+
 | Symmetric NAT |                     | Symmetric NAT |
 +---------------+                     +---------------+
         ^                                     ^
         |                                     |
         v                                     v
    +---------+                           +---------+
    | clientA |                           | clientB |
    +---------+                           +---------+
]]></artwork></figure>

<t><list style="symbols">
  <t>relayA2srflxB: The channel of relayed address of clientA to server-reflexive address of
clientB, shown below:</t>
</list></t>

<figure title="Established relayA2srflxB Data Channel" anchor="fig-relayA2srflxB"><artwork><![CDATA[
                   +-------------+  XOR-RELAYED-ADDRESS
 10.11.252.43:3478 | Turn Server |  allocated for clientA
                   +-------------+  10.11.252.43:55666
        ^                                  ^
        |                                  |
        v                                  v
+---------------+                  +---------------+
| Symmetric NAT |                  | Symmetric NAT |
+---------------+                  +---------------+
        ^                                  ^
        |                                  |
        v                                  v
   +---------+                        +---------+
   | clientA |                        | clientB |
   +---------+                        +---------+
]]></artwork></figure>

<t><list style="symbols">
  <t>relayA2relayB: The channel of relayed address of clientA to relayed address of
clientB, shown below:</t>
</list></t>

<figure title="Established relayA2relayB Data Channel" anchor="fig-relayA2relayB"><artwork><![CDATA[
 XOR-RELAYED-ADDRESS               XOR-RELAYED-ADDRESS
 allocated for clientA <-------->  allocated for clientB
 10.11.252.43:55555                10.11.252.43:55666
 +-------------+                    +-------------+
 | Turn Server |                    | Turn Server |
 +-------------+                    +-------------+
10.11.252.43:3478                  10.11.252.43:3478
        ^                                  ^
        |                                  |
        v                                  v
+---------------+                  +---------------+
| Symmetric NAT |                  | Symmetric NAT |
+---------------+                  +---------------+
        ^                                  ^
        |                                  |
        v                                  v
   +---------+                        +---------+
   | clientA |                        | clientB |
   +---------+                        +---------+
]]></artwork></figure>

<t>ICE would have a priority calculation for the 3 channels, and which channel is finally
selected depends on the calculation results.</t>

<t>For a client, the usage of a TURN cluster SHOULD be like a single
TURN server, which means that the above 3 channels MUST still can be
successfully established through TURN cluster, moreover, all requests
from the peers of one P2P connection SHOULD be forward to the same TURN server
in the cluster, or the calculation formula would be unavailable because of the
potential one more hop between the TURN server.</t>

</section>
<section anchor="arch_design"><name>Architectural and Interactive Process</name>
<t>A single TURN server always serves on a default port(e.g., 3478 for UDP/TCP, 5349 for TLS),
and allocates ports for client relay. In order to be compatible with the existing
TURN implementation, a TURN server in cluster SHOULD also work in a similar way.
In addition, the TURN server requires that all
allocated ports can be accessed by the client directly. Since it is hard and insecure for
a cluster to expose a large number of ports for each server in the cluster, the TURN cluster
described in the document chooses to provide all services on the default port, and ensure the correct routing of
packets through the routable transaction id(described in <xref target="tid_gen"/>).
This section will describe the architecture for the TURN cluster,
and introduces the interaction process between client and cluster.</t>

<section anchor="arch"><name>Overview of the Architectural</name>
<t>The structure of the TURN cluster is not complicated,
which just has a front-end load balancer &quot;TURN LB&quot; as the gateway to forward client requests to
corresponding TURN server, and the TURN server is the equipment that really provides
service. As described in Section 1 of <xref target="RFC8656"/>, A client using TURN
must have some way to communicate the relayed information
to its peers, and to learn each peer&#39;s relay information, here we use &quot;signaling server&quot;
described in <xref target="RFC8445"/> to represent this component, the network topology(including the internal
architecture of TURN cluster) is depicted in figure below:</t>

<figure title="Example Topology of Client and TURN Cluster" anchor="fig-turn-cluster-stru"><artwork><![CDATA[
                  +------------------+
          +------>| signaling server |<-------+
          |       +------------------+        |
    +----------+                        +----------+
    | client A |                        | client B |
    +----------+                        +----------+
 10.243.22.200:23768                  10.69.127.39:32102
          |                                   |
          +-------------+       +-------------+
                        |       |
+-----------------------|-------|-----------------------+
| TURN cluster          |       |                       |
|                       v       v                       |
|                    10.11.252.43:3478                  |
|                      +---------+                      |
|                      | TURN LB |                      |
|                      +---------+                      |
|                       |       |                       |
|        +--------------+       |                       |
|        |                      |                       |
|        v                 +----+                       |
| 192.168.1.2:3478         |                            |
| +-------------+          v            +-------------+ |
| |TURN server 1| 192.168.1.2:61002  ...|TURN server n| |
| +-------------+                       +-------------+ |
+-------------------------------------------------------+
]]></artwork></figure>

<t>The functions of each component are as follows:</t>

<t>Client A/B: All peers of one P2P relay connection.</t>

<t>Signaling server: A server for all clients to exchange TURN information with its peers,
this specification does not involve its specific process and implementation, Implementers
can refer to the &quot;signaling server&quot; defined in <xref target="RFC8445"/> for implementation</t>

<t>TURN LB: A device that performs two functions:(1)Ensure the load balance of all
servers in the cluster; (2)Ensure that data from all
peers of a P2P connection can be routed to an appropriate TURN server.</t>

<t>TURN server: The real TURN service provider.</t>

<t>The core of the architecture design is:
* Provide TURN services through a unified access portal.
* Using TURN LB and mechanism described in <xref target="route-mech"/> to ensure
all packets can be routed to the appropriate backend TURN server.
* Each TURN server in the cluster just works like a single TURN
server, the difference is that the TURN server MUST
use ENCRYPTED-RELAYED-ADDRESS(defined in <xref target="ERA-gen"/>) to transmit allocation
information instead of XOR-RELAYED-ADDRESS, in order
to avoid the exposing of internal network information. In additional, since
the address information is encrypted in ENCRYPTED-RELAYED-ADDRESS, and the client
cannot extract it directly, client MUST use ENCRYPTED-PEER-ADDRESS(defined
in <xref target="EPA_gen"/>) to specify the address information of the peer instead of XOR-PEER-ADDRESS.</t>

</section>
<section anchor="overview-of-interaction-process"><name>Overview of interaction process</name>
<t>Since the TURN server in the cluster MUST transmit allocation information through
ENCRYPTED-RELAYED-ADDRESS to protecting cluster internal network information,
client can not get the allocated address directly, and the
establishing of srflxA2relayB and relayA2srflxB cannot be the same as usual.
As depicted in <xref target="fig-turn-cluster-stru"/>, all requests can only be sent
to the unified access portal of cluster, in order to ensure the correct forwarding of requests,
some routing message MUST be carried in a request, when TURN LB receive requests, it
MUST extract and parse the routing message, and forward requests depend on it.
The overall interactive processing is shown in the following figure, related address information comes
from <xref target="fig-turn-cluster-stru"/> and ERA in the figure corresponds to
ENCRYPTED-PEER-ADDRESS(defined in <xref target="ERA-gen"/>):</t>

<figure title="Interaction Process Between Client and TURN Cluster " anchor="fig-turn-cluster-interac"><artwork><![CDATA[
  clientA                     TURN cluster                  clientB
    |                             |                             |
    |----------TURN Req---------->|                             |
    |   (to 10.11.252.43:3478)    |                             |
    |                             |                             |
    |<---------TURN Resp----------|                             |
    |   (carry routing-info-A     |                             |
    |          in ERA)            |                             |
    |                             |                             |
    |--ClientA ICE Candidate Info------------------------------>|
    |                             |                             |
    |                             |           extract routing-info-A
    |                             |            from clientA's ERA
    |                             |                             |
    |                             |<---------TURN Req-----------|
    |                             |   (to 10.11.252.43:3478,    |
    |                             |    with routing-info-A)     |
    |                             |                             |
    |                             |----------TURN Resp--------->|
    |                             |    (carry routing-info-B    |
    |                             |           in ERA)           |
    |                             |                             |
    |<-----------------------------clientB ICE Candidate Info---|
    |                             |                             |
extract routing-info-B            |                             |
 from clientB's ERA               |                             |
    |                             |                             |
    |<----Connectivity Checks---->|<----Connectivity Checks---->|
    |   (to 10.11.252.43:3478,    |   (to 10.11.252.43:3478,    |
    |    with routing-info-B)     |    with routing-info-A)     |
    |                             |                             |
    |<------------Data----------->|<-----------Data------------>|
    | (from/to 10.11.252.43:3478) | (from/to 10.11.252.43:3478) |
]]></artwork></figure>

<section anchor="clienta-behavior"><name>ClientA Behavior</name>
<t>When the clientA starts an ICE process,
it first sends a STUN/TURN request as usual. Since currently clientA does not have any information
about the server and clientB, clientA MUST use &quot;Arbitrary-mode&quot; defined in <xref target="tid_gen"/> to generate
transaction ID for requests. After receiving the Allocate success response, clientA will extract
ENCRYPTED-RELAYED-ADDRESS from the response and send it to clientB in Candidate Information.</t>

<t>Later clientA will receive Candidate Information from clientB, which include
clientB&#39;s ENCRYPTED-RELAYED-ADDRESS, clientA MUST extract routing-info-B from
it and start connectivity checks. For establishing &quot;srflxA2relayB&quot; data channel,
the Bind request of clientA SHOULD be sent to the relayed address obtained by
clientB from the server, then clientA MUST use &quot;Specific-address-mode&quot; to generate
transaction ID for the Binding request. For establishing &quot;relayA2srflxB&quot; and &quot;relayA2relayB&quot;
data channel, related requests SHOULD be sent to the TURN server that clientA
had accessed before, then clientA MUST use &quot;Specific-server-mode&quot; to generate
transaction ID for these requests.</t>

<t>Above 3 relayed data channels have their own ways to transmit application data,
for &quot;srflxA2relayB&quot;, clientA can just send UDP datagram to the unified access portal
of cluster, and the routing records left by the previous Binding request can
ensure that they can be forwarded correctly. For &quot;relayA2srflxB&quot; and &quot;relayA2relayB&quot;,
there are 2 mechanism for clientA sending application data to clientB: (1)Send
Indication(defined in Section 11 of <xref target="RFC8656"/>); (2)Bind a Channel and
send ChannelData message(defined in Section 12 of <xref target="RFC8656"/>), where these two mechanism
MUST use &quot;Specific-server-mode&quot; to generate transaction ID for indication(defined in
Section 11 of <xref target="RFC8656"/>), meanwhile, client MUST use
ENCRYPTED-PEER-ADDRESS(description in <xref target="EPA_gen"/>) to specify
the address of peer instead of XOR-PEER-ADDRESS. For Channel mechanism, after success building
a channel by Binding request, the later ChannelData message will be
routed by the routing records left by the Binding request.</t>

</section>
<section anchor="clientb-behavior"><name>ClientB Behavior</name>
<t>The behavior of ClientB is just similar to clientA, the difference is that
when clientB sends STUN/TURN requests for the first time,
it have already known which server it should access through the routing-info-A brought by clientA,
so, clientB MUST use &quot;Specific-server-mode&quot; to generate transaction ID for these requests.</t>

</section>
<section anchor="turn-cluster-behavior"><name>TURN Cluster Behavior</name>
<t>A TURN Service cluster consists of 2 components, TURN LB and TURN server, the TURN LB is
used to forward all packets to the right TURN server, and TURN server is
the actual TURN service provider.</t>

<section anchor="turn_lb_behavior"><name>TURN LB Behavior</name>
<t>TURN LB forwards packets through two elements:</t>

<t><list style="symbols">
  <t>A self maintained routing-map, whose key is: concat(client source IP address, client source Port),
and value is: concat(upstream TURN server IP address, upstream TURN server port).</t>
  <t>Routing information in transaction ID.</t>
</list></t>

<t>When a packet arrives, a TURN LB SHOULD resolve and process packet as below:</t>

<t><list style="symbols">
  <t>TURN LB first determines whether this packet is in STUN format, if so, TURN LB
will extract the transaction ID from the packet, and process this packet through the way
described in <xref target="lb_proc_tid"/>.</t>
  <t>If this packet is not in STUN format, TURN LB will extract the
source IP address and port of the packet to form the key, and try to get the upstream TURN
server IP address and port through the key and routing-map, if successfully,
TURN LB will forward the packet to the upstream TURN server directly, and refresh
the expiration time of the corresponding routing record.
If failed, drop this packet silently.</t>
</list></t>

<t>Moreover, TURN LB SHOULD NOT modify the source IP address and port of the packet,
for a TURN cluster MAY still provide STUN service.</t>

</section>
<section anchor="turn-server-behavior"><name>TURN Server Behavior</name>
<t>For most STUN/TURN messages, the TURN server processes them as defined in <xref target="RFC8656"/>,
while there are some special requirements for XOR-RELAYED-ADDRESS and XOR-PEER-ADDRESS.
Instead of transmitting allocation information by XOR-RELAYED-ADDRESS, the TURN server MUST
use ENCRYPTED-RELAYED-ADDRESS described in <xref target="ERA-gen"/> to protect internal
network information. And when the TURN server receives
an ENCRYPTED-PEER-ADDRESS attribute, it MUST process
it as described in<xref target="EPA_gen"/>. In addition, since a TURN server in the cluster MAY also provide STUN
service, it SHOULD avoid carrying any attributes(e.g., RESPONSE-ORIGIN, RESPONSE-PORT defined in
<xref target="RFC5780"/>) that expose internal network information in the stun response</t>

</section>
</section>
</section>
</section>
<section anchor="route-mech"><name>Routing Mechanism</name>
<t>This section defines the conventions for related components in <xref target="fig-turn-cluster-stru"/>
securely generate and transmit routing information. It describes:(1) How does the TURN server
generate ENCRYPTED-RELAYED-ADDRESS to securely carry routing information; (2) How does the client
generate routable transaction ID with ENCRYPTED-RELAYED-ADDRESS and specify address of peer
by ENCRYPTED-PEER-ADDRESS; (3) How does the TURN LB process routable
transaction ID and forward packets.</t>

<section anchor="ERA-gen"><name>Server Generate ENCRYPTED-RELAYED-ADDRESS</name>
<t>ENCRYPTED-RELAYED-ADDRESS is a new STUN attribute defined in this
specification, which attribute value is TBD1(IANA is requested to
assign TBD1 a value in the range 0x000e-0x000f).
The generation of ENCRYPTED-RELAYED-ADDRESS is divided into 3 phases:(1) Preparation
phase; (2) Obfuscated phase; (3) Encryption phase.</t>

<section anchor="preparation-phase"><name>Preparation Phase</name>
<t>The preparation phase is triggered at the time of preparing for cluster establishment or
updating the members of the cluster. In the preparation phase, the maintainer of the cluster
will generate and synchronize configuration to TURN LB and each TURN server inside the cluster.
The configuration consists of 4 parts: (1) A 2 bits Configuration-ID, which is used to uniquely
identify the configuration when the cluster configuration rotates; (2) An arbitrary nonnegative
integer &quot;divisor&quot;, which is used to do obfuscated calculation, &quot;divisor&quot; MUST be larger
than the numbers of TURN server; (3) A set of &quot;modulus&quot;, which is
used to uniquely identifies each server in the cluster; (4) A 16 byte &quot;key&quot;, which is used
in encryption phase. The maintainer of cluster MUST perform the following operations in the
preparation phase:</t>

<t><list style="symbols">
  <t>Select a configuration ID for the configuration. The maintainer SHOULD ensure
that there are no clients that are still using the configuration corresponding to the selected ID.</t>
  <t>Generate &quot;divisor&quot;, &quot;modulus&quot; set and &quot;key&quot; defined in the configuration as required.</t>
  <t>If the cluster currently has a configuration in use, set its state to be &quot;wait to be offline&quot;.</t>
  <t>Synchronize new configuration ID, &quot;divisor&quot; and &quot;key&quot; to TURN LB and each TURN
server, then assigned each TURN server its own &quot;modulus&quot;, and synchronize the mapping
between the &quot;modulus&quot; and TURN server IP address to TURN LB.</t>
  <t>Set the state of the new configuration to be &quot;active&quot;. Note there MUST be only one
configuration at the &quot;active&quot; state. TURN server MUST NOT generate
new ENCRYPTED-RELAYED-ADDRESS using an old configuration after receiving a new one.</t>
</list></t>

</section>
<section anchor="obfuscation-phase"><name>Obfuscation Phase</name>
<t>When a TURN server begins to generate ENCRYPTED-RELAYED-ADDRESS for Allocate success response,
it starts the Obfuscation phase. In Obfuscation phase, TURN server use divisor and its modulus
from the currently used configuration to generate Obfuscated-address, the struct of Obfuscated-address
is depicted below:</t>

<figure><artwork><![CDATA[
Obfuscated-address {
  Configuration-ID(2),
  Obfuscated-value(30)
}
]]></artwork></figure>

<t>Obfuscated-value is calculated by adding an arbitrary nonnegative integer
multiple of the &quot;divisor&quot; to its &quot;modulus&quot;, without exceeding the maximum integer value 2^30.</t>

</section>
<section anchor="encryption-phase"><name>Encryption Phase</name>
<t>After getting Obfuscated-address, the TURN server starts the Encryption phase,
it first server left-padding the magic cookie with zeros to a 16Bytes string, and encrypt
it with the &quot;key&quot; obtained in the preparation phase. Encryption in the algorithms
below uses the AES-128-ECB cipher, and the encryption result is recorded as &quot;mask&quot;. Then,
TURN server begin to generate ENCRYPTED-RELAYED-ADDRESS with the &quot;mask&quot;,
the struct of ENCRYPTED-RELAYED-ADDRESS is shown below:</t>

<figure><artwork><![CDATA[
ENCRYPTED-RELAYED-ADDRESS {
  Attribute-Type(8),
  Reserve-bit(2),
  Encoded-Check-bit(6),
  Encoded-Port(16),
  Encoded-Obfuscated-Address(32)
}
]]></artwork></figure>

<t>ENCRYPTED-RELAYED-ADDRESS has the following fields:</t>

<t>Attribute-Type: IANA is requested to assign a value for it.</t>

<t>Reserve-bit: A 2bits value reserved for two special purposes.</t>

<t>The Encoded-Check-bit, Encoded-Obfuscated-Address,Encoded-configuration-ID and Encoded-Port
are calculated by the function defined below:</t>

<figure><artwork><![CDATA[
Encoded-Check-bit = mask[0:6] ^ plaintext-check-bit
Encoded-Port = mask[6:22] ^ allocate-port
Encoded-Obfuscated-Address = mask[22:54] ^ Obfuscated-Address
]]></artwork></figure>

<t>While plaintext-check-bit is a 6 bits value with all bits of &#39;1&#39;, and
allocate-port is the 16 bits port value allocated by the TURN server.</t>

</section>
</section>
<section anchor="tid_gen"><name>Generation of Routable Transaction ID</name>
<t>As described in <xref target="RFC8489"/>, The transaction ID is a 96-bit identifier generated by
the client, to uniquely identify STUN transactions, it is always a uniformly
and randomly chosen value. Actually, 96 bits is over abundant, we can further
design the transaction ID, so that it can not only implement the uniqueness,
but also securely carry some routing information and check information. The structure of a Routable
Transaction ID is shown below:</t>

<figure><artwork><![CDATA[
Routable Transaction ID {
  Mode-bit (2),
  Routing-info (6..54),
  Random-bit (40..88),
}
]]></artwork></figure>

<t>While the Mode-bit correspond to 3 route modes, and each mode has its corresponding routing information,
3 modes are depicted below:</t>

<t><list style="symbols">
  <t>Arbitrary mode: Corresponding request can be sent to the default port of any TURN server in
the cluster.</t>
  <t>Specific-server-mode: Corresponding request MUST be sent to the default port of
the specific TURN server.</t>
  <t>Specific-address-mode: Corresponding request MUST be sent to the specified port of
the specific TURN server</t>
</list></t>

<section anchor="arbitrary-mode"><name>Arbitrary Mode</name>
<t>The typical scenario of &quot;Arbitrary-mode&quot; is that when a client send the
first STUN/TURN request to the cluster at the beginning of ICE process, it
does not have any information about TURN server, so client SHOULD set the
Mode-bit to &quot;00&quot;, and the routing information of transaction ID is
just the 6bits check-bit with all bits of &#39;1&#39;, as depicted below:</t>

<figure><artwork><![CDATA[
Routing-info {
  Check-bit(6)
}
]]></artwork></figure>

<t>After that, the client will generate a 88bit random string as the Random-bit.</t>

</section>
<section anchor="specific-server-mode"><name>Specific Server Mode</name>
<t>The scenarios suitable for mode B are: The client has received ENCRYPTED-XOR-RELAY-ADDRESS
from TURN server or peer, and it expects to send a request to the TURN server
corresponding to the ENCRYPTED-XOR-RELAY-ADDRESS.
For example: (1) Client has established a RTP relay connection in a TURN server, and wants to
establish a RTP/RTCP connection pair in the same TURN server; (2) Client has received
ENCRYPTED-XOR-RELAY-ADDRESS from peer Candidate Information
and expects to apply for the relay port in the same TURN server.
At this mode, client MUST set Mode-bit to &quot;01&quot;, and Routing-info struct
is depicted below:</t>

<figure><artwork><![CDATA[
Routing-info {
  Encoded-Check-bit(6),
  Encoded-Obfuscated-Address(32),
}
]]></artwork></figure>

<t>Encoded-Check-bit and Encoded-Address Here are obtained directly from ENCRYPTED-XOR-RELAY-ADDRESS.
The rest 56bit of transaction ID MUST be a cryptographically random value.</t>

</section>
<section anchor="specific-address-mode"><name>Specific Address Mode</name>
<t>At Specific Address Mode, client MUST have receive ENCRYPTED-XOR-RELAY-ADDRESS and expect
to send a request to the specific port of the specific TURN server, a typical scenario is
that: Client has received ENCRYPTED-XOR-RELAY-ADDRESS from peer Candidate Information,
and expects to send a Bind request to the address of ENCRYPTED-XOR-RELAY-ADDRESS.
At this mode, client SHOULD set Mode-bit to &quot;10&quot;, and Routing-info struct
is depicted below:</t>

<figure><artwork><![CDATA[
Routing-info {
  Encoded-Check-bit(6),
  Encoded-Obfuscated-Address(32),
  Encoded-Port(16),
}
]]></artwork></figure>

<t>Client MUST set Mode-bit to &#39;10&#39;, and extract Encoded-Check-bit, Encoded-Port and Encoded-Address
from ENCRYPTED-XOR-RELAY-ADDRESS., and set it to transaction ID. then generate a 40bit random string
to fill the rest of the transaction ID.</t>

</section>
<section anchor="uniqueness-of-transaction-id"><name>Uniqueness of Transaction ID</name>
<t>This section will make a simple analysis of the uniqueness of the routable transaction ID,
the routable transaction ID still depends on a large enough value range and
random selection to ensure uniqueness. In fact, the routing part in transaction ID reduces
the value range of transaction ID, in order to avoid the value range being too small,
this specification suggest the obfuscated way to encode address, then the value range
of transaction ID is determined by two factors: the length of random bit and the
number of cluster machines N, and the value range of
routable transaction ID under the three modes is shown in the table below:</t>

<figure><artwork><![CDATA[
+-------------------------+------------------+
|           mode          |    value range   |
+-------------------------+------------------+
|     Arbitrary Mode      |     0 - 2^88     |
+-------------------------+------------------+
|   Specific Server Mode  |   0 - (2^88)/N   |
+-------------------------+------------------+
|  Specific Address Mode  |   0 - (2^72)/N   |
+-------------------------+------------------+
]]></artwork></figure>

<t>In production environment, the number of machines in a TURN cluster is not particularly large,
so the value range of arbitrary mode and specific server mode is enough for
most scenarios. As for specific address mode, only related peers will use this mode to access
the same address, so it can work well without a particularly large value range.</t>

</section>
</section>
<section anchor="lb_proc_tid"><name>TURN LB Process Transaction ID</name>
<t>When a TURN LB receives a TURN packet, it first extracts the first 2 bits of transaction ID,
if the first 2 bits are &quot;11&quot;, the TURN LB will drop this packet silently.
Later TURN LB will determine the mode of the client by the first 2 bits. For arbitrary mode requests, TURN LB will
check whether the next 6 bits are all &#39;1&#39;, if not, TURN LB SHOULD drop this packet
silently. If yes, TURN LB will forward this packet to
a backend TURN server default port depending on each server&#39;s load condition.</t>

<t>For specific server Mode and specific address Mode requests, TURN LB would first
generate &quot;mask&quot; just as defined in encryption phase of <xref target="ERA-gen"/>, and calculate
plaintext-check-bit and Obfuscated-Address as below:</t>

<figure><artwork><![CDATA[
plaintext-check-bit = mask[0:6] ^ Encoded-Check-bit
Obfuscated-Address  = mask[22:54] ^ Encoded-Obfuscated-Address
]]></artwork></figure>

<t>TURN LB then checks if all bits of plaintext-check-bit are all &#39;1&#39;,
if the check fails, TURN LB will drop this packet silently. If success,
TURN LB SHOULD perform the following sequence of steps:</t>

<t><list style="numbers">
  <t>Extract configuration ID and Obfuscated-value from Obfuscated-Address, and get the configuration
corresponding to the configuration ID.</t>
  <t>Express Obfuscated-value as an unsigned integer, and divide the result by the &quot;divisor&quot; to
get the modulus of the request.</t>
  <t>Use modulus to get TURN server IP address from the TURN LB self maintain map.
If &quot;modulus&quot; cannot be mapped to any TURN server, drop this packet silently.</t>
  <t>If the TURN server selected in step3 is offline because of configuration rotation,
TURN LB SHOULD send an error response to the client, with setting the
ERR_CODE to be TBD3(IANA is request to assign a &quot;4xx&quot; err code for this value, to indicate
request is failed because of the configuration problem).</t>
  <t>If the TURN server selected in step3 works well, then it will forward the packet by the mode, for
specific server Mode, TURN LB will forward the packet to the default port of the TURN server. For
specific address Mode, TURN LB will forward the packet to the specific-port of the TURN server.</t>
</list></t>

<t>The specific-port of step5 is calculated as below:</t>

<figure><artwork><![CDATA[
allocate-port = mask[6:22] ^ Encoded-Port
]]></artwork></figure>

</section>
<section anchor="EPA_gen"><name>ENCRYPTED-PEER-ADDRESS</name>
<t>ENCRYPTED-PEER-ADDRESS is a new STUN attribute defined in this
specification, which attribute value is TBD2(IANA is requested to
assign TBD1 a value in the range 0x000e-0x000f).
Similar to XOR-PEER-ADDRESS, the ENCRYPTED-PEER-ADDRESS is also used to
indicate server the address and port of the peer, while the ENCRYPTED-PEER-ADDRESS
is applicable to the scenario where the address and port of the peer is contained
in ENCRYPTED-RELAYED-ADDRESS. ENCRYPTED-PEER-ADDRESS has the same struct
as ENCRYPTED-RELAYED-ADDRESS, and IANA is requested to assign a type value for
ENCRYPTED-PEER-ADDRESS.</t>

<t>TURN server MUST perform the following steps to process
ENCRYPTED-PEER-ADDRESS attribute.</t>

<t><list style="numbers">
  <t>Calculate plaintext-check-bit, allocate-port and Obfuscated-Address by the mask
and formula defined in <xref target="ERA-gen"/>.</t>
  <t>Check if all bits of plaintext-check-bit are all &#39;1&#39;, if the check fails, the TURN server SHOULD
drop this packet silently.</t>
  <t>Extract configuration ID and Obfuscated-value from Obfuscated-Address, and get the &quot;divisor&quot;
and &quot;modulus&quot; of the server by configuration id.</t>
  <t>Express Obfuscated-value as an unsigned integer, and divide the result by the &quot;divisor&quot; to
get the &quot;modulus&quot; of the request. Check if the &quot;modulus&quot; of the request is equal to the
&quot;modulus&quot; of the server, if not equal, TURN server SHOULD
send an error response to the client, with setting the ERR_CODE to
be TBD4(IANA is request to assign a &quot;4xx&quot; err code for this value, to indicate
request is failed due to access to an inappropriate server). If equal, the TURN
server then sends the packet to the corresponding address.</t>
</list></t>

<t>The check at step4 is based on this consideration: Since the cluster has
provided the routing mechanisms, all peers of a relayed channel SHOULD be
connected to the same server to avoid extra hops in the network.</t>

</section>
<section anchor="tls-consideration"><name>TLS Consideration</name>
<t>For most STUN/TURN requests, TURN LB forwards them based on transaction ID, if
these messages are transmitted over DTLS-over-UDP or TLS-over-TCP, TURN LB
cannot see the transaction ID directly. In these cases, TURN LB MUST also play
a role of TLS offload device to obtain the plaintext transaction ID.</t>

</section>
</section>
<section anchor="security-consideration"><name>Security Consideration</name>
<t>This document describes an architectural framework for building large-scale TURN clusters,
since an attacker cannot obtain network information of a TURN server inside the cluster, attacks
based on source address forgery(e.g., TURN loop attack) can be effectively prevented.
While a TURN cluster still suffers most attacks against a single TURN server,
This section will discuss possible attacks on a TURN cluster.
For the attacks discussed in Section 21 of <xref target="RFC8656"/>,
if they are not mentioned in this section, it indicates that the
relevant analysis of the attack is still valid for the TURN cluster.</t>

<section anchor="dos-against-turn-cluster"><name>DoS Against TURN Cluster</name>
<t>An attacker might generate a large number of legitimate allocation requests and
flood it, to exhaust the available ports of all TURN servers in the cluster.
Since all requests are legitimate, the attack cannot be prevented directly.
The maintainer of the TURN cluster can set up some custom address-based rules,
which limit the number of allocation requests from the same source address to
mitigate this attack.</t>

</section>
<section anchor="dos-against-a-single-turn-server"><name>DoS Against a Single TURN Server</name>
<t>Since the routing message in the transaction ID is encrypted and will be checked, it is
hard for an attacker to construct a large number legitimate TURN request to attack
a single TURN server. However, ChannelData messages are routed by the address, an
attacker might obtain a ChannelData and flood the corresponding channel with traffic.
This attack is mitigated by the recommendation that the server limit the amount
of bandwidth it will relay for a given username or just use (D)TLS to avoid
forgery of legal ChannelData messages.</t>

</section>
</section>
<section anchor="iana-consideration"><name>IANA Consideration</name>
<t>IANA is requested to assign the type values for the attribute
ENCRYPTED-RELAYED-ADDRESS(defined in <xref target="ERA-gen"/>) and ENCRYPTED-PEER-ADDRESS(defined
in <xref target="EPA_gen"/>).</t>

<figure><artwork><![CDATA[
+----------------+---------------------------+-----------------+
| attribute type |        description        |   reference     |
+----------------+---------------------------+-----------------+
|                |         value for         |                 |
|      TBD1      | ENCRYPTED-RELAYED-ADDRESS,|    this RFC     |
|                |    used to carry relayed  |                 |
|                |       address safely      |                 |
+----------------+---------------------------+-----------------+
|                |         value for         |                 |
|      TBD2      |  ENCRYPTED-PEER-ADDRESS,  |    this RFC     |
|                | used to carry peer address|                 |
|                |          safely           |                 |
+----------------+--------------===----------+-----------------+
]]></artwork></figure>

<t>IANA is requested to assign the err code for the TBD3(defined in <xref target="lb_proc_tid"/>)
and TBD4(defined in <xref target="EPA_gen"/>) depicted below:</t>

<figure><artwork><![CDATA[
+----------+------------------------+-----------------+
| err code |       description      |   reference     |
+----------+------------------------+-----------------+
|          | request failed due to  |                 |
|   TBD3   | server configuration   |    this RFC     |
|          | rotation               |                 |
+----------+------------------------+-----------------+
|          | request failed because |                 |
|   TBD4   | the client accessed an |    this RFC     |
|          | inappropriate server   |                 |
+----------+------------------------+-----------------+
]]></artwork></figure>

</section>
<section anchor="contributors"><name>Contributors</name>
<t>The authors would like to thank HongQuan.Z(hongquan.zhq@antgroup.com),
jim(jim.pj@alibaba-inc.com), Y.Chen(cy119846@antgroup.com),
Han.X(han.xiao@antgroup.com), Bin.Y(yb261973@antgroup.com),
and XiaoKang.Q(xiaokang.qxk@antgroup.com), LingTao.K(lingtao.klt@antgroup.com)
for their contributions to the this document.</t>

</section>


  </middle>

  <back>


    <references title='Normative References'>

&RFC7478;
&RFC8489;
&RFC8656;
&RFC8445;
&RFC2119;
&RFC8174;
&RFC9000;
&RFC5780;


    </references>

    <references title='Informative References'>

<reference anchor="TURN-Load-balance" target="https://github.com/coturn/coturn/wiki/TURN-Performance-and-Load-Balance">
  <front>
    <title>TURN Performance and Load Balance</title>
    <author >
      <organization></organization>
    </author>
    <date year="n.d."/>
  </front>
</reference>


    </references>



  </back>

<!-- ##markdown-source:
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

-->

</rfc>

