将common包改名为utils, 因为common太长了

This commit is contained in:
hahahrfool
2022-03-17 08:11:56 +08:00
parent 99afcc9eb8
commit c9cf683a58
18 changed files with 130 additions and 81 deletions

View File

@@ -1,3 +1,14 @@
# 该Makefile 只支持linux中使用. 不过幸亏golang厉害交叉编译相当简单
#
# for building with filename "verysimple" and pack into verysimple_xxx.tgz:
# make PACK=1
#
# 我们只支持64位
#
# for embedding geoip file:
# make tags="embed_geoip" macm1
# 目前发布版直接使用go1.18编译你如果想编译出相同文件也要使用go1.18才行
BUILD_VERSION := v1.0.4 BUILD_VERSION := v1.0.4
prefix :=verysimple prefix :=verysimple
@@ -8,10 +19,7 @@ macosAmd :=_macos_
macosArm :=_macos_m1_ macosArm :=_macos_m1_
windows :=_win10_ windows :=_win10_
# for building with filename "verysimple" and pack into verysimple_xxx.tgz:
# make PACK=1
#我们只支持64位
linuxAmdFn:=${prefix}${linuxAmd}${BUILD_VERSION} linuxAmdFn:=${prefix}${linuxAmd}${BUILD_VERSION}
linuxArmFn:=${prefix}${linuxArm}${BUILD_VERSION} linuxArmFn:=${prefix}${linuxArm}${BUILD_VERSION}
@@ -19,8 +27,6 @@ macFn :=${prefix}${macosAmd}${BUILD_VERSION}
macM1Fn :=${prefix}${macosArm}${BUILD_VERSION} macM1Fn :=${prefix}${macosArm}${BUILD_VERSION}
winFn :=${prefix}${windows}${BUILD_VERSION} winFn :=${prefix}${windows}${BUILD_VERSION}
# for embedding geoip file:
# make tags="embed_geoip" macm1
cmd:=go build -tags $(tags) -trimpath -ldflags "-X 'main.Version=${BUILD_VERSION}' -s -w -buildid=" -o cmd:=go build -tags $(tags) -trimpath -ldflags "-X 'main.Version=${BUILD_VERSION}' -s -w -buildid=" -o

View File

@@ -140,7 +140,7 @@ v2ray_simple -c server.json
关于 vlesss 的配置,查看 server.example.json和 client.example.json就知道了很简单的。 关于 vlesss 的配置,查看 server.example.json和 client.example.json就知道了很简单的。
目前配置文件一共就4行其中两行还是花括号这要是还要我解释我就打你屁股 目前配置文件最短情况一共就4行其中两行还是花括号这要是还要我解释我就踢你的屁股
## 验证方式 ## 验证方式
@@ -160,6 +160,10 @@ v2ray_simple -c server.json
再次重复,文档越多越好,尽量降低开发者入门的门槛。 再次重复,文档越多越好,尽量降低开发者入门的门槛。
我有时也会时常在 discussion里发一些研究、讨论的文章大家也要踊跃发言
https://github.com/hahahrfool/v2ray_simple/discussions
### 代码 ### 代码
代码的理念就是极简!这也是本项目名字由来! 代码的理念就是极简!这也是本项目名字由来!

View File

@@ -6,7 +6,7 @@ import (
"io/ioutil" "io/ioutil"
"os" "os"
"github.com/hahahrfool/v2ray_simple/common" "github.com/hahahrfool/v2ray_simple/utils"
) )
type Config struct { type Config struct {
@@ -20,7 +20,7 @@ type RouteStruct struct {
} }
func loadConfig(fileName string) (*Config, error) { func loadConfig(fileName string) (*Config, error) {
path := common.GetFilePath(fileName) path := utils.GetFilePath(fileName)
if len(path) > 0 { if len(path) > 0 {
if cf, err := os.Open(path); err == nil { if cf, err := os.Open(path); err == nil {
defer cf.Close() defer cf.Close()
@@ -38,7 +38,7 @@ func loadConfig(fileName string) (*Config, error) {
func loadConfigFromStr(str string) (*Config, error) { func loadConfigFromStr(str string) (*Config, error) {
config := &Config{} config := &Config{}
if err := json.Unmarshal([]byte(str), config); err != nil { if err := json.Unmarshal([]byte(str), config); err != nil {
return nil, common.NewErr("can not parse config ", err) return nil, utils.NewErr("can not parse config ", err)
} }
return config, nil return config, nil
} }

View File

@@ -1,5 +1,5 @@
/* /*
Package httpLayer 提供http层的一些方法和定义 Package httpLayer 提供http层的一些方法和定义比如fallback
*/ */
package httpLayer package httpLayer

41
main.go
View File

@@ -12,31 +12,23 @@ import (
"syscall" "syscall"
"time" "time"
"github.com/hahahrfool/v2ray_simple/common"
"github.com/hahahrfool/v2ray_simple/httpLayer" "github.com/hahahrfool/v2ray_simple/httpLayer"
"github.com/hahahrfool/v2ray_simple/netLayer" "github.com/hahahrfool/v2ray_simple/netLayer"
"github.com/hahahrfool/v2ray_simple/proxy/direct" "github.com/hahahrfool/v2ray_simple/proxy/direct"
"github.com/hahahrfool/v2ray_simple/proxy/socks5" "github.com/hahahrfool/v2ray_simple/proxy/socks5"
"github.com/hahahrfool/v2ray_simple/proxy/vless" "github.com/hahahrfool/v2ray_simple/proxy/vless"
"github.com/hahahrfool/v2ray_simple/tlsLayer" "github.com/hahahrfool/v2ray_simple/tlsLayer"
"github.com/hahahrfool/v2ray_simple/utils"
"github.com/hahahrfool/v2ray_simple/proxy" "github.com/hahahrfool/v2ray_simple/proxy"
) )
const (
log_debug = iota
log_info
log_warning
log_error
)
var ( var (
desc = "v2ray_simple, a very simple implementation of V2Ray, 并且在某些地方试图走在v2ray前面" desc = "v2ray_simple, a very simple implementation of V2Ray, 并且在某些地方试图走在v2ray前面"
configFileName string configFileName string
uniqueTestDomain string //有时需要测试到单一网站的流量,此时为了避免其它干扰,需要在这里声明 一下 该域名,然后程序里会进行过滤 uniqueTestDomain string //有时需要测试到单一网站的流量,此时为了避免其它干扰,需要在这里声明 一下 该域名,然后程序里会进行过滤
logLevel int //值越小越唠叨, 废话越多值越大打印的越少见log_开头的常量
//另外本作暂时不考虑引入外界log包。依赖越少越好。 //另外本作暂时不考虑引入外界log包。依赖越少越好。
@@ -52,8 +44,6 @@ var (
func init() { func init() {
directClient, _ = proxy.ClientFromURL("direct://") directClient, _ = proxy.ClientFromURL("direct://")
flag.IntVar(&logLevel, "ll", log_warning, "log level,0=debug, 1=info, 2=warning, 3=error")
flag.BoolVar(&tls_lazy_encrypt, "lazy", false, "tls lazy encrypt (splice)") flag.BoolVar(&tls_lazy_encrypt, "lazy", false, "tls lazy encrypt (splice)")
flag.BoolVar(&tls_lazy_secure, "ls", false, "tls lazy secure, use special techs to ensure the tls lazy encrypt data can't be detected. Only valid at client end.") flag.BoolVar(&tls_lazy_secure, "ls", false, "tls lazy secure, use special techs to ensure the tls lazy encrypt data can't be detected. Only valid at client end.")
@@ -81,13 +71,17 @@ func main() {
conf, err = loadConfig(configFileName) conf, err = loadConfig(configFileName)
if err != nil { if err != nil {
log.Println("can not load config file: ", err) log.Println("can not load config file: ", err)
os.Exit(-1) os.Exit(-1)
} }
localServer, err := proxy.ServerFromURL(conf.Server_ThatListenPort_Url) localServer, err := proxy.ServerFromURL(conf.Server_ThatListenPort_Url)
if err != nil { if err != nil {
log.Println("can not create local server: ", err) log.Println("can not create local server: ", err)
os.Exit(-1) os.Exit(-1)
} }
defer localServer.Stop() defer localServer.Stop()
@@ -115,7 +109,11 @@ func main() {
log.Println("can not listen on", localServer.AddrStr(), err) log.Println("can not listen on", localServer.AddrStr(), err)
os.Exit(-1) os.Exit(-1)
} }
log.Println(localServer.Name(), "is listening TCP on ", localServer.AddrStr())
if utils.CanLogInfo() {
log.Println(localServer.Name(), "is listening TCP on ", localServer.AddrStr())
}
// 后台运行主代码而main函数只监听中断信号 // 后台运行主代码而main函数只监听中断信号
// TODO: 未来main函数可以推出 交互模式,等未来推出动态增删用户、查询流量等功能时就有用 // TODO: 未来main函数可以推出 交互模式,等未来推出动态增删用户、查询流量等功能时就有用
@@ -152,7 +150,10 @@ func handleNewIncomeConnection(localServer proxy.Server, remoteClient proxy.Clie
baseLocalConn := thisLocalConnectionInstance baseLocalConn := thisLocalConnectionInstance
//log.Println("got new", thisLocalConnectionInstance.RemoteAddr().String()) if utils.CanLogInfo() {
log.Println("got new", thisLocalConnectionInstance.RemoteAddr().String())
}
var err error var err error
@@ -224,7 +225,7 @@ afterLocalServerHandshake:
//如果可以route //如果可以route
if !localServer.CantRoute() && routePolicy != nil { if !localServer.CantRoute() && routePolicy != nil {
if logLevel <= log_info { if utils.CanLogInfo() {
log.Println("enabling routing feature") log.Println("enabling routing feature")
} }
@@ -235,7 +236,7 @@ afterLocalServerHandshake:
}) })
if outtag == "direct" { if outtag == "direct" {
client = directClient client = directClient
if logLevel <= log_info { if utils.CanLogInfo() {
log.Println("routed to direct", targetAddr.UrlString()) log.Println("routed to direct", targetAddr.UrlString())
} }
} }
@@ -450,7 +451,7 @@ afterLocalServerHandshake:
if theFallback != nil { if theFallback != nil {
//这里注意因为是吧tls解密了之后的数据发送到目标地址所以这种方式只支持转发到本机纯http服务器 //这里注意因为是吧tls解密了之后的数据发送到目标地址所以这种方式只支持转发到本机纯http服务器
wrc.Write(theFallback.FirstBuffer().Bytes()) wrc.Write(theFallback.FirstBuffer().Bytes())
common.PutBytes(theFallback.FirstBuffer().Bytes()) //这个Buf不是从common.GetBuf创建的而是从一个 GetBytes的[]byte 包装 的 utils.PutBytes(theFallback.FirstBuffer().Bytes()) //这个Buf不是从utils.GetBuf创建的而是从一个 GetBytes的[]byte 包装 的
} }
/* /*
@@ -548,7 +549,7 @@ func tryRawCopy(useSecureMethod bool, proxy_client proxy.UserClient, proxy_serve
//wrc 要实现 ReaderFrom才行, 或者把最底层TCPConn暴露然后 wlccc 也要把最底层 TCPConn暴露出来 //wrc 要实现 ReaderFrom才行, 或者把最底层TCPConn暴露然后 wlccc 也要把最底层 TCPConn暴露出来
// 这里就直接采取底层方式 // 这里就直接采取底层方式
p := common.GetPacket() p := utils.GetPacket()
isgood := false isgood := false
isbad := false isbad := false
@@ -704,7 +705,7 @@ func tryRawCopy(useSecureMethod bool, proxy_client proxy.UserClient, proxy_serve
} }
} }
} }
common.PutPacket(p) utils.PutPacket(p)
if isbad { if isbad {
//直接退化成普通Copy //直接退化成普通Copy
@@ -732,7 +733,7 @@ func tryRawCopy(useSecureMethod bool, proxy_client proxy.UserClient, proxy_serve
isgood2 := false isgood2 := false
isbad2 := false isbad2 := false
p := common.GetPacket() p := utils.GetPacket()
count := 0 count := 0
@@ -809,7 +810,7 @@ func tryRawCopy(useSecureMethod bool, proxy_client proxy.UserClient, proxy_serve
isbad2 = true isbad2 = true
} }
} }
common.PutPacket(p) utils.PutPacket(p)
if isbad2 { if isbad2 {

View File

@@ -104,9 +104,9 @@ import (
"net/url" "net/url"
"strings" "strings"
"github.com/hahahrfool/v2ray_simple/common"
"github.com/hahahrfool/v2ray_simple/netLayer" "github.com/hahahrfool/v2ray_simple/netLayer"
"github.com/hahahrfool/v2ray_simple/tlsLayer" "github.com/hahahrfool/v2ray_simple/tlsLayer"
"github.com/hahahrfool/v2ray_simple/utils"
) )
// 给一个节点 提供 VSI中 第 5-7层 的支持, server和 client通用. 个别方法只能用于某一端 // 给一个节点 提供 VSI中 第 5-7层 的支持, server和 client通用. 个别方法只能用于某一端
@@ -250,7 +250,7 @@ func ClientFromURL(s string) (Client, error) {
u, err := url.Parse(s) u, err := url.Parse(s)
if err != nil { if err != nil {
return nil, common.NewDataErr("can not parse client url", err, s) return nil, utils.NewDataErr("can not parse client url", err, s)
} }
schemeName := strings.ToLower(u.Scheme) schemeName := strings.ToLower(u.Scheme)
@@ -279,7 +279,7 @@ func ClientFromURL(s string) (Client, error) {
} }
return nil, common.NewDataErr("unknown client scheme '", nil, u.Scheme) return nil, utils.NewDataErr("unknown client scheme '", nil, u.Scheme)
} }
// Server 用于监听 客户端 的连接 // Server 用于监听 客户端 的连接
@@ -328,7 +328,7 @@ func PrintAllClientNames() {
func ServerFromURL(s string) (Server, error) { func ServerFromURL(s string) (Server, error) {
u, err := url.Parse(s) u, err := url.Parse(s)
if err != nil { if err != nil {
return nil, common.NewDataErr("can not parse server url ", err, s) return nil, utils.NewDataErr("can not parse server url ", err, s)
} }
schemeName := strings.ToLower(u.Scheme) schemeName := strings.ToLower(u.Scheme)
@@ -358,7 +358,7 @@ func ServerFromURL(s string) (Server, error) {
} }
} }
return nil, common.NewDataErr("unknown server scheme '", nil, u.Scheme) return nil, utils.NewDataErr("unknown server scheme '", nil, u.Scheme)
} }
func configCommonForServer(ser ProxyCommon, u *url.URL) { func configCommonForServer(ser ProxyCommon, u *url.URL) {

View File

@@ -11,8 +11,8 @@ import (
"net/url" "net/url"
"time" "time"
"github.com/hahahrfool/v2ray_simple/common"
"github.com/hahahrfool/v2ray_simple/netLayer" "github.com/hahahrfool/v2ray_simple/netLayer"
"github.com/hahahrfool/v2ray_simple/utils"
"github.com/hahahrfool/v2ray_simple/proxy" "github.com/hahahrfool/v2ray_simple/proxy"
) )
@@ -62,8 +62,8 @@ func (s *Server) Handshake(underlay net.Conn) (io.ReadWriter, *netLayer.Addr, er
} }
defer underlay.SetReadDeadline(time.Time{}) defer underlay.SetReadDeadline(time.Time{})
buf := common.GetPacket() buf := utils.GetPacket()
defer common.PutPacket(buf) defer utils.PutPacket(buf)
// Read hello message // Read hello message
// 一般握手包发来的是 [5 1 0] // 一般握手包发来的是 [5 1 0]

View File

@@ -11,9 +11,9 @@ import (
"strconv" "strconv"
"sync" "sync"
"github.com/hahahrfool/v2ray_simple/common"
"github.com/hahahrfool/v2ray_simple/netLayer" "github.com/hahahrfool/v2ray_simple/netLayer"
"github.com/hahahrfool/v2ray_simple/proxy" "github.com/hahahrfool/v2ray_simple/proxy"
"github.com/hahahrfool/v2ray_simple/utils"
) )
func init() { func init() {
@@ -101,7 +101,7 @@ func (c *Client) Handshake(underlay net.Conn, target *netLayer.Addr) (io.ReadWri
UMFURS_conn.Write(buf.Bytes()) UMFURS_conn.Write(buf.Bytes())
common.PutBuf(buf) utils.PutBuf(buf)
bs := []byte{0} bs := []byte{0}
n, err := UMFURS_conn.Read(bs) n, err := UMFURS_conn.Read(bs)
@@ -131,7 +131,7 @@ func (c *Client) Handshake(underlay net.Conn, target *netLayer.Addr) (io.ReadWri
_, err = underlay.Write(buf.Bytes()) _, err = underlay.Write(buf.Bytes())
common.PutBuf(buf) utils.PutBuf(buf)
return &UserConn{ return &UserConn{
Conn: underlay, Conn: underlay,
@@ -192,7 +192,7 @@ func (c *Client) WriteUDPRequest(a *net.UDPAddr, b []byte) (err error) {
func (c *Client) getBufWithCmd(cmd byte) *bytes.Buffer { func (c *Client) getBufWithCmd(cmd byte) *bytes.Buffer {
v := c.version v := c.version
buf := common.GetBuf() buf := utils.GetBuf()
buf.WriteByte(byte(v)) //version buf.WriteByte(byte(v)) //version
buf.Write(c.user[:]) buf.Write(c.user[:])
if v == 0 { if v == 0 {
@@ -215,7 +215,7 @@ func (c *Client) handle_CRUMFURS(UMFURS_conn net.Conn) {
if c.HasAdvancedApplicationLayer() { if c.HasAdvancedApplicationLayer() {
buf_for_umfurs := common.GetPacket() buf_for_umfurs := utils.GetPacket()
n, err := UMFURS_conn.Read(buf_for_umfurs) n, err := UMFURS_conn.Read(buf_for_umfurs)
if err != nil { if err != nil {
break break

View File

@@ -13,10 +13,10 @@ import (
"time" "time"
"unsafe" "unsafe"
"github.com/hahahrfool/v2ray_simple/common"
"github.com/hahahrfool/v2ray_simple/httpLayer" "github.com/hahahrfool/v2ray_simple/httpLayer"
"github.com/hahahrfool/v2ray_simple/netLayer" "github.com/hahahrfool/v2ray_simple/netLayer"
"github.com/hahahrfool/v2ray_simple/proxy" "github.com/hahahrfool/v2ray_simple/proxy"
"github.com/hahahrfool/v2ray_simple/utils"
) )
func init() { func init() {
@@ -143,19 +143,19 @@ func (s *Server) Handshake(underlay net.Conn) (io.ReadWriter, *netLayer.Addr, er
// 因此v1.0.3以及更老版本都是直接一段一段read的。 // 因此v1.0.3以及更老版本都是直接一段一段read的。
//但是因为需要支持fallback技术所以还是要 进行缓存, 然后返回的UserConn要使用MultiReader重用之前读过的部分没办法。 //但是因为需要支持fallback技术所以还是要 进行缓存, 然后返回的UserConn要使用MultiReader重用之前读过的部分没办法。
readbs := common.GetBytes(common.StandardBytesLength) readbs := utils.GetBytes(utils.StandardBytesLength)
//var auth [17]byte //var auth [17]byte
wholeReadLen, err := underlay.Read(readbs) wholeReadLen, err := underlay.Read(readbs)
if err != nil { if err != nil {
return nil, nil, common.NewDataErr("read err", err, wholeReadLen) return nil, nil, utils.NewDataErr("read err", err, wholeReadLen)
} }
if wholeReadLen < 17 { if wholeReadLen < 17 {
//根据下面回答HTTP的最小长度恰好是16字节但是是0.9版本。1.0是18字节1.1还要更长。总之我们可以直接不返回fallback地址 //根据下面回答HTTP的最小长度恰好是16字节但是是0.9版本。1.0是18字节1.1还要更长。总之我们可以直接不返回fallback地址
//https://stackoverflow.com/questions/25047905/http-request-minimum-size-in-bytes/25065089 //https://stackoverflow.com/questions/25047905/http-request-minimum-size-in-bytes/25065089
return nil, nil, common.NewDataErr("fallback, msg too short", nil, wholeReadLen) return nil, nil, utils.NewDataErr("fallback, msg too short", nil, wholeReadLen)
} }
@@ -183,7 +183,7 @@ realPart:
version := auth[0] version := auth[0]
if version > 1 { if version > 1 {
returnErr = common.NewDataErr("Vless invalid version ", nil, version) returnErr = utils.NewDataErr("Vless invalid version ", nil, version)
goto errorPart goto errorPart
} }
@@ -215,9 +215,9 @@ realPart:
//读一下然后直接舍弃 //读一下然后直接舍弃
/* /*
tmpBuf := common.GetBytes(int(addonLenByte)) tmpBuf := utils.GetBytes(int(addonLenByte))
underlay.Read(tmpBuf) underlay.Read(tmpBuf)
common.PutBytes(tmpBuf) utils.PutBytes(tmpBuf)
*/ */
if tmpbs := readbuf.Next(int(addonLenByte)); len(tmpbs) != int(addonLenByte) { if tmpbs := readbuf.Next(int(addonLenByte)); len(tmpbs) != int(addonLenByte) {
return nil, nil, errors.New("vless short read in addon") return nil, nil, errors.New("vless short read in addon")
@@ -252,7 +252,7 @@ realPart:
_, err = underlay.Write([]byte{CRUMFURS_ESTABLISHED}) _, err = underlay.Write([]byte{CRUMFURS_ESTABLISHED})
if err != nil { if err != nil {
returnErr = common.NewErr("write to crumfurs err", err) returnErr = utils.NewErr("write to crumfurs err", err)
goto errorPart goto errorPart
} }
@@ -300,7 +300,7 @@ realPart:
case netLayer.AtypIP4: case netLayer.AtypIP4:
ip_or_domain_bytesLength = net.IPv4len ip_or_domain_bytesLength = net.IPv4len
addr.IP = common.GetBytes(net.IPv4len) addr.IP = utils.GetBytes(net.IPv4len)
case netLayer.AtypDomain: case netLayer.AtypDomain:
// 解码域名的长度 // 解码域名的长度
@@ -317,14 +317,14 @@ realPart:
case netLayer.AtypIP6: case netLayer.AtypIP6:
ip_or_domain_bytesLength = net.IPv6len ip_or_domain_bytesLength = net.IPv6len
addr.IP = common.GetBytes(net.IPv6len) addr.IP = utils.GetBytes(net.IPv6len)
default: default:
returnErr = fmt.Errorf("unknown address type %v", addrTypeByte) returnErr = fmt.Errorf("unknown address type %v", addrTypeByte)
goto errorPart goto errorPart
} }
ip_or_domain := common.GetBytes(int(ip_or_domain_bytesLength)) ip_or_domain := utils.GetBytes(int(ip_or_domain_bytesLength))
_, err = readbuf.Read(ip_or_domain) _, err = readbuf.Read(ip_or_domain)
@@ -338,7 +338,7 @@ realPart:
addr.Name = string(ip_or_domain) addr.Name = string(ip_or_domain)
} }
common.PutBytes(ip_or_domain) utils.PutBytes(ip_or_domain)
default: default:
@@ -378,7 +378,7 @@ func (c *CRUMFURS) WriteUDPResponse(a *net.UDPAddr, b []byte) (err error) {
if len(a.IP) > 4 { if len(a.IP) > 4 {
atype = netLayer.AtypIP6 atype = netLayer.AtypIP6
} }
buf := common.GetBuf() buf := utils.GetBuf()
buf.WriteByte(atype) buf.WriteByte(atype)
buf.Write(a.IP) buf.Write(a.IP)
@@ -395,6 +395,6 @@ func (c *CRUMFURS) WriteUDPResponse(a *net.UDPAddr, b []byte) (err error) {
_, err = c.Write(buf.Bytes()) _, err = c.Write(buf.Bytes())
common.PutBuf(buf) utils.PutBuf(buf)
return return
} }

View File

@@ -8,8 +8,8 @@ import (
"io" "io"
"net" "net"
"github.com/hahahrfool/v2ray_simple/common"
"github.com/hahahrfool/v2ray_simple/proxy" "github.com/hahahrfool/v2ray_simple/proxy"
"github.com/hahahrfool/v2ray_simple/utils"
) )
const Name = "vless" const Name = "vless"
@@ -64,7 +64,7 @@ func (uc *UserConn) Write(p []byte) (int, error) {
if uc.isServerEnd && !uc.isntFirstPacket { if uc.isServerEnd && !uc.isntFirstPacket {
uc.isntFirstPacket = true uc.isntFirstPacket = true
writeBuf = common.GetBuf() writeBuf = utils.GetBuf()
//v0 中,服务端的回复的第一个包也是要有数据头的(和客户端的handshake类似只是第一个包有)第一字节版本第二字节addon长度都是0 //v0 中,服务端的回复的第一个包也是要有数据头的(和客户端的handshake类似只是第一个包有)第一字节版本第二字节addon长度都是0
@@ -80,7 +80,7 @@ func (uc *UserConn) Write(p []byte) (int, error) {
_, err := uc.Conn.Write(writeBuf.Bytes()) //“直接return这个的长度” 是错的因为写入长度只能小于等于len(p) _, err := uc.Conn.Write(writeBuf.Bytes()) //“直接return这个的长度” 是错的因为写入长度只能小于等于len(p)
common.PutBuf(writeBuf) utils.PutBuf(writeBuf)
if err != nil { if err != nil {
return 0, err return 0, err
@@ -99,7 +99,7 @@ func (uc *UserConn) Write(p []byte) (int, error) {
} else { } else {
l := int16(len(p)) l := int16(len(p))
if writeBuf == nil { if writeBuf == nil {
writeBuf = common.GetBuf() writeBuf = utils.GetBuf()
} }
writeBuf.WriteByte(byte(l >> 8)) writeBuf.WriteByte(byte(l >> 8))
@@ -108,7 +108,7 @@ func (uc *UserConn) Write(p []byte) (int, error) {
_, err := uc.Conn.Write(writeBuf.Bytes()) //“直接return这个的长度” 是错的因为写入长度只能小于等于len(p) _, err := uc.Conn.Write(writeBuf.Bytes()) //“直接return这个的长度” 是错的因为写入长度只能小于等于len(p)
common.PutBuf(writeBuf) utils.PutBuf(writeBuf)
if err != nil { if err != nil {
return 0, err return 0, err
@@ -165,7 +165,7 @@ func (uc *UserConn) Read(p []byte) (int, error) {
uc.isntFirstPacket = true uc.isntFirstPacket = true
bs := common.GetPacket() bs := utils.GetPacket()
n, e := from.Read(bs) n, e := from.Read(bs)
if e != nil { if e != nil {
@@ -176,7 +176,7 @@ func (uc *UserConn) Read(p []byte) (int, error) {
return 0, errors.New("vless response head too short") return 0, errors.New("vless response head too short")
} }
n = copy(p, bs[2:n]) n = copy(p, bs[2:n])
common.PutPacket(bs) utils.PutPacket(bs)
return n, nil return n, nil
} }
@@ -251,7 +251,7 @@ func (uc *UserConn) readudp_withLenthHead(p []byte) (int, error) {
} }
l := int(int16(b1)<<8 + int16(b2)) l := int(int16(b1)<<8 + int16(b2))
bs := common.GetBytes(l) bs := utils.GetBytes(l)
n, err := io.ReadFull(uc.bufr, bs) n, err := io.ReadFull(uc.bufr, bs)
if err != nil { if err != nil {
return 0, err return 0, err

View File

@@ -4,7 +4,7 @@ import (
"crypto/tls" "crypto/tls"
"net" "net"
"github.com/hahahrfool/v2ray_simple/common" "github.com/hahahrfool/v2ray_simple/utils"
) )
type Server struct { type Server struct {
@@ -34,7 +34,7 @@ func (s *Server) Handshake(underlay net.Conn) (tlsConn *Conn, err error) {
rawTlsConn := tls.Server(underlay, s.tlsConfig) rawTlsConn := tls.Server(underlay, s.tlsConfig)
err = rawTlsConn.Handshake() err = rawTlsConn.Handshake()
if err != nil { if err != nil {
err = common.NewErr("tlsLayer: tls握手失败", err) err = utils.NewErr("tlsLayer: tls握手失败", err)
return return
} }

View File

@@ -9,7 +9,7 @@ import (
"net" "net"
"strings" "strings"
"github.com/hahahrfool/v2ray_simple/common" "github.com/hahahrfool/v2ray_simple/utils"
) )
var PDD bool //print tls detect detail var PDD bool //print tls detect detail
@@ -130,7 +130,7 @@ func (c *ComSniff) GetFailReason() int {
} }
// 总之,如果读写都用同样的判断代码的话,客户端和服务端应该就能同步进行 相同的TLS判断 // 总之,如果读写都用同样的判断代码的话,客户端和服务端应该就能同步进行 相同的TLS判断
func (cd *ComSniff) commonDetect(p []byte, isRead bool) { func (cd *ComSniff) utilsDetect(p []byte, isRead bool) {
/* /*
我们把tls的细节放在这个注释里便于参考 我们把tls的细节放在这个注释里便于参考
@@ -441,7 +441,7 @@ func (cd *ComSniff) commonDetect(p []byte, isRead bool) {
if n >= ubl { if n >= ubl {
if cd.UH.HasUserByBytes(p[:ubl]) { if cd.UH.HasUserByBytes(p[:ubl]) {
bs := common.GetBytes(ubl) bs := utils.GetBytes(ubl)
copy(bs, p[:ubl]) copy(bs, p[:ubl])
cd.SpecialCommandBytes = bs cd.SpecialCommandBytes = bs
@@ -506,7 +506,7 @@ func (cd *ComSniff) commonDetect(p []byte, isRead bool) {
} }
func commonFilterStep(err error, cd *ComSniff, p []byte, isRead bool) { func utilsFilterStep(err error, cd *ComSniff, p []byte, isRead bool) {
if !OnlyTest && (cd.DefinitelyNotTLS || cd.IsTls) { //确定了是TLS 或者肯定不是 tls了的话就直接return掉 if !OnlyTest && (cd.DefinitelyNotTLS || cd.IsTls) { //确定了是TLS 或者肯定不是 tls了的话就直接return掉
return return
} }
@@ -524,7 +524,7 @@ func commonFilterStep(err error, cd *ComSniff, p []byte, isRead bool) {
} }
if len(p) > 3 { if len(p) > 3 {
cd.commonDetect(p, isRead) cd.utilsDetect(p, isRead)
} }
} }
@@ -542,7 +542,7 @@ type DetectReader struct {
func (dr *DetectReader) Read(p []byte) (n int, err error) { func (dr *DetectReader) Read(p []byte) (n int, err error) {
n, err = dr.Reader.Read(p) n, err = dr.Reader.Read(p)
commonFilterStep(err, &dr.ComSniff, p[:n], true) utilsFilterStep(err, &dr.ComSniff, p[:n], true)
if PDD { if PDD {
if dr.DefinitelyNotTLS { if dr.DefinitelyNotTLS {
@@ -616,7 +616,7 @@ func (dw *DetectWriter) Write(p []byte) (n int, err error) {
return return
} }
commonFilterStep(nil, &dw.ComSniff, p, false) utilsFilterStep(nil, &dw.ComSniff, p, false)
// 经过判断之后,确认是 tls了则我们缓存这个记录 然后通过tls发送特殊指令 // 经过判断之后,确认是 tls了则我们缓存这个记录 然后通过tls发送特殊指令
if dw.IsTls { if dw.IsTls {

View File

@@ -7,7 +7,7 @@ import (
"net" "net"
"time" "time"
"github.com/hahahrfool/v2ray_simple/common" "github.com/hahahrfool/v2ray_simple/utils"
) )
// 和TeeConn配合的是Recorder, 每次调用Write就会记录一个新Buffer // 和TeeConn配合的是Recorder, 每次调用Write就会记录一个新Buffer
@@ -47,7 +47,7 @@ func (wr *Recorder) ReleaseBuffers() {
wr.Buflist = nil //make([]*bytes.Buffer, 0, 10) wr.Buflist = nil //make([]*bytes.Buffer, 0, 10)
for _, v := range tmp { for _, v := range tmp {
common.PutBuf(v) utils.PutBuf(v)
} }
} }
@@ -68,14 +68,14 @@ func (wr *Recorder) DigestAll() {
} }
// 每Write一遍 就写入一个新的buffer, 使用 common.GetBuf() 获取 // 每Write一遍 就写入一个新的buffer, 使用 utils.GetBuf() 获取
func (wr *Recorder) Write(p []byte) (n int, err error) { func (wr *Recorder) Write(p []byte) (n int, err error) {
if wr.stop { if wr.stop {
return len(p), nil return len(p), nil
} }
if wr.writeCount > 0 { //舍弃第一个包,因为第一个包我们要做 tls的handshake检测 以及 vless的uuid检测所以不可能没有tls的 数据包 if wr.writeCount > 0 { //舍弃第一个包,因为第一个包我们要做 tls的handshake检测 以及 vless的uuid检测所以不可能没有tls的 数据包
buf := common.GetBuf() buf := utils.GetBuf()
n, err = buf.Write(p) n, err = buf.Write(p)
wr.Buflist = append(wr.Buflist, buf) wr.Buflist = append(wr.Buflist, buf)

View File

@@ -1,4 +1,4 @@
package common package utils
import "fmt" import "fmt"

36
utils/log.go Normal file
View File

@@ -0,0 +1,36 @@
package utils
import "flag"
const (
Log_debug = iota
Log_info
Log_warning
Log_error
//Log_fatal 不支持不打印致命输出。既然致命我们一定要尸检然后查看病因啊
//Log_off
)
//LogLevel 值越小越唠叨, 废话越多值越大打印的越少见log_开头的常量;默认是warning级别
var LogLevel int
func init() {
flag.IntVar(&LogLevel, "ll", Log_warning, "log level,0=debug, 1=info, 2=warning, 3=error, 4=fatal, 5=off")
}
//return LogLevel <= l
func CanLogWithLevel(l int) bool {
return LogLevel <= l
}
func CanLogErr() bool {
return LogLevel <= Log_error
}
func CanLogInfo() bool {
return LogLevel <= Log_info
}

View File

@@ -1,4 +1,4 @@
package common package utils
import ( import (
"os" "os"

View File

@@ -1,4 +1,4 @@
package common package utils
import ( import (
"bytes" "bytes"

2
utils/utils.go Normal file
View File

@@ -0,0 +1,2 @@
// Package utils provides utils that needed by all packages of verysimle
package utils