tcp-clone 0.99.3

TCP proxy server with ability to send client upstream to observers.
Documentation

Architecture

                               Simple proxy                                   ...with client TX observers:
#########################################################################                                 
#                                                                       #                                 
#    TCP client                `tcp-clone`                TCP server    #                 Observer 0..N   
#  +------------+            +-------------+            +------------+  #              +--------------+   
#  |            |            |             |            |            |  #              |              |--+
#  |    connect |----------->| accept      |            |            |  #              |              |  |
#  |            |            |     connect |----------->| accept     |  #              |              |  |
#  |            |            |             |\----------------------------------------->| accept       |  |
#  |            |            |             |            |            |  #              |              |  |
#  |            |            |             |            |            |  #              |              |  |
#  |            |            |             |            |            |  #              |              |  |
#  |            |            |             |            |            |  #              |              |  |
#  |            |   RX/TX    |             |   client   |            |  #              |              |  |
#  |     RX, TX |<---------->| RX, TX      |   RX/TX    |            |  #              |              |  |
#  |            |            |      RX, TX |<---------->| RX, TX     |  #              |              |  |
#  |            |            |             |\ client TX |            |  #              |              |  |
#  |            |            |             | \---------------------------------------->| RX           |  |
#  |            |            |             |            |            |  #  observer TX |              |  |
#  |            |            |     dropped |<------------------------------------------| TX           |  |
#  |            |            |             |            |            |  #              |              |  |
#  |            |            |             |            |            |  #              |              |  |
#  |            |            |             |            |            |  #              |              |  |
#  |            |            |             |            |            |  #              |              |  |
#  |            |            |             |            |            |  #              |              |  |
#  |            |            |             |            |            |  #              |              |  |
#  | disconnect |-----x----->| disconnect  |            |            |  #              |              |  |
#  |         #1 |            |  disconnect |------x---->|            |  #              |              |  |
#  |            |            |             |\           |            |  #              |              |  |
#  |            |            |             | ------------------x---------------------->| disconnect   |  |
#  |            |            |             |            |            |  #              |              |  |
#  |            |            |             |            |            |  #              |              |  |
#  |            |            |             |            |            |  #              |              |  |
#  |            |            |             |            |            |  #              |              |  |
#  |            |            |             |            |            |  #              |              |  |
#  |            |            |             |            |            |  #              |              |  |
#  |            |            |  disconnect |<-----x-----| disconnect |  #              |              |  |
#  | disconnect |<----x------| disconnect  |            | #2         |  #              |              |  |
#  |            |            |  disconnect |-------------------x---------------------->| disconnect   |  |
#  |            |            |             |            |            |  #              |              |  |
#  |            |            |             |            |            |  #              |              |  |
#  |            |            |             |            |            |  #              |              |  |
#  |            |            |             |            |            |  #              |              |  |
#  |            |            |             |            |            |  #              |              |  |
#  |            |            |  disconnect |<------------------x-----------------------| disconnect   |  |
#  |            |            |             |            |            |  #              | #3           |  |
#  +------------+            +-------------+            +------------+  #              +--------------+  |
#########################################################################               +----------------+

Installation

From source

With cargo installed run:

$ cargo install tcp-clone

Pre-builds

Download a released version.

Usage

$ tcp-clone --help

Configuration file

Example

[[tcp_clone]]

  [tcp_clone.server]
  listen_addr = "127.0.0.1:1202"

  [tcp_clone.target]
  addr = "127.0.0.1:5000"

  [[tcp_clone.observer]]
  addr = "127.0.0.1:6000"

  [[tcp_clone.observer]]
  addr = "127.0.0.1:7000"

# Add more servers:
#
#[[tcp_clone]]
#
#  [tcp_clone.server]
#  listen_addr = "127.0.0.1:1111"
#
#  [tcp_clone.target]
#  addr = "127.0.0.1:3333"
#
#  [[tcp_clone.observer]]
#  addr = "127.0.0.1:5555"

Demo

With iperf

$ tcp-clone tcp-clone.toml                        # `tcp-clone` server
$ iperf -s -p 5000 -b 800Mbits/sec                # Target server
$ iperf -s -p 6000 -b 1Gbytes/sec                 # Observer #1
$ iperf -s -p 7000 -b 500Mbits/sec                # Observer #2
$ iperf -c 127.0.0.1 -p 1202 -n 250Mbytes -P 4

With netcat

$ tcp-clone tcp-clone.toml
$ nc -l -p 5000
$ nc -l -p 6000
$ nc -l -p 7000
$ nc 127.0.0.1 1202
$ # ...and now type into the netcat instances...

License