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

<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [
<!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 toc="yes"?>
<?rfc sortrefs="yes"?>
<?rfc symrefs="yes"?>

<rfc ipr="trust200902" docName="draft-zeng-turn-cluster-02" category="info">

  <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" title="Introduction">
<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'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" title="Terminology">

<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 "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
"SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" 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, &#8230;, xN): Concatenation of byte strings.
      "concat(0x01, 0x0203, 0x040506) = 0x010203040506".</t>

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

<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" title="Overview of an TURN ICE process">
<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" title="Architectural and Interactive Process">
<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" title="Overview of the Architectural">
<t>The structure of the TURN cluster is not complicated,
which just has a front-end load balancer "TURN LB" 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's relay information, here we use "signaling server"
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 "signaling server" 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" title="Overview of interaction process">
<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" title="ClientA Behavior">
<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 "Arbitrary-mode" 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's ENCRYPTED-RELAYED-ADDRESS, clientA MUST extract routing-info-B from
it and start connectivity checks. For establishing "srflxA2relayB" data channel,
the Bind request of clientA SHOULD be sent to the relayed address obtained by
clientB from the server, then clientA MUST use "Specific-address-mode" to generate
transaction ID for the Binding request. For establishing "relayA2srflxB" and "relayA2relayB"
data channel, related requests SHOULD be sent to the TURN server that clientA
had accessed before, then clientA MUST use "Specific-server-mode" to generate
transaction ID for these requests.</t>

<t>Above 3 relayed data channels have their own ways to transmit application data,
for "srflxA2relayB", 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 "relayA2srflxB" and "relayA2relayB",
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 "Specific-server-mode" 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" title="ClientB Behavior">
<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 "Specific-server-mode" to generate transaction ID for these requests.</t>

</section>
<section anchor="turn-cluster-behavior" title="TURN Cluster Behavior">
<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" title="TURN LB Behavior">
<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" title="TURN Server Behavior">
<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" title="Routing Mechanism">
<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" title="Server Generate ENCRYPTED-RELAYED-ADDRESS">
<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" title="Preparation Phase">
<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 "divisor", which is used to do obfuscated calculation, "divisor" MUST be larger
than the numbers of TURN server; (3) A set of "modulus", which is
used to uniquely identifies each server in the cluster; (4) A 16 byte "key", 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 "divisor", "modulus" set and "key" defined in the configuration as required.</t>
  <t>If the cluster currently has a configuration in use, set its state to be "wait to be offline".</t>
  <t>Synchronize new configuration ID, "divisor" and "key" to TURN LB and each TURN
server, then assigned each TURN server its own "modulus", and synchronize the mapping
between the "modulus" and TURN server IP address to TURN LB.</t>
  <t>Set the state of the new configuration to be "active". Note there MUST be only one
configuration at the "active" 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" title="Obfuscation Phase">
<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 "divisor" to its "modulus", without exceeding the maximum integer value 2^30.</t>

</section>
<section anchor="encryption-phase" title="Encryption Phase">
<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 "key" obtained in the preparation phase. Encryption in the algorithms
below uses the AES-128-ECB cipher, and the encryption result is recorded as "mask". Then,
TURN server begin to generate ENCRYPTED-RELAYED-ADDRESS with the "mask",
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 '1', and
allocate-port is the 16 bits port value allocated by the TURN server.</t>

</section>
</section>
<section anchor="tid_gen" title="Generation of Routable Transaction ID">
<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" title="Arbitrary Mode">
<t>The typical scenario of "Arbitrary-mode" 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 "00", and the routing information of transaction ID is
just the 6bits check-bit with all bits of '1', 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" title="Specific Server Mode">
<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 "01", 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" title="Specific Address Mode">
<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 "10", 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 '10', 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" title="Uniqueness of Transaction ID">
<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" title="TURN LB Process Transaction ID">
<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 "11", 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 '1', 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's load condition.</t>

<t>For specific server Mode and specific address Mode requests, TURN LB would first
generate "mask" 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 '1',
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 "divisor" 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 "modulus" 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 "4xx" 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" title="ENCRYPTED-PEER-ADDRESS">
<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 '1', 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 "divisor"
and "modulus" of the server by configuration id.</t>
  <t>Express Obfuscated-value as an unsigned integer, and divide the result by the "divisor" to
get the "modulus" of the request. Check if the "modulus" of the request is equal to the
"modulus" 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 "4xx" 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" title="TLS Consideration">
<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" title="Security Consideration">
<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" title="DoS Against TURN Cluster">
<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" title="DoS Against a Single TURN Server">
<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" title="IANA Consideration">
<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  |  ({{ERA-gen}})) |
|                |       address safely      |                 |
+----------------+---------------------------+-----------------+
|                |         value for         |                 |
|      TBD2      |  ENCRYPTED-PEER-ADDRESS,  |    this RFC     |
|                | used to carry peer address|  ({{EPA_gen}})  |
|                |          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" title="Contributors">
<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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
bXCRI5VVOEVRCIS/PNyVh7vwMChqmqn+bjh5+HEtsuAjaKI2UcKGK/gcIwuC
kcLTIFh/pV/++sBznzvfd7X5yiX99CfN1+2eClxRjp4aR/hFdpPX+Lfs/Evm
a79a3zlDuvsnzVc/WYb0l+3vu2agnQrDagLyl87nRXVPZ8n4XYm7aL/yx+wP
vcAuVnzXfOFL5vs9YNENLCJk1a0sCBkk8u1rcWlJwDi+TXPjh/6e1bm+9pzP
Y211GceZ8hD0mPyoxGRNEKBEH+ZorcXZY2FCHTEUxZMwStC8pcC1frQp8vDU
Bh4o+LynYLUnqLVueGgQRitQuXZDUf4uyqW3DfQNleSSxMwc3ImbM+Lvgr1k
ieLIg+MJPkbrK/rP15fdy/MXw5/Oz7rDs7PL86urxvDKs96T2j4xQoPPvxy+
efPA44e92o6VErb2uJ3yeNf132ULTVM9IU+Cmxqxp6YxxeScM+841gYI7GwM
lgq6YMsopWQcyj2Au9E7Gs9RIDJw3RndKeC8GiiZl+/lNY3xgito+bBI3G7E
Epymp67jd4nRwhyvQsf+mBYYCa+qZLGsdDYPzm9zJ/A3EbvaQqsfow0Sfb59
pnQcknQbtilv4nROClhmBuYLVbGuBUExiaRpelSHyhVFPzhkPsJVwL4a0Jli
TIkE3zIno+sgim9hMeTTlQkpWFQWN/P74YDWciJHKKwKtTvCA+BzN3PQ+m4T
E+vK7VIp8sg7sVeV4TJsm4YWadPSG2zIeK5zafD4jZbtW6SNVqX30xP8RE0T
6M929swnmzKOWXq71QO32xpon20XfrZJ+MXW4L8FetG25tfn2XufZ+ptsPI8
+jPKgxPP8m/gUDcTKGoPXzPtDQd0W52A65Tp0u0G8n6IgDdtUsDRQOOqTqp1
am4i+uFWMwZEf3R0ZB7bAkUtfm6BnhY3t0DNW7UFidXpawuCrlPzZ82kr/wv
QynaiqACyt2CcAOq/cQ5mpR+TXBNFOvf0EqxLSJ3M8X+UZLW/TTSaSMRRsam
+mszmZ60CV7300SlNVLedCRy9DXG0XTwge/6M+apc6zap92r/X9sZ9NM+sr/
sZ2GOZrZTrui4N8Qsh00K9n0kLSqtsxScjwcaI5Usu0oMWWbcQPWG9D/WpXJ
nDNGJ8kyySalVDp4gwKjWs0rzJbCBN3YGKWch4ZJFRS9bkraHCXRPH1nC0BU
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

-->

</rfc>

