Signed-off-by: arraykeys@gmail.com <arraykeys@gmail.com>
17
CHANGELOG
@ -1,21 +1,8 @@
|
|||||||
proxy更新日志
|
proxy更新日志
|
||||||
v3.2
|
v3.2
|
||||||
1.内网穿透功能server端-r参数增加了协议和key设置
|
1.内网穿透功能server端-r参数增加了协议和key设置.
|
||||||
|
|
||||||
-r 完整格式是:PROTOCOL://LOCAL_IP:LOCAL_PORT@[CLIENT_KEY]CLIENT_LOCAL_HOST:CLIENT_LOCAL_PORT
|
|
||||||
|
|
||||||
1.1.协议PROTOCOL:默认是tcp,可以是udp.
|
|
||||||
比如: -r "udp://:10053@:53" -r "tcp://:10800@:1080" -r ":8080@:80"
|
|
||||||
如果指定了--udp参数,PROTOCOL默认为udp;
|
|
||||||
如果没有指定--udp参数,PROTOCOL默认为tcp;
|
|
||||||
|
|
||||||
1.2.CLIENT_KEY:默认是default.
|
|
||||||
比如: -r "udp://:10053@[test1]:53" -r "tcp://:10800@[test2]:1080" -r ":8080@:80"
|
|
||||||
如果指定了--key参数,CLIENT_KEY留空默认为--key指定的值;
|
|
||||||
如果没有指定--key参数,CLIENT_KEY留空默认为default;p;
|
|
||||||
|
|
||||||
1.3.LOCAL_IP为空默认是绑定全部ip.CLIENT_LOCAL_HOST留空默认是127.0.0.1
|
|
||||||
2.手册增加了对-r参数的详细说明.
|
2.手册增加了对-r参数的详细说明.
|
||||||
|
3.修复了普通模式也检查证书文件的bug.
|
||||||
|
|
||||||
v3.1
|
v3.1
|
||||||
1.优化了内网穿透功能,bridge,client和server只需要启动一个即可。
|
1.优化了内网穿透功能,bridge,client和server只需要启动一个即可。
|
||||||
|
|||||||
10
config.go
@ -92,7 +92,14 @@ func initConfig() (err error) {
|
|||||||
|
|
||||||
serviceName := kingpin.MustParse(app.Parse(os.Args[1:]))
|
serviceName := kingpin.MustParse(app.Parse(os.Args[1:]))
|
||||||
|
|
||||||
if *certTLS != "" && *keyTLS != "" {
|
if *httpArgs.ParentType == "tls" ||
|
||||||
|
*tcpArgs.ParentType == "tls" ||
|
||||||
|
*udpArgs.ParentType == "tls" ||
|
||||||
|
*httpArgs.LocalType == "tls" ||
|
||||||
|
*tcpArgs.IsTLS ||
|
||||||
|
serviceName == "tserver" ||
|
||||||
|
serviceName == "tclient" ||
|
||||||
|
serviceName == "tbridge" {
|
||||||
args.CertBytes, args.KeyBytes = tlsBytes(*certTLS, *keyTLS)
|
args.CertBytes, args.KeyBytes = tlsBytes(*certTLS, *keyTLS)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -103,6 +110,7 @@ func initConfig() (err error) {
|
|||||||
tunnelBridgeArgs.Args = args
|
tunnelBridgeArgs.Args = args
|
||||||
tunnelClientArgs.Args = args
|
tunnelClientArgs.Args = args
|
||||||
tunnelServerArgs.Args = args
|
tunnelServerArgs.Args = args
|
||||||
|
|
||||||
poster()
|
poster()
|
||||||
//regist services and run service
|
//regist services and run service
|
||||||
services.Regist("http", services.NewHTTP(), httpArgs)
|
services.Regist("http", services.NewHTTP(), httpArgs)
|
||||||
|
|||||||
@ -1,40 +0,0 @@
|
|||||||
这里以vps centos 64位为例子
|
|
||||||
Linux 部分
|
|
||||||
1.Putty工具(或其他工具)
|
|
||||||
root登入
|
|
||||||
2.下载批量命令文件install_auto.sh(64位的话直接执行这个命令即可)
|
|
||||||
#curl -L https://raw.githubusercontent.com/snail007/goproxy/master/install_auto.sh | bash
|
|
||||||
注意
|
|
||||||
这里的install_auto.sh 源码可以下载修改proxy版本,保存后执行.
|
|
||||||
<img src="https://github.com/snail007/goproxy/blob/master/docs/images/image001.png?raw=true"/>
|
|
||||||
3.修改/etc/proxy/proxy.toml配置文件
|
|
||||||
<img src="https://github.com/snail007/goproxy/blob/master/docs/images/image002.png?raw=true"/>
|
|
||||||
<img src="https://github.com/snail007/goproxy/blob/master/docs/images/image003.png?raw=true"/>
|
|
||||||
<img src="https://github.com/snail007/goproxy/blob/master/docs/images/image004.png?raw=true"/>
|
|
||||||
#/usr/bin/proxyd status
|
|
||||||
如果未运行那么执行调试命令:/usr/bin/proxy
|
|
||||||
如果一切正常,可以使用proxyd命令管理proxy,执行 proxyd 可以查看用法.
|
|
||||||
后台启动proxy: proxyd start
|
|
||||||
4.下载证书加密文件/etc/proxy/proxy.crt和/etc/proxy/proxy.key到windows
|
|
||||||
Windows部分
|
|
||||||
5.https://github.com/snail007/goproxy/releases 下载对应windows版本
|
|
||||||
<img src="https://github.com/snail007/goproxy/blob/master/docs/images/image005.jpg?raw=true"/>
|
|
||||||
<img src="https://github.com/snail007/goproxy/blob/master/docs/images/image006.png?raw=true"/>
|
|
||||||
我的是d:盘
|
|
||||||
6.修改windows下的proxy.toml vps服务ip和上面设置的端口哦
|
|
||||||
<img src="https://github.com/snail007/goproxy/blob/master/docs/images/image007.png?raw=true"/>
|
|
||||||
然后运行proxy.exe即可.
|
|
||||||
这时候浏览器代理服务器就是127.0.0.1:9501啦,完毕!
|
|
||||||
|
|
||||||
要隐藏windows命令用工具下载RunHiddenConsole.exe 写个bat文件都放proxy目录下就行
|
|
||||||
Start.bat
|
|
||||||
|
|
||||||
@echo off
|
|
||||||
echo Starting
|
|
||||||
RunHiddenConsole D:/proxy/proxy.exe
|
|
||||||
|
|
||||||
Stop.bat
|
|
||||||
@echo off
|
|
||||||
echo Stopping
|
|
||||||
taskkill /F /IM proxy.exe > nul
|
|
||||||
exit
|
|
||||||
|
Before Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 3.7 KiB |
|
Before Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 2.7 KiB |
|
Before Width: | Height: | Size: 2.7 KiB |
|
Before Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 119 KiB |
@ -25,6 +25,11 @@ func NewHTTP() Service {
|
|||||||
basicAuth: utils.BasicAuth{},
|
basicAuth: utils.BasicAuth{},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
func (s *HTTP) CheckArgs() {
|
||||||
|
if *s.cfg.Parent != "" && *s.cfg.ParentType == "" {
|
||||||
|
log.Fatalf("parent type unkown,use -T <tls|tcp>")
|
||||||
|
}
|
||||||
|
}
|
||||||
func (s *HTTP) InitService() {
|
func (s *HTTP) InitService() {
|
||||||
s.InitBasicAuth()
|
s.InitBasicAuth()
|
||||||
if *s.cfg.Parent != "" {
|
if *s.cfg.Parent != "" {
|
||||||
@ -38,13 +43,12 @@ func (s *HTTP) StopService() {
|
|||||||
}
|
}
|
||||||
func (s *HTTP) Start(args interface{}) (err error) {
|
func (s *HTTP) Start(args interface{}) (err error) {
|
||||||
s.cfg = args.(HTTPArgs)
|
s.cfg = args.(HTTPArgs)
|
||||||
|
s.CheckArgs()
|
||||||
if *s.cfg.Parent != "" {
|
if *s.cfg.Parent != "" {
|
||||||
log.Printf("use %s parent %s", *s.cfg.ParentType, *s.cfg.Parent)
|
log.Printf("use %s parent %s", *s.cfg.ParentType, *s.cfg.Parent)
|
||||||
s.InitOutConnPool()
|
s.InitOutConnPool()
|
||||||
}
|
}
|
||||||
|
|
||||||
s.InitService()
|
s.InitService()
|
||||||
|
|
||||||
host, port, _ := net.SplitHostPort(*s.cfg.Local)
|
host, port, _ := net.SplitHostPort(*s.cfg.Local)
|
||||||
p, _ := strconv.Atoi(port)
|
p, _ := strconv.Atoi(port)
|
||||||
sc := utils.NewServerChannel(host, p)
|
sc := utils.NewServerChannel(host, p)
|
||||||
|
|||||||
@ -24,6 +24,14 @@ func NewTCP() Service {
|
|||||||
cfg: TCPArgs{},
|
cfg: TCPArgs{},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
func (s *TCP) CheckArgs() {
|
||||||
|
if *s.cfg.Parent == "" {
|
||||||
|
log.Fatalf("parent required for %s %s", s.cfg.Protocol(), *s.cfg.Local)
|
||||||
|
}
|
||||||
|
if *s.cfg.ParentType == "" {
|
||||||
|
log.Fatalf("parent type unkown,use -T <tls|tcp>")
|
||||||
|
}
|
||||||
|
}
|
||||||
func (s *TCP) InitService() {
|
func (s *TCP) InitService() {
|
||||||
s.InitOutConnPool()
|
s.InitOutConnPool()
|
||||||
}
|
}
|
||||||
@ -34,12 +42,8 @@ func (s *TCP) StopService() {
|
|||||||
}
|
}
|
||||||
func (s *TCP) Start(args interface{}) (err error) {
|
func (s *TCP) Start(args interface{}) (err error) {
|
||||||
s.cfg = args.(TCPArgs)
|
s.cfg = args.(TCPArgs)
|
||||||
if *s.cfg.Parent != "" {
|
s.CheckArgs()
|
||||||
log.Printf("use %s parent %s", *s.cfg.ParentType, *s.cfg.Parent)
|
log.Printf("use %s parent %s", *s.cfg.ParentType, *s.cfg.Parent)
|
||||||
} else {
|
|
||||||
log.Fatalf("parent required for %s %s", s.cfg.Protocol(), *s.cfg.Local)
|
|
||||||
}
|
|
||||||
|
|
||||||
s.InitService()
|
s.InitService()
|
||||||
|
|
||||||
host, port, _ := net.SplitHostPort(*s.cfg.Local)
|
host, port, _ := net.SplitHostPort(*s.cfg.Local)
|
||||||
|
|||||||
@ -32,7 +32,7 @@ func NewTunnelBridge() Service {
|
|||||||
func (s *TunnelBridge) InitService() {
|
func (s *TunnelBridge) InitService() {
|
||||||
|
|
||||||
}
|
}
|
||||||
func (s *TunnelBridge) Check() {
|
func (s *TunnelBridge) CheckArgs() {
|
||||||
if s.cfg.CertBytes == nil || s.cfg.KeyBytes == nil {
|
if s.cfg.CertBytes == nil || s.cfg.KeyBytes == nil {
|
||||||
log.Fatalf("cert and key file required")
|
log.Fatalf("cert and key file required")
|
||||||
}
|
}
|
||||||
@ -43,7 +43,7 @@ func (s *TunnelBridge) StopService() {
|
|||||||
}
|
}
|
||||||
func (s *TunnelBridge) Start(args interface{}) (err error) {
|
func (s *TunnelBridge) Start(args interface{}) (err error) {
|
||||||
s.cfg = args.(TunnelBridgeArgs)
|
s.cfg = args.(TunnelBridgeArgs)
|
||||||
s.Check()
|
s.CheckArgs()
|
||||||
s.InitService()
|
s.InitService()
|
||||||
host, port, _ := net.SplitHostPort(*s.cfg.Local)
|
host, port, _ := net.SplitHostPort(*s.cfg.Local)
|
||||||
p, _ := strconv.Atoi(port)
|
p, _ := strconv.Atoi(port)
|
||||||
|
|||||||
@ -25,7 +25,7 @@ func NewTunnelClient() Service {
|
|||||||
|
|
||||||
func (s *TunnelClient) InitService() {
|
func (s *TunnelClient) InitService() {
|
||||||
}
|
}
|
||||||
func (s *TunnelClient) Check() {
|
func (s *TunnelClient) CheckArgs() {
|
||||||
if *s.cfg.Parent != "" {
|
if *s.cfg.Parent != "" {
|
||||||
log.Printf("use tls parent %s", *s.cfg.Parent)
|
log.Printf("use tls parent %s", *s.cfg.Parent)
|
||||||
} else {
|
} else {
|
||||||
@ -39,7 +39,7 @@ func (s *TunnelClient) StopService() {
|
|||||||
}
|
}
|
||||||
func (s *TunnelClient) Start(args interface{}) (err error) {
|
func (s *TunnelClient) Start(args interface{}) (err error) {
|
||||||
s.cfg = args.(TunnelClientArgs)
|
s.cfg = args.(TunnelClientArgs)
|
||||||
s.Check()
|
s.CheckArgs()
|
||||||
s.InitService()
|
s.InitService()
|
||||||
log.Printf("proxy on tunnel client mode")
|
log.Printf("proxy on tunnel client mode")
|
||||||
for {
|
for {
|
||||||
|
|||||||
@ -93,7 +93,7 @@ type UDPItem struct {
|
|||||||
func (s *TunnelServer) InitService() {
|
func (s *TunnelServer) InitService() {
|
||||||
s.UDPConnDeamon()
|
s.UDPConnDeamon()
|
||||||
}
|
}
|
||||||
func (s *TunnelServer) Check() {
|
func (s *TunnelServer) CheckArgs() {
|
||||||
if *s.cfg.Remote == "" {
|
if *s.cfg.Remote == "" {
|
||||||
log.Fatalf("remote required")
|
log.Fatalf("remote required")
|
||||||
}
|
}
|
||||||
@ -105,7 +105,7 @@ func (s *TunnelServer) StopService() {
|
|||||||
}
|
}
|
||||||
func (s *TunnelServer) Start(args interface{}) (err error) {
|
func (s *TunnelServer) Start(args interface{}) (err error) {
|
||||||
s.cfg = args.(TunnelServerArgs)
|
s.cfg = args.(TunnelServerArgs)
|
||||||
s.Check()
|
s.CheckArgs()
|
||||||
s.InitService()
|
s.InitService()
|
||||||
host, port, _ := net.SplitHostPort(*s.cfg.Local)
|
host, port, _ := net.SplitHostPort(*s.cfg.Local)
|
||||||
p, _ := strconv.Atoi(port)
|
p, _ := strconv.Atoi(port)
|
||||||
@ -219,8 +219,7 @@ func (s *TunnelServer) UDPConnDeamon() {
|
|||||||
var outConn net.Conn
|
var outConn net.Conn
|
||||||
// var hb utils.HeartbeatReadWriter
|
// var hb utils.HeartbeatReadWriter
|
||||||
var ID string
|
var ID string
|
||||||
var cmdChn = make(chan bool, 1)
|
// var cmdChn = make(chan bool, 1000)
|
||||||
|
|
||||||
var err error
|
var err error
|
||||||
for {
|
for {
|
||||||
item := <-s.udpChn
|
item := <-s.udpChn
|
||||||
@ -229,25 +228,19 @@ func (s *TunnelServer) UDPConnDeamon() {
|
|||||||
for {
|
for {
|
||||||
outConn, ID, err = s.GetOutConn("")
|
outConn, ID, err = s.GetOutConn("")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
cmdChn <- true
|
// cmdChn <- true
|
||||||
outConn = nil
|
outConn = nil
|
||||||
utils.CloseConn(&outConn)
|
utils.CloseConn(&outConn)
|
||||||
log.Printf("connect to %s fail, err: %s, retrying...", *s.cfg.Parent, err)
|
log.Printf("connect to %s fail, err: %s, retrying...", *s.cfg.Parent, err)
|
||||||
time.Sleep(time.Second * 3)
|
time.Sleep(time.Second * 3)
|
||||||
continue
|
continue
|
||||||
} else {
|
} else {
|
||||||
// hb = utils.NewHeartbeatReadWriter(&outConn, 3, func(err error, hb *utils.HeartbeatReadWriter) {
|
|
||||||
// log.Printf("%s conn %s to bridge released", *s.cfg.Key, ID)
|
|
||||||
// hb.Close()
|
|
||||||
// })
|
|
||||||
// go func(outConn net.Conn, hb utils.HeartbeatReadWriter, ID string) {
|
|
||||||
go func(outConn net.Conn, ID string) {
|
go func(outConn net.Conn, ID string) {
|
||||||
go func() {
|
go func() {
|
||||||
<-cmdChn
|
// <-cmdChn
|
||||||
outConn.Close()
|
// outConn.Close()
|
||||||
}()
|
}()
|
||||||
for {
|
for {
|
||||||
//srcAddrFromConn, body, err := utils.ReadUDPPacket(&hb)
|
|
||||||
srcAddrFromConn, body, err := utils.ReadUDPPacket(outConn)
|
srcAddrFromConn, body, err := utils.ReadUDPPacket(outConn)
|
||||||
if err == io.EOF || err == io.ErrUnexpectedEOF {
|
if err == io.EOF || err == io.ErrUnexpectedEOF {
|
||||||
log.Printf("UDP deamon connection %s exited", ID)
|
log.Printf("UDP deamon connection %s exited", ID)
|
||||||
@ -272,18 +265,13 @@ func (s *TunnelServer) UDPConnDeamon() {
|
|||||||
}
|
}
|
||||||
//log.Printf("udp response to local %s success , %v", srcAddrFromConn, body)
|
//log.Printf("udp response to local %s success , %v", srcAddrFromConn, body)
|
||||||
}
|
}
|
||||||
// }(outConn, hb, ID)
|
|
||||||
}(outConn, ID)
|
}(outConn, ID)
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
outConn.SetWriteDeadline(time.Now().Add(time.Second))
|
outConn.SetWriteDeadline(time.Now().Add(time.Second))
|
||||||
// _, err = hb.Write(utils.UDPPacket(item.srcAddr.String(), *item.packet))
|
|
||||||
_, err = outConn.Write(utils.UDPPacket(item.srcAddr.String(), *item.packet))
|
_, err = outConn.Write(utils.UDPPacket(item.srcAddr.String(), *item.packet))
|
||||||
// writer := bufio.NewWriter(outConn)
|
|
||||||
// writer.Write(utils.UDPPacket(item.srcAddr.String(), *item.packet))
|
|
||||||
// err := writer.Flush()
|
|
||||||
outConn.SetWriteDeadline(time.Time{})
|
outConn.SetWriteDeadline(time.Time{})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
utils.CloseConn(&outConn)
|
utils.CloseConn(&outConn)
|
||||||
|
|||||||
@ -27,6 +27,14 @@ func NewUDP() Service {
|
|||||||
p: utils.NewConcurrentMap(),
|
p: utils.NewConcurrentMap(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
func (s *UDP) CheckArgs() {
|
||||||
|
if *s.cfg.Parent == "" {
|
||||||
|
log.Fatalf("parent required for udp %s", *s.cfg.Local)
|
||||||
|
}
|
||||||
|
if *s.cfg.ParentType == "" {
|
||||||
|
log.Fatalf("parent type unkown,use -T <tls|tcp>")
|
||||||
|
}
|
||||||
|
}
|
||||||
func (s *UDP) InitService() {
|
func (s *UDP) InitService() {
|
||||||
if *s.cfg.ParentType != TYPE_UDP {
|
if *s.cfg.ParentType != TYPE_UDP {
|
||||||
s.InitOutConnPool()
|
s.InitOutConnPool()
|
||||||
@ -39,12 +47,8 @@ func (s *UDP) StopService() {
|
|||||||
}
|
}
|
||||||
func (s *UDP) Start(args interface{}) (err error) {
|
func (s *UDP) Start(args interface{}) (err error) {
|
||||||
s.cfg = args.(UDPArgs)
|
s.cfg = args.(UDPArgs)
|
||||||
if *s.cfg.Parent != "" {
|
s.CheckArgs()
|
||||||
log.Printf("use %s parent %s", *s.cfg.ParentType, *s.cfg.Parent)
|
log.Printf("use %s parent %s", *s.cfg.ParentType, *s.cfg.Parent)
|
||||||
} else {
|
|
||||||
log.Fatalf("parent required for udp %s", *s.cfg.Local)
|
|
||||||
}
|
|
||||||
|
|
||||||
s.InitService()
|
s.InitService()
|
||||||
|
|
||||||
host, port, _ := net.SplitHostPort(*s.cfg.Local)
|
host, port, _ := net.SplitHostPort(*s.cfg.Local)
|
||||||
|
|||||||