mirror of
https://github.com/e1732a364fed/v2ray_simple.git
synced 2025-10-26 18:21:07 +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
|
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
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|
||||||
### 代码
|
### 代码
|
||||||
|
|
||||||
代码的理念就是极简!这也是本项目名字由来!
|
代码的理念就是极简!这也是本项目名字由来!
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
Package httpLayer 提供http层的一些方法和定义
|
Package httpLayer 提供http层的一些方法和定义,比如fallback
|
||||||
*/
|
*/
|
||||||
package httpLayer
|
package httpLayer
|
||||||
|
|
||||||
|
|||||||
41
main.go
41
main.go
@@ -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 {
|
||||||
|
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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]
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
package common
|
package utils
|
||||||
|
|
||||||
import "fmt"
|
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 (
|
import (
|
||||||
"os"
|
"os"
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package common
|
package utils
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"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