mirror of
https://github.com/e1732a364fed/v2ray_simple.git
synced 2025-10-29 03:02:41 +08:00
将common包改名为utils, 因为common太长了
This commit is contained in:
16
Makefile
16
Makefile
@@ -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
|
||||
|
||||
prefix :=verysimple
|
||||
@@ -8,10 +19,7 @@ macosAmd :=_macos_
|
||||
macosArm :=_macos_m1_
|
||||
windows :=_win10_
|
||||
|
||||
# for building with filename "verysimple" and pack into verysimple_xxx.tgz:
|
||||
# make PACK=1
|
||||
|
||||
#我们只支持64位
|
||||
|
||||
linuxAmdFn:=${prefix}${linuxAmd}${BUILD_VERSION}
|
||||
linuxArmFn:=${prefix}${linuxArm}${BUILD_VERSION}
|
||||
@@ -19,8 +27,6 @@ macFn :=${prefix}${macosAmd}${BUILD_VERSION}
|
||||
macM1Fn :=${prefix}${macosArm}${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
|
||||
|
||||
|
||||
@@ -140,7 +140,7 @@ v2ray_simple -c server.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
|
||||
|
||||
|
||||
### 代码
|
||||
|
||||
代码的理念就是极简!这也是本项目名字由来!
|
||||
|
||||
@@ -6,7 +6,7 @@ import (
|
||||
"io/ioutil"
|
||||
"os"
|
||||
|
||||
"github.com/hahahrfool/v2ray_simple/common"
|
||||
"github.com/hahahrfool/v2ray_simple/utils"
|
||||
)
|
||||
|
||||
type Config struct {
|
||||
@@ -20,7 +20,7 @@ type RouteStruct struct {
|
||||
}
|
||||
|
||||
func loadConfig(fileName string) (*Config, error) {
|
||||
path := common.GetFilePath(fileName)
|
||||
path := utils.GetFilePath(fileName)
|
||||
if len(path) > 0 {
|
||||
if cf, err := os.Open(path); err == nil {
|
||||
defer cf.Close()
|
||||
@@ -38,7 +38,7 @@ func loadConfig(fileName string) (*Config, error) {
|
||||
func loadConfigFromStr(str string) (*Config, error) {
|
||||
config := &Config{}
|
||||
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
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
Package httpLayer 提供http层的一些方法和定义
|
||||
Package httpLayer 提供http层的一些方法和定义,比如fallback
|
||||
*/
|
||||
package httpLayer
|
||||
|
||||
|
||||
39
main.go
39
main.go
@@ -12,31 +12,23 @@ import (
|
||||
"syscall"
|
||||
"time"
|
||||
|
||||
"github.com/hahahrfool/v2ray_simple/common"
|
||||
"github.com/hahahrfool/v2ray_simple/httpLayer"
|
||||
"github.com/hahahrfool/v2ray_simple/netLayer"
|
||||
"github.com/hahahrfool/v2ray_simple/proxy/direct"
|
||||
"github.com/hahahrfool/v2ray_simple/proxy/socks5"
|
||||
"github.com/hahahrfool/v2ray_simple/proxy/vless"
|
||||
"github.com/hahahrfool/v2ray_simple/tlsLayer"
|
||||
"github.com/hahahrfool/v2ray_simple/utils"
|
||||
|
||||
"github.com/hahahrfool/v2ray_simple/proxy"
|
||||
)
|
||||
|
||||
const (
|
||||
log_debug = iota
|
||||
log_info
|
||||
log_warning
|
||||
log_error
|
||||
)
|
||||
|
||||
var (
|
||||
desc = "v2ray_simple, a very simple implementation of V2Ray, 并且在某些地方试图走在v2ray前面"
|
||||
|
||||
configFileName string
|
||||
|
||||
uniqueTestDomain string //有时需要测试到单一网站的流量,此时为了避免其它干扰,需要在这里声明 一下 该域名,然后程序里会进行过滤
|
||||
logLevel int //值越小越唠叨, 废话越多,值越大打印的越少,见log_开头的常量
|
||||
|
||||
//另外,本作暂时不考虑引入外界log包。依赖越少越好。
|
||||
|
||||
@@ -52,8 +44,6 @@ var (
|
||||
func init() {
|
||||
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_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)
|
||||
if err != nil {
|
||||
|
||||
log.Println("can not load config file: ", err)
|
||||
|
||||
os.Exit(-1)
|
||||
}
|
||||
|
||||
localServer, err := proxy.ServerFromURL(conf.Server_ThatListenPort_Url)
|
||||
if err != nil {
|
||||
|
||||
log.Println("can not create local server: ", err)
|
||||
|
||||
os.Exit(-1)
|
||||
}
|
||||
defer localServer.Stop()
|
||||
@@ -115,8 +109,12 @@ func main() {
|
||||
log.Println("can not listen on", localServer.AddrStr(), err)
|
||||
os.Exit(-1)
|
||||
}
|
||||
|
||||
if utils.CanLogInfo() {
|
||||
log.Println(localServer.Name(), "is listening TCP on ", localServer.AddrStr())
|
||||
|
||||
}
|
||||
|
||||
// 后台运行主代码,而main函数只监听中断信号
|
||||
// TODO: 未来main函数可以推出 交互模式,等未来推出动态增删用户、查询流量等功能时就有用
|
||||
go func() {
|
||||
@@ -152,7 +150,10 @@ func handleNewIncomeConnection(localServer proxy.Server, remoteClient proxy.Clie
|
||||
|
||||
baseLocalConn := thisLocalConnectionInstance
|
||||
|
||||
//log.Println("got new", thisLocalConnectionInstance.RemoteAddr().String())
|
||||
if utils.CanLogInfo() {
|
||||
log.Println("got new", thisLocalConnectionInstance.RemoteAddr().String())
|
||||
|
||||
}
|
||||
|
||||
var err error
|
||||
|
||||
@@ -224,7 +225,7 @@ afterLocalServerHandshake:
|
||||
//如果可以route
|
||||
if !localServer.CantRoute() && routePolicy != nil {
|
||||
|
||||
if logLevel <= log_info {
|
||||
if utils.CanLogInfo() {
|
||||
log.Println("enabling routing feature")
|
||||
}
|
||||
|
||||
@@ -235,7 +236,7 @@ afterLocalServerHandshake:
|
||||
})
|
||||
if outtag == "direct" {
|
||||
client = directClient
|
||||
if logLevel <= log_info {
|
||||
if utils.CanLogInfo() {
|
||||
log.Println("routed to direct", targetAddr.UrlString())
|
||||
}
|
||||
}
|
||||
@@ -450,7 +451,7 @@ afterLocalServerHandshake:
|
||||
if theFallback != nil {
|
||||
//这里注意,因为是吧tls解密了之后的数据发送到目标地址,所以这种方式只支持转发到本机纯http服务器
|
||||
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暴露出来
|
||||
// 这里就直接采取底层方式
|
||||
|
||||
p := common.GetPacket()
|
||||
p := utils.GetPacket()
|
||||
isgood := 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 {
|
||||
//直接退化成普通Copy
|
||||
@@ -732,7 +733,7 @@ func tryRawCopy(useSecureMethod bool, proxy_client proxy.UserClient, proxy_serve
|
||||
isgood2 := false
|
||||
isbad2 := false
|
||||
|
||||
p := common.GetPacket()
|
||||
p := utils.GetPacket()
|
||||
|
||||
count := 0
|
||||
|
||||
@@ -809,7 +810,7 @@ func tryRawCopy(useSecureMethod bool, proxy_client proxy.UserClient, proxy_serve
|
||||
isbad2 = true
|
||||
}
|
||||
}
|
||||
common.PutPacket(p)
|
||||
utils.PutPacket(p)
|
||||
|
||||
if isbad2 {
|
||||
|
||||
|
||||
@@ -104,9 +104,9 @@ import (
|
||||
"net/url"
|
||||
"strings"
|
||||
|
||||
"github.com/hahahrfool/v2ray_simple/common"
|
||||
"github.com/hahahrfool/v2ray_simple/netLayer"
|
||||
"github.com/hahahrfool/v2ray_simple/tlsLayer"
|
||||
"github.com/hahahrfool/v2ray_simple/utils"
|
||||
)
|
||||
|
||||
// 给一个节点 提供 VSI中 第 5-7层 的支持, server和 client通用. 个别方法只能用于某一端
|
||||
@@ -250,7 +250,7 @@ func ClientFromURL(s string) (Client, error) {
|
||||
u, err := url.Parse(s)
|
||||
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)
|
||||
@@ -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 用于监听 客户端 的连接
|
||||
@@ -328,7 +328,7 @@ func PrintAllClientNames() {
|
||||
func ServerFromURL(s string) (Server, error) {
|
||||
u, err := url.Parse(s)
|
||||
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)
|
||||
@@ -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) {
|
||||
|
||||
@@ -11,8 +11,8 @@ import (
|
||||
"net/url"
|
||||
"time"
|
||||
|
||||
"github.com/hahahrfool/v2ray_simple/common"
|
||||
"github.com/hahahrfool/v2ray_simple/netLayer"
|
||||
"github.com/hahahrfool/v2ray_simple/utils"
|
||||
|
||||
"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{})
|
||||
|
||||
buf := common.GetPacket()
|
||||
defer common.PutPacket(buf)
|
||||
buf := utils.GetPacket()
|
||||
defer utils.PutPacket(buf)
|
||||
|
||||
// Read hello message
|
||||
// 一般握手包发来的是 [5 1 0]
|
||||
|
||||
@@ -11,9 +11,9 @@ import (
|
||||
"strconv"
|
||||
"sync"
|
||||
|
||||
"github.com/hahahrfool/v2ray_simple/common"
|
||||
"github.com/hahahrfool/v2ray_simple/netLayer"
|
||||
"github.com/hahahrfool/v2ray_simple/proxy"
|
||||
"github.com/hahahrfool/v2ray_simple/utils"
|
||||
)
|
||||
|
||||
func init() {
|
||||
@@ -101,7 +101,7 @@ func (c *Client) Handshake(underlay net.Conn, target *netLayer.Addr) (io.ReadWri
|
||||
|
||||
UMFURS_conn.Write(buf.Bytes())
|
||||
|
||||
common.PutBuf(buf)
|
||||
utils.PutBuf(buf)
|
||||
|
||||
bs := []byte{0}
|
||||
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())
|
||||
|
||||
common.PutBuf(buf)
|
||||
utils.PutBuf(buf)
|
||||
|
||||
return &UserConn{
|
||||
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 {
|
||||
v := c.version
|
||||
buf := common.GetBuf()
|
||||
buf := utils.GetBuf()
|
||||
buf.WriteByte(byte(v)) //version
|
||||
buf.Write(c.user[:])
|
||||
if v == 0 {
|
||||
@@ -215,7 +215,7 @@ func (c *Client) handle_CRUMFURS(UMFURS_conn net.Conn) {
|
||||
|
||||
if c.HasAdvancedApplicationLayer() {
|
||||
|
||||
buf_for_umfurs := common.GetPacket()
|
||||
buf_for_umfurs := utils.GetPacket()
|
||||
n, err := UMFURS_conn.Read(buf_for_umfurs)
|
||||
if err != nil {
|
||||
break
|
||||
|
||||
@@ -13,10 +13,10 @@ import (
|
||||
"time"
|
||||
"unsafe"
|
||||
|
||||
"github.com/hahahrfool/v2ray_simple/common"
|
||||
"github.com/hahahrfool/v2ray_simple/httpLayer"
|
||||
"github.com/hahahrfool/v2ray_simple/netLayer"
|
||||
"github.com/hahahrfool/v2ray_simple/proxy"
|
||||
"github.com/hahahrfool/v2ray_simple/utils"
|
||||
)
|
||||
|
||||
func init() {
|
||||
@@ -143,19 +143,19 @@ func (s *Server) Handshake(underlay net.Conn) (io.ReadWriter, *netLayer.Addr, er
|
||||
// 因此v1.0.3以及更老版本都是直接一段一段read的。
|
||||
//但是,因为需要支持fallback技术,所以还是要 进行缓存, 然后返回的UserConn要使用MultiReader,重用之前读过的部分,没办法。
|
||||
|
||||
readbs := common.GetBytes(common.StandardBytesLength)
|
||||
readbs := utils.GetBytes(utils.StandardBytesLength)
|
||||
|
||||
//var auth [17]byte
|
||||
wholeReadLen, err := underlay.Read(readbs)
|
||||
if err != nil {
|
||||
return nil, nil, common.NewDataErr("read err", err, wholeReadLen)
|
||||
return nil, nil, utils.NewDataErr("read err", err, wholeReadLen)
|
||||
}
|
||||
|
||||
if wholeReadLen < 17 {
|
||||
//根据下面回答,HTTP的最小长度恰好是16字节,但是是0.9版本。1.0是18字节,1.1还要更长。总之我们可以直接不返回fallback地址
|
||||
//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]
|
||||
if version > 1 {
|
||||
|
||||
returnErr = common.NewDataErr("Vless invalid version ", nil, version)
|
||||
returnErr = utils.NewDataErr("Vless invalid version ", nil, version)
|
||||
goto errorPart
|
||||
|
||||
}
|
||||
@@ -215,9 +215,9 @@ realPart:
|
||||
|
||||
//读一下然后直接舍弃
|
||||
/*
|
||||
tmpBuf := common.GetBytes(int(addonLenByte))
|
||||
tmpBuf := utils.GetBytes(int(addonLenByte))
|
||||
underlay.Read(tmpBuf)
|
||||
common.PutBytes(tmpBuf)
|
||||
utils.PutBytes(tmpBuf)
|
||||
*/
|
||||
if tmpbs := readbuf.Next(int(addonLenByte)); len(tmpbs) != int(addonLenByte) {
|
||||
return nil, nil, errors.New("vless short read in addon")
|
||||
@@ -252,7 +252,7 @@ realPart:
|
||||
_, err = underlay.Write([]byte{CRUMFURS_ESTABLISHED})
|
||||
if err != nil {
|
||||
|
||||
returnErr = common.NewErr("write to crumfurs err", err)
|
||||
returnErr = utils.NewErr("write to crumfurs err", err)
|
||||
goto errorPart
|
||||
}
|
||||
|
||||
@@ -300,7 +300,7 @@ realPart:
|
||||
case netLayer.AtypIP4:
|
||||
|
||||
ip_or_domain_bytesLength = net.IPv4len
|
||||
addr.IP = common.GetBytes(net.IPv4len)
|
||||
addr.IP = utils.GetBytes(net.IPv4len)
|
||||
|
||||
case netLayer.AtypDomain:
|
||||
// 解码域名的长度
|
||||
@@ -317,14 +317,14 @@ realPart:
|
||||
case netLayer.AtypIP6:
|
||||
|
||||
ip_or_domain_bytesLength = net.IPv6len
|
||||
addr.IP = common.GetBytes(net.IPv6len)
|
||||
addr.IP = utils.GetBytes(net.IPv6len)
|
||||
default:
|
||||
|
||||
returnErr = fmt.Errorf("unknown address type %v", addrTypeByte)
|
||||
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)
|
||||
|
||||
@@ -338,7 +338,7 @@ realPart:
|
||||
addr.Name = string(ip_or_domain)
|
||||
}
|
||||
|
||||
common.PutBytes(ip_or_domain)
|
||||
utils.PutBytes(ip_or_domain)
|
||||
|
||||
default:
|
||||
|
||||
@@ -378,7 +378,7 @@ func (c *CRUMFURS) WriteUDPResponse(a *net.UDPAddr, b []byte) (err error) {
|
||||
if len(a.IP) > 4 {
|
||||
atype = netLayer.AtypIP6
|
||||
}
|
||||
buf := common.GetBuf()
|
||||
buf := utils.GetBuf()
|
||||
|
||||
buf.WriteByte(atype)
|
||||
buf.Write(a.IP)
|
||||
@@ -395,6 +395,6 @@ func (c *CRUMFURS) WriteUDPResponse(a *net.UDPAddr, b []byte) (err error) {
|
||||
|
||||
_, err = c.Write(buf.Bytes())
|
||||
|
||||
common.PutBuf(buf)
|
||||
utils.PutBuf(buf)
|
||||
return
|
||||
}
|
||||
|
||||
@@ -8,8 +8,8 @@ import (
|
||||
"io"
|
||||
"net"
|
||||
|
||||
"github.com/hahahrfool/v2ray_simple/common"
|
||||
"github.com/hahahrfool/v2ray_simple/proxy"
|
||||
"github.com/hahahrfool/v2ray_simple/utils"
|
||||
)
|
||||
|
||||
const Name = "vless"
|
||||
@@ -64,7 +64,7 @@ func (uc *UserConn) Write(p []byte) (int, error) {
|
||||
if uc.isServerEnd && !uc.isntFirstPacket {
|
||||
uc.isntFirstPacket = true
|
||||
|
||||
writeBuf = common.GetBuf()
|
||||
writeBuf = utils.GetBuf()
|
||||
|
||||
//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)
|
||||
|
||||
common.PutBuf(writeBuf)
|
||||
utils.PutBuf(writeBuf)
|
||||
|
||||
if err != nil {
|
||||
return 0, err
|
||||
@@ -99,7 +99,7 @@ func (uc *UserConn) Write(p []byte) (int, error) {
|
||||
} else {
|
||||
l := int16(len(p))
|
||||
if writeBuf == nil {
|
||||
writeBuf = common.GetBuf()
|
||||
writeBuf = utils.GetBuf()
|
||||
}
|
||||
|
||||
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)
|
||||
|
||||
common.PutBuf(writeBuf)
|
||||
utils.PutBuf(writeBuf)
|
||||
|
||||
if err != nil {
|
||||
return 0, err
|
||||
@@ -165,7 +165,7 @@ func (uc *UserConn) Read(p []byte) (int, error) {
|
||||
|
||||
uc.isntFirstPacket = true
|
||||
|
||||
bs := common.GetPacket()
|
||||
bs := utils.GetPacket()
|
||||
n, e := from.Read(bs)
|
||||
|
||||
if e != nil {
|
||||
@@ -176,7 +176,7 @@ func (uc *UserConn) Read(p []byte) (int, error) {
|
||||
return 0, errors.New("vless response head too short")
|
||||
}
|
||||
n = copy(p, bs[2:n])
|
||||
common.PutPacket(bs)
|
||||
utils.PutPacket(bs)
|
||||
return n, nil
|
||||
|
||||
}
|
||||
@@ -251,7 +251,7 @@ func (uc *UserConn) readudp_withLenthHead(p []byte) (int, error) {
|
||||
}
|
||||
|
||||
l := int(int16(b1)<<8 + int16(b2))
|
||||
bs := common.GetBytes(l)
|
||||
bs := utils.GetBytes(l)
|
||||
n, err := io.ReadFull(uc.bufr, bs)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
|
||||
@@ -4,7 +4,7 @@ import (
|
||||
"crypto/tls"
|
||||
"net"
|
||||
|
||||
"github.com/hahahrfool/v2ray_simple/common"
|
||||
"github.com/hahahrfool/v2ray_simple/utils"
|
||||
)
|
||||
|
||||
type Server struct {
|
||||
@@ -34,7 +34,7 @@ func (s *Server) Handshake(underlay net.Conn) (tlsConn *Conn, err error) {
|
||||
rawTlsConn := tls.Server(underlay, s.tlsConfig)
|
||||
err = rawTlsConn.Handshake()
|
||||
if err != nil {
|
||||
err = common.NewErr("tlsLayer: tls握手失败", err)
|
||||
err = utils.NewErr("tlsLayer: tls握手失败", err)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
@@ -9,7 +9,7 @@ import (
|
||||
"net"
|
||||
"strings"
|
||||
|
||||
"github.com/hahahrfool/v2ray_simple/common"
|
||||
"github.com/hahahrfool/v2ray_simple/utils"
|
||||
)
|
||||
|
||||
var PDD bool //print tls detect detail
|
||||
@@ -130,7 +130,7 @@ func (c *ComSniff) GetFailReason() int {
|
||||
}
|
||||
|
||||
// 总之,如果读写都用同样的判断代码的话,客户端和服务端应该就能同步进行 相同的TLS判断
|
||||
func (cd *ComSniff) commonDetect(p []byte, isRead bool) {
|
||||
func (cd *ComSniff) utilsDetect(p []byte, isRead bool) {
|
||||
|
||||
/*
|
||||
我们把tls的细节放在这个注释里,便于参考
|
||||
@@ -441,7 +441,7 @@ func (cd *ComSniff) commonDetect(p []byte, isRead bool) {
|
||||
if n >= ubl {
|
||||
|
||||
if cd.UH.HasUserByBytes(p[:ubl]) {
|
||||
bs := common.GetBytes(ubl)
|
||||
bs := utils.GetBytes(ubl)
|
||||
copy(bs, p[:ubl])
|
||||
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掉
|
||||
return
|
||||
}
|
||||
@@ -524,7 +524,7 @@ func commonFilterStep(err error, cd *ComSniff, p []byte, isRead bool) {
|
||||
}
|
||||
|
||||
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) {
|
||||
n, err = dr.Reader.Read(p)
|
||||
|
||||
commonFilterStep(err, &dr.ComSniff, p[:n], true)
|
||||
utilsFilterStep(err, &dr.ComSniff, p[:n], true)
|
||||
|
||||
if PDD {
|
||||
if dr.DefinitelyNotTLS {
|
||||
@@ -616,7 +616,7 @@ func (dw *DetectWriter) Write(p []byte) (n int, err error) {
|
||||
return
|
||||
}
|
||||
|
||||
commonFilterStep(nil, &dw.ComSniff, p, false)
|
||||
utilsFilterStep(nil, &dw.ComSniff, p, false)
|
||||
|
||||
// 经过判断之后,确认是 tls了,则我们缓存这个记录, 然后通过tls发送特殊指令
|
||||
if dw.IsTls {
|
||||
|
||||
@@ -7,7 +7,7 @@ import (
|
||||
"net"
|
||||
"time"
|
||||
|
||||
"github.com/hahahrfool/v2ray_simple/common"
|
||||
"github.com/hahahrfool/v2ray_simple/utils"
|
||||
)
|
||||
|
||||
// 和TeeConn配合的是Recorder, 每次调用Write就会记录一个新Buffer
|
||||
@@ -47,7 +47,7 @@ func (wr *Recorder) ReleaseBuffers() {
|
||||
wr.Buflist = nil //make([]*bytes.Buffer, 0, 10)
|
||||
|
||||
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) {
|
||||
if wr.stop {
|
||||
return len(p), nil
|
||||
}
|
||||
|
||||
if wr.writeCount > 0 { //舍弃第一个包,因为第一个包我们要做 tls的handshake检测 以及 vless的uuid检测,所以不可能没有tls的 数据包
|
||||
buf := common.GetBuf()
|
||||
buf := utils.GetBuf()
|
||||
n, err = buf.Write(p)
|
||||
|
||||
wr.Buflist = append(wr.Buflist, buf)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package common
|
||||
package utils
|
||||
|
||||
import "fmt"
|
||||
|
||||
36
utils/log.go
Normal file
36
utils/log.go
Normal 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
|
||||
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
package common
|
||||
package utils
|
||||
|
||||
import (
|
||||
"os"
|
||||
@@ -1,4 +1,4 @@
|
||||
package common
|
||||
package utils
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
2
utils/utils.go
Normal file
2
utils/utils.go
Normal file
@@ -0,0 +1,2 @@
|
||||
// Package utils provides utils that needed by all packages of verysimle
|
||||
package utils
|
||||
Reference in New Issue
Block a user