很多修改

This commit is contained in:
刘河
2019-01-26 17:27:28 +08:00
parent c34e5e1a7d
commit 0b90bf3a18
22 changed files with 433 additions and 357 deletions

View File

@@ -8,53 +8,47 @@ import (
//server base struct
type server struct {
bridge *bridge.Tunnel
config *utils.ServerConfig
bridge *bridge.Bridge
task *utils.Tunnel
config *utils.Config
sync.Mutex
}
func (s *server) GetTunnelAndWriteHost(connType string, cnf *utils.ServerConfig, addr string) (*utils.Conn, error) {
var err error
link, err := s.bridge.GetTunnel(cnf.ClientId, cnf.CompressEncode, cnf.CompressDecode, cnf.Crypt, cnf.Mux)
if err != nil {
return nil, err
func (s *server) GetTunnelAndWriteHost(connType string, clientId int, cnf *utils.Config, addr string) (link *utils.Conn, err error) {
if link, err = s.bridge.GetTunnel(clientId, cnf.CompressEncode, cnf.CompressDecode, cnf.Crypt, cnf.Mux); err != nil {
return
}
if _, err = link.WriteHost(connType, addr); err != nil {
link.Close()
return nil, err
}
return link, nil
return
}
func (s *server) FlowAdd(in, out int64) {
s.Lock()
defer s.Unlock()
if s.config.Flow == nil {
s.config.Flow = new(utils.Flow)
}
s.config.Flow.ExportFlow += out
s.config.Flow.InletFlow += in
s.task.Flow.ExportFlow += out
s.task.Flow.InletFlow += in
}
func (s *server) FlowAddHost(host *utils.HostList, in, out int64) {
func (s *server) FlowAddHost(host *utils.Host, in, out int64) {
s.Lock()
defer s.Unlock()
if s.config.Flow == nil {
s.config.Flow = new(utils.Flow)
}
host.Flow.ExportFlow += out
host.Flow.InletFlow += in
}
//热更新配置
func (s *server) ResetConfig() {
task, err := CsvDb.GetTask(s.config.Id)
//获取最新数据
task, err := CsvDb.GetTask(s.task.Id)
if err != nil {
return
}
s.config.UseClientCnf = task.UseClientCnf
if s.config.UseClientCnf {
client, err := CsvDb.GetClient(s.config.ClientId)
s.task.UseClientCnf = task.UseClientCnf
//使用客户端配置
if s.task.UseClientCnf {
client, err := CsvDb.GetClient(s.task.Client.Id)
if err == nil {
s.config.U = client.Cnf.U
s.config.P = client.Cnf.P
@@ -62,15 +56,14 @@ func (s *server) ResetConfig() {
s.config.Mux = client.Cnf.Mux
s.config.Crypt = client.Cnf.Crypt
}
s.config.CompressDecode, s.config.CompressEncode = utils.GetCompressType(client.Cnf.Compress)
} else {
if err == nil {
s.config.U = task.U
s.config.P = task.P
s.config.Compress = task.Compress
s.config.Mux = task.Mux
s.config.Crypt = task.Crypt
s.config.U = task.Config.U
s.config.P = task.Config.P
s.config.Compress = task.Config.Compress
s.config.Mux = task.Config.Mux
s.config.Crypt = task.Config.Crypt
}
s.config.CompressDecode, s.config.CompressEncode = utils.GetCompressType(task.Compress)
}
s.config.CompressDecode, s.config.CompressEncode = utils.GetCompressType(s.config.Compress)
}

View File

@@ -13,13 +13,7 @@ type process func(c *utils.Conn, s *TunnelModeServer) error
//tcp隧道模式
func ProcessTunnel(c *utils.Conn, s *TunnelModeServer) error {
_, _, rb, err, r := c.GetHost()
if err == nil {
if err := s.auth(r, c, s.config.U, s.config.P); err != nil {
return err
}
}
return s.dealClient(c, s.config, s.config.Target, "", rb)
return s.dealClient(c, s.config, s.task.Target, "", nil)
}
//http代理模式
@@ -41,8 +35,7 @@ func ProcessHost(c *utils.Conn, s *TunnelModeServer) error {
var (
isConn = true
link *utils.Conn
client *utils.Client
host *utils.HostList
host *utils.Host
wg sync.WaitGroup
)
for {
@@ -52,17 +45,17 @@ func ProcessHost(c *utils.Conn, s *TunnelModeServer) error {
}
//首次获取conn
if isConn {
if host, client, err = GetKeyByHost(r.Host); err != nil {
if host, err = GetInfoByHost(r.Host); err != nil {
log.Printf("the host %s is not found !", r.Host)
break
}
client.Cnf.ClientId = host.ClientId
client.Cnf.CompressDecode, client.Cnf.CompressEncode = utils.GetCompressType(client.Cnf.Compress)
if err = s.auth(r, c, client.Cnf.U, client.Cnf.P); err != nil {
host.Client.Cnf.CompressDecode, host.Client.Cnf.CompressEncode = utils.GetCompressType(host.Client.Cnf.Compress)
if err = s.auth(r, c, host.Client.Cnf.U, host.Client.Cnf.P); err != nil {
break
}
if link, err = s.GetTunnelAndWriteHost(utils.CONN_TCP, client.Cnf, host.Target); err != nil {
if link, err = s.GetTunnelAndWriteHost(utils.CONN_TCP, host.Client.Id, host.Client.Cnf, host.Target); err != nil {
log.Println("get bridge tunnel error: ", err)
break
}
@@ -72,27 +65,28 @@ func ProcessHost(c *utils.Conn, s *TunnelModeServer) error {
} else {
wg.Add(1)
go func() {
out, _ := utils.Relay(c.Conn, link.Conn, client.Cnf.CompressDecode, client.Cnf.Crypt, client.Cnf.Mux)
out, _ := utils.Relay(c.Conn, link.Conn, host.Client.Cnf.CompressDecode, host.Client.Cnf.Crypt, host.Client.Cnf.Mux)
wg.Done()
s.FlowAddHost(host, 0, out)
}()
}
isConn = false
}
//根据设定修改header和host
utils.ChangeHostAndHeader(r, host.HostChange, host.HeaderChange, c.Conn.RemoteAddr().String())
b, err := httputil.DumpRequest(r, true)
s.FlowAddHost(host, int64(len(b)), 0)
if err != nil {
break
}
if _, err := link.WriteTo(b, client.Cnf.CompressEncode, client.Cnf.Crypt); err != nil {
s.FlowAddHost(host, int64(len(b)), 0)
if _, err := link.WriteTo(b, host.Client.Cnf.CompressEncode, host.Client.Cnf.Crypt); err != nil {
break
}
}
wg.Wait()
if client != nil && client.Cnf != nil && client.Cnf.Mux && link != nil {
link.WriteTo([]byte(utils.IO_EOF), client.Cnf.CompressEncode, client.Cnf.Crypt)
s.bridge.ReturnTunnel(link, client.Id)
if host != nil && host.Client.Cnf != nil && host.Client.Cnf.Mux && link != nil {
link.WriteTo([]byte(utils.IO_EOF), host.Client.Cnf.CompressEncode, host.Client.Cnf.Crypt)
s.bridge.ReturnTunnel(link, host.Client.Id)
} else if link != nil {
link.Close()
}
@@ -103,5 +97,3 @@ func ProcessHost(c *utils.Conn, s *TunnelModeServer) error {
c.Close()
return nil
}

View File

@@ -20,10 +20,9 @@ type RunServer struct {
}
var (
Bridge *bridge.Tunnel
Bridge *bridge.Bridge
RunList map[int]interface{} //运行中的任务
CsvDb = utils.GetCsvDb()
VerifyKey string
)
func init() {
@@ -33,7 +32,7 @@ func init() {
//从csv文件中恢复任务
func InitFromCsv() {
for _, v := range CsvDb.Tasks {
if v.Start == 1 {
if v.Status {
log.Println("启动模式:", v.Mode, "监听端口:", v.TcpPort)
AddTask(v)
}
@@ -41,7 +40,7 @@ func InitFromCsv() {
}
//start a new server
func StartNewServer(bridgePort int, cnf *utils.ServerConfig) {
func StartNewServer(bridgePort int, cnf *utils.Tunnel) {
Bridge = bridge.NewTunnel(bridgePort, RunList)
if err := Bridge.StartTunnel(); err != nil {
log.Fatalln("服务端开启失败", err)
@@ -58,37 +57,32 @@ func StartNewServer(bridgePort int, cnf *utils.ServerConfig) {
}
//new a server by mode name
func NewMode(Bridge *bridge.Tunnel, c *utils.ServerConfig) interface{} {
config := utils.DeepCopyConfig(c)
switch config.Mode {
func NewMode(Bridge *bridge.Bridge, c *utils.Tunnel) interface{} {
switch c.Mode {
case "tunnelServer":
return NewTunnelModeServer(ProcessTunnel, Bridge, config)
return NewTunnelModeServer(ProcessTunnel, Bridge, c)
case "socks5Server":
return NewSock5ModeServer(Bridge, config)
return NewSock5ModeServer(Bridge, c)
case "httpProxyServer":
return NewTunnelModeServer(ProcessHttp, Bridge, config)
return NewTunnelModeServer(ProcessHttp, Bridge, c)
case "udpServer":
return NewUdpModeServer(Bridge, config)
return NewUdpModeServer(Bridge, c)
case "webServer":
InitFromCsv()
p, _ := beego.AppConfig.Int("hostPort")
t := &utils.ServerConfig{
TcpPort: p,
Mode: "httpHostServer",
Target: "",
U: "",
P: "",
Compress: "",
Start: 1,
IsRun: 0,
ClientStatus: 0,
t := &utils.Tunnel{
TcpPort: p,
Mode: "httpHostServer",
Target: "",
Config: &utils.Config{},
Status: true,
}
AddTask(t)
return NewWebServer(Bridge)
case "hostServer":
return NewHostServer(config)
return NewHostServer(c)
case "httpHostServer":
return NewTunnelModeServer(ProcessHost, Bridge, config)
return NewTunnelModeServer(ProcessHost, Bridge, c)
}
return nil
}
@@ -100,7 +94,7 @@ func StopServer(id int) error {
if t, err := CsvDb.GetTask(id); err != nil {
return err
} else {
t.Start = 0
t.Status = false
CsvDb.UpdateTask(t)
}
return nil
@@ -109,7 +103,7 @@ func StopServer(id int) error {
}
//add task
func AddTask(t *utils.ServerConfig) error {
func AddTask(t *utils.Tunnel) error {
if svr := NewMode(Bridge, t); svr != nil {
RunList[t.Id] = svr
go func() {
@@ -131,7 +125,7 @@ func StartTask(id int) error {
return err
} else {
AddTask(t)
t.Start = 1
t.Status = true
CsvDb.UpdateTask(t)
}
return nil
@@ -146,12 +140,11 @@ func DelTask(id int) error {
}
//get key by host from x
func GetKeyByHost(host string) (h *utils.HostList, t *utils.Client, err error) {
func GetInfoByHost(host string) (h *utils.Host, err error) {
for _, v := range CsvDb.Hosts {
s := strings.Split(host, ":")
if s[0] == v.Host {
h = v
t, err = CsvDb.GetClient(v.ClientId)
return
}
}
@@ -160,39 +153,25 @@ func GetKeyByHost(host string) (h *utils.HostList, t *utils.Client, err error) {
}
//get task list by page num
func GetServerConfig(start, length int, typeVal string, clientId int) ([]*utils.ServerConfig, int) {
list := make([]*utils.ServerConfig, 0)
func GetTunnel(start, length int, typeVal string, clientId int) ([]*utils.Tunnel, int) {
list := make([]*utils.Tunnel, 0)
var cnt int
for _, v := range CsvDb.Tasks {
if (typeVal != "" && v.Mode != typeVal) || (typeVal == "" && clientId != v.ClientId) {
if (typeVal != "" && v.Mode != typeVal) || (typeVal == "" && clientId != v.Client.Id) {
continue
}
if v.UseClientCnf {
v = utils.DeepCopyConfig(v)
if c, err := CsvDb.GetClient(v.ClientId); err == nil {
v.Compress = c.Cnf.Compress
v.Mux = c.Cnf.Mux
v.Crypt = c.Cnf.Crypt
v.U = c.Cnf.U
v.P = c.Cnf.P
}
}
cnt++
if _, ok := Bridge.SignalList[v.Client.Id]; ok {
v.Client.IsConnect = true
} else {
v.Client.IsConnect = false
}
if start--; start < 0 {
if length--; length > 0 {
if _, ok := RunList[v.Id]; ok {
v.IsRun = 1
v.Client.Status = true
} else {
v.IsRun = 0
}
if s, ok := Bridge.SignalList[v.ClientId]; ok {
if s.Len() > 0 {
v.ClientStatus = 1
} else {
v.ClientStatus = 0
}
} else {
v.ClientStatus = 0
v.Client.Status = false
}
list = append(list, v)
}
@@ -218,13 +197,13 @@ func dealClientData(list []*utils.Client) {
v.Flow.InletFlow = 0
v.Flow.ExportFlow = 0
for _, h := range CsvDb.Hosts {
if h.ClientId == v.Id {
if h.Client.Id == v.Id {
v.Flow.InletFlow += h.Flow.InletFlow
v.Flow.ExportFlow += h.Flow.ExportFlow
}
}
for _, t := range CsvDb.Tasks {
if t.ClientId == v.Id {
if t.Client.Id == v.Id {
v.Flow.InletFlow += t.Flow.InletFlow
v.Flow.ExportFlow += t.Flow.ExportFlow
}
@@ -236,12 +215,12 @@ func dealClientData(list []*utils.Client) {
//根据客户端id删除其所属的所有隧道和域名
func DelTunnelAndHostByClientId(clientId int) {
for _, v := range CsvDb.Tasks {
if v.ClientId == clientId {
if v.Client.Id == clientId {
DelTask(v.Id)
}
}
for _, v := range CsvDb.Hosts {
if v.ClientId == clientId {
if v.Client.Id == clientId {
CsvDb.DelHost(v.Host)
}
}

View File

@@ -141,7 +141,7 @@ func (s *Sock5ModeServer) doConnect(c net.Conn, command uint8) (proxyConn *utils
} else {
ltype = utils.CONN_TCP
}
if proxyConn, err = s.GetTunnelAndWriteHost(ltype, s.config, addr); err != nil {
if proxyConn, err = s.GetTunnelAndWriteHost(ltype, s.task.Client.Id, s.config, addr); err != nil {
log.Println("get bridge tunnel error: ", err)
return
}
@@ -160,7 +160,7 @@ func (s *Sock5ModeServer) handleConnect(c net.Conn) {
proxyConn, err := s.doConnect(c, connectMethod)
defer func() {
if s.config.Mux && proxyConn != nil {
s.bridge.ReturnTunnel(proxyConn, s.config.ClientId)
s.bridge.ReturnTunnel(proxyConn, s.task.Client.Id)
}
}()
if err != nil {
@@ -198,7 +198,7 @@ func (s *Sock5ModeServer) handleUDP(c net.Conn) {
proxyConn, err := s.doConnect(c, associateMethod)
defer func() {
if s.config.Mux && proxyConn != nil {
s.bridge.ReturnTunnel(proxyConn, s.config.ClientId)
s.bridge.ReturnTunnel(proxyConn, s.task.Client.Id)
}
}()
if err != nil {
@@ -285,7 +285,7 @@ func (s *Sock5ModeServer) Auth(c net.Conn) error {
//start
func (s *Sock5ModeServer) Start() error {
var err error
s.listener, err = net.Listen("tcp", ":"+strconv.Itoa(s.config.TcpPort))
s.listener, err = net.Listen("tcp", ":"+strconv.Itoa(s.task.TcpPort))
if err != nil {
return err
}
@@ -309,10 +309,11 @@ func (s *Sock5ModeServer) Close() error {
}
//new
func NewSock5ModeServer(bridge *bridge.Tunnel, cnf *utils.ServerConfig) *Sock5ModeServer {
func NewSock5ModeServer(bridge *bridge.Bridge, task *utils.Tunnel) *Sock5ModeServer {
s := new(Sock5ModeServer)
s.bridge = bridge
s.config = cnf
s.task = task
s.config = utils.DeepCopyConfig(task.Config)
if s.config.U != "" && s.config.P != "" {
s.isVerify = true
} else {

View File

@@ -20,11 +20,12 @@ type TunnelModeServer struct {
}
//tcp|http|host
func NewTunnelModeServer(process process, bridge *bridge.Tunnel, cnf *utils.ServerConfig) *TunnelModeServer {
func NewTunnelModeServer(process process, bridge *bridge.Bridge, task *utils.Tunnel) *TunnelModeServer {
s := new(TunnelModeServer)
s.bridge = bridge
s.process = process
s.config = cnf
s.task = task
s.config = utils.DeepCopyConfig(task.Config)
return s
}
@@ -34,7 +35,7 @@ func (s *TunnelModeServer) Start() error {
if s.errorContent, err = utils.ReadAllFromFile(beego.AppPath + "/web/static/page/error.html"); err != nil {
s.errorContent = []byte("easyProxy 404")
}
s.listener, err = net.ListenTCP("tcp", &net.TCPAddr{net.ParseIP("0.0.0.0"), s.config.TcpPort, ""})
s.listener, err = net.ListenTCP("tcp", &net.TCPAddr{net.ParseIP("0.0.0.0"), s.task.TcpPort, ""})
if err != nil {
return err
}
@@ -69,15 +70,15 @@ func (s *TunnelModeServer) writeConnFail(c net.Conn) {
}
//与客户端建立通道
func (s *TunnelModeServer) dealClient(c *utils.Conn, cnf *utils.ServerConfig, addr string, method string, rb []byte) error {
func (s *TunnelModeServer) dealClient(c *utils.Conn, cnf *utils.Config, addr string, method string, rb []byte) error {
var link *utils.Conn
var err error
defer func() {
if cnf.Mux && link != nil {
s.bridge.ReturnTunnel(link, cnf.ClientId)
s.bridge.ReturnTunnel(link, s.task.Client.Id)
}
}()
if link, err = s.GetTunnelAndWriteHost(utils.CONN_TCP, cnf, addr); err != nil {
if link, err = s.GetTunnelAndWriteHost(utils.CONN_TCP, s.task.Client.Id, cnf, addr); err != nil {
log.Println("get bridge tunnel error: ", err)
return err
}
@@ -115,7 +116,7 @@ func (s *WebServer) Start() {
}
//new
func NewWebServer(bridge *bridge.Tunnel) *WebServer {
func NewWebServer(bridge *bridge.Bridge) *WebServer {
s := new(WebServer)
s.bridge = bridge
return s
@@ -131,9 +132,10 @@ func (s *HostServer) Start() error {
return nil
}
func NewHostServer(cnf *utils.ServerConfig) *HostServer {
func NewHostServer(task *utils.Tunnel) *HostServer {
s := new(HostServer)
s.config = cnf
s.task = task
s.config = utils.DeepCopyConfig(task.Config)
return s
}

View File

@@ -15,18 +15,19 @@ type UdpModeServer struct {
udpMap map[string]*utils.Conn
}
func NewUdpModeServer(bridge *bridge.Tunnel, cnf *utils.ServerConfig) *UdpModeServer {
func NewUdpModeServer(bridge *bridge.Bridge, task *utils.Tunnel) *UdpModeServer {
s := new(UdpModeServer)
s.bridge = bridge
s.udpMap = make(map[string]*utils.Conn)
s.config = cnf
s.task = task
s.config = utils.DeepCopyConfig(task.Config)
return s
}
//开始
func (s *UdpModeServer) Start() error {
var err error
s.listener, err = net.ListenUDP("udp", &net.UDPAddr{net.ParseIP("0.0.0.0"), s.config.TcpPort, ""})
s.listener, err = net.ListenUDP("udp", &net.UDPAddr{net.ParseIP("0.0.0.0"), s.task.TcpPort, ""})
if err != nil {
return err
}
@@ -45,14 +46,14 @@ func (s *UdpModeServer) Start() error {
return nil
}
//TODO:效率问题有待解决
//TODO:效率问题有待解决--->建立稳定通道,重复利用,提高效率,下个版本
func (s *UdpModeServer) process(addr *net.UDPAddr, data []byte) {
conn, err := s.bridge.GetTunnel(s.config.ClientId, s.config.CompressEncode, s.config.CompressDecode, s.config.Crypt, s.config.Mux)
conn, err := s.bridge.GetTunnel(s.task.Client.Id, s.config.CompressEncode, s.config.CompressDecode, s.config.Crypt, s.config.Mux)
if err != nil {
log.Println(err)
return
}
if _, err := conn.WriteHost(utils.CONN_UDP, s.config.Target); err != nil {
if _, err := conn.WriteHost(utils.CONN_UDP, s.task.Target); err != nil {
conn.Close()
return
}
@@ -60,7 +61,7 @@ func (s *UdpModeServer) process(addr *net.UDPAddr, data []byte) {
defer func() {
if conn != nil && s.config.Mux {
conn.WriteTo([]byte(utils.IO_EOF), s.config.CompressEncode, s.config.Crypt)
s.bridge.ReturnTunnel(conn, s.config.ClientId)
s.bridge.ReturnTunnel(conn, s.task.Client.Id)
} else {
conn.Close()
}
@@ -70,7 +71,6 @@ func (s *UdpModeServer) process(addr *net.UDPAddr, data []byte) {
buf := utils.BufPoolUdp.Get().([]byte)
out, err := conn.ReadFrom(buf, s.config.CompressDecode, s.config.Crypt)
if err != nil || err == io.EOF {
log.Println("revieve error:", err)
return
}
s.listener.WriteToUDP(buf[:out], addr)