mirror of
https://github.com/e1732a364fed/v2ray_simple.git
synced 2025-10-17 14:22:35 +08:00

创建新子包netLayer, 将 proxy.Addr改为 netLayer.Addr 修订文档 RoutePolicy等分流机制也放到 netLayer 引入github.com/oschwald/maxminddb-golang 依赖,支持使用 GeoLite2-Country.mmdb 来进行ip分流 另外注意它默认的版本对于 golang.org/x/sys 包的依赖太老了,会导致go1.18中编译不通过,我在 go.mod 文件中新增了下面代码,就能通过编译了 ``` require ( golang.org/x/sys v0.0.0-20220315194320-039c03cc5b86 // indirect ) ``` verysimple的可执行文件的相同目录下,必须有该mmdb文件才能够开启ip分流功能 新配置方式:配置文件新加一行 "route":{ "mycountry":"CN" } mycountry指定的国家的ip会被直连发送,其他地址ip会被发送到代理. 新配置方式,回落,直接在 local 项的 url 的 query部分添加 fallback=:80, 或者 fallback=127.0.0.1:80 即可 回落到指定端口. 将tls_test重新挪动到tlsLayer包中 在main.go中添加了 logLevel变量,并且把关于配置文件的部分挪动到 config.go 出了上面的分流和回落以外,还新增支持了 #xxx 的尾缀,用于配置该url的tag. tag在未来会被用于精准分流 Makefile中新增了 PACK 参数用于编译出 打包版的发行包;可选 tag=embed_geoip 参数用于将mmdb.tgz文件内置到可执行程序里 同时,我开始直接使用go1.18编译本项目,期待性能提升,因为这是新发布的版本,看了介绍据说对 mac m1有20%的提升.
55 lines
1.3 KiB
Go
55 lines
1.3 KiB
Go
package tlsLayer
|
||
|
||
import (
|
||
"crypto/tls"
|
||
"net"
|
||
"unsafe"
|
||
)
|
||
|
||
//参考 crypt/tls 的 conn.go, 注意,如果上游代码的底层结构发生了改变,则这里也要跟着修改,保持头部结构一致
|
||
type faketlsconn struct {
|
||
// constant
|
||
conn net.Conn
|
||
isClient bool
|
||
}
|
||
|
||
// 本包会用到这个Conn,比如server和client的 Handshake,
|
||
// 唯一特性就是它可以返回tls连接的底层tcp连接,见 GetRaw
|
||
type Conn struct {
|
||
*tls.Conn
|
||
}
|
||
|
||
func (c *Conn) GetRaw(tls_lazy_encrypt bool) *net.TCPConn {
|
||
rc := (*faketlsconn)(unsafe.Pointer(uintptr(unsafe.Pointer(c.Conn))))
|
||
if rc != nil {
|
||
if rc.conn != nil {
|
||
//log.Println("成功获取到 *net.TCPConn!", rc.conn.(*net.TCPConn)) //经测试,是毫无问题的,完全能提取出来并正常使用
|
||
//在 tls_lazy_encrypt 时,我们使用 TeeConn
|
||
|
||
if tls_lazy_encrypt {
|
||
tc := rc.conn.(*TeeConn)
|
||
return tc.OldConn.(*net.TCPConn)
|
||
} else {
|
||
return rc.conn.(*net.TCPConn)
|
||
}
|
||
|
||
}
|
||
}
|
||
return nil
|
||
}
|
||
|
||
// 直接获取TeeConn,仅用于已经确定肯定能获取到的情况
|
||
func (c *Conn) GetTeeConn() *TeeConn {
|
||
rc := (*faketlsconn)(unsafe.Pointer(uintptr(unsafe.Pointer(c.Conn))))
|
||
|
||
return rc.conn.(*TeeConn)
|
||
|
||
}
|
||
|
||
//return c.Conn.ConnectionState().NegotiatedProtocol
|
||
func (c *Conn) GetAlpn() string {
|
||
|
||
return c.Conn.ConnectionState().NegotiatedProtocol
|
||
|
||
}
|