no message

This commit is contained in:
arraykeys
2017-12-02 14:02:17 +08:00
parent a02aeeb906
commit 977b1aba1c
7 changed files with 117 additions and 71 deletions

View File

@ -1,4 +1,9 @@
proxy更新日志 proxy更新日志
v4.0
1.内网穿透三端重构了一个multiplexing版本对应的子命令分别是serverclientbridge
使用方式和参数与之前的子命令tservertclienttserver完全一样另外serverclient增加了
压缩传输参数--c使用压缩传输速度更快。
v3.9 v3.9
1.增加了守护运行参数--forever,比如: proxy http --forever , 1.增加了守护运行参数--forever,比如: proxy http --forever ,
proxy会fork子进程,然后监控子进程,如果子进程异常退出,5秒后重启子进程. proxy会fork子进程,然后监控子进程,如果子进程异常退出,5秒后重启子进程.

View File

@ -352,12 +352,19 @@ VPS(IP:22.22.22.33)执行:
### **4.内网穿透** ### **4.内网穿透**
#### **4.1、原理说明** #### **4.1、原理说明**
内网穿透,由三部分组成:client端,server端,bridge端client和server主动连接bridge端进行桥接. 内网穿透,分为两个版本。
当用户访问server端,流程是: 1. 多链接版本对应的子命令是tservertclienttbridge。
1. server主动和bridge端建立连接 1. 多路复用版本对应的子命令是serverclientbridge。
1. 然后bridge端通知client端连接bridge端,并连接内网目标端口; 1. 多链接版本和多路复用版本的参数和使用方式完全一样。
1. 然后绑定client端到bridge端和client端到内网端口的连接 1. **多路复用版本的serverclient可以开启压缩传输参数是--c。**
1. 然后bridge端把client过来的连接与server端过来的连接绑定 1. **serverclient要么都开启压缩要么都不开启不能只开一个。**
下面的教程以“多链接版本”为例子,说明使用方法。
内网穿透由三部分组成:tclient端,tserver端,tbridge端tclient和tserver主动连接tbridge端进行桥接.
当用户访问tserver端,流程是:
1. tserver主动和tbridge端建立连接
1. 然后tbridge端通知tclient端连接tbridge端,并连接内网目标端口;
1. 然后绑定tclient端到tbridge端和tclient端到内网端口的连接
1. 然后tbridge端把tclient过来的连接与tserver端过来的连接绑定
1. 整个通道建立完成; 1. 整个通道建立完成;
#### **4.2、TCP普通用法** #### **4.2、TCP普通用法**
@ -571,7 +578,6 @@ KCP协议需要-B参数设置一个密码用于加密解密数据
### TODO ### TODO
- http,socks代理多个上级负载均衡? - http,socks代理多个上级负载均衡?
- 内网穿透增加multiplexing模式?
- 欢迎加群反馈... - 欢迎加群反馈...
### 如何使用源码? ### 如何使用源码?

View File

@ -111,6 +111,7 @@ func initConfig() (err error) {
muxServerArgs.IsUDP = muxServer.Flag("udp", "proxy on udp mux server mode").Default("false").Bool() muxServerArgs.IsUDP = muxServer.Flag("udp", "proxy on udp mux server mode").Default("false").Bool()
muxServerArgs.Key = muxServer.Flag("k", "client key").Default("default").String() muxServerArgs.Key = muxServer.Flag("k", "client key").Default("default").String()
muxServerArgs.Route = muxServer.Flag("route", "local route to client's network, such as: PROTOCOL://LOCAL_IP:LOCAL_PORT@[CLIENT_KEY]CLIENT_LOCAL_HOST:CLIENT_LOCAL_PORT").Short('r').Default("").Strings() muxServerArgs.Route = muxServer.Flag("route", "local route to client's network, such as: PROTOCOL://LOCAL_IP:LOCAL_PORT@[CLIENT_KEY]CLIENT_LOCAL_HOST:CLIENT_LOCAL_PORT").Short('r').Default("").Strings()
muxServerArgs.IsCompress = muxServer.Flag("c", "compress data when tcp mode").Default("false").Bool()
//########mux-client######### //########mux-client#########
muxClient := app.Command("client", "proxy on mux client mode").Hidden() muxClient := app.Command("client", "proxy on mux client mode").Hidden()
@ -119,6 +120,7 @@ func initConfig() (err error) {
muxClientArgs.KeyFile = muxClient.Flag("key", "key file for tls").Short('K').Default("proxy.key").String() muxClientArgs.KeyFile = muxClient.Flag("key", "key file for tls").Short('K').Default("proxy.key").String()
muxClientArgs.Timeout = muxClient.Flag("timeout", "tcp timeout with milliseconds").Short('t').Default("2000").Int() muxClientArgs.Timeout = muxClient.Flag("timeout", "tcp timeout with milliseconds").Short('t').Default("2000").Int()
muxClientArgs.Key = muxClient.Flag("k", "key same with server").Default("default").String() muxClientArgs.Key = muxClient.Flag("k", "key same with server").Default("default").String()
muxClientArgs.IsCompress = muxClient.Flag("c", "compress data when tcp mode").Default("false").Bool()
//########mux-bridge######### //########mux-bridge#########
muxBridge := app.Command("bridge", "proxy on mux bridge mode").Hidden() muxBridge := app.Command("bridge", "proxy on mux bridge mode").Hidden()

View File

@ -33,6 +33,7 @@ type MuxServerArgs struct {
Timeout *int Timeout *int
Route *[]string Route *[]string
Mgr *MuxServerManager Mgr *MuxServerManager
IsCompress *bool
} }
type MuxClientArgs struct { type MuxClientArgs struct {
Parent *string Parent *string
@ -42,6 +43,7 @@ type MuxClientArgs struct {
KeyBytes []byte KeyBytes []byte
Key *string Key *string
Timeout *int Timeout *int
IsCompress *bool
} }
type MuxBridgeArgs struct { type MuxBridgeArgs struct {
Parent *string Parent *string
@ -51,6 +53,7 @@ type MuxBridgeArgs struct {
KeyBytes []byte KeyBytes []byte
Local *string Local *string
Timeout *int Timeout *int
IsCompress *bool
} }
type TunnelServerArgs struct { type TunnelServerArgs struct {
Parent *string Parent *string

View File

@ -97,15 +97,6 @@ func (s *MuxBridge) Clean() {
s.StopService() s.StopService()
} }
func (s *MuxBridge) callback(inConn net.Conn, key string) { func (s *MuxBridge) callback(inConn net.Conn, key string) {
reader := bufio.NewReader(inConn)
var err error
var ID, clientLocalAddr, serverID string
err = utils.ReadPacketData(reader, &ID, &clientLocalAddr, &serverID)
if err != nil {
log.Printf("read error,ERR:%s", err)
return
}
packet := utils.BuildPacketData(ID, clientLocalAddr, serverID)
try := 20 try := 20
for { for {
try-- try--
@ -124,13 +115,7 @@ func (s *MuxBridge) callback(inConn net.Conn, key string) {
time.Sleep(time.Second * 3) time.Sleep(time.Second * 3)
continue continue
} else { } else {
_, err := stream.Write(packet) log.Printf("%s stream created", key)
if err != nil {
log.Printf("server %s stream write fail, err: %s, retrying...", key, err)
time.Sleep(time.Second * 3)
continue
}
log.Printf("server stream %s created", ID)
die1 := make(chan bool, 1) die1 := make(chan bool, 1)
die2 := make(chan bool, 1) die2 := make(chan bool, 1)
go func() { go func() {
@ -147,7 +132,7 @@ func (s *MuxBridge) callback(inConn net.Conn, key string) {
} }
stream.Close() stream.Close()
inConn.Close() inConn.Close()
log.Printf("server stream %s released", ID) log.Printf("%s stream released", key)
break break
} }
} }

View File

@ -2,11 +2,13 @@ package services
import ( import (
"crypto/tls" "crypto/tls"
"io"
"log" "log"
"net" "net"
"proxy/utils" "proxy/utils"
"time" "time"
"github.com/golang/snappy"
"github.com/xtaci/smux" "github.com/xtaci/smux"
) )
@ -42,7 +44,7 @@ func (s *MuxClient) Start(args interface{}) (err error) {
s.cfg = args.(MuxClientArgs) s.cfg = args.(MuxClientArgs)
s.CheckArgs() s.CheckArgs()
s.InitService() s.InitService()
log.Printf("proxy on mux client mode") log.Printf("proxy on mux client mode, compress %v", *s.cfg.IsCompress)
for { for {
var _conn tls.Conn var _conn tls.Conn
_conn, err = utils.TlsConnectHost(*s.cfg.Parent, *s.cfg.Timeout, s.cfg.CertBytes, s.cfg.KeyBytes) _conn, err = utils.TlsConnectHost(*s.cfg.Parent, *s.cfg.Timeout, s.cfg.CertBytes, s.cfg.KeyBytes)
@ -176,8 +178,29 @@ func (s *MuxClient) ServeConn(inConn *smux.Stream, localAddr, ID string) {
log.Printf("build connection error, err: %s", err) log.Printf("build connection error, err: %s", err)
return return
} }
log.Printf("conn %s created", ID)
if *s.cfg.IsCompress {
die1 := make(chan bool, 1)
die2 := make(chan bool, 1)
go func() {
io.Copy(outConn, snappy.NewReader(inConn))
die1 <- true
}()
go func() {
io.Copy(snappy.NewWriter(inConn), outConn)
die2 <- true
}()
select {
case <-die1:
case <-die2:
}
outConn.Close()
inConn.Close()
log.Printf("%s stream %s released", *s.cfg.Key, ID)
} else {
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)
}) })
log.Printf("conn %s created", ID) }
} }

View File

@ -3,6 +3,7 @@ package services
import ( import (
"crypto/tls" "crypto/tls"
"fmt" "fmt"
"io"
"log" "log"
"net" "net"
"proxy/utils" "proxy/utils"
@ -11,6 +12,7 @@ import (
"strings" "strings"
"time" "time"
"github.com/golang/snappy"
"github.com/xtaci/smux" "github.com/xtaci/smux"
) )
@ -83,6 +85,7 @@ func (s *MuxServerManager) Start(args interface{}) (err error) {
Key: &KEY, Key: &KEY,
Timeout: s.cfg.Timeout, Timeout: s.cfg.Timeout,
Mgr: s, Mgr: s,
IsCompress: s.cfg.IsCompress,
}) })
if err != nil { if err != nil {
@ -167,16 +170,35 @@ func (s *MuxServer) Start(args interface{}) (err error) {
break break
} }
} }
log.Printf("%s stream %s created", *s.cfg.Key, ID)
if *s.cfg.IsCompress {
die1 := make(chan bool, 1)
die2 := make(chan bool, 1)
go func() {
io.Copy(inConn, snappy.NewReader(outConn))
die1 <- true
}()
go func() {
io.Copy(snappy.NewWriter(outConn), inConn)
die2 <- true
}()
select {
case <-die1:
case <-die2:
}
outConn.Close()
inConn.Close()
log.Printf("%s stream %s released", *s.cfg.Key, ID)
} else {
utils.IoBind(inConn, outConn, func(err interface{}) { utils.IoBind(inConn, outConn, func(err interface{}) {
log.Printf("%s conn %s released", *s.cfg.Key, ID) log.Printf("%s conn %s released", *s.cfg.Key, ID)
}) })
//add conn }
log.Printf("%s conn %s created", *s.cfg.Key, ID)
}) })
if err != nil { if err != nil {
return return
} }
log.Printf("proxy on mux server mode %s", (*s.sc.Listener).Addr()) log.Printf("proxy on mux server mode %s, compress %v", (*s.sc.Listener).Addr(), *s.cfg.IsCompress)
} }
return return
} }