A Simple TCP Socket Balancer for balance Multi Socks5 Proxy Backend
End Maintenance, Please Use Socks5BalancerAsio Instead
- Load Balance user connect to multi backend with multi rule
- Load all config from config file
- support unlimited backend number
- can monitor backend alive state
- can monitor backend is work well
- connection from front end will not connect to dead backend
- have 2 check way to check a backend is dead or alive
- if a backend revive from dead, it will be auto enable
loop
: every connect will round robin on all live backendrandom
: every connect will random connect a live backendone_by_one
: every new connect will try to use last connect backend, if that backend dead, will try next live onechange_by_time
: similarone_by_one
, but will force change server to next after a specific time (in config)
config is a json, the template config is config.json
it must encode with UTF-8 no BOM
{
"listenHost": "127.0.0.1", // the listen host, default is 127.0.0.1
"listenPort": 5000, // the listen port, default is 5000
// (if all backend down at same time, the new connect will wast `retryTimes*connectTimeout` time on it. )
"retryTimes": 3, // when new connect coming, how many backend we try to connect. default is 3
"connectTimeout": 2000, // when try to connect backend, how long the backend connect timeout means it's dead. default is 2000ms (2s)
// (notice that, the testRemoteHost must be a HTTPS server. now we only check is it connectable.)
"testRemoteHost": "www.google.com", // what target host name we use to check the backend socks5 proxy work well. default is "www.google.com"
"testRemotePort": 443, // what target port we use to check the backend socks5 proxy work well. default is 443
// (the `tcpCheck` only create a TCP handshake to backend to check the backend is alive)
"tcpCheckPeriod": 5000, // how many Period of every backend live check. default is 5000ms (5s)
"tcpCheckStart": 1000, // how many time we wait before first backend live check. default is 1000ms (1s)
"connectCheckPeriod": 300000, // how many Period of check every backend socks5 proxy work well. default is 300000ms (300s or 5min)
"connectCheckStart": 1000, // how many time we wait before first check backend socks5 proxy work well. default is 1000ms (1s)
"additionCheckPeriod": 10000, // how many time we check the all backend dead and force check then. default is 10000ms (10s)
"upstreamSelectRule": "random", // the Load Balance Rule. default is `random`
"sleepTime": 1800000, // how many time we need to sleep after last connect. default is 1800000ms (1800s or 30min)
"serverChangeTime": 5000, // the config of Load Balance Rule `change_by_time`. default is 5000ms (5s)
"stateServerHost": "127.0.0.1", // the simple state monitor server host. default is 127.0.0.1
"stateServerPort": 5010, // the simple state monitor server port. default is 5010
// the `momentLocale` is moment format. now only build with en & zh-cn for best size. if you need more language, can enable on `webpack-prod.config.js` -> `MomentLocalesPlugin`
"momentLocale": "en", // the time localization config. now it can be `en` or `zh-cn`. default is `en`
"upstream": [ // the backend server array. default is empty. (now only support socks5 proxy server)
{
"name": "Server Name A", // the backend server name string, you can use any string on this
"host": "127.0.0.1", // the backend server host
"port": 3000 // the backend server port
},
{
"name": "Server Name B",
"host": "127.0.0.1",
"port": 3001
},
{
"name": "Server Name C",
"host": "127.0.0.1",
"port": 3002,
"disable": 1 // if set the "disable" as NOT Falsy (Falsy means 0,false,null,undefined..), this server will disable by default
}
],
"internalBehavior": { // some inner config , if you dont known how it work, you dont need care it.
"connectResetMeansOffline": true, // if detect the connect be reset, Think of that backend as Offline. default is true
"statisticalTimerPeriod": 1000 // the backend statistical period, if your server have low CPU, you can reduce it. default is 1000ms (1s)
}
}
the minimal config template :
{
"listenHost": "127.0.0.1",
"listenPort": 5000,
"upstreamSelectRule": "random",
"serverChangeTime": 5000,
"upstream": [
{
"host": "127.0.0.1",
"port": 3000
}
]
}
build it: nodejs
, yarn
run it: nodejs
, one or more socks5 proxy as backend
if use archlinux:
pacman -S nodejs yarn npm
download node_module:
yarn install
build it:
yarn run build
then, the build output is the dist/bundle-prod.js
you can copy the file bundle-prod.js
and a config file to any you want to run, it only require nodejs
to run.
you can set the env to special config file path or set it as command params
follow is two systemd config example
set config to env globalConfigFilePath
# nano /etc/systemd/system/Socks5Balancer.service
[Unit]
Description=Socks5Balancer Service
Requires=network.target
After=network.target
[Service]
Type=simple
User=username
Restart=always
AmbientCapabilities=CAP_NET_BIND_SERVICE
Environment=globalConfigFilePath=/home/username/Socks5Balancer/config.json
ExecStart=/usr/bin/node /home/username/Socks5Balancer/bundle-prod.js
[Install]
WantedBy=multi-user.target
set config to command params
# nano /etc/systemd/system/Socks5Balancer.service
[Unit]
Description=Socks5Balancer Service
Requires=network.target
After=network.target
[Service]
Type=simple
User=username
Restart=always
AmbientCapabilities=CAP_NET_BIND_SERVICE
ExecStart=/usr/bin/node /home/username/Socks5Balancer/bundle-prod.js /home/username/Socks5Balancer/config.json
[Install]
WantedBy=multi-user.target
if a backend cannot connect to the testRemoteHost
, this backend cannot pass the connectCheck
.
if a backend cannot be handshake use TCP, this backend cannot pass the tcpCheck
.
if a backend cannot pass connectCheck
or tcpCheck
, this backend will be disable untill it pass all the two check.
if all backend are disabled, the front connect will be reject.
Warning: the connectCheck
have a long CheckPeriod (default is 5min), if a backend cannot work well in the Period, connect to it will han and the Balance unable to discover it.
Warning: Many socks5 Proxy have a strange behavior, the first connect will hang or wait many time after a lone idle.
Warning: if you set the connectCheckPeriod
too short, it may wast many bandwidth.
I recommend change_by_time
if you often browser web page.
if you want the IP not change, example playing some game, use one_by_one
if you use it to download something and dont care about latency and IP, like BT, use random
or loop
a simple state monitor server can config by stateServerHost
and stateServerPort
it's a plain text server, use TCP connect to it, then it will output a text string include it's running info.
you can use a Web Browser to check it.
- support socks5 UDP
- support Load Balance Rule
best_latency
- support Load Balance Rule
fast_download_speed
- support Load Balance Rule
fast_upload_speed
- add server priority
- add control function on state monitor
- add manual disable function on state monitor
- add runtime rule change function on state monitor
- add manual close connect function on state monitor
- auto close all connect when switch (change) server
- show connect speed on state monitor
- show how many data was transfer in data monitor
- Analysis socks5 proxy
- Direct Impl Proxy Client
- Impl Trojan Proxy Client