Traffic-shaping SOCKS5 proxy
tsproxy provides basic latency, download and upload traffic shaping while only requiring user-level access (no root permissions required). It should work for basic browser testing but for protocol-level work it does not provide a suitable replacement for something like dummynet or netem.
tsproxy is monolithic and all of the functionality is in tsproxy.py. It is written expecting Python 2.7.
#Usage
$ python tsproxy.py --rtt=<latency> --inkbps=<download bandwidth> --outkbps=<upload bandwidth>
Hit ctrl-C (or send a SIGINT) to exit
#Example
$ python tsproxy.py --rtt=200 --inkbps=1600 --outkbps=768
#Command-line Options
| Option | Alias | Description |
|---|---|---|
--rtt |
-r |
Latency in milliseconds (full round trip, half of the latency gets applied to each direction). |
--inkbps |
-i |
Download Bandwidth (in 1000 bits/s - Kbps). |
--outkbps |
-o |
Upload Bandwidth (in 1000 bits/s - Kbps). |
--window |
-w |
Emulated TCP initial congestion window (defaults to 10). |
--port |
-p |
SOCKS 5 proxy port (defaults to port 1080). Specifying a port of 0 will use a randomly assigned port. |
--bind |
-b |
Interface address to listen on (defaults to localhost). |
--desthost |
-d |
Redirect all outbound connections to the specified host (name or IP). |
--mapports |
-m |
Remap outbound ports. Comma-separated list of original:new with * as a wildcard. --mapports '443:8443,*:8080' |
--localhost |
-l |
Include connections already destined for localhost/127.0.0.1 in the host and port remapping. |
--verbose |
-v |
Increase verbosity (specify multiple times for more). -vvvv for full debug output. |
#Runtime Options
The traffic shaping configuration can be changed dynamically at runtime by passing commands in through the console (or stdin). Each command is on a line, terminated with an end-of-line (\n).
flush : Flush queued data out of the pipes. Useful for clearing out any accumulated background data between tests.set rtt <latency> : Change the connection latency. i.e. set rtt 200\n will change to a 200ms RTT.set inkbps <bandwidth> : Change the download bandwidth. i.e. set inkbps 5000\n will change to a 5Mbps download connection.set outkbps <bandwidth> : Change the upload bandwidth. i.e. set outkbps 1000\n will change to a 1Mbps upload connection.set mapports <port mapping string> : Change the destination port mapping.reset all : Disable all port mapping and traffic shapingreset rtt : Set latency to 0reset inkbps : Disable download traffic shapingreset outkbps : Disable upload traffic shapingreset mapports : Disable destination port mappingAll bandwidth and latency changes also carry an implied flush and clear out any pending data.
#Configuring Chrome to use tsproxy Add a --proxy-server command-line option.
--proxy-server="socks://localhost:1080"
#Known Shortcomings/Issues