代码调整

pull/1219/head
刘河 2019-01-04 00:21:23 +08:00
parent 11554aadfc
commit 9202db49b8
13 changed files with 133 additions and 476 deletions

View File

@ -1,10 +1,10 @@
appname = httpMonitor appname = easyProxy
#web管理端口 #web管理端口
httpport = 8080 httpport = 8080
#启动模式dev|pro #启动模式dev|pro
runmode = dev runmode = pro
#web管理密码 #web管理密码
password=123 password=123
@ -12,9 +12,9 @@ password=123
#http监听端口 #http监听端口
hostPort=8028 hostPort=8028
#basic auth认证用户名和密码为空则不验证 #basic auth认证用户名和密码为空则不验证,全局控制
auth.user=test auth.user=
auth.password=1234 auth.password=
#是否加密传输0|1 #是否加密传输0|1,全局控制
crypt=1 crypt=0

View File

@ -1,3 +1,3 @@
a.proxy.com,127.0.0.1:81,o2430bnq22jgnmcl
b.proxy.com,127.0.0.1:82,o2430bnq22jgnmcl b.proxy.com,127.0.0.1:82,o2430bnq22jgnmcl
a.o.com,10.1.50.203:80,o2430bnq22jgnmcl b.o.com,127.0.0.1:88,ts08z6vk5nc72fs8
a.o.com,127.0.0.1:88,ts08z6vk5nc72fs8

1 a.proxy.com b.proxy.com 127.0.0.1:81 127.0.0.1:82 o2430bnq22jgnmcl
a.proxy.com 127.0.0.1:81 o2430bnq22jgnmcl
1 b.proxy.com b.proxy.com 127.0.0.1:82 127.0.0.1:82 o2430bnq22jgnmcl
2 a.o.com b.o.com 10.1.50.203:80 127.0.0.1:88 o2430bnq22jgnmcl ts08z6vk5nc72fs8
3 a.o.com 127.0.0.1:88 ts08z6vk5nc72fs8

View File

@ -1 +1,2 @@
8001,tunnelServer,10.1.50.196:4000,jq5i7n0sjs1h0jje,,,,1,1 0,hostServer,,ts08z6vk5nc72fs8,,,,1,0
8001,tunnelServer,127.0.0.1:88,jq5i7n0sjs1h0jje,,,,1,1

1 8001 0 tunnelServer hostServer 10.1.50.196:4000 jq5i7n0sjs1h0jje ts08z6vk5nc72fs8 1 1 0
2 8001 tunnelServer 127.0.0.1:88 jq5i7n0sjs1h0jje 1 1

BIN
lib/.socks5.go.swp Normal file

Binary file not shown.

View File

@ -16,6 +16,7 @@ type TRPClient struct {
vKey string vKey string
} }
//new client
func NewRPClient(svraddr string, tcpNum int, vKey string) *TRPClient { func NewRPClient(svraddr string, tcpNum int, vKey string) *TRPClient {
c := new(TRPClient) c := new(TRPClient)
c.svrAddr = svraddr c.svrAddr = svraddr
@ -24,6 +25,7 @@ func NewRPClient(svraddr string, tcpNum int, vKey string) *TRPClient {
return c return c
} }
//start
func (s *TRPClient) Start() error { func (s *TRPClient) Start() error {
for i := 0; i < s.tcpNum; i++ { for i := 0; i < s.tcpNum; i++ {
go s.newConn() go s.newConn()
@ -46,6 +48,7 @@ func (s *TRPClient) newConn() error {
return s.process(NewConn(conn)) return s.process(NewConn(conn))
} }
//处理
func (s *TRPClient) process(c *Conn) error { func (s *TRPClient) process(c *Conn) error {
c.SetAlive() c.SetAlive()
if _, err := c.Write([]byte(getverifyval(s.vKey))); err != nil { if _, err := c.Write([]byte(getverifyval(s.vKey))); err != nil {
@ -119,8 +122,8 @@ func (s *TRPClient) dealChan() error {
//http模式处理 //http模式处理
func (s *TRPClient) dealHttp(c *Conn) error { func (s *TRPClient) dealHttp(c *Conn) error {
buf := make([]byte, 1024*32) buf := make([]byte, 1024*32)
en, de, _ := c.GetConnInfoFromConn() en, de, crypt := c.GetConnInfoFromConn()
n, err := c.ReadFromCompress(buf, de) n, err := c.ReadFrom(buf, de, crypt)
if err != nil { if err != nil {
c.wError() c.wError()
return err return err
@ -136,7 +139,7 @@ func (s *TRPClient) dealHttp(c *Conn) error {
return err return err
} }
c.wSign() c.wSign()
n, err = c.WriteCompress(respBytes, en) n, err = c.WriteTo(respBytes, en, crypt)
if err != nil { if err != nil {
return err return err
} }

View File

@ -3,11 +3,10 @@ package lib
import ( import (
"bufio" "bufio"
"bytes" "bytes"
"compress/gzip"
"encoding/binary" "encoding/binary"
"errors" "errors"
"fmt"
"github.com/golang/snappy" "github.com/golang/snappy"
"io"
"log" "log"
"net" "net"
"net/http" "net/http"
@ -29,6 +28,7 @@ func NewCryptConn(conn net.Conn, crypt bool) *CryptConn {
return c return c
} }
//加密写
func (s *CryptConn) Write(b []byte) (n int, err error) { func (s *CryptConn) Write(b []byte) (n int, err error) {
n = len(b) n = len(b)
if s.crypt { if s.crypt {
@ -43,6 +43,7 @@ func (s *CryptConn) Write(b []byte) (n int, err error) {
return return
} }
//解密读
func (s *CryptConn) Read(b []byte) (n int, err error) { func (s *CryptConn) Read(b []byte) (n int, err error) {
if s.crypt { if s.crypt {
var lens int var lens int
@ -78,6 +79,7 @@ func NewSnappyConn(conn net.Conn, crypt bool) *SnappyConn {
return c return c
} }
//snappy压缩写 包含加密
func (s *SnappyConn) Write(b []byte) (n int, err error) { func (s *SnappyConn) Write(b []byte) (n int, err error) {
n = len(b) n = len(b)
if s.crypt { if s.crypt {
@ -93,6 +95,7 @@ func (s *SnappyConn) Write(b []byte) (n int, err error) {
return return
} }
//snappy压缩读 包含解密
func (s *SnappyConn) Read(b []byte) (n int, err error) { func (s *SnappyConn) Read(b []byte) (n int, err error) {
if n, err = s.r.Read(b); err != nil { if n, err = s.r.Read(b); err != nil {
return return
@ -109,64 +112,21 @@ func (s *SnappyConn) Read(b []byte) (n int, err error) {
return return
} }
type GzipConn struct {
w *gzip.Writer
r *gzip.Reader
crypt bool
}
func NewGzipConn(conn net.Conn, crypt bool) *GzipConn {
c := new(GzipConn)
c.crypt = crypt
c.w = gzip.NewWriter(conn)
c.r, err = gzip.NewReader(conn)
fmt.Println("err", err)
//错误处理
return c
}
func (s *GzipConn) Write(b []byte) (n int, err error) {
fmt.Println(string(b))
if n, err = s.w.Write(b); err != nil {
//err = s.w.Flush()
//s.w.Close()
return
}
err = s.w.Flush()
return
}
func (s *GzipConn) Read(b []byte) (n int, err error) {
fmt.Println("read")
if n, err = s.r.Read(b); err != nil {
return
}
if s.crypt {
var bs []byte
if bs, err = AesDecrypt(b[:n], []byte(cryptKey)); err != nil {
log.Println("decode crypt error:", err)
return
}
n = len(bs)
copy(b, bs)
}
return
}
type Conn struct { type Conn struct {
conn net.Conn conn net.Conn
} }
//new conn
func NewConn(conn net.Conn) *Conn { func NewConn(conn net.Conn) *Conn {
c := new(Conn) c := new(Conn)
c.conn = conn c.conn = conn
return c return c
} }
//读取指定内容长度 //读取指定长度内容
func (s *Conn) ReadLen(len int) ([]byte, error) { func (s *Conn) ReadLen(len int) ([]byte, error) {
buf := make([]byte, len) buf := make([]byte, len)
if n, err := s.Read(buf); err != nil || n != len { if n, err := io.ReadFull(s, buf); err != nil || n != len {
return buf, errors.New("读取指定长度错误" + err.Error()) return buf, errors.New("读取指定长度错误" + err.Error())
} }
return buf, nil return buf, nil
@ -174,14 +134,14 @@ func (s *Conn) ReadLen(len int) ([]byte, error) {
//获取长度 //获取长度
func (s *Conn) GetLen() (int, error) { func (s *Conn) GetLen() (int, error) {
val := make([]byte, 4) val, err := s.ReadLen(4)
if _, err := s.Read(val); err != nil { if err != nil {
return 0, err return 0, err
} }
return GetLenByBytes(val) return GetLenByBytes(val)
} }
//写入长度 //写入长度+内容 粘包
func (s *Conn) WriteLen(buf []byte) (int, error) { func (s *Conn) WriteLen(buf []byte) (int, error) {
var b []byte var b []byte
if b, err = GetLenBytes(buf); err != nil { if b, err = GetLenBytes(buf); err != nil {
@ -192,8 +152,8 @@ func (s *Conn) WriteLen(buf []byte) (int, error) {
//读取flag //读取flag
func (s *Conn) ReadFlag() (string, error) { func (s *Conn) ReadFlag() (string, error) {
val := make([]byte, 4) val, err := s.ReadLen(4)
if _, err := s.Read(val); err != nil { if err != nil {
return "", err return "", err
} }
return string(val), err return string(val), err
@ -202,20 +162,20 @@ func (s *Conn) ReadFlag() (string, error) {
//读取host 连接地址 压缩类型 //读取host 连接地址 压缩类型
func (s *Conn) GetHostFromConn() (typeStr string, host string, en, de int, crypt bool, err error) { func (s *Conn) GetHostFromConn() (typeStr string, host string, en, de int, crypt bool, err error) {
retry: retry:
ltype := make([]byte, 3) lType, err := s.ReadLen(3)
if _, err = s.Read(ltype); err != nil {
return
}
if typeStr = string(ltype); typeStr == TEST_FLAG {
en, de, crypt = s.GetConnInfoFromConn()
goto retry
}
len, err := s.GetLen()
if err != nil { if err != nil {
return return
} }
hostByte := make([]byte, len) if typeStr = string(lType); typeStr == TEST_FLAG {
if _, err = s.Read(hostByte); err != nil { en, de, crypt = s.GetConnInfoFromConn()
goto retry
}
cLen, err := s.GetLen()
if err != nil {
return
}
hostByte, err := s.ReadLen(cLen)
if err != nil {
return return
} }
host = string(hostByte) host = string(hostByte)
@ -239,7 +199,7 @@ func (s *Conn) SetAlive() {
conn.SetKeepAlivePeriod(time.Duration(2 * time.Second)) conn.SetKeepAlivePeriod(time.Duration(2 * time.Second))
} }
//从tcp报文中解析出host //从tcp报文中解析出host,连接类型等
func (s *Conn) GetHost() (method, address string, rb []byte, err error, r *http.Request) { func (s *Conn) GetHost() (method, address string, rb []byte, err error, r *http.Request) {
var b [32 * 1024]byte var b [32 * 1024]byte
var n int var n int
@ -268,76 +228,76 @@ func (s *Conn) GetHost() (method, address string, rb []byte, err error, r *http.
return return
} }
//压缩方式读 //单独读(加密|压缩)
func (s *Conn) ReadFromCompress(b []byte, compress int) (int, error) { func (s *Conn) ReadFrom(b []byte, compress int, crypt bool) (int, error) {
switch compress { if COMPRESS_SNAPY_DECODE == compress {
case COMPRESS_SNAPY_DECODE: return NewSnappyConn(s.conn, crypt).Read(b)
r := snappy.NewReader(s)
return r.Read(b)
default:
return s.Read(b)
} }
return 0, nil return NewCryptConn(s.conn, crypt).Read(b)
} }
//压缩方式写 //单独写(加密|压缩)
func (s *Conn) WriteCompress(b []byte, compress int) (n int, err error) { func (s *Conn) WriteTo(b []byte, compress int, crypt bool) (n int, err error) {
switch compress { if COMPRESS_SNAPY_ENCODE == compress {
case COMPRESS_SNAPY_ENCODE: return NewSnappyConn(s.conn, crypt).Write(b)
w := snappy.NewBufferedWriter(s)
if n, err = w.Write(b); err == nil {
w.Flush()
} }
err = w.Close() return NewCryptConn(s.conn, crypt).Write(b)
default:
n, err = s.Write(b)
}
return
} }
//写压缩方式 //写压缩方式,加密
func (s *Conn) WriteConnInfo(en, de int, crypt bool) { func (s *Conn) WriteConnInfo(en, de int, crypt bool) {
s.Write([]byte(strconv.Itoa(en) + strconv.Itoa(de) + GetStrByBool(crypt))) s.Write([]byte(strconv.Itoa(en) + strconv.Itoa(de) + GetStrByBool(crypt)))
} }
//获取压缩方式 //获取压缩方式,是否加密
func (s *Conn) GetConnInfoFromConn() (en, de int, crypt bool) { func (s *Conn) GetConnInfoFromConn() (en, de int, crypt bool) {
buf := make([]byte, 3) buf, err := s.ReadLen(3)
s.Read(buf) //TODO错误处理
if err != nil {
return
}
en, _ = strconv.Atoi(string(buf[0])) en, _ = strconv.Atoi(string(buf[0]))
de, _ = strconv.Atoi(string(buf[1])) de, _ = strconv.Atoi(string(buf[1]))
crypt = GetBoolByStr(string(buf[2])) crypt = GetBoolByStr(string(buf[2]))
return return
} }
//close
func (s *Conn) Close() error { func (s *Conn) Close() error {
return s.conn.Close() return s.conn.Close()
} }
//write
func (s *Conn) Write(b []byte) (int, error) { func (s *Conn) Write(b []byte) (int, error) {
return s.conn.Write(b) return s.conn.Write(b)
} }
//read
func (s *Conn) Read(b []byte) (int, error) { func (s *Conn) Read(b []byte) (int, error) {
return s.conn.Read(b) return s.conn.Read(b)
} }
//write error
func (s *Conn) wError() (int, error) { func (s *Conn) wError() (int, error) {
return s.Write([]byte(RES_MSG)) return s.Write([]byte(RES_MSG))
} }
//write sign flag
func (s *Conn) wSign() (int, error) { func (s *Conn) wSign() (int, error) {
return s.Write([]byte(RES_SIGN)) return s.Write([]byte(RES_SIGN))
} }
//write main
func (s *Conn) wMain() (int, error) { func (s *Conn) wMain() (int, error) {
return s.Write([]byte(WORK_MAIN)) return s.Write([]byte(WORK_MAIN))
} }
//write chan
func (s *Conn) wChan() (int, error) { func (s *Conn) wChan() (int, error) {
return s.Write([]byte(WORK_CHAN)) return s.Write([]byte(WORK_CHAN))
} }
//write test
func (s *Conn) wTest() (int, error) { func (s *Conn) wTest() (int, error) {
return s.Write([]byte(TEST_FLAG)) return s.Write([]byte(TEST_FLAG))
} }

View File

@ -10,6 +10,7 @@ import (
"time" "time"
) )
//en
func AesEncrypt(origData, key []byte) ([]byte, error) { func AesEncrypt(origData, key []byte) ([]byte, error) {
block, err := aes.NewCipher(key) block, err := aes.NewCipher(key)
if err != nil { if err != nil {
@ -26,6 +27,7 @@ func AesEncrypt(origData, key []byte) ([]byte, error) {
return crypted, nil return crypted, nil
} }
//de
func AesDecrypt(crypted, key []byte) ([]byte, error) { func AesDecrypt(crypted, key []byte) ([]byte, error) {
block, err := aes.NewCipher(key) block, err := aes.NewCipher(key)
if err != nil { if err != nil {
@ -41,24 +43,14 @@ func AesDecrypt(crypted, key []byte) ([]byte, error) {
return origData, nil return origData, nil
} }
func ZeroPadding(ciphertext []byte, blockSize int) []byte { //补全
padding := blockSize - len(ciphertext)%blockSize
padtext := bytes.Repeat([]byte{0}, padding)
return append(ciphertext, padtext...)
}
func ZeroUnPadding(origData []byte) []byte {
length := len(origData)
unpadding := int(origData[length-1])
return origData[:(length - unpadding)]
}
func PKCS5Padding(ciphertext []byte, blockSize int) []byte { func PKCS5Padding(ciphertext []byte, blockSize int) []byte {
padding := blockSize - len(ciphertext)%blockSize padding := blockSize - len(ciphertext)%blockSize
padtext := bytes.Repeat([]byte{byte(padding)}, padding) padtext := bytes.Repeat([]byte{byte(padding)}, padding)
return append(ciphertext, padtext...) return append(ciphertext, padtext...)
} }
//去补
func PKCS5UnPadding(origData []byte) []byte { func PKCS5UnPadding(origData []byte) []byte {
length := len(origData) length := len(origData)
// 去掉最后一个字节 unpadding 次 // 去掉最后一个字节 unpadding 次

View File

@ -1,285 +0,0 @@
package lib
import (
"encoding/csv"
"errors"
"log"
"os"
"strconv"
)
type TaskList struct {
TcpPort int //服务端与客户端通信端口
Mode string //启动方式
Target string //目标
VerifyKey string //flag
U string //socks5验证用户名
P string //socks5验证密码
Compress string //压缩方式
Start int //是否开启
IsRun int //是否在运行
ClientStatus int //客户端状态
}
type HostList struct {
Vkey string //服务端与客户端通信端口
Host string //启动方式
Target string //目标
}
func NewCsv(path string, bridge *Tunnel, runList map[string]interface{}) *Csv {
c := new(Csv)
c.Path = path
c.Bridge = bridge
c.RunList = runList
return c
}
type Csv struct {
Tasks []*TaskList
Path string
Bridge *Tunnel
RunList map[string]interface{}
Hosts []*HostList //域名列表
}
func (s *Csv) Init() {
s.LoadTaskFromCsv()
s.LoadHostFromCsv()
}
func (s *Csv) StoreTasksToCsv() {
// 创建文件
csvFile, err := os.Create(s.Path + "tasks.csv")
if err != nil {
log.Fatalf(err.Error())
}
defer csvFile.Close()
writer := csv.NewWriter(csvFile)
for _, task := range s.Tasks {
record := []string{
strconv.Itoa(task.TcpPort),
task.Mode,
task.Target,
task.VerifyKey,
task.U,
task.P,
task.Compress,
strconv.Itoa(task.Start),
}
err := writer.Write(record)
if err != nil {
log.Fatalf(err.Error())
}
}
writer.Flush()
}
func (s *Csv) LoadTaskFromCsv() {
// 打开文件
file, err := os.Open(s.Path + "tasks.csv")
if err != nil {
panic(err)
}
defer file.Close()
// 获取csv的reader
reader := csv.NewReader(file)
// 设置FieldsPerRecord为-1
reader.FieldsPerRecord = -1
// 读取文件中所有行保存到slice中
records, err := reader.ReadAll()
if err != nil {
panic(err)
}
var tasks []*TaskList
// 将每一行数据保存到内存slice中
for _, item := range records {
tcpPort, _ := strconv.Atoi(item[0])
Start, _ := strconv.Atoi(item[7])
post := &TaskList{
TcpPort: tcpPort,
Mode: item[1],
Target: item[2],
VerifyKey: item[3],
U: item[4],
P: item[5],
Compress: item[6],
Start: Start,
}
tasks = append(tasks, post)
}
s.Tasks = tasks
}
func (s *Csv) StoreHostToCsv() {
// 创建文件
csvFile, err := os.Create(s.Path + "hosts.csv")
if err != nil {
panic(err)
}
defer csvFile.Close()
// 获取csv的Writer
writer := csv.NewWriter(csvFile)
// 将map中的Post转换成slice因为csv的Write需要slice参数
// 并写入csv文件
for _, host := range s.Hosts {
record := []string{
host.Host,
host.Target,
host.Vkey,
}
err1 := writer.Write(record)
if err1 != nil {
panic(err1)
}
}
// 确保所有内存数据刷到csv文件
writer.Flush()
}
func (s *Csv) LoadHostFromCsv() {
// 打开文件
file, err := os.Open(s.Path + "hosts.csv")
if err != nil {
panic(err)
}
defer file.Close()
// 获取csv的reader
reader := csv.NewReader(file)
// 设置FieldsPerRecord为-1
reader.FieldsPerRecord = -1
// 读取文件中所有行保存到slice中
records, err := reader.ReadAll()
if err != nil {
panic(err)
}
var hosts []*HostList
// 将每一行数据保存到内存slice中
for _, item := range records {
post := &HostList{
Vkey: item[2],
Host: item[0],
Target: item[1],
}
hosts = append(hosts, post)
}
s.Hosts = hosts
}
func (s *Csv) GetTaskList(start, length int, typeVal string) ([]*TaskList, int) {
list := make([]*TaskList, 0)
var cnt int
for _, v := range s.Tasks {
if v.Mode != typeVal {
continue
}
cnt++
if start--; start < 0 {
if length--; length > 0 {
if _, ok := s.RunList[v.VerifyKey]; ok {
v.IsRun = 1
} else {
v.IsRun = 0
}
if s, ok := s.Bridge.signalList[getverifyval(v.VerifyKey)]; ok {
if s.Len() > 0 {
v.ClientStatus = 1
} else {
v.ClientStatus = 0
}
} else {
v.ClientStatus = 0
}
list = append(list, v)
}
}
}
return list, cnt
}
func (s *Csv) NewTask(t *TaskList) {
s.Tasks = append(s.Tasks, t)
s.StoreTasksToCsv()
}
func (s *Csv) UpdateTask(t *TaskList) error {
for k, v := range s.Tasks {
if v.VerifyKey == t.VerifyKey {
s.Tasks = append(s.Tasks[:k], s.Tasks[k+1:]...)
s.Tasks = append(s.Tasks, t)
s.StoreTasksToCsv()
return nil
}
}
//TODO:待测试
return errors.New("不存在")
}
func (s *Csv) AddRunList(vKey string, svr interface{}) {
s.RunList[vKey] = svr
}
func (s *Csv) DelRunList(vKey string) {
delete(s.RunList, vKey)
}
func (s *Csv) DelTask(vKey string) error {
for k, v := range s.Tasks {
if v.VerifyKey == vKey {
s.Tasks = append(s.Tasks[:k], s.Tasks[k+1:]...)
s.StoreTasksToCsv()
return nil
}
}
return errors.New("不存在")
}
func (s *Csv) GetTask(vKey string) (v *TaskList, err error) {
for _, v = range s.Tasks {
if v.VerifyKey == vKey {
return
}
}
err = errors.New("未找到")
return
}
func (s *Csv) DelHost(host string) error {
for k, v := range s.Hosts {
if v.Host == host {
s.Hosts = append(s.Hosts[:k], s.Hosts[k+1:]...)
s.StoreHostToCsv()
return nil
}
}
return errors.New("不存在")
}
func (s *Csv) NewHost(t *HostList) {
s.Hosts = append(s.Hosts, t)
s.StoreHostToCsv()
}
func (s *Csv) GetHostList(start, length int, vKey string) ([]*HostList, int) {
list := make([]*HostList, 0)
var cnt int
for _, v := range s.Hosts {
if v.Vkey == vKey {
cnt++
if start--; start < 0 {
if length--; length > 0 {
list = append(list, v)
}
}
}
}
return list, cnt
}

View File

@ -19,7 +19,7 @@ var (
verifyKey = flag.String("vkey", "", "验证密钥") verifyKey = flag.String("vkey", "", "验证密钥")
u = flag.String("u", "", "socks5验证用户名") u = flag.String("u", "", "socks5验证用户名")
p = flag.String("p", "", "socks5验证密码") p = flag.String("p", "", "socks5验证密码")
compress = flag.String("compress", "", "数据压缩方式(gzip|snappy") compress = flag.String("compress", "", "数据压缩方式(snappy")
serverAddr = flag.String("server", "", "服务器地址ip:端口") serverAddr = flag.String("server", "", "服务器地址ip:端口")
crypt = flag.String("crypt", "", "是否加密(1|0)") crypt = flag.String("crypt", "", "是否加密(1|0)")
config Config config Config

View File

@ -30,6 +30,8 @@ WWW-Authenticate: Basic realm="easyProxy"
401 Unauthorized` 401 Unauthorized`
) )
type process func(c *Conn, s *TunnelModeServer) error
type HttpModeServer struct { type HttpModeServer struct {
bridge *Tunnel bridge *Tunnel
httpPort int httpPort int
@ -39,6 +41,7 @@ type HttpModeServer struct {
crypt bool crypt bool
} }
//http
func NewHttpModeServer(httpPort int, bridge *Tunnel, enCompress int, deCompress int, vKey string, crypt bool) *HttpModeServer { func NewHttpModeServer(httpPort int, bridge *Tunnel, enCompress int, deCompress int, vKey string, crypt bool) *HttpModeServer {
s := new(HttpModeServer) s := new(HttpModeServer)
s.bridge = bridge s.bridge = bridge
@ -93,7 +96,7 @@ func (s *HttpModeServer) writeRequest(r *http.Request, conn *Conn) error {
} }
conn.wSign() conn.wSign()
conn.WriteConnInfo(s.enCompress, s.deCompress, s.crypt) conn.WriteConnInfo(s.enCompress, s.deCompress, s.crypt)
c, err := conn.WriteCompress(raw, s.enCompress) c, err := conn.WriteTo(raw, s.enCompress, s.crypt)
if err != nil { if err != nil {
return err return err
} }
@ -112,7 +115,7 @@ func (s *HttpModeServer) writeResponse(w http.ResponseWriter, c *Conn) error {
switch flags { switch flags {
case RES_SIGN: case RES_SIGN:
buf := make([]byte, 1024*1024*32) buf := make([]byte, 1024*1024*32)
n, err := c.ReadFromCompress(buf, s.deCompress) n, err := c.ReadFrom(buf, s.deCompress, s.crypt)
if err != nil { if err != nil {
return err return err
} }
@ -141,8 +144,6 @@ func (s *HttpModeServer) writeResponse(w http.ResponseWriter, c *Conn) error {
return nil return nil
} }
type process func(c *Conn, s *TunnelModeServer) error
type TunnelModeServer struct { type TunnelModeServer struct {
httpPort int httpPort int
tunnelTarget string tunnelTarget string
@ -157,6 +158,7 @@ type TunnelModeServer struct {
crypt bool crypt bool
} }
//tcp|http|host
func NewTunnelModeServer(httpPort int, tunnelTarget string, process process, bridge *Tunnel, enCompress, deCompress int, vKey, basicUser, basicPasswd string, crypt bool) *TunnelModeServer { func NewTunnelModeServer(httpPort int, tunnelTarget string, process process, bridge *Tunnel, enCompress, deCompress int, vKey, basicUser, basicPasswd string, crypt bool) *TunnelModeServer {
s := new(TunnelModeServer) s := new(TunnelModeServer)
s.httpPort = httpPort s.httpPort = httpPort
@ -191,6 +193,8 @@ func (s *TunnelModeServer) Start() error {
} }
return nil return nil
} }
//权限认证
func (s *TunnelModeServer) auth(r *http.Request, c *Conn) error { func (s *TunnelModeServer) auth(r *http.Request, c *Conn) error {
if s.basicUser != "" && s.basicPassword != "" && !checkAuth(r, s.basicUser, s.basicPassword) { if s.basicUser != "" && s.basicPassword != "" && !checkAuth(r, s.basicUser, s.basicPassword) {
c.Write([]byte(Unauthorized_BYTES)) c.Write([]byte(Unauthorized_BYTES))
@ -200,27 +204,44 @@ func (s *TunnelModeServer) auth(r *http.Request, c *Conn) error {
return nil return nil
} }
//与客户端建立通道
func (s *TunnelModeServer) dealClient(vKey string, en, de int, c *Conn, target string, method string, rb []byte) error {
link, err := s.bridge.GetTunnel(getverifyval(vKey), en, de, s.crypt)
if err != nil {
log.Println(err)
c.Close()
return err
}
if _, err := link.WriteHost(CONN_TCP, target); err != nil {
c.Close()
link.Close()
log.Println(err)
return err
}
if method == "CONNECT" {
fmt.Fprint(c, "HTTP/1.1 200 Connection established\r\n")
} else {
link.WriteTo(rb, en, s.crypt)
}
go relay(link, c, en, s.crypt)
relay(c, link, de, s.crypt)
return nil
}
//close
func (s *TunnelModeServer) Close() error { func (s *TunnelModeServer) Close() error {
return s.listener.Close() return s.listener.Close()
} }
//tcp隧道模式 //tcp隧道模式
func ProcessTunnel(c *Conn, s *TunnelModeServer) error { func ProcessTunnel(c *Conn, s *TunnelModeServer) error {
link, err := s.bridge.GetTunnel(getverifyval(s.vKey), s.enCompress, s.deCompress, s.crypt) method, _, rb, err, r := c.GetHost()
if err != nil { if err == nil {
log.Println(err) if err := s.auth(r, c); err != nil {
c.Close()
return err return err
} }
if _, err := link.WriteHost(CONN_TCP, s.tunnelTarget); err != nil {
link.Close()
c.Close()
log.Println(err)
return err
} }
go relay(link, c, s.enCompress, s.crypt) return s.dealClient(s.vKey, s.enCompress, s.deCompress, c, s.tunnelTarget, method, rb)
relay(c, link, s.deCompress, s.crypt)
return nil
} }
//http代理模式 //http代理模式
@ -233,26 +254,7 @@ func ProcessHttp(c *Conn, s *TunnelModeServer) error {
if err := s.auth(r, c); err != nil { if err := s.auth(r, c); err != nil {
return err return err
} }
link, err := s.bridge.GetTunnel(getverifyval(s.vKey), s.enCompress, s.deCompress, s.crypt) return s.dealClient(s.vKey, s.enCompress, s.deCompress, c, addr, method, rb)
if err != nil {
log.Println(err)
c.Close()
return err
}
if _, err := link.WriteHost(CONN_TCP, addr); err != nil {
c.Close()
link.Close()
log.Println(err)
return err
}
if method == "CONNECT" {
fmt.Fprint(c, "HTTP/1.1 200 Connection established\r\n")
} else {
link.WriteCompress(rb, s.enCompress)
}
go relay(link, c, s.enCompress, s.crypt)
relay(c, link, s.deCompress, s.crypt)
return nil
} }
//多客户端域名代理 //多客户端域名代理
@ -271,26 +273,7 @@ func ProcessHost(c *Conn, s *TunnelModeServer) error {
return err return err
} }
de, en := getCompressType(task.Compress) de, en := getCompressType(task.Compress)
link, err := s.bridge.GetTunnel(getverifyval(host.Vkey), en, de, s.crypt) return s.dealClient(host.Vkey, en, de, c, host.Target, method, rb)
if err != nil {
log.Println(err)
c.Close()
return err
}
if _, err := link.WriteHost(CONN_TCP, host.Target); err != nil {
c.Close()
link.Close()
log.Println(err)
return err
}
if method == "CONNECT" {
fmt.Fprint(c, "HTTP/1.1 200 Connection established\r\n")
} else {
link.WriteCompress(rb, en)
}
go relay(link, c, en, s.crypt)
relay(c, link, de, s.crypt)
return nil
} }
//web管理方式 //web管理方式
@ -320,6 +303,7 @@ func (s *WebServer) Start() {
beego.Run() beego.Run()
} }
//new
func NewWebServer(bridge *Tunnel) *WebServer { func NewWebServer(bridge *Tunnel) *WebServer {
s := new(WebServer) s := new(WebServer)
s.bridge = bridge s.bridge = bridge
@ -343,6 +327,7 @@ func NewHostServer(crypt bool) *HostServer {
return s return s
} }
//close
func (s *HostServer) Close() error { func (s *HostServer) Close() error {
return nil return nil
} }

View File

@ -56,6 +56,7 @@ type Sock5ModeServer struct {
crypt bool crypt bool
} }
//req
func (s *Sock5ModeServer) handleRequest(c net.Conn) { func (s *Sock5ModeServer) handleRequest(c net.Conn) {
/* /*
The SOCKS request is formed as follows: The SOCKS request is formed as follows:
@ -88,6 +89,7 @@ func (s *Sock5ModeServer) handleRequest(c net.Conn) {
} }
} }
//reply
func (s *Sock5ModeServer) sendReply(c net.Conn, rep uint8) { func (s *Sock5ModeServer) sendReply(c net.Conn, rep uint8) {
reply := []byte{ reply := []byte{
5, 5,
@ -108,6 +110,7 @@ func (s *Sock5ModeServer) sendReply(c net.Conn, rep uint8) {
c.Write(reply) c.Write(reply)
} }
//do conn
func (s *Sock5ModeServer) doConnect(c net.Conn, command uint8) (proxyConn *Conn, err error) { func (s *Sock5ModeServer) doConnect(c net.Conn, command uint8) (proxyConn *Conn, err error) {
addrType := make([]byte, 1) addrType := make([]byte, 1)
c.Read(addrType) c.Read(addrType)
@ -154,6 +157,7 @@ func (s *Sock5ModeServer) doConnect(c net.Conn, command uint8) (proxyConn *Conn,
return client, nil return client, nil
} }
//conn
func (s *Sock5ModeServer) handleConnect(c net.Conn) { func (s *Sock5ModeServer) handleConnect(c net.Conn) {
proxyConn, err := s.doConnect(c, connectMethod) proxyConn, err := s.doConnect(c, connectMethod)
if err != nil { if err != nil {
@ -170,6 +174,7 @@ func (s *Sock5ModeServer) handleConnect(c net.Conn) {
func (s *Sock5ModeServer) handleBind(c net.Conn) { func (s *Sock5ModeServer) handleBind(c net.Conn) {
} }
//udp
func (s *Sock5ModeServer) handleUDP(c net.Conn) { func (s *Sock5ModeServer) handleUDP(c net.Conn) {
log.Println("UDP Associate") log.Println("UDP Associate")
/* /*
@ -198,6 +203,7 @@ func (s *Sock5ModeServer) handleUDP(c net.Conn) {
} }
} }
//new conn
func (s *Sock5ModeServer) handleNewConn(c net.Conn) { func (s *Sock5ModeServer) handleNewConn(c net.Conn) {
buf := make([]byte, 2) buf := make([]byte, 2)
if _, err := io.ReadFull(c, buf); err != nil { if _, err := io.ReadFull(c, buf); err != nil {
@ -234,6 +240,7 @@ func (s *Sock5ModeServer) handleNewConn(c net.Conn) {
s.handleRequest(c) s.handleRequest(c)
} }
//socks5 auth
func (s *Sock5ModeServer) Auth(c net.Conn) error { func (s *Sock5ModeServer) Auth(c net.Conn) error {
header := []byte{0, 0} header := []byte{0, 0}
if _, err := io.ReadAtLeast(c, header, 2); err != nil { if _, err := io.ReadAtLeast(c, header, 2); err != nil {
@ -269,6 +276,7 @@ func (s *Sock5ModeServer) Auth(c net.Conn) error {
return errors.New("未知错误") return errors.New("未知错误")
} }
//start
func (s *Sock5ModeServer) Start() error { func (s *Sock5ModeServer) Start() error {
s.listener, err = net.Listen("tcp", ":"+strconv.Itoa(s.httpPort)) s.listener, err = net.Listen("tcp", ":"+strconv.Itoa(s.httpPort))
if err != nil { if err != nil {
@ -287,10 +295,12 @@ func (s *Sock5ModeServer) Start() error {
return nil return nil
} }
//close
func (s *Sock5ModeServer) Close() error { func (s *Sock5ModeServer) Close() error {
return s.listener.Close() return s.listener.Close()
} }
//new
func NewSock5ModeServer(httpPort int, u, p string, brige *Tunnel, enCompress int, deCompress int, vKey string, crypt bool) *Sock5ModeServer { func NewSock5ModeServer(httpPort int, u, p string, brige *Tunnel, enCompress int, deCompress int, vKey string, crypt bool) *Sock5ModeServer {
s := new(Sock5ModeServer) s := new(Sock5ModeServer)
s.httpPort = httpPort s.httpPort = httpPort

View File

@ -1,7 +1,6 @@
package lib package lib
import ( import (
"fmt"
"io" "io"
"log" "log"
"net" "net"
@ -47,7 +46,6 @@ func (s *UdpModeServer) Start() error {
if strings.Contains(err.Error(), "use of closed network connection") { if strings.Contains(err.Error(), "use of closed network connection") {
break break
} }
log.Println(err)
continue continue
} }
go s.process(addr, data[:n]) go s.process(addr, data[:n])
@ -57,8 +55,6 @@ func (s *UdpModeServer) Start() error {
//TODO:效率问题有待解决 //TODO:效率问题有待解决
func (s *UdpModeServer) process(addr *net.UDPAddr, data []byte) { func (s *UdpModeServer) process(addr *net.UDPAddr, data []byte) {
fmt.Println(addr.String())
fmt.Println(string(data))
conn, err := s.bridge.GetTunnel(getverifyval(s.vKey), s.enCompress, s.deCompress, s.crypt) conn, err := s.bridge.GetTunnel(getverifyval(s.vKey), s.enCompress, s.deCompress, s.crypt)
if err != nil { if err != nil {
log.Println(err) log.Println(err)
@ -68,11 +64,11 @@ func (s *UdpModeServer) process(addr *net.UDPAddr, data []byte) {
conn.Close() conn.Close()
return return
} }
conn.WriteCompress(data, s.enCompress) conn.WriteTo(data, s.enCompress,s.crypt)
go func(addr *net.UDPAddr, conn *Conn) { go func(addr *net.UDPAddr, conn *Conn) {
buf := make([]byte, 1024) buf := make([]byte, 1024)
conn.conn.SetReadDeadline(time.Now().Add(time.Duration(time.Second * 3))) conn.conn.SetReadDeadline(time.Now().Add(time.Duration(time.Second * 3)))
n, err := conn.ReadFromCompress(buf, s.deCompress) n, err := conn.ReadFrom(buf, s.deCompress,s.crypt)
if err != nil || err == io.EOF { if err != nil || err == io.EOF {
conn.Close() conn.Close()
return return

View File

@ -16,19 +16,11 @@ import (
"regexp" "regexp"
"strconv" "strconv"
"strings" "strings"
"sync"
) )
var ( var (
disabledRedirect = errors.New("disabled redirect.") disabledRedirect = errors.New("disabled redirect.")
bufPool = &sync.Pool{
New: func() interface{} {
return make([]byte, 32*1024)
},
}
) )
//pool 实现
type bufType [32 * 1024]byte
const ( const (
COMPRESS_NONE_ENCODE = iota COMPRESS_NONE_ENCODE = iota
@ -37,6 +29,7 @@ const (
COMPRESS_SNAPY_DECODE COMPRESS_SNAPY_DECODE
) )
//error
func BadRequest(w http.ResponseWriter) { func BadRequest(w http.ResponseWriter) {
http.Error(w, http.StatusText(http.StatusBadRequest), http.StatusBadRequest) http.Error(w, http.StatusText(http.StatusBadRequest), http.StatusBadRequest)
} }
@ -95,7 +88,7 @@ func DecodeRequest(data []byte) (*http.Request, error) {
return req, nil return req, nil
} }
//// 将response转为字节 // 将response转为字节
func EncodeResponse(r *http.Response) ([]byte, error) { func EncodeResponse(r *http.Response) ([]byte, error) {
respBytes, err := httputil.DumpResponse(r, true) respBytes, err := httputil.DumpResponse(r, true)
if err != nil { if err != nil {
@ -116,6 +109,7 @@ func DecodeResponse(data []byte) (*http.Response, error) {
return resp, nil return resp, nil
} }
// 根据host地址从配置是文件中查找对应目标
func getHost(str string) (string, error) { func getHost(str string) (string, error) {
for _, v := range config.SiteList { for _, v := range config.SiteList {
if v.Host == str { if v.Host == str {
@ -125,6 +119,7 @@ func getHost(str string) (string, error) {
return "", errors.New("没有找到解析的的host!") return "", errors.New("没有找到解析的的host!")
} }
//替换
func replaceHost(resp []byte) []byte { func replaceHost(resp []byte) []byte {
str := string(resp) str := string(resp)
for _, v := range config.SiteList { for _, v := range config.SiteList {
@ -134,8 +129,8 @@ func replaceHost(resp []byte) []byte {
return []byte(str) return []byte(str)
} }
//copy
func relay(in, out *Conn, compressType int, crypt bool) { func relay(in, out *Conn, compressType int, crypt bool) {
fmt.Println(crypt)
switch compressType { switch compressType {
case COMPRESS_SNAPY_ENCODE: case COMPRESS_SNAPY_ENCODE:
copyBuffer(NewSnappyConn(in.conn, crypt), out) copyBuffer(NewSnappyConn(in.conn, crypt), out)
@ -264,7 +259,7 @@ func GetStrByBool(b bool) string {
return "0" return "0"
} }
// io.copy的优化版读取buffer长度原为32*1024与snappy不同导致读取出的内容存在差异不利于解密 // io.copy的优化版读取buffer长度原为32*1024与snappy不同导致读取出的内容存在差异不利于解密,特此修改
func copyBuffer(dst io.Writer, src io.Reader) (written int64, err error) { func copyBuffer(dst io.Writer, src io.Reader) (written int64, err error) {
// If the reader has a WriteTo method, use it to do the copy. // If the reader has a WriteTo method, use it to do the copy.
// Avoids an allocation and a copy. // Avoids an allocation and a copy.