tcp-clone
TCP proxy server with ability to send client upstream to observers.
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:
sh
$ cargo install tcp-clone
Pre-builds
Download a released version.
Usage
sh
$ tcp-clone --help
Configuration file
Example
```toml
[[tcp_clone]]
[tcpclone.server]
listenaddr = "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
sh
$ 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
sh
$ 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
This project is licensed under the MIT license.
Copyright © 2019 Bence SZIGETI <bence.szigeti@gohyda.com>