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