<?xml version="1.0" encoding="US-ASCII"?>
<!DOCTYPE rfc SYSTEM "rfc2629.dtd">
<?rfc toc="yes"?>
<?rfc tocompact="yes"?>
<?rfc tocdepth="3"?>
<?rfc tocindent="yes"?>
<?rfc symrefs="yes"?>
<?rfc sortrefs="yes"?>
<?rfc comments="yes"?>
<?rfc inline="yes"?>
<?rfc compact="yes"?>
<?rfc subcompact="no"?>
<rfc category="info" docName="draft-matsuhira-mslb-11" ipr="trust200902">
  <front>
    <title abbrev="MSLB">Multi-Stage Transparent Server Load Balancing</title>

    <author fullname="Naoki Matsuhira" initials="N." surname="Matsuhira">
      <organization>Fujitsu Limited</organization>

      <address>
        <postal>
          <street>17-25, Shinkamata 1-chome, Ota-ku</street>

          <city>Tokyo</city>

          <code>144-8588</code>

          <region/>

          <country>Japan</country>
        </postal>

        <phone>+81-3-3735-1111</phone>

        <facsimile/>

        <email>naoki.matsuhira@gmail.com</email>
      </address>
    </author>

    <date day="18" month="December" year="2021"/>

    <area/>

    <workgroup/>

    <keyword/>

    <keyword/>

    <abstract>
      <t>This document specifies Multi-Stage Transparent Server Load Balancing
      (MSLB) specification. MSLB make server load balancing over Layer3
      network without packet header change at client and server. MSLB make
      server load balancing with any protocol and protocol with encription
      such as IPsec ESP, SSL/TLS.</t>
    </abstract>

    <note title="Requirements Language">
      <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 <xref
      target="RFC2119">RFC 2119</xref>.</t>
    </note>
  </front>

  <middle>
    <section title="Introduction">
      <t>This document specifies Multi-Stage Transparent Server Load Balancing
      (MSLB) specification.</t>

      <t>MSLB provide server load balancing function over Layer3 network
      without packet header change at client and server. MSLB work with any
      protocol and protocol with payload encription such as IPsec ESP,
      SSL/TLS.</t>
    </section>

    <section title="Traditional load balancing method">
      <t>There are several load balancing technique, such as round robin DNS,
      <xref target="RFC1546">IP Anycasting</xref> and destination address
      translation. <xref target="Fig-DNAT"/> shows load balancing system with
      typical server load balancer with destination address translation
      technique.<figure anchor="Fig-DNAT">
          <artwork><![CDATA[
                                           +---------+   +--------+
                                           |         +---+ Server |
              +---------+   +----------+   |         |   +--------+
              |         |   |          |   |         |        :
 +--------+   |         |   |  Server  |   |         |   +--------+
 | Client +---+ Network +---+   Load   +---+ Network +---+ Server |
 +--------+   |         |   | Balancer |   |         |   +--------+
              |         |   |          |   |         |        :
              +---------+   +----------+   |         |   +--------+
                                           |         +---+ Server |
                                           +---------+   +--------+

]]></artwork>
        </figure></t>

      <t/>

      <t>It is well-known that Network address translator break <xref
      target="RFC2775">internet transparency</xref> and have a <xref
      target="RFC2993">application dependency</xref> characteristic.</t>

      <t>Some server load balancer use application data, so with IPsec ESP,
      SSL/TLS, this mechanisms may not work well.</t>

      <t/>
    </section>

    <section title="Architecture of MSLB">
      <t/>

      <t>Load balancing is the tecnique that distribute packet to multiple
      server. For packet distribution, destination addresss translation
      technique is useful, however this technique itself break internet
      transparency.</t>

      <t>After distribution, if write back to the original destination address
      may possoble, it is possible to recover transparency. This is the basic
      idea and architecture of MSLB. <xref target="Fig-MSLBarch"/> shows
      architecture of MSLB.</t>

      <t/>

      <figure anchor="Fig-MSLBarch">
        <artwork><![CDATA[
  Client ----  overwrite    +----------  write back  ----- server
               destination  |
               address      + ---------  write back  ----- server
                            |
                            :                 :              :

                            + ---------  write back  ----- server

]]></artwork>
      </figure>

      <t/>

      <t>This method process only destination address of IP header. This
      method can be applied to both IPv4 and IPv6.</t>

      <t/>
    </section>

    <section title="configuration">
      <t/>

      <t/>

      <section title="basic configuration">
        <t/>

        <t><xref target="Fig-basic-conf"/> shows basic server load balancing
        system with MSLB. This case two-stage configuration with one MSLB-F
        and one-stage many MSLB-Bs.</t>

        <t><figure anchor="Fig-basic-conf">
            <artwork><![CDATA[
                                   +-------+   +------+   +------+
                                   |       +---+MSLB-B+---+Server|
            +-------+   +------+   |       |   +------+   +------+
            |       |   |      |   |       |       :          :
 +------+   |       |   |      |   |       |   +------+   +------+
 |Client+---+Network+---+MSLB-F+---+Network+---+MSLB-B+---+Server|
 +------+   |       |   |      |   |       |   +------+   +------+
            |       |   |      |   |       |       :          :
            +-------+   +------+   |       |   +------+   +------+
                                   |       +---+MSLB-B+---+Server|
                                   +-------+   +------+   +------+


	]]></artwork>
          </figure></t>

        <t/>

        <t>MSLB-F is front function of MSLB and translate destination address
        to one of the address of MSLB-B. BSLB-B s backend function of MSLB and
        translate destination address to the original server address, i.e.
        address of MSLB-F. The IP address of MSLB-F and all server is the same
        value.</t>

        <t>MSLB-F may multi-stage configuration. <xref
        target="Fig-3stage-conf"/>shows three stage configuration with
        two-stage MSLB-F and one-stage many MSLB-Bs.</t>

        <t/>

        <t><figure anchor="Fig-3stage-conf">
            <artwork><![CDATA[
                                         +---+  +------+  +------+
                                         |   |--+MSLB-B+--+Server|
                          +---+          |   |  +------+  +------+
                          |   |  +----+  |Net|      :         :
           +---+  +----+  |   |  |MSLB|  |   |  +------+  +------+
           |   |  |    |  |   |--+ -F +--+   |--+MSLB-B+--+Server|
 +------+  |   |  |    |  |   |  +----+  +---+  +------+  +------+
 |Client+--+Net+--+MSLB+--+Net|               
 +------+  |   |  | -F |  |   |  +----+  +---+  +------+  +------+
           |   |  |    |  |   +--+MSLB+--+   |--+MSLB-B+--+Server|
           +---+  +----+  |   |  | -F |  |   |  +------+  +------+
                          |   |  +----+  |Net|      :         :
                          +---+          |   |  +------+  +------+
                                         |   |--+MSLB-B+--+Server|
                                         +---*  +------+  +------+
	]]></artwork>
          </figure></t>

        <t/>

        <t/>

        <t/>

        <t/>
      </section>

      <section title="one arm configuration">
        <t/>

        <t><xref target="Fig-one-arm"/>shows one arm configuration of server
        load balancing system with MSLB.</t>

        <t/>

        <t><figure anchor="Fig-one-arm">
            <artwork><![CDATA[
                +---------+
                |         |
                | MSLB-F  |
                |         |
                +----+----+
                     |
                +----+----+   +--------+   +--------+
                |         +---+ MSLB-B +---+ Server |
                |         |   +--------+   +--------+
                |         |       :            :
 +--------+     |         |   +--------+   +--------+
 | Client |-----+ Network +---+ MSLB-B +---+ Server |
 +--------+     |         |   +--------+   +--------+
                |         |       :            :
                |         |   +--------+   +--------+
                |         +---+ MSLB-B +---+ Server |
                +---------+   +--------+   +--------+


	]]></artwork>
          </figure></t>

        <t/>

        <t>MSLB-F is front function of MSLB and translate destination address
        to one of the address of MSLB-B. BSLB-B s backend function of MSLB and
        translate destination address to the original server address, i.e.
        address of MSLB-F. The IP address of MSLB-F and all server is the same
        value.</t>

        <t>This configuration, MSLB-F is connecting to the network with single
        link, that is one arm configuration. This case, retuen packet, i.e.
        packet from server to client does not pass through the MSLB-F.</t>

        <t/>
      </section>
    </section>

    <section title="mode">
      <t/>

      <t>MSLB have two mode, one is address translation mode, and the other is
      encapsulation mode.</t>

      <t/>

      <section title="address translation mode">
        <t/>

        <t>This mode using address translation technique.</t>

        <t>Figure <xref target="Fig-nat-mode"> </xref> shows packet processing
        with address translation mode.</t>

        <t/>

        <t/>

        <t><figure anchor="Fig-nat-mode">
            <artwork><![CDATA[
                                   +-------+   +------+   +------+
                                   |       +---+MSLB-B+---+Server|
 +------+                          |       |   | IP_B1|   | IP_S |
 |Client|   +-------+   +------+   |       |   +------+   +------+
 | IP_C1+---+       |   |      |   |       |
 +------+   |       |   |      |   |       |   +------+   +------+
            |Network|   |MSLB-F|---+Network+---+MSLB-B+---+Server|
            |       +---+      |   |       |   | IP_B2|   | IP_S |
 +------+   |       |   | IP_S |   |       |   +------+   +------+
 |Client+---+       |   |      |   |       |
 | IP_C2|   +-------+   +------+   |       |   +------+   +------+
 +------+                          |       +---+MSLB-B+---+Server|
                                   |       |   | IP_B3|   | IP_S |
                                   +-------+   +------+   +------+
                           :                       :
                           :                       :
   +------+----+           :   +------+----+       :+------+----+
   | data | IP |           :   | data | IP |       :| data | IP |
   +------+----+           :   +------+----+       :+------+----+
   ----------------------> : --------------------> : ------------>
     src = IP_C1           :    src = IP_C1        :   src = IP_C1
     dst = IP_S            :    dst = IP_B1        :   dst = IP_S
                           :                       :
   +------+----+           :   +------+----+       :+------+----+
   | data | IP |           :   | data | IP |       :| data | IP |
   +------+----+           :   +------+----+       :+------+----+
   <--------------------- -: <-------------------- : <------------
     src = IP_S            :    src = IP_S         :   src = IP_S
     dst = IP_C1           :    dst = IP_C1        :   dst = IP_C1
                           :                       :





	]]></artwork>
          </figure></t>

        <t/>

        <t>In this figure, to the Client, IP address is allocated IP_C1,
        IP_C2, and server IP address is IP_S. This case, IP_S is also allocate
        to all servers and MSLB-F. And to the MSLB-B, IP_B1, IP_B2, IP_B3 is
        allocated. These allocation is shown in upper part of <xref
        target="Fig-nat-mode"/>.</t>

        <t>Lower part of <xref target="Fig-nat-mode"/> shows packet transfered
        between client and server. From Client to the Server, only destination
        address is translate, MSLB-F translate from IP_S to IP_B1, and MSLB-B
        translate from IP_B1 to IP_S. Then the destination address of packet
        which send client and the destination address of packet which recieve
        server is same address. That mean, transparency is remained.</t>

        <t/>

        <t>Return packet, i.e., from server to the client is not translate,
        just forwarded.</t>

        <t>In the Internet, Client IP address and server IP address must
        Global IP address, however, IP address of MSLB-B may private IP
        address.</t>

        <t/>

        <t/>

        <figure anchor="Fig-nat-mode-tab">
          <artwork><![CDATA[
 +--------------------+----------+-------------------------+
 | Source IP address  | net mask | destination IP address  |
 +--------------------+----------+-------------------------+
 |  IP_C1             |          |  IP_B1                  |
 +--------------------+----------+-------------------------+
 |  IP_C2             |          |  IP_B2                  |
 +--------------------+----------+-------------------------+
 |        :           |    :     |             :           |
 |        :           |    :     |             :           |
 |        :           |    :     |             :           |
 +--------------------+----------+-------------------------+
  

]]></artwork>
        </figure>

        <t/>

        <t><xref target="Fig-nat-mode-tab"/> shows MSLB table. MSLB have this
        table and translate the destination address using this table value.
        MSLB-F check source IP address, and translate destination address with
        this table.</t>

        <t/>

        <t>Using IPv4-IPv6 translation may possible, i.e., IPv4 packet
        translated to IPv6, then translate to IPv4 or IPv6 packet translate to
        IPv4, then translate IPv6 may possible<xref
        target="Fig-nat-mode-case"/> shows possible combination of IPv4 and
        IPv6. These IPv4-IPv6 translation case will be defined in future.</t>

        <t/>

        <t><figure anchor="Fig-nat-mode-case">
            <artwork><![CDATA[
     Client     MSLB-F         MSLB-B     Server
                  :              :
                  :              :
(1)  <-- IPv4 --> : <-- IPv4 --> : <-- IPv4 --> 
                  :              :
(2)  <-- IPv6 --> : <-- IPv6 --> : <-- IPv6 -->
                  :              :
(3)  <-- IPv4 --> : <-- IPv6 --> : <-- IPv4 -->
                  :              :
(4)  <-- IPv6 --> : <-- IPv4 --> : <-- IPv6 -->
                  :              :

]]></artwork>
          </figure></t>

        <t/>

        <t/>

        <t/>
      </section>

      <section title="encapsulation mode">
        <t/>

        <t>This mode using encapsulation technique.</t>

        <t>Figure <xref target="Fig-tun-mode"/> shows packet processing with
        encapsulation mode.</t>

        <t/>

        <t><figure anchor="Fig-tun-mode">
            <artwork><![CDATA[
                                   +-------+   +------+   +------+
                                   |       +---+MSLB-B+---+Server|
                                   |       |   | IP_B1|   | IP_S |
            +-------+   +------+   |       |   +------+   +------+
            |       |   |      |   |       |
 +------+   |       |   |      |   |       |   +------+   +------+
 |Client|---+Network+---+MSLB-F|---+Network+---+MSLB-B+---+Server|
 | IP_C |   |       |   |      |   |       |   | IP_B2|   | IP_S |
 +------+   |       |   | IP_S |   |       |   +------+   +------+
            |       |   |      |   |       |
            +-------+   +------+   |       |   +------+   +------+
                                   |       +---+MSLB-B+---+Server|
                                   |       |   | IP_B3|   | IP_S |
                                   +-------+   +------+   +------+
                           :                       :
                           :                       :
   +------+----+           :   +------+----+----+  :+------+----+
   | data | IP |           :   | data | IP | IP |  :| data | IP |
   +------+----+           :   +------+----+----+  :+------+----+
   ----------------------> : --------------------> : ------------>
     src = IP_C            :   Inner header        :   src = IP_C
     dst = IP_S            :    src = IP_C         :   dst = IP_S
                           :    dst = IP_S         :
                           :   Outer header        :
                           :    src = IP_S         :
                           :    dst = IP_B1        :
                           :                       :
                           :                       :
                           :                       :
   +------+----+           :   +------+----+       :+------+----+
   | data | IP |           :   | data | IP |       :| data | IP |
   +------+----+           :   +------+----+       :+------+----+
   <--------------------- -: <-------------------- : <------------
     src = IP_S            :    src = IP_S         :   src = IP_S
     dst = IP_C            :    dst = IP_C         :   dst = IP_C
                           :                       :





	]]></artwork>
          </figure></t>

        <t/>

        <t>In this figure, to the Client, IP address is allocated IP_C1,
        IP_C2, and server IP address is IP_S. This case, IP_S is also allocate
        to all servers and MSLB-F. And to the MSLB-B, IP_B1, IP_B2, IP_B3 is
        allocated. These allocation is shown in upper part of <xref
        target="Fig-nat-mode"/>.</t>

        <t>Lower part of <xref target="Fig-nat-mode"/> shows packet transfered
        between client and server. From Client to the Server, MSLB-F
        encapsulate original IP packet and send to MSLB-B. MSLB-B decapsulate
        outer IP header, and forwarad to the server. Inner IP packet does not
        change, that mean, transparency is remained.</t>

        <t>With encapsulation mode, packet size is increase, so fragmentation
        is needed if encapsulated packet size exceed MTU or Path MTU. MSLB-F
        MUST support <xref target="RFC1853">tunnel MTU discovery</xref>.
        Fragmentation and <xref target="RFC1191">Path MTU discovery</xref>
        issue will describe in future.</t>

        <t/>

        <t>Return packet, i.e., from server to the client is not encapsulate,
        just forwarded.</t>

        <t>In the Internet, Client IP address and server IP address must
        Global IP address, however, IP address of MSLB-B may private IP
        address.</t>

        <t/>

        <t/>

        <t><figure anchor="FIg-tun-mode-tab">
            <artwork><![CDATA[
 +--------------------+----------+-------------------------+
 | Source IP address  | net mask | destination IP address  |
 +--------------------+----------+-------------------------+
 |  IP_C1             |          |  IP_B1                  |
 +--------------------+----------+-------------------------+
 |  IP_C2             |          |  IP_B2                  |
 +--------------------+----------+-------------------------+
 |        :           |    :     |             :           |
 |        :           |    :     |             :           |
 |        :           |    :     |             :           |
 +--------------------+----------+-------------------------+
  

]]></artwork>
          </figure></t>

        <t/>

        <t><xref target="FIg-tun-mode-tab"/> shows MSLB table. MSLB have this
        table and encapsulate and generate outer header with destination
        address using this table value. MSLB-F check source IP address, and
        generate destination address of outer header with this table.</t>

        <t/>

        <t>Using IPv4 over IPv6 encapsulation or IPv6 over IPv4 encapsulation
        may possible, i.e., IPv4 packet encapsulated to IPv6, then decapsulate
        to IPv4 or IPv6 packet encapsulated to IPv4, then deencapsulated IPv6
        may possible<xref target="Fig-tun-mode-case"/> shows possible
        combination of IPv4 and IPv6. These IPv4-IPv6 encapsulation case will
        be defined in future.</t>

        <t/>

        <t><figure anchor="Fig-tun-mode-case">
            <artwork><![CDATA[
     Client     MSLB-F                   MSLB-B     Server
                  :                        :
                  :                        :
(1)  <-- IPv4 --> : <-- IPv4 over IPv4 --> : <-- IPv4 --> 
                  :                        :
(2)  <-- IPv6 --> : <-- IPv6 over IPv6 --> : <-- IPv6 -->
                  :                        :
(3)  <-- IPv4 --> : <-- IPv4 over IPv6 --> : <-- IPv4 -->
                  :                        :
(4)  <-- IPv6 --> : <-- IPv6 over IPv4 --> : <-- IPv6 -->
                  :                        :

]]></artwork>
          </figure></t>

        <t/>

        <t/>

        <t/>
      </section>
    </section>

    <section title="Ingress filtering environment">
      <t/>

      <t><xref target="RFC2827"/> describe ingress filtering for defending DoS
      attack which employ IP source address spoofing.</t>

      <t>Depend on the location of the MSLB-F and MSLB-B, it is possible that
      packet from server to client is discarded by ingress filtering. In such
      case, encapsulating the packet from server to client might resolve.
      <xref target="Fig-ingress-filtering"/> shows such solution.</t>

      <t/>

      <t><figure anchor="Fig-ingress-filtering">
          <artwork><![CDATA[
                                   +-------+   +------+   +------+
                                   |       +---+MSLB-B+---+Server|
 +------+                          |       |   | IP_B1|   | IP_S |
 |Client|   +-------+   +------+   |       |   +------+   +------+
 | IP_C1+---+       |   |      |   |       |
 +------+   |       |   |      |   |       |   +------+   +------+
            |Network|   |MSLB-F|---+Network+---+MSLB-B+---+Server|
            |       +---+      |   |       |   | IP_B2|   | IP_S |
 +------+   |       |   | IP_S |   |       |   +------+   +------+
 |Client+---+       |   |      |   |       |
 | IP_C2|   +-------+   +------+   |       |   +------+   +------+
 +------+                          |       +---+MSLB-B+---+Server|
                                   |       |   | IP_B3|   | IP_S |
                                   +-------+   +------+   +------+

                           :                       :
   +------+----+           :   +------+----+----+  :+------+----+
   | data | IP |           :   | data | IP | IP |  :| data | IP |
   +------+----+           :   +------+----+----+  :+------+----+
   <--------------------- -: <-------------------- : <------------
     src = IP_S            :   Inner header        :   src = IP_S
     dst = IP_C            :    src = IP_S         :   dst = IP_C
                           :    dst = IP_C         :
                           : Outer header          :
                           :    src = IP_B1
                           :    dst = IP_TBD




	]]></artwork>
        </figure></t>

      <t/>

      <t/>

      <t/>

      <t/>
    </section>

    <section title="Characteristic">
      <t>MSLB has following characteristics.</t>

      <t/>

      <t><list style="symbols">
          <t>Layer 3 Load balancer</t>

          <t>Support NAT unfriendly application such as FTP</t>

          <t>work with any application layer protocol (maybe)</t>

          <t>work with encription (IPsec ESP, SSL/TLS)</t>

          <t>work over Layer 3 network</t>

          <t>may enforce policy with static configuration</t>
        </list></t>

      <t/>

      <t/>

      <t/>

      <t/>
    </section>

    <section anchor="IANA" title="IANA Considerations">
      <t>This document makes no request of IANA.</t>

      <t>Note to RFC Editor: this section may be removed on publication as an
      RFC.</t>
    </section>

    <section anchor="Security" title="Security Considerations">
      <t>Security consideration does not discussed in this memo.</t>
    </section>

    <section anchor="Acknowledgements" title="Acknowledgements">
      <t/>
    </section>
  </middle>

  <back>
    <references title="Normative References">
      <?rfc include="reference.RFC.2119"?>

      <?rfc include='reference.RFC.1546'?>

      <?rfc include='reference.RFC.2827'?>

      <?rfc include='reference.RFC.2775'?>

      <?rfc include='reference.RFC.2993'?>

      <?rfc include='reference.RFC.1853'?>

      <?rfc include='reference.RFC.1191'?>
    </references>
  </back>
</rfc>
