12
CHANGELOG
12
CHANGELOG
@ -1,13 +1,13 @@
|
|||||||
proxy更新日志
|
proxy更新日志
|
||||||
v4.7
|
v4.7
|
||||||
1.优化了bridge的日志,增加了client和server的掉线日志.
|
1.增加了基于gomobile的sdk,对安卓/IOS提供SDK支持.
|
||||||
2.优化了sps读取http(s)代理响应的缓冲大小,同时优化了CONNECT请求,
|
2.优化了bridge的日志,增加了client和server的掉线日志.
|
||||||
|
3.优化了sps读取http(s)代理响应的缓冲大小,同时优化了CONNECT请求,
|
||||||
避免了某些代理服务器返回过多数据导致不能正常通讯的问题.
|
避免了某些代理服务器返回过多数据导致不能正常通讯的问题.
|
||||||
3.去除了鸡肋连接池功能.
|
4.去除了鸡肋连接池功能.
|
||||||
4.增加了gomobile sdk,对安卓/IOS提供支持.
|
|
||||||
5.优化了所有服务代码,方便对sdk提供支持.
|
5.优化了所有服务代码,方便对sdk提供支持.
|
||||||
|
6.增加了SDK手册.
|
||||||
|
7.增加了GUI客户端(windows/web/android/ios)介绍主页.
|
||||||
|
|
||||||
v4.6
|
v4.6
|
||||||
1.sps,http(s),socks5,内网穿透都做了大量的超时优化处理,更加稳定.
|
1.sps,http(s),socks5,内网穿透都做了大量的超时优化处理,更加稳定.
|
||||||
|
|||||||
@ -86,7 +86,6 @@ func initConfig() (err error) {
|
|||||||
httpArgs.Direct = http.Flag("direct", "direct domain file , one domain each line").Default("direct").Short('d').String()
|
httpArgs.Direct = http.Flag("direct", "direct domain file , one domain each line").Default("direct").Short('d').String()
|
||||||
httpArgs.AuthFile = http.Flag("auth-file", "http basic auth file,\"username:password\" each line in file").Short('F').String()
|
httpArgs.AuthFile = http.Flag("auth-file", "http basic auth file,\"username:password\" each line in file").Short('F').String()
|
||||||
httpArgs.Auth = http.Flag("auth", "http basic auth username and password, mutiple user repeat -a ,such as: -a user1:pass1 -a user2:pass2").Short('a').Strings()
|
httpArgs.Auth = http.Flag("auth", "http basic auth username and password, mutiple user repeat -a ,such as: -a user1:pass1 -a user2:pass2").Short('a').Strings()
|
||||||
httpArgs.PoolSize = http.Flag("pool-size", "conn pool size , which connect to parent proxy, zero: means turn off pool").Short('L').Default("0").Int()
|
|
||||||
httpArgs.CheckParentInterval = http.Flag("check-parent-interval", "check if proxy is okay every interval seconds,zero: means no check").Short('I').Default("3").Int()
|
httpArgs.CheckParentInterval = http.Flag("check-parent-interval", "check if proxy is okay every interval seconds,zero: means no check").Short('I').Default("3").Int()
|
||||||
httpArgs.Local = http.Flag("local", "local ip:port to listen,multiple address use comma split,such as: 0.0.0.0:80,0.0.0.0:443").Short('p').Default(":33080").String()
|
httpArgs.Local = http.Flag("local", "local ip:port to listen,multiple address use comma split,such as: 0.0.0.0:80,0.0.0.0:443").Short('p').Default(":33080").String()
|
||||||
httpArgs.SSHUser = http.Flag("ssh-user", "user for ssh").Short('u').Default("").String()
|
httpArgs.SSHUser = http.Flag("ssh-user", "user for ssh").Short('u').Default("").String()
|
||||||
@ -109,7 +108,6 @@ func initConfig() (err error) {
|
|||||||
tcpArgs.Timeout = tcp.Flag("timeout", "tcp timeout milliseconds when connect to real server or parent proxy").Short('e').Default("2000").Int()
|
tcpArgs.Timeout = tcp.Flag("timeout", "tcp timeout milliseconds when connect to real server or parent proxy").Short('e').Default("2000").Int()
|
||||||
tcpArgs.ParentType = tcp.Flag("parent-type", "parent protocol type <tls|tcp|kcp|udp>").Short('T').Enum("tls", "tcp", "udp", "kcp")
|
tcpArgs.ParentType = tcp.Flag("parent-type", "parent protocol type <tls|tcp|kcp|udp>").Short('T').Enum("tls", "tcp", "udp", "kcp")
|
||||||
tcpArgs.LocalType = tcp.Flag("local-type", "local protocol type <tls|tcp|kcp>").Default("tcp").Short('t').Enum("tls", "tcp", "kcp")
|
tcpArgs.LocalType = tcp.Flag("local-type", "local protocol type <tls|tcp|kcp>").Default("tcp").Short('t').Enum("tls", "tcp", "kcp")
|
||||||
tcpArgs.PoolSize = tcp.Flag("pool-size", "conn pool size , which connect to parent proxy, zero: means turn off pool").Short('L').Default("0").Int()
|
|
||||||
tcpArgs.CheckParentInterval = tcp.Flag("check-parent-interval", "check if proxy is okay every interval seconds,zero: means no check").Short('I').Default("3").Int()
|
tcpArgs.CheckParentInterval = tcp.Flag("check-parent-interval", "check if proxy is okay every interval seconds,zero: means no check").Short('I').Default("3").Int()
|
||||||
tcpArgs.Local = tcp.Flag("local", "local ip:port to listen").Short('p').Default(":33080").String()
|
tcpArgs.Local = tcp.Flag("local", "local ip:port to listen").Short('p').Default(":33080").String()
|
||||||
|
|
||||||
@ -120,7 +118,6 @@ func initConfig() (err error) {
|
|||||||
udpArgs.KeyFile = udp.Flag("key", "key file for tls").Short('K').Default("proxy.key").String()
|
udpArgs.KeyFile = udp.Flag("key", "key file for tls").Short('K').Default("proxy.key").String()
|
||||||
udpArgs.Timeout = udp.Flag("timeout", "tcp timeout milliseconds when connect to parent proxy").Short('t').Default("2000").Int()
|
udpArgs.Timeout = udp.Flag("timeout", "tcp timeout milliseconds when connect to parent proxy").Short('t').Default("2000").Int()
|
||||||
udpArgs.ParentType = udp.Flag("parent-type", "parent protocol type <tls|tcp|udp>").Short('T').Enum("tls", "tcp", "udp")
|
udpArgs.ParentType = udp.Flag("parent-type", "parent protocol type <tls|tcp|udp>").Short('T').Enum("tls", "tcp", "udp")
|
||||||
udpArgs.PoolSize = udp.Flag("pool-size", "conn pool size , which connect to parent proxy, zero: means turn off pool").Short('L').Default("0").Int()
|
|
||||||
udpArgs.CheckParentInterval = udp.Flag("check-parent-interval", "check if proxy is okay every interval seconds,zero: means no check").Short('I').Default("3").Int()
|
udpArgs.CheckParentInterval = udp.Flag("check-parent-interval", "check if proxy is okay every interval seconds,zero: means no check").Short('I').Default("3").Int()
|
||||||
udpArgs.Local = udp.Flag("local", "local ip:port to listen").Short('p').Default(":33080").String()
|
udpArgs.Local = udp.Flag("local", "local ip:port to listen").Short('p').Default(":33080").String()
|
||||||
|
|
||||||
|
|||||||
77
sdk/README.md
Normal file
77
sdk/README.md
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
|
||||||
|
# Proxy SDK 使用说明
|
||||||
|
|
||||||
|
proxy使用gombile实现了一份go代码编译为android和ios平台下面可以直接调用的sdk类库,
|
||||||
|
基于这些类库,APP开发者可以轻松的开发出各种形式的代理工具.
|
||||||
|
|
||||||
|
### 下面分平台介绍SDK的用法
|
||||||
|
|
||||||
|
#### Android SDK
|
||||||
|
|
||||||
|
[](https://github.com/snail007/goproxy/) []() [](https://github.com/snail007/goproxy/releases) [](https://github.com/snail007/goproxy/releases)
|
||||||
|
|
||||||
|
[点击下载Android-SDK](https://github.com/snail007/goproxy-sdk-android/releases)
|
||||||
|
在Android系统提供的sdk形式是一个后缀为.aar的类库文件,开发的时候只需要把arr类库文件引入android项目即可.
|
||||||
|
|
||||||
|
### Android-SDK使用实例
|
||||||
|
|
||||||
|
#### 1.导入包
|
||||||
|
```java
|
||||||
|
import snail007.proxy.Porxy
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 2.启动一个服务
|
||||||
|
```java
|
||||||
|
String args="http -p :8080"
|
||||||
|
String err=Proxy.start(args)
|
||||||
|
if (err.isEmpty()){
|
||||||
|
//启动失败
|
||||||
|
System.out.println("start fail,error:"+err)
|
||||||
|
}else{
|
||||||
|
//启动成功
|
||||||
|
}
|
||||||
|
```
|
||||||
|
#### 3.判断一个服务是否在运行
|
||||||
|
|
||||||
|
```java
|
||||||
|
String args="http -p :8080"
|
||||||
|
boolean isRunning=Proxy.isRunning(args)//这里传递http也可以,最终使用的就是args里面的第一个参数http
|
||||||
|
if(isRunning){
|
||||||
|
//正在运行
|
||||||
|
}else{
|
||||||
|
//没有运行
|
||||||
|
}
|
||||||
|
```
|
||||||
|
#### 4.停止一个服务
|
||||||
|
|
||||||
|
```java
|
||||||
|
String args="http -p :8080"
|
||||||
|
Proxy.stop(args)//这里传递http也可以,最终使用的就是args里面的第一个参数http
|
||||||
|
//停止完毕
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### IOS-SDK使用实例
|
||||||
|
|
||||||
|
#### todo
|
||||||
|
|
||||||
|
|
||||||
|
### 关于服务
|
||||||
|
proxy的服务有11种,分别是:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
http
|
||||||
|
socks
|
||||||
|
sps
|
||||||
|
tcp
|
||||||
|
udp
|
||||||
|
bridge
|
||||||
|
server
|
||||||
|
client
|
||||||
|
tbridge
|
||||||
|
tserver
|
||||||
|
tclient
|
||||||
|
```
|
||||||
|
每个服务只能启动一个,如果相同的服务启动多次,那么之前的服务会被停掉,后面启动的服务覆盖之前的服务.
|
||||||
|
上面这些服务的具体使用方式和具体参数,可以参考[proxy手册](https://github.com/snail007/goproxy/blob/master/README_ZH.md)
|
||||||
@ -1,41 +1,56 @@
|
|||||||
#/bin/bash
|
#/bin/bash
|
||||||
VER="v4.7"
|
VER="v4.7"
|
||||||
rm -rf proxy-sdk-release-*
|
rm -rf android
|
||||||
|
rm -rf ios
|
||||||
|
mkdir android
|
||||||
|
mkdir ios
|
||||||
|
|
||||||
#arm
|
#arm
|
||||||
gomobile bind -v -target=android/arm
|
gomobile bind -v -target=android/arm -javapkg=snail007 -ldflags="-s -w"
|
||||||
mkdir proxy-sdk-arm
|
mkdir arm
|
||||||
mv sdk.aar proxy-sdk-arm/proxy-sdk-arm.aar
|
mv proxy.aar arm/snail007.goproxy.sdk.aar
|
||||||
mv sdk-sources.jar proxy-sdk-arm/proxy-sdk-arm-sources.jar
|
mv proxy-sources.jar arm/snail007.goproxy.sdk-sources.jar
|
||||||
tar zcfv proxy-sdk-arm-${VER}.tar.gz proxy-sdk-arm
|
tar zcfv sdk-arm-${VER}.tar.gz arm
|
||||||
rm -rf proxy-sdk-arm
|
mv sdk-arm-${VER}.tar.gz android
|
||||||
|
rm -rf arm
|
||||||
|
|
||||||
|
|
||||||
#arm64
|
#arm64
|
||||||
gomobile bind -v -target=android/arm64
|
gomobile bind -v -target=android/arm64 -javapkg=snail007 -ldflags="-s -w"
|
||||||
mkdir proxy-sdk-arm64
|
mkdir arm64
|
||||||
mv sdk.aar proxy-sdk-arm64/proxy-sdk-arm64.aar
|
mv proxy.aar arm64/snail007.goproxy.sdk.aar
|
||||||
mv sdk-sources.jar proxy-sdk-arm64/proxy-sdk-arm64-sources.jar
|
mv proxy-sources.jar arm64/snail007.goproxy.sdk-sources.jar
|
||||||
tar zcfv proxy-sdk-arm64-${VER}.tar.gz proxy-sdk-arm64
|
tar zcfv sdk-arm64-${VER}.tar.gz arm64
|
||||||
rm -rf proxy-sdk-arm64
|
mv sdk-arm64-${VER}.tar.gz android
|
||||||
|
rm -rf arm64
|
||||||
|
|
||||||
|
|
||||||
#386
|
#386
|
||||||
gomobile bind -v -target=android/386
|
gomobile bind -v -target=android/386 -javapkg=snail007 -ldflags="-s -w"
|
||||||
mkdir proxy-sdk-386
|
mkdir 386
|
||||||
mv sdk.aar proxy-sdk-386/proxy-sdk-386.aar
|
mv proxy.aar 386/snail007.goproxy.sdk.aar
|
||||||
mv sdk-sources.jar proxy-sdk-386/proxy-sdk-386-sources.jar
|
mv proxy-sources.jar 386/snail007.goproxy.sdk-sources.jar
|
||||||
tar zcfv proxy-sdk-386-${VER}.tar.gz proxy-sdk-386
|
tar zcfv sdk-386-${VER}.tar.gz 386
|
||||||
rm -rf proxy-sdk-386
|
mv sdk-386-${VER}.tar.gz android
|
||||||
|
rm -rf 386
|
||||||
|
|
||||||
#amd64
|
#amd64
|
||||||
gomobile bind -v -target=android/amd64
|
gomobile bind -v -target=android/amd64 -javapkg=snail007 -ldflags="-s -w"
|
||||||
mkdir proxy-sdk-amd64
|
mkdir amd64
|
||||||
mv sdk.aar proxy-sdk-amd64/proxy-sdk-amd64.aar
|
mv proxy.aar amd64/snail007.goproxy.sdk.aar
|
||||||
mv sdk-sources.jar proxy-sdk-amd64/proxy-sdk-amd64-sources.jar
|
mv proxy-sources.jar amd64/snail007.goproxy.sdk-sources.jar
|
||||||
tar zcfv proxy-sdk-amd64-${VER}.tar.gz proxy-sdk-amd64
|
tar zcfv sdk-amd64-${VER}.tar.gz amd64
|
||||||
rm -rf proxy-sdk-amd64
|
mv sdk-amd64-${VER}.tar.gz android
|
||||||
|
rm -rf amd64
|
||||||
|
|
||||||
|
|
||||||
#all-in-one
|
#all-in-one
|
||||||
gomobile bind -v -target=android
|
gomobile bind -v -target=android -javapkg=snail007 -ldflags="-s -w"
|
||||||
mkdir proxy-sdk-all
|
mkdir all
|
||||||
mv sdk.aar proxy-sdk-all/proxy-sdk-all.aar
|
mv proxy.aar all/snail007.goproxy.sdk.aar
|
||||||
mv sdk-sources.jar proxy-sdk-all/proxy-sdk-all-sources.jar
|
mv proxy-sources.jar all/snail007.goproxy.sdk-sources.jar
|
||||||
tar zcfv proxy-sdk-all-${VER}.tar.gz proxy-sdk-all
|
tar zcfv sdk-all-${VER}.tar.gz all
|
||||||
rm -rf proxy-sdk-all
|
mv sdk-all-${VER}.tar.gz android
|
||||||
mkdir proxy-sdk-release-${VER}
|
rm -rf all
|
||||||
mv *.tar.gz proxy-sdk-release-${VER}
|
|
||||||
echo "done."
|
echo "done."
|
||||||
|
|||||||
131
sdk/sdk.go
131
sdk/sdk.go
@ -1,13 +1,16 @@
|
|||||||
package sdk
|
package proxy
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"crypto/sha1"
|
"crypto/sha1"
|
||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
|
"net"
|
||||||
"os"
|
"os"
|
||||||
"snail007/proxy/services"
|
"snail007/proxy/services"
|
||||||
"snail007/proxy/services/kcpcfg"
|
"snail007/proxy/services/kcpcfg"
|
||||||
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
kcp "github.com/xtaci/kcp-go"
|
kcp "github.com/xtaci/kcp-go"
|
||||||
"golang.org/x/crypto/pbkdf2"
|
"golang.org/x/crypto/pbkdf2"
|
||||||
@ -16,7 +19,6 @@ import (
|
|||||||
|
|
||||||
var (
|
var (
|
||||||
app *kingpin.Application
|
app *kingpin.Application
|
||||||
service *services.ServiceItem
|
|
||||||
)
|
)
|
||||||
|
|
||||||
//Start argsStr: is the whole command line args string
|
//Start argsStr: is the whole command line args string
|
||||||
@ -47,7 +49,7 @@ func Start(argsStr string) (errStr string) {
|
|||||||
logfile := app.Flag("log", "log file path").Default("").String()
|
logfile := app.Flag("log", "log file path").Default("").String()
|
||||||
kcpArgs.Key = app.Flag("kcp-key", "pre-shared secret between client and server").Default("secrect").String()
|
kcpArgs.Key = app.Flag("kcp-key", "pre-shared secret between client and server").Default("secrect").String()
|
||||||
kcpArgs.Crypt = app.Flag("kcp-method", "encrypt/decrypt method, can be: aes, aes-128, aes-192, salsa20, blowfish, twofish, cast5, 3des, tea, xtea, xor, sm4, none").Default("aes").Enum("aes", "aes-128", "aes-192", "salsa20", "blowfish", "twofish", "cast5", "3des", "tea", "xtea", "xor", "sm4", "none")
|
kcpArgs.Crypt = app.Flag("kcp-method", "encrypt/decrypt method, can be: aes, aes-128, aes-192, salsa20, blowfish, twofish, cast5, 3des, tea, xtea, xor, sm4, none").Default("aes").Enum("aes", "aes-128", "aes-192", "salsa20", "blowfish", "twofish", "cast5", "3des", "tea", "xtea", "xor", "sm4", "none")
|
||||||
kcpArgs.Mode = app.Flag("kcp-mode", "profiles: fast3, fast2, fast, normal, manual").Default("fast").Enum("fast3", "fast2", "fast", "normal", "manual")
|
kcpArgs.Mode = app.Flag("kcp-mode", "profiles: fast3, fast2, fast, normal, manual").Default("fast3").Enum("fast3", "fast2", "fast", "normal", "manual")
|
||||||
kcpArgs.MTU = app.Flag("kcp-mtu", "set maximum transmission unit for UDP packets").Default("1350").Int()
|
kcpArgs.MTU = app.Flag("kcp-mtu", "set maximum transmission unit for UDP packets").Default("1350").Int()
|
||||||
kcpArgs.SndWnd = app.Flag("kcp-sndwnd", "set send window size(num of packets)").Default("1024").Int()
|
kcpArgs.SndWnd = app.Flag("kcp-sndwnd", "set send window size(num of packets)").Default("1024").Int()
|
||||||
kcpArgs.RcvWnd = app.Flag("kcp-rcvwnd", "set receive window size(num of packets)").Default("1024").Int()
|
kcpArgs.RcvWnd = app.Flag("kcp-rcvwnd", "set receive window size(num of packets)").Default("1024").Int()
|
||||||
@ -79,7 +81,6 @@ func Start(argsStr string) (errStr string) {
|
|||||||
httpArgs.Direct = http.Flag("direct", "direct domain file , one domain each line").Default("direct").Short('d').String()
|
httpArgs.Direct = http.Flag("direct", "direct domain file , one domain each line").Default("direct").Short('d').String()
|
||||||
httpArgs.AuthFile = http.Flag("auth-file", "http basic auth file,\"username:password\" each line in file").Short('F').String()
|
httpArgs.AuthFile = http.Flag("auth-file", "http basic auth file,\"username:password\" each line in file").Short('F').String()
|
||||||
httpArgs.Auth = http.Flag("auth", "http basic auth username and password, mutiple user repeat -a ,such as: -a user1:pass1 -a user2:pass2").Short('a').Strings()
|
httpArgs.Auth = http.Flag("auth", "http basic auth username and password, mutiple user repeat -a ,such as: -a user1:pass1 -a user2:pass2").Short('a').Strings()
|
||||||
httpArgs.PoolSize = http.Flag("pool-size", "conn pool size , which connect to parent proxy, zero: means turn off pool").Short('L').Default("0").Int()
|
|
||||||
httpArgs.CheckParentInterval = http.Flag("check-parent-interval", "check if proxy is okay every interval seconds,zero: means no check").Short('I').Default("3").Int()
|
httpArgs.CheckParentInterval = http.Flag("check-parent-interval", "check if proxy is okay every interval seconds,zero: means no check").Short('I').Default("3").Int()
|
||||||
httpArgs.Local = http.Flag("local", "local ip:port to listen,multiple address use comma split,such as: 0.0.0.0:80,0.0.0.0:443").Short('p').Default(":33080").String()
|
httpArgs.Local = http.Flag("local", "local ip:port to listen,multiple address use comma split,such as: 0.0.0.0:80,0.0.0.0:443").Short('p').Default(":33080").String()
|
||||||
httpArgs.SSHUser = http.Flag("ssh-user", "user for ssh").Short('u').Default("").String()
|
httpArgs.SSHUser = http.Flag("ssh-user", "user for ssh").Short('u').Default("").String()
|
||||||
@ -102,7 +103,6 @@ func Start(argsStr string) (errStr string) {
|
|||||||
tcpArgs.Timeout = tcp.Flag("timeout", "tcp timeout milliseconds when connect to real server or parent proxy").Short('e').Default("2000").Int()
|
tcpArgs.Timeout = tcp.Flag("timeout", "tcp timeout milliseconds when connect to real server or parent proxy").Short('e').Default("2000").Int()
|
||||||
tcpArgs.ParentType = tcp.Flag("parent-type", "parent protocol type <tls|tcp|kcp|udp>").Short('T').Enum("tls", "tcp", "udp", "kcp")
|
tcpArgs.ParentType = tcp.Flag("parent-type", "parent protocol type <tls|tcp|kcp|udp>").Short('T').Enum("tls", "tcp", "udp", "kcp")
|
||||||
tcpArgs.LocalType = tcp.Flag("local-type", "local protocol type <tls|tcp|kcp>").Default("tcp").Short('t').Enum("tls", "tcp", "kcp")
|
tcpArgs.LocalType = tcp.Flag("local-type", "local protocol type <tls|tcp|kcp>").Default("tcp").Short('t').Enum("tls", "tcp", "kcp")
|
||||||
tcpArgs.PoolSize = tcp.Flag("pool-size", "conn pool size , which connect to parent proxy, zero: means turn off pool").Short('L').Default("0").Int()
|
|
||||||
tcpArgs.CheckParentInterval = tcp.Flag("check-parent-interval", "check if proxy is okay every interval seconds,zero: means no check").Short('I').Default("3").Int()
|
tcpArgs.CheckParentInterval = tcp.Flag("check-parent-interval", "check if proxy is okay every interval seconds,zero: means no check").Short('I').Default("3").Int()
|
||||||
tcpArgs.Local = tcp.Flag("local", "local ip:port to listen").Short('p').Default(":33080").String()
|
tcpArgs.Local = tcp.Flag("local", "local ip:port to listen").Short('p').Default(":33080").String()
|
||||||
|
|
||||||
@ -113,7 +113,6 @@ func Start(argsStr string) (errStr string) {
|
|||||||
udpArgs.KeyFile = udp.Flag("key", "key file for tls").Short('K').Default("proxy.key").String()
|
udpArgs.KeyFile = udp.Flag("key", "key file for tls").Short('K').Default("proxy.key").String()
|
||||||
udpArgs.Timeout = udp.Flag("timeout", "tcp timeout milliseconds when connect to parent proxy").Short('t').Default("2000").Int()
|
udpArgs.Timeout = udp.Flag("timeout", "tcp timeout milliseconds when connect to parent proxy").Short('t').Default("2000").Int()
|
||||||
udpArgs.ParentType = udp.Flag("parent-type", "parent protocol type <tls|tcp|udp>").Short('T').Enum("tls", "tcp", "udp")
|
udpArgs.ParentType = udp.Flag("parent-type", "parent protocol type <tls|tcp|udp>").Short('T').Enum("tls", "tcp", "udp")
|
||||||
udpArgs.PoolSize = udp.Flag("pool-size", "conn pool size , which connect to parent proxy, zero: means turn off pool").Short('L').Default("0").Int()
|
|
||||||
udpArgs.CheckParentInterval = udp.Flag("check-parent-interval", "check if proxy is okay every interval seconds,zero: means no check").Short('I').Default("3").Int()
|
udpArgs.CheckParentInterval = udp.Flag("check-parent-interval", "check if proxy is okay every interval seconds,zero: means no check").Short('I').Default("3").Int()
|
||||||
udpArgs.Local = udp.Flag("local", "local ip:port to listen").Short('p').Default(":33080").String()
|
udpArgs.Local = udp.Flag("local", "local ip:port to listen").Short('p').Default(":33080").String()
|
||||||
|
|
||||||
@ -225,7 +224,11 @@ func Start(argsStr string) (errStr string) {
|
|||||||
spsArgs.AuthURLRetry = sps.Flag("auth-retry", "access 'auth-url' fail and retry count").Default("0").Int()
|
spsArgs.AuthURLRetry = sps.Flag("auth-retry", "access 'auth-url' fail and retry count").Default("0").Int()
|
||||||
spsArgs.ParentAuth = sps.Flag("parent-auth", "parent socks auth username and password, such as: -A user1:pass1").Short('A').String()
|
spsArgs.ParentAuth = sps.Flag("parent-auth", "parent socks auth username and password, such as: -A user1:pass1").Short('A').String()
|
||||||
//parse args
|
//parse args
|
||||||
args := strings.Fields(strings.Trim(argsStr, " "))
|
_args := strings.Fields(strings.Trim(argsStr, " "))
|
||||||
|
args := []string{}
|
||||||
|
for _, a := range _args {
|
||||||
|
args = append(args, strings.Trim(a, "\""))
|
||||||
|
}
|
||||||
serviceName, err := app.Parse(args)
|
serviceName, err := app.Parse(args)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Sprintf("parse args fail,err: %s", err)
|
return fmt.Sprintf("parse args fail,err: %s", err)
|
||||||
@ -323,16 +326,120 @@ func Start(argsStr string) (errStr string) {
|
|||||||
case "sps":
|
case "sps":
|
||||||
services.Regist("sps", services.NewSPS(), spsArgs)
|
services.Regist("sps", services.NewSPS(), spsArgs)
|
||||||
}
|
}
|
||||||
|
_, err = services.Run(serviceName)
|
||||||
service, err = services.Run(serviceName)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Sprintf("run service [%s] fail, ERR:%s", serviceName, err)
|
return fmt.Sprintf("run service [%s] fail, ERR:%s", serviceName, err)
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func Stop() {
|
func Stop(service string) {
|
||||||
if service != nil && service.S != nil {
|
s := getServiceName(service)
|
||||||
service.S.Clean()
|
if s == "" {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
services.Stop(s)
|
||||||
|
}
|
||||||
|
|
||||||
|
func IsRunning(service string) bool {
|
||||||
|
s := getServiceName(service)
|
||||||
|
if s == "" {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
srv := services.GetService(s)
|
||||||
|
if srv == nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
typ := "tcp"
|
||||||
|
addr := ""
|
||||||
|
route := ""
|
||||||
|
switch srv.Name {
|
||||||
|
case "http":
|
||||||
|
addr = *srv.Args.(services.HTTPArgs).Local
|
||||||
|
case "socks":
|
||||||
|
addr = *srv.Args.(services.SocksArgs).Local
|
||||||
|
case "sps":
|
||||||
|
addr = *srv.Args.(services.SPSArgs).Local
|
||||||
|
case "tcp":
|
||||||
|
addr = *srv.Args.(services.TCPArgs).Local
|
||||||
|
case "bridge":
|
||||||
|
addr = *srv.Args.(services.MuxBridgeArgs).Local
|
||||||
|
|
||||||
|
case "tbridge":
|
||||||
|
addr = *srv.Args.(services.TunnelBridgeArgs).Local
|
||||||
|
case "server":
|
||||||
|
if len(*srv.Args.(services.MuxServerArgs).Route) > 0 {
|
||||||
|
route = (*srv.Args.(services.MuxServerArgs).Route)[0]
|
||||||
|
}
|
||||||
|
case "tserver":
|
||||||
|
if len(*srv.Args.(services.TunnelServerArgs).Route) > 0 {
|
||||||
|
route = (*srv.Args.(services.TunnelServerArgs).Route)[0]
|
||||||
|
}
|
||||||
|
case "client":
|
||||||
|
case "tclient":
|
||||||
|
case "udp":
|
||||||
|
typ = "udp"
|
||||||
|
}
|
||||||
|
if route != "" {
|
||||||
|
if strings.HasPrefix(route, "udp://") {
|
||||||
|
typ = "udp"
|
||||||
|
}
|
||||||
|
info := strings.TrimPrefix(route, "udp://")
|
||||||
|
info = strings.TrimPrefix(info, "tcp://")
|
||||||
|
_routeInfo := strings.Split(info, "@")
|
||||||
|
addr = _routeInfo[0]
|
||||||
|
}
|
||||||
|
a := strings.Split(addr, ",")
|
||||||
|
if len(a) > 0 {
|
||||||
|
return PortIsAlive(a[0], typ) == ""
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func getServiceName(args string) string {
|
||||||
|
s := strings.Fields(strings.Trim(args, " \t"))
|
||||||
|
if len(s) == 0 {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
return s[0]
|
||||||
|
}
|
||||||
|
|
||||||
|
func PortIsAlive(address string, network ...string) string {
|
||||||
|
time.Sleep(time.Second)
|
||||||
|
n := "tcp"
|
||||||
|
if len(network) == 1 {
|
||||||
|
n = network[0]
|
||||||
|
}
|
||||||
|
if n == "tcp" {
|
||||||
|
conn, err := net.DialTimeout(n, address, time.Second)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Sprintf("connect %s is failed!,err:%v\n", address, err)
|
||||||
|
}
|
||||||
|
conn.Close()
|
||||||
|
} else {
|
||||||
|
ip, port, err := net.SplitHostPort(address)
|
||||||
|
if err != nil {
|
||||||
|
return err.Error()
|
||||||
|
}
|
||||||
|
portI, _ := strconv.Atoi(port)
|
||||||
|
dstAddr := &net.UDPAddr{IP: net.ParseIP(ip), Port: portI}
|
||||||
|
conn, err := net.DialUDP(n, &net.UDPAddr{IP: net.IPv4zero, Port: 0}, dstAddr)
|
||||||
|
if err != nil {
|
||||||
|
return err.Error()
|
||||||
|
}
|
||||||
|
conn.SetDeadline(time.Now().Add(time.Millisecond * 200))
|
||||||
|
_, err = conn.Write([]byte{0x00})
|
||||||
|
conn.SetDeadline(time.Now().Add(time.Millisecond * 200))
|
||||||
|
b := make([]byte, 1)
|
||||||
|
_, err = conn.Read(b)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
if strings.Contains(err.Error(), "refused") {
|
||||||
|
return err.Error()
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
conn.Close()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|||||||
@ -111,7 +111,6 @@ type TCPArgs struct {
|
|||||||
ParentType *string
|
ParentType *string
|
||||||
LocalType *string
|
LocalType *string
|
||||||
Timeout *int
|
Timeout *int
|
||||||
PoolSize *int
|
|
||||||
CheckParentInterval *int
|
CheckParentInterval *int
|
||||||
KCP kcpcfg.KCPConfigArgs
|
KCP kcpcfg.KCPConfigArgs
|
||||||
}
|
}
|
||||||
@ -139,7 +138,6 @@ type HTTPArgs struct {
|
|||||||
ParentType *string
|
ParentType *string
|
||||||
LocalType *string
|
LocalType *string
|
||||||
Timeout *int
|
Timeout *int
|
||||||
PoolSize *int
|
|
||||||
CheckParentInterval *int
|
CheckParentInterval *int
|
||||||
SSHKeyFile *string
|
SSHKeyFile *string
|
||||||
SSHKeyFileSalt *string
|
SSHKeyFileSalt *string
|
||||||
@ -161,7 +159,6 @@ type UDPArgs struct {
|
|||||||
Local *string
|
Local *string
|
||||||
ParentType *string
|
ParentType *string
|
||||||
Timeout *int
|
Timeout *int
|
||||||
PoolSize *int
|
|
||||||
CheckParentInterval *int
|
CheckParentInterval *int
|
||||||
}
|
}
|
||||||
type SocksArgs struct {
|
type SocksArgs struct {
|
||||||
|
|||||||
@ -25,6 +25,7 @@ type HTTP struct {
|
|||||||
domainResolver utils.DomainResolver
|
domainResolver utils.DomainResolver
|
||||||
isStop bool
|
isStop bool
|
||||||
serverChannels []*utils.ServerChannel
|
serverChannels []*utils.ServerChannel
|
||||||
|
userConns utils.ConcurrentMap
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewHTTP() Service {
|
func NewHTTP() Service {
|
||||||
@ -36,6 +37,7 @@ func NewHTTP() Service {
|
|||||||
lockChn: make(chan bool, 1),
|
lockChn: make(chan bool, 1),
|
||||||
isStop: false,
|
isStop: false,
|
||||||
serverChannels: []*utils.ServerChannel{},
|
serverChannels: []*utils.ServerChannel{},
|
||||||
|
userConns: utils.NewConcurrentMap(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
func (s *HTTP) CheckArgs() (err error) {
|
func (s *HTTP) CheckArgs() (err error) {
|
||||||
@ -139,7 +141,7 @@ func (s *HTTP) StopService() {
|
|||||||
if e != nil {
|
if e != nil {
|
||||||
log.Printf("stop http(s) service crashed,%s", e)
|
log.Printf("stop http(s) service crashed,%s", e)
|
||||||
} else {
|
} else {
|
||||||
log.Printf("service http(s) stoped,%s", e)
|
log.Printf("service http(s) stoped")
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
s.isStop = true
|
s.isStop = true
|
||||||
@ -230,7 +232,6 @@ func (s *HTTP) callback(inConn net.Conn) {
|
|||||||
log.Printf("use proxy : %v, %s", useProxy, address)
|
log.Printf("use proxy : %v, %s", useProxy, address)
|
||||||
|
|
||||||
err = s.OutToTCP(useProxy, address, &inConn, &req)
|
err = s.OutToTCP(useProxy, address, &inConn, &req)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if *s.cfg.Parent == "" {
|
if *s.cfg.Parent == "" {
|
||||||
log.Printf("connect to %s fail, ERR:%s", address, err)
|
log.Printf("connect to %s fail, ERR:%s", address, err)
|
||||||
@ -298,9 +299,13 @@ func (s *HTTP) OutToTCP(useProxy bool, address string, inConn *net.Conn, req *ut
|
|||||||
|
|
||||||
utils.IoBind((*inConn), outConn, func(err interface{}) {
|
utils.IoBind((*inConn), outConn, func(err interface{}) {
|
||||||
log.Printf("conn %s - %s released [%s]", inAddr, outAddr, req.Host)
|
log.Printf("conn %s - %s released [%s]", inAddr, outAddr, req.Host)
|
||||||
|
s.userConns.Remove(inAddr)
|
||||||
})
|
})
|
||||||
log.Printf("conn %s - %s connected [%s]", inAddr, outAddr, req.Host)
|
log.Printf("conn %s - %s connected [%s]", inAddr, outAddr, req.Host)
|
||||||
|
if c, ok := s.userConns.Get(inAddr); ok {
|
||||||
|
(*c.(*net.Conn)).Close()
|
||||||
|
}
|
||||||
|
s.userConns.Set(inAddr, inConn)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -372,8 +377,6 @@ func (s *HTTP) InitOutConnPool() {
|
|||||||
s.cfg.CertBytes, s.cfg.KeyBytes, s.cfg.CaCertBytes,
|
s.cfg.CertBytes, s.cfg.KeyBytes, s.cfg.CaCertBytes,
|
||||||
s.Resolve(*s.cfg.Parent),
|
s.Resolve(*s.cfg.Parent),
|
||||||
*s.cfg.Timeout,
|
*s.cfg.Timeout,
|
||||||
*s.cfg.PoolSize,
|
|
||||||
*s.cfg.PoolSize*2,
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -19,6 +19,7 @@ import (
|
|||||||
type MuxBridge struct {
|
type MuxBridge struct {
|
||||||
cfg MuxBridgeArgs
|
cfg MuxBridgeArgs
|
||||||
clientControlConns utils.ConcurrentMap
|
clientControlConns utils.ConcurrentMap
|
||||||
|
serverConns utils.ConcurrentMap
|
||||||
router utils.ClientKeyRouter
|
router utils.ClientKeyRouter
|
||||||
l *sync.Mutex
|
l *sync.Mutex
|
||||||
isStop bool
|
isStop bool
|
||||||
@ -29,6 +30,7 @@ func NewMuxBridge() Service {
|
|||||||
b := &MuxBridge{
|
b := &MuxBridge{
|
||||||
cfg: MuxBridgeArgs{},
|
cfg: MuxBridgeArgs{},
|
||||||
clientControlConns: utils.NewConcurrentMap(),
|
clientControlConns: utils.NewConcurrentMap(),
|
||||||
|
serverConns: utils.NewConcurrentMap(),
|
||||||
l: &sync.Mutex{},
|
l: &sync.Mutex{},
|
||||||
isStop: false,
|
isStop: false,
|
||||||
}
|
}
|
||||||
@ -58,7 +60,7 @@ func (s *MuxBridge) StopService() {
|
|||||||
if e != nil {
|
if e != nil {
|
||||||
log.Printf("stop bridge service crashed,%s", e)
|
log.Printf("stop bridge service crashed,%s", e)
|
||||||
} else {
|
} else {
|
||||||
log.Printf("service bridge stoped,%s", e)
|
log.Printf("service bridge stoped")
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
s.isStop = true
|
s.isStop = true
|
||||||
@ -70,6 +72,9 @@ func (s *MuxBridge) StopService() {
|
|||||||
(session.(*smux.Session)).Close()
|
(session.(*smux.Session)).Close()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
for _, c := range s.serverConns.Items() {
|
||||||
|
(*c.(*net.Conn)).Close()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
func (s *MuxBridge) Start(args interface{}) (err error) {
|
func (s *MuxBridge) Start(args interface{}) (err error) {
|
||||||
s.cfg = args.(MuxBridgeArgs)
|
s.cfg = args.(MuxBridgeArgs)
|
||||||
@ -116,6 +121,7 @@ func (s *MuxBridge) handler(inConn net.Conn) {
|
|||||||
switch connType {
|
switch connType {
|
||||||
case CONN_SERVER:
|
case CONN_SERVER:
|
||||||
var serverID string
|
var serverID string
|
||||||
|
inAddr := inConn.RemoteAddr().String()
|
||||||
inConn.SetDeadline(time.Now().Add(time.Millisecond * time.Duration(*s.cfg.Timeout)))
|
inConn.SetDeadline(time.Now().Add(time.Millisecond * time.Duration(*s.cfg.Timeout)))
|
||||||
err = utils.ReadPacketData(reader, &serverID)
|
err = utils.ReadPacketData(reader, &serverID)
|
||||||
inConn.SetDeadline(time.Time{})
|
inConn.SetDeadline(time.Time{})
|
||||||
@ -124,6 +130,10 @@ func (s *MuxBridge) handler(inConn net.Conn) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
log.Printf("server connection %s %s connected", serverID, key)
|
log.Printf("server connection %s %s connected", serverID, key)
|
||||||
|
if c, ok := s.serverConns.Get(inAddr); ok {
|
||||||
|
(*c.(*net.Conn)).Close()
|
||||||
|
}
|
||||||
|
s.serverConns.Set(inAddr, &inConn)
|
||||||
session, err := smux.Server(inConn, nil)
|
session, err := smux.Server(inConn, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
utils.CloseConn(&inConn)
|
utils.CloseConn(&inConn)
|
||||||
@ -138,6 +148,7 @@ func (s *MuxBridge) handler(inConn net.Conn) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
session.Close()
|
session.Close()
|
||||||
utils.CloseConn(&inConn)
|
utils.CloseConn(&inConn)
|
||||||
|
s.serverConns.Remove(inAddr)
|
||||||
log.Printf("server connection %s %s released", serverID, key)
|
log.Printf("server connection %s %s released", serverID, key)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
@ -56,7 +56,7 @@ func (s *MuxClient) StopService() {
|
|||||||
if e != nil {
|
if e != nil {
|
||||||
log.Printf("stop client service crashed,%s", e)
|
log.Printf("stop client service crashed,%s", e)
|
||||||
} else {
|
} else {
|
||||||
log.Printf("service client stoped,%s", e)
|
log.Printf("service client stoped")
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
s.isStop = true
|
s.isStop = true
|
||||||
|
|||||||
@ -155,7 +155,7 @@ func (s *MuxServer) StopService() {
|
|||||||
if e != nil {
|
if e != nil {
|
||||||
log.Printf("stop server service crashed,%s", e)
|
log.Printf("stop server service crashed,%s", e)
|
||||||
} else {
|
} else {
|
||||||
log.Printf("service server stoped,%s", e)
|
log.Printf("service server stoped")
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
s.isStop = true
|
s.isStop = true
|
||||||
|
|||||||
@ -18,13 +18,20 @@ type ServiceItem struct {
|
|||||||
var servicesMap = map[string]*ServiceItem{}
|
var servicesMap = map[string]*ServiceItem{}
|
||||||
|
|
||||||
func Regist(name string, s Service, args interface{}) {
|
func Regist(name string, s Service, args interface{}) {
|
||||||
|
Stop(name)
|
||||||
servicesMap[name] = &ServiceItem{
|
servicesMap[name] = &ServiceItem{
|
||||||
S: s,
|
S: s,
|
||||||
Args: args,
|
Args: args,
|
||||||
Name: name,
|
Name: name,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
func GetService(name string) *ServiceItem {
|
||||||
|
if s, ok := servicesMap[name]; ok && s.S != nil {
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
|
||||||
|
}
|
||||||
func Stop(name string) {
|
func Stop(name string) {
|
||||||
if s, ok := servicesMap[name]; ok && s.S != nil {
|
if s, ok := servicesMap[name]; ok && s.S != nil {
|
||||||
s.S.Clean()
|
s.S.Clean()
|
||||||
|
|||||||
@ -26,6 +26,7 @@ type Socks struct {
|
|||||||
sc *utils.ServerChannel
|
sc *utils.ServerChannel
|
||||||
domainResolver utils.DomainResolver
|
domainResolver utils.DomainResolver
|
||||||
isStop bool
|
isStop bool
|
||||||
|
userConns utils.ConcurrentMap
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewSocks() Service {
|
func NewSocks() Service {
|
||||||
@ -35,6 +36,7 @@ func NewSocks() Service {
|
|||||||
basicAuth: utils.BasicAuth{},
|
basicAuth: utils.BasicAuth{},
|
||||||
lockChn: make(chan bool, 1),
|
lockChn: make(chan bool, 1),
|
||||||
isStop: false,
|
isStop: false,
|
||||||
|
userConns: utils.NewConcurrentMap(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -147,7 +149,7 @@ func (s *Socks) StopService() {
|
|||||||
if e != nil {
|
if e != nil {
|
||||||
log.Printf("stop socks service crashed,%s", e)
|
log.Printf("stop socks service crashed,%s", e)
|
||||||
} else {
|
} else {
|
||||||
log.Printf("service socks stoped,%s", e)
|
log.Printf("service socks stoped")
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
s.isStop = true
|
s.isStop = true
|
||||||
@ -161,6 +163,9 @@ func (s *Socks) StopService() {
|
|||||||
if s.sc != nil && (*s.sc).Listener != nil {
|
if s.sc != nil && (*s.sc).Listener != nil {
|
||||||
(*(*s.sc).Listener).Close()
|
(*(*s.sc).Listener).Close()
|
||||||
}
|
}
|
||||||
|
for _, c := range s.userConns.Items() {
|
||||||
|
(*c.(*net.Conn)).Close()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
func (s *Socks) Start(args interface{}) (err error) {
|
func (s *Socks) Start(args interface{}) (err error) {
|
||||||
//start()
|
//start()
|
||||||
@ -526,6 +531,11 @@ func (s *Socks) proxyTCP(inConn *net.Conn, methodReq socks.MethodsRequest, reque
|
|||||||
utils.IoBind(*inConn, outConn, func(err interface{}) {
|
utils.IoBind(*inConn, outConn, func(err interface{}) {
|
||||||
log.Printf("conn %s - %s released", inAddr, request.Addr())
|
log.Printf("conn %s - %s released", inAddr, request.Addr())
|
||||||
})
|
})
|
||||||
|
if c, ok := s.userConns.Get(inAddr); ok {
|
||||||
|
(*c.(*net.Conn)).Close()
|
||||||
|
s.userConns.Remove(inAddr)
|
||||||
|
}
|
||||||
|
s.userConns.Set(inAddr, inConn)
|
||||||
}
|
}
|
||||||
func (s *Socks) getOutConn(methodBytes, reqBytes []byte, host string) (outConn net.Conn, err interface{}) {
|
func (s *Socks) getOutConn(methodBytes, reqBytes []byte, host string) (outConn net.Conn, err interface{}) {
|
||||||
switch *s.cfg.ParentType {
|
switch *s.cfg.ParentType {
|
||||||
|
|||||||
@ -22,6 +22,7 @@ type SPS struct {
|
|||||||
domainResolver utils.DomainResolver
|
domainResolver utils.DomainResolver
|
||||||
basicAuth utils.BasicAuth
|
basicAuth utils.BasicAuth
|
||||||
serverChannels []*utils.ServerChannel
|
serverChannels []*utils.ServerChannel
|
||||||
|
userConns utils.ConcurrentMap
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewSPS() Service {
|
func NewSPS() Service {
|
||||||
@ -30,6 +31,7 @@ func NewSPS() Service {
|
|||||||
cfg: SPSArgs{},
|
cfg: SPSArgs{},
|
||||||
basicAuth: utils.BasicAuth{},
|
basicAuth: utils.BasicAuth{},
|
||||||
serverChannels: []*utils.ServerChannel{},
|
serverChannels: []*utils.ServerChannel{},
|
||||||
|
userConns: utils.NewConcurrentMap(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
func (s *SPS) CheckArgs() (err error) {
|
func (s *SPS) CheckArgs() (err error) {
|
||||||
@ -75,8 +77,6 @@ func (s *SPS) InitOutConnPool() {
|
|||||||
s.cfg.CertBytes, s.cfg.KeyBytes, nil,
|
s.cfg.CertBytes, s.cfg.KeyBytes, nil,
|
||||||
*s.cfg.Parent,
|
*s.cfg.Parent,
|
||||||
*s.cfg.Timeout,
|
*s.cfg.Timeout,
|
||||||
0,
|
|
||||||
0,
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -87,7 +87,7 @@ func (s *SPS) StopService() {
|
|||||||
if e != nil {
|
if e != nil {
|
||||||
log.Printf("stop sps service crashed,%s", e)
|
log.Printf("stop sps service crashed,%s", e)
|
||||||
} else {
|
} else {
|
||||||
log.Printf("service sps stoped,%s", e)
|
log.Printf("service sps stoped")
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
for _, sc := range s.serverChannels {
|
for _, sc := range s.serverChannels {
|
||||||
@ -98,6 +98,9 @@ func (s *SPS) StopService() {
|
|||||||
(*sc.UDPListener).Close()
|
(*sc.UDPListener).Close()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
for _, c := range s.userConns.Items() {
|
||||||
|
(*c.(*net.Conn)).Close()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
func (s *SPS) Start(args interface{}) (err error) {
|
func (s *SPS) Start(args interface{}) (err error) {
|
||||||
s.cfg = args.(SPSArgs)
|
s.cfg = args.(SPSArgs)
|
||||||
@ -304,8 +307,13 @@ func (s *SPS) OutToTCP(inConn *net.Conn) (err error) {
|
|||||||
outAddr := outConn.RemoteAddr().String()
|
outAddr := outConn.RemoteAddr().String()
|
||||||
utils.IoBind((*inConn), outConn, func(err interface{}) {
|
utils.IoBind((*inConn), outConn, func(err interface{}) {
|
||||||
log.Printf("conn %s - %s released", inAddr, outAddr)
|
log.Printf("conn %s - %s released", inAddr, outAddr)
|
||||||
|
s.userConns.Remove(inAddr)
|
||||||
})
|
})
|
||||||
log.Printf("conn %s - %s connected", inAddr, outAddr)
|
log.Printf("conn %s - %s connected", inAddr, outAddr)
|
||||||
|
if c, ok := s.userConns.Get(inAddr); ok {
|
||||||
|
(*c.(*net.Conn)).Close()
|
||||||
|
}
|
||||||
|
s.userConns.Set(inAddr, &inConn)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
func (s *SPS) InitBasicAuth() (err error) {
|
func (s *SPS) InitBasicAuth() (err error) {
|
||||||
|
|||||||
@ -18,6 +18,7 @@ type TCP struct {
|
|||||||
cfg TCPArgs
|
cfg TCPArgs
|
||||||
sc *utils.ServerChannel
|
sc *utils.ServerChannel
|
||||||
isStop bool
|
isStop bool
|
||||||
|
userConns utils.ConcurrentMap
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewTCP() Service {
|
func NewTCP() Service {
|
||||||
@ -25,6 +26,7 @@ func NewTCP() Service {
|
|||||||
outPool: utils.OutConn{},
|
outPool: utils.OutConn{},
|
||||||
cfg: TCPArgs{},
|
cfg: TCPArgs{},
|
||||||
isStop: false,
|
isStop: false,
|
||||||
|
userConns: utils.NewConcurrentMap(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
func (s *TCP) CheckArgs() (err error) {
|
func (s *TCP) CheckArgs() (err error) {
|
||||||
@ -54,7 +56,7 @@ func (s *TCP) StopService() {
|
|||||||
if e != nil {
|
if e != nil {
|
||||||
log.Printf("stop tcp service crashed,%s", e)
|
log.Printf("stop tcp service crashed,%s", e)
|
||||||
} else {
|
} else {
|
||||||
log.Printf("service tcp stoped,%s", e)
|
log.Printf("service tcp stoped")
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
s.isStop = true
|
s.isStop = true
|
||||||
@ -64,6 +66,9 @@ func (s *TCP) StopService() {
|
|||||||
if s.sc.UDPListener != nil {
|
if s.sc.UDPListener != nil {
|
||||||
(*s.sc.UDPListener).Close()
|
(*s.sc.UDPListener).Close()
|
||||||
}
|
}
|
||||||
|
for _, c := range s.userConns.Items() {
|
||||||
|
(*c.(*net.Conn)).Close()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
func (s *TCP) Start(args interface{}) (err error) {
|
func (s *TCP) Start(args interface{}) (err error) {
|
||||||
s.cfg = args.(TCPArgs)
|
s.cfg = args.(TCPArgs)
|
||||||
@ -134,14 +139,20 @@ func (s *TCP) OutToTCP(inConn *net.Conn) (err error) {
|
|||||||
//outLocalAddr := outConn.LocalAddr().String()
|
//outLocalAddr := outConn.LocalAddr().String()
|
||||||
utils.IoBind((*inConn), outConn, func(err interface{}) {
|
utils.IoBind((*inConn), outConn, func(err interface{}) {
|
||||||
log.Printf("conn %s - %s released", inAddr, outAddr)
|
log.Printf("conn %s - %s released", inAddr, outAddr)
|
||||||
|
s.userConns.Remove(inAddr)
|
||||||
})
|
})
|
||||||
log.Printf("conn %s - %s connected", inAddr, outAddr)
|
log.Printf("conn %s - %s connected", inAddr, outAddr)
|
||||||
|
if c, ok := s.userConns.Get(inAddr); ok {
|
||||||
|
(*c.(*net.Conn)).Close()
|
||||||
|
}
|
||||||
|
s.userConns.Set(inAddr, &inConn)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
func (s *TCP) OutToUDP(inConn *net.Conn) (err error) {
|
func (s *TCP) OutToUDP(inConn *net.Conn) (err error) {
|
||||||
log.Printf("conn created , remote : %s ", (*inConn).RemoteAddr())
|
log.Printf("conn created , remote : %s ", (*inConn).RemoteAddr())
|
||||||
for {
|
for {
|
||||||
if s.isStop {
|
if s.isStop {
|
||||||
|
(*inConn).Close()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
srcAddr, body, err := utils.ReadUDPPacket(bufio.NewReader(*inConn))
|
srcAddr, body, err := utils.ReadUDPPacket(bufio.NewReader(*inConn))
|
||||||
@ -200,8 +211,6 @@ func (s *TCP) InitOutConnPool() {
|
|||||||
s.cfg.CertBytes, s.cfg.KeyBytes, nil,
|
s.cfg.CertBytes, s.cfg.KeyBytes, nil,
|
||||||
*s.cfg.Parent,
|
*s.cfg.Parent,
|
||||||
*s.cfg.Timeout,
|
*s.cfg.Timeout,
|
||||||
*s.cfg.PoolSize,
|
|
||||||
*s.cfg.PoolSize*2,
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -47,7 +47,7 @@ func (s *TunnelBridge) StopService() {
|
|||||||
if e != nil {
|
if e != nil {
|
||||||
log.Printf("stop tbridge service crashed,%s", e)
|
log.Printf("stop tbridge service crashed,%s", e)
|
||||||
} else {
|
} else {
|
||||||
log.Printf("service tbridge stoped,%s", e)
|
log.Printf("service tbridge stoped")
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
s.isStop = true
|
s.isStop = true
|
||||||
|
|||||||
@ -12,15 +12,15 @@ import (
|
|||||||
|
|
||||||
type TunnelClient struct {
|
type TunnelClient struct {
|
||||||
cfg TunnelClientArgs
|
cfg TunnelClientArgs
|
||||||
// cm utils.ConnManager
|
|
||||||
ctrlConn net.Conn
|
ctrlConn net.Conn
|
||||||
isStop bool
|
isStop bool
|
||||||
|
userConns utils.ConcurrentMap
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewTunnelClient() Service {
|
func NewTunnelClient() Service {
|
||||||
return &TunnelClient{
|
return &TunnelClient{
|
||||||
cfg: TunnelClientArgs{},
|
cfg: TunnelClientArgs{},
|
||||||
// cm: utils.NewConnManager(),
|
userConns: utils.NewConcurrentMap(),
|
||||||
isStop: false,
|
isStop: false,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -49,13 +49,16 @@ func (s *TunnelClient) StopService() {
|
|||||||
if e != nil {
|
if e != nil {
|
||||||
log.Printf("stop tclient service crashed,%s", e)
|
log.Printf("stop tclient service crashed,%s", e)
|
||||||
} else {
|
} else {
|
||||||
log.Printf("service tclient stoped,%s", e)
|
log.Printf("service tclient stoped")
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
s.isStop = true
|
s.isStop = true
|
||||||
if s.ctrlConn != nil {
|
if s.ctrlConn != nil {
|
||||||
s.ctrlConn.Close()
|
s.ctrlConn.Close()
|
||||||
}
|
}
|
||||||
|
for _, c := range s.userConns.Items() {
|
||||||
|
(*c.(*net.Conn)).Close()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
func (s *TunnelClient) Start(args interface{}) (err error) {
|
func (s *TunnelClient) Start(args interface{}) (err error) {
|
||||||
s.cfg = args.(TunnelClientArgs)
|
s.cfg = args.(TunnelClientArgs)
|
||||||
@ -139,6 +142,9 @@ func (s *TunnelClient) ServeUDP(localAddr, ID, serverID string) {
|
|||||||
// for {
|
// for {
|
||||||
for {
|
for {
|
||||||
if s.isStop {
|
if s.isStop {
|
||||||
|
if inConn != nil {
|
||||||
|
inConn.Close()
|
||||||
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
// s.cm.RemoveOne(*s.cfg.Key, ID)
|
// s.cm.RemoveOne(*s.cfg.Key, ID)
|
||||||
@ -252,10 +258,14 @@ func (s *TunnelClient) ServeConn(localAddr, ID, serverID string) {
|
|||||||
log.Printf("build connection error, err: %s", err)
|
log.Printf("build connection error, err: %s", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
inAddr := inConn.RemoteAddr().String()
|
||||||
utils.IoBind(inConn, outConn, func(err interface{}) {
|
utils.IoBind(inConn, outConn, func(err interface{}) {
|
||||||
log.Printf("conn %s released", ID)
|
log.Printf("conn %s released", ID)
|
||||||
// s.cm.RemoveOne(*s.cfg.Key, ID)
|
s.userConns.Remove(inAddr)
|
||||||
})
|
})
|
||||||
// s.cm.Add(*s.cfg.Key, ID, &inConn)
|
if c, ok := s.userConns.Get(inAddr); ok {
|
||||||
|
(*c.(*net.Conn)).Close()
|
||||||
|
}
|
||||||
|
s.userConns.Set(inAddr, &inConn)
|
||||||
log.Printf("conn %s created", ID)
|
log.Printf("conn %s created", ID)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -19,6 +19,7 @@ type TunnelServer struct {
|
|||||||
sc utils.ServerChannel
|
sc utils.ServerChannel
|
||||||
isStop bool
|
isStop bool
|
||||||
udpConn *net.Conn
|
udpConn *net.Conn
|
||||||
|
userConns utils.ConcurrentMap
|
||||||
}
|
}
|
||||||
|
|
||||||
type TunnelServerManager struct {
|
type TunnelServerManager struct {
|
||||||
@ -142,6 +143,7 @@ func NewTunnelServer() Service {
|
|||||||
cfg: TunnelServerArgs{},
|
cfg: TunnelServerArgs{},
|
||||||
udpChn: make(chan UDPItem, 50000),
|
udpChn: make(chan UDPItem, 50000),
|
||||||
isStop: false,
|
isStop: false,
|
||||||
|
userConns: utils.NewConcurrentMap(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -157,7 +159,7 @@ func (s *TunnelServer) StopService() {
|
|||||||
if e != nil {
|
if e != nil {
|
||||||
log.Printf("stop server service crashed,%s", e)
|
log.Printf("stop server service crashed,%s", e)
|
||||||
} else {
|
} else {
|
||||||
log.Printf("service server stoped,%s", e)
|
log.Printf("service server stoped")
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
s.isStop = true
|
s.isStop = true
|
||||||
@ -171,6 +173,9 @@ func (s *TunnelServer) StopService() {
|
|||||||
if s.udpConn != nil {
|
if s.udpConn != nil {
|
||||||
(*s.udpConn).Close()
|
(*s.udpConn).Close()
|
||||||
}
|
}
|
||||||
|
for _, c := range s.userConns.Items() {
|
||||||
|
(*c.(*net.Conn)).Close()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
func (s *TunnelServer) InitService() (err error) {
|
func (s *TunnelServer) InitService() (err error) {
|
||||||
s.UDPConnDeamon()
|
s.UDPConnDeamon()
|
||||||
@ -230,12 +235,15 @@ func (s *TunnelServer) Start(args interface{}) (err error) {
|
|||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
inAddr := inConn.RemoteAddr().String()
|
||||||
utils.IoBind(inConn, outConn, func(err interface{}) {
|
utils.IoBind(inConn, outConn, func(err interface{}) {
|
||||||
// s.cfg.Mgr.cm.RemoveOne(s.cfg.Mgr.serverID, ID)
|
s.userConns.Remove(inAddr)
|
||||||
log.Printf("%s conn %s released", *s.cfg.Key, ID)
|
log.Printf("%s conn %s released", *s.cfg.Key, ID)
|
||||||
})
|
})
|
||||||
//add conn
|
if c, ok := s.userConns.Get(inAddr); ok {
|
||||||
// s.cfg.Mgr.cm.Add(s.cfg.Mgr.serverID, ID, &inConn)
|
(*c.(*net.Conn)).Close()
|
||||||
|
}
|
||||||
|
s.userConns.Set(inAddr, &inConn)
|
||||||
log.Printf("%s conn %s created", *s.cfg.Key, ID)
|
log.Printf("%s conn %s created", *s.cfg.Key, ID)
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@ -59,7 +59,7 @@ func (s *UDP) StopService() {
|
|||||||
if e != nil {
|
if e != nil {
|
||||||
log.Printf("stop udp service crashed,%s", e)
|
log.Printf("stop udp service crashed,%s", e)
|
||||||
} else {
|
} else {
|
||||||
log.Printf("service udp stoped,%s", e)
|
log.Printf("service udp stoped")
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
s.isStop = true
|
s.isStop = true
|
||||||
@ -133,7 +133,7 @@ func (s *UDP) GetConn(connKey string) (conn net.Conn, isNew bool, err error) {
|
|||||||
func (s *UDP) OutToTCP(packet []byte, localAddr, srcAddr *net.UDPAddr) (err error) {
|
func (s *UDP) OutToTCP(packet []byte, localAddr, srcAddr *net.UDPAddr) (err error) {
|
||||||
numLocal := crc32.ChecksumIEEE([]byte(localAddr.String()))
|
numLocal := crc32.ChecksumIEEE([]byte(localAddr.String()))
|
||||||
numSrc := crc32.ChecksumIEEE([]byte(srcAddr.String()))
|
numSrc := crc32.ChecksumIEEE([]byte(srcAddr.String()))
|
||||||
mod := uint32(*s.cfg.PoolSize)
|
mod := uint32(10)
|
||||||
if mod == 0 {
|
if mod == 0 {
|
||||||
mod = 10
|
mod = 10
|
||||||
}
|
}
|
||||||
@ -153,6 +153,7 @@ func (s *UDP) OutToTCP(packet []byte, localAddr, srcAddr *net.UDPAddr) (err erro
|
|||||||
log.Printf("conn %d created , local: %s", connKey, srcAddr.String())
|
log.Printf("conn %d created , local: %s", connKey, srcAddr.String())
|
||||||
for {
|
for {
|
||||||
if s.isStop {
|
if s.isStop {
|
||||||
|
conn.Close()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
srcAddrFromConn, body, err := utils.ReadUDPPacket(bufio.NewReader(conn))
|
srcAddrFromConn, body, err := utils.ReadUDPPacket(bufio.NewReader(conn))
|
||||||
@ -240,8 +241,6 @@ func (s *UDP) InitOutConnPool() {
|
|||||||
s.cfg.CertBytes, s.cfg.KeyBytes, nil,
|
s.cfg.CertBytes, s.cfg.KeyBytes, nil,
|
||||||
*s.cfg.Parent,
|
*s.cfg.Parent,
|
||||||
*s.cfg.Timeout,
|
*s.cfg.Timeout,
|
||||||
*s.cfg.PoolSize,
|
|
||||||
*s.cfg.PoolSize*2,
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -24,7 +24,7 @@ func NewServerChannel(ip string, port int) ServerChannel {
|
|||||||
ip: ip,
|
ip: ip,
|
||||||
port: port,
|
port: port,
|
||||||
errAcceptHandler: func(err error) {
|
errAcceptHandler: func(err error) {
|
||||||
fmt.Printf("accept error , ERR:%s", err)
|
log.Printf("accept error , ERR:%s", err)
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -516,7 +516,7 @@ type OutConn struct {
|
|||||||
timeout int
|
timeout int
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewOutConn(dur int, typ string, kcp kcpcfg.KCPConfigArgs, certBytes, keyBytes, caCertBytes []byte, address string, timeout int, InitialCap int, MaxCap int) (op OutConn) {
|
func NewOutConn(dur int, typ string, kcp kcpcfg.KCPConfigArgs, certBytes, keyBytes, caCertBytes []byte, address string, timeout int) (op OutConn) {
|
||||||
return OutConn{
|
return OutConn{
|
||||||
dur: dur,
|
dur: dur,
|
||||||
typ: typ,
|
typ: typ,
|
||||||
|
|||||||
Reference in New Issue
Block a user