<?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-00" 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><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>

<t>Process state machine is shown below:</t>

<figure><artwork><![CDATA[
                      +-------------+
                      |Packet arrive|
                      +------+------+
                             |
                             v
                             /\
                            /  \
                           / Is \
                        Y / STUN \  N
         +---------------/ format \--------------+
         |               \ packet?/              |
         |                \      /               |
         |                 \    /                v
         |                  \  /                 /\
         |                   \/                 /  \
         |                                     /Have\
         |                                  Y /record\
         |                      +------------/   in   \
         |                      |            \ route  /
         |                      |             \ map? /
         |                      |              \    /
         |                      |               \  /
         |                      |                \/
         |                      |                 |N
         v                      v                 v
+-----------------+   +--------------------+  +------+
| Forward packet  |   |   Forward packet   |  | Drop |
|by transaction id|   |by route info in map|  |packet|
+-----------------+   +--------------------+  +------+
]]></artwork></figure>

</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>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 TBD1(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>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 TBD2(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>

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

<figure><artwork><![CDATA[
+----------+------------------------+-----------------+
| err code |       description      |   reference     |
+----------+------------------------+-----------------+
|          | request failed due to  |                 |
|   TBD1   | server configuration   |    this RFC     |
|          | rotation               |                 |
+----------+------------------------+-----------------+
|          | request failed because |                 |
|   TBD2   | 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:
H4sIAOKcXWEAA+09aXcbx5Hf+1f0oz6YtACIAClKopNswMMxX3QwJJWsd732
GwJDYCJgBp4ZkIRF5bdvXX3NAUKynf2yeC8RPTN9VdfdVdXdbleVSTmLD/XW
1fuLt/p4tizKOD/Ul6NoFutsWWp6PuLn+nqlc3gYXcPLMo/SIhqVSZbqZLyl
ouvrPL49pAZd6UiNs1EazaH/cR7dlN1f4nTSLZd52pUeu7u7ahyV8MHHk+HV
6SelVFFG6finaJal8DTNlEoWMKEyh+8Hu7uvdgfqboL/Hc3Vh7tDfZZCN2lc
dk9wBDWKykOdpDfQbpSNkxQ+XRbdqBgliVokhxp+T/QoSuFprKM8j1Z6O7nR
0WymV3Gxo7NcT6NiqqdxHiuty2x0iC/gzyLLyzy+KQ7x79Wc/qRXKlqW0yzH
5/jryr9a88r/kcxmSTTX/wVrt6+yHCY2TEv9F4Dnwj6O51EyO9R33KT3y4c/
R2l5k6S9UTZXKs3yeVQmtzEOdfHt8Yv9Fy/lz5f7L1+ZPw+eH9in+8/lz0G/
bz/ov9iXP1/t7u7Kn89fvIQ/FYLOG4U283UWjbvX0SxKRzGvUpCGcOM8zqkJ
vNSwcxq/1kf8NX8c5ZMYdmValovi8NmzSVJOl9e4pGejDJHB/HOXfEie0Yhe
n13ok2dg+lTdbldH1wWgwKhU6moa80QWeQbblc10UuhxXCSTNB7DBsLGzW4B
XeGzUZamMWDsbVKu8HNA47nObmAJgIll1sV/1XE2ny/TBBAJMftuGqf67fAK
erxNRnGh4/ukKDtICYAz2R1gmI6j0VQvoC2OFhdIHgmgUKQBsyM9mkYw6kxB
ZzTNIs5v47zo6csEQVYipgEmxjDPOfzfIh4lN8lI5/HPyySP53FaFoDQNH/E
WZgudtPRxRJGjQp1cXX+7OLq+NyuDgZaREle6DmQjL6GPqEPnBp2UQBO+vPo
qKREgKVZCesoVgQwIv5IF7C4WfA1TATeRwFT6GmgQR2NxwkO3ZG3ChsAwCzr
iGZFptM4Hhc4BMy1SMbweJrd4X8DBJMYdmmSZWM9QwxifEPwAgIo+Qy3GJaI
0wCij2baoissuohHyxx2tgfYV8DWZwQ0ANkYyCodFx34T1ipgTA1UtDjLUwE
HsPwOfRI7CfKx3oeA3/DQZP5Ykb7AEu7WaYEYfgQcZ2GZAgpWWiHXtRHYgDY
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

-->

</rfc>

