no message
This commit is contained in:
@ -1,4 +1,9 @@
|
|||||||
proxy更新日志
|
proxy更新日志
|
||||||
|
v4.0
|
||||||
|
1.内网穿透三端重构了一个multiplexing版本,对应的子命令分别是server,client,bridge
|
||||||
|
使用方式和参数与之前的子命令tserver,tclient,tserver完全一样,另外server,client增加了
|
||||||
|
压缩传输参数--c,使用压缩传输速度更快。
|
||||||
|
|
||||||
v3.9
|
v3.9
|
||||||
1.增加了守护运行参数--forever,比如: proxy http --forever ,
|
1.增加了守护运行参数--forever,比如: proxy http --forever ,
|
||||||
proxy会fork子进程,然后监控子进程,如果子进程异常退出,5秒后重启子进程.
|
proxy会fork子进程,然后监控子进程,如果子进程异常退出,5秒后重启子进程.
|
||||||
|
|||||||
20
README.md
20
README.md
@ -352,12 +352,19 @@ VPS(IP:22.22.22.33)执行:
|
|||||||
|
|
||||||
### **4.内网穿透**
|
### **4.内网穿透**
|
||||||
#### **4.1、原理说明**
|
#### **4.1、原理说明**
|
||||||
内网穿透,由三部分组成:client端,server端,bridge端;client和server主动连接bridge端进行桥接.
|
内网穿透,分为两个版本。
|
||||||
当用户访问server端,流程是:
|
1. 多链接版本,对应的子命令是tserver,tclient,tbridge。
|
||||||
1. server主动和bridge端建立连接;
|
1. 多路复用版本,对应的子命令是server,client,bridge。
|
||||||
1. 然后bridge端通知client端连接bridge端,并连接内网目标端口;
|
1. 多链接版本和多路复用版本的参数和使用方式完全一样。
|
||||||
1. 然后绑定client端到bridge端和client端到内网端口的连接;
|
1. **多路复用版本的server,client可以开启压缩传输,参数是--c。**
|
||||||
1. 然后bridge端把client过来的连接与server端过来的连接绑定;
|
1. **server,client要么都开启压缩,要么都不开启,不能只开一个。**
|
||||||
|
下面的教程以“多链接版本”为例子,说明使用方法。
|
||||||
|
内网穿透由三部分组成: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模式?
|
|
||||||
- 欢迎加群反馈...
|
- 欢迎加群反馈...
|
||||||
|
|
||||||
### 如何使用源码?
|
### 如何使用源码?
|
||||||
|
|||||||
@ -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()
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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)
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user