Skip to content

Commit

Permalink
Url路由 泛解析
Browse files Browse the repository at this point in the history
  • Loading branch information
刘河 committed Feb 15, 2019
1 parent 44d3145 commit 9f6b33a
Show file tree
Hide file tree
Showing 26 changed files with 262 additions and 156 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -326,7 +326,7 @@ nps.exe test|start|stop|restart|status
- 服务端

```
./nps -mode=tunnelServer -vkey=DKibZF5TXvic1g3kY -tcpport=8284 -httpport=8024 -target=10.1.50.203:80
./nps -mode=tcpServer -vkey=DKibZF5TXvic1g3kY -tcpport=8284 -httpport=8024 -target=10.1.50.203:80
```

名称 | 含义
Expand Down
34 changes: 28 additions & 6 deletions bridge/bridge.go
Original file line number Diff line number Diff line change
Expand Up @@ -314,15 +314,37 @@ func (s *Bridge) GetConfig(c *conn.Conn) {
c.WriteAddFail()
break
} else {
t.Client = client
file.GetCsvDb().NewTask(t)
if b := tool.TestServerPort(t.Port, t.Mode); !b {
ports := common.GetPorts(t.Ports)
targets := common.GetPorts(t.Target)
if len(ports) > 1 && (t.Mode == "tcpServer" || t.Mode == "udpServer") && (len(ports) != len(targets)) {
fail = true
c.WriteAddFail()
} else {
s.OpenTask <- t
break
}
for i := 0; i < len(ports); i++ {
tl := new(file.Tunnel)
tl.Mode = t.Mode
tl.Port = ports[i]
if len(ports) == 1 {
tl.Target = t.Target
} else {
tl.Target = strconv.Itoa(targets[i])
}
tl.Id = file.GetCsvDb().GetTaskId()
tl.Status = true
tl.Flow = new(file.Flow)
tl.Remark = t.Remark
tl.NoStore = true
tl.Client = client
file.GetCsvDb().NewTask(tl)
if b := tool.TestServerPort(tl.Port, tl.Mode); !b {
fail = true
c.WriteAddFail()
} else {
s.OpenTask <- tl
}
c.WriteAddOk()
}
c.WriteAddOk()
}
}
}
Expand Down
37 changes: 18 additions & 19 deletions client/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,9 @@ func (s *TRPClient) Close() {
s.tunnel.Close()
s.stop <- true
for _, v := range s.linkMap {
v.Stop <- true
if v.Conn != nil {
v.Conn.Close()
}
}
}

Expand All @@ -74,7 +76,6 @@ func (s *TRPClient) processor(c *conn.Conn) {
if link, err := c.GetLinkInfo(); err != nil {
break
} else {
link.Stop = make(chan bool)
s.Lock()
s.linkMap[link.Id] = link
s.Unlock()
Expand All @@ -95,6 +96,7 @@ func (s *TRPClient) processor(c *conn.Conn) {
}

func (s *TRPClient) linkProcess(link *conn.Link, c *conn.Conn) {
link.Host = common.FormatAddress(link.Host)
//与目标建立连接
server, err := net.DialTimeout(link.ConnType, link.Host, time.Second*3)

Expand All @@ -106,26 +108,23 @@ func (s *TRPClient) linkProcess(link *conn.Link, c *conn.Conn) {

c.WriteSuccess(link.Id)

go func() {
link.Conn = conn.NewConn(server)
buf := pool.BufPoolCopy.Get().([]byte)
for {
if n, err := server.Read(buf); err != nil {
s.tunnel.SendMsg([]byte(common.IO_EOF), link)
link.Conn = conn.NewConn(server)
buf := pool.BufPoolCopy.Get().([]byte)
for {
if n, err := server.Read(buf); err != nil {
s.tunnel.SendMsg([]byte(common.IO_EOF), link)
break
} else {
if _, err := s.tunnel.SendMsg(buf[:n], link); err != nil {
c.Close()
break
} else {
if _, err := s.tunnel.SendMsg(buf[:n], link); err != nil {
c.Close()
break
}
}
}
pool.PutBufPoolCopy(buf)
s.Lock()
delete(s.linkMap, link.Id)
s.Unlock()
}()
<-link.Stop
}
pool.PutBufPoolCopy(buf)
s.Lock()
delete(s.linkMap, link.Id)
s.Unlock()
}

//隧道模式处理
Expand Down
2 changes: 1 addition & 1 deletion client/client_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ func TestConfig(t *testing.T) {
}
tunnel := &file.Tunnel{
Port: 9001,
Mode: "tunnelServer",
Mode: "tcpServer",
Target: "127.0.0.1:8082",
Remark: "333",
}
Expand Down
2 changes: 1 addition & 1 deletion conf/app.conf
Original file line number Diff line number Diff line change
Expand Up @@ -37,4 +37,4 @@ bridgeType=tcp
publicVkey=123

#Open ports allowed on the server side
allowPorts=9001-9009,10001,11000-12000
allowPorts=9001-9100,10001,11000-12000
1 change: 1 addition & 0 deletions conf/clients.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
7,7hv3avgeg2ldzvx7,,true,,,0,,0,0
1 change: 1 addition & 0 deletions conf/hosts.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
a.o.com,127.0.0.1:8080,7,,,,,1
45 changes: 24 additions & 21 deletions conf/npc.conf
Original file line number Diff line number Diff line change
Expand Up @@ -2,32 +2,35 @@
server=127.0.0.1:8284
tp=tcp
vkey=123
username=111
password=222
compress=snappy
crypt=true
auto_reconnection=true

[web1]
host=a.o.com
host_change=www.sina.com
target=127.0.0.1:8080,127.0.0.1:8082
header_cookkile=122123
header_user-Agent=122123
host_change=www.proxy.com
target=127.0.0.1:8080

[web2]
host=www.baidu.com
host_change=www.sina.com
host=a.proxy.com
target=127.0.0.1:8080,127.0.0.1:8082
header_cookkile="122123"
header_user-Agent=122123
[tunnel1]
host_change=www.proxy.com
header_set_proxy=nps

[tcp]
mode=tcpServer
target=8001-8005,8006
port=9001-9005,9006

[socks5]
mode=socks5Server
port=9007

[http]
mode=httpProxyServer
port=9008

[udp]
mode=udpServer
target=127.0.0.1:8080
port=9001
[tunnel2]
mode=tunnelServer
target=127.0.0.1:8080
port=9001
[tunnel3]
mode=tunnelServer
target=127.0.0.1:8080
port=9002
port=9009
target=114.114.114.114:53
42 changes: 41 additions & 1 deletion lib/common/util.go
Original file line number Diff line number Diff line change
Expand Up @@ -200,4 +200,44 @@ func InIntArr(arr []int, val int) bool {
}
}
return false
}
}

func GetPorts(p string) []int {
var ps []int
arr := strings.Split(p, ",")
for _, v := range arr {
fw := strings.Split(v, "-")
if len(fw) == 2 {
if IsPort(fw[0]) && IsPort(fw[1]) {
start, _ := strconv.Atoi(fw[0])
end, _ := strconv.Atoi(fw[1])
for i := start; i <= end; i++ {
ps = append(ps, i)
}
} else {
continue
}
} else if IsPort(v) {
p, _ := strconv.Atoi(v)
ps = append(ps, p)
}
}
return ps
}
func IsPort(p string) bool {
pi, err := strconv.Atoi(p)
if err != nil {
return false
}
if pi > 65536 || pi < 1 {
return false
}
return true
}

func FormatAddress(s string) string {
if strings.Contains(s, ":") {
return s
}
return "127.0.0.1:" + s
}
2 changes: 1 addition & 1 deletion lib/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ func dealTunnel(s string) *file.Tunnel {
}
switch item[0] {
case "port":
t.Port = common.GetIntNoErrByStr(item[1])
t.Ports = item[1]
case "mode":
t.Mode = item[1]
case "target":
Expand Down
6 changes: 3 additions & 3 deletions lib/conn/conn.go
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ func (s *Conn) ReadLen(cLen int) ([]byte, error) {
defer pool.BufPoolMax.Put(buf)
}
if n, err := io.ReadFull(s, buf); err != nil || n != cLen {
return buf, errors.New("读取指定长度错误" + err.Error())
return buf, errors.New("Error reading specified length" + err.Error())
}
return buf, nil
}
Expand Down Expand Up @@ -368,7 +368,7 @@ func (s *Conn) SendTaskInfo(t *file.Tunnel) (int, error) {
*/
raw := bytes.NewBuffer([]byte{})
binary.Write(raw, binary.LittleEndian, []byte(common.NEW_TASK))
common.BinaryWrite(raw, t.Mode, strconv.Itoa(t.Port), t.Target, t.Remark)
common.BinaryWrite(raw, t.Mode, t.Ports, t.Target, t.Remark)
s.Lock()
defer s.Unlock()
return s.Write(raw.Bytes())
Expand All @@ -386,7 +386,7 @@ func (s *Conn) GetTaskInfo() (t *file.Tunnel, err error) {
arr := strings.Split(string(b), common.CONN_DATA_SEQ)
t = new(file.Tunnel)
t.Mode = arr[0]
t.Port, _ = strconv.Atoi(arr[1])
t.Ports = arr[1]
t.Target = arr[2]
t.Id = file.GetCsvDb().GetTaskId()
t.Status = true
Expand Down
1 change: 0 additions & 1 deletion lib/conn/link.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ type Link struct {
UdpListener *net.UDPConn
Rate *rate.Rate
UdpRemoteAddr *net.UDPAddr
Stop chan bool
}

func NewLink(id int, connType string, host string, en, de int, crypt bool, c *Conn, flow *file.Flow, udpListener *net.UDPConn, rate *rate.Rate, UdpRemoteAddr *net.UDPAddr) *Link {
Expand Down
Loading

0 comments on commit 9f6b33a

Please sign in to comment.