mirror of
https://github.com/e1732a364fed/v2ray_simple.git
synced 2025-10-18 06:40:42 +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%的提升.
72 lines
1.5 KiB
Go
72 lines
1.5 KiB
Go
//go:build embed_geoip
|
||
// +build embed_geoip
|
||
|
||
package netLayer
|
||
|
||
import (
|
||
"archive/tar"
|
||
"bytes"
|
||
"compress/gzip"
|
||
_ "embed"
|
||
"fmt"
|
||
"io"
|
||
"log"
|
||
"os"
|
||
|
||
"github.com/oschwald/maxminddb-golang"
|
||
)
|
||
|
||
//使用 go build -tags embed_geoip 来将文件 编译进 可执行文件
|
||
|
||
//文件来自 https://dev.maxmind.com/geoip/geolite2-free-geolocation-data?lang=en
|
||
// 需要自行下载,或者到其他提供该文件的github项目下载,然后放入我们的 netLayer 文件夹中
|
||
|
||
//go:embed GeoLite2-Country.mmdb.tgz
|
||
var geoLite2Country_embed_tgz []byte
|
||
|
||
//注意,如果使用了embed版,然后又提供命令参数加载外部文件,就会内嵌版被覆盖
|
||
|
||
//将 tgz文件解压成maxmind的mmdb文件
|
||
func init() {
|
||
embedGeoip = true
|
||
|
||
outBuf := &bytes.Buffer{}
|
||
|
||
gzf, err := gzip.NewReader(bytes.NewBuffer(geoLite2Country_embed_tgz))
|
||
if err != nil {
|
||
fmt.Println("load geoLite2Country_embed_tgz err,", err)
|
||
os.Exit(1)
|
||
}
|
||
|
||
tarReader := tar.NewReader(gzf)
|
||
|
||
header, err := tarReader.Next()
|
||
|
||
if err != nil {
|
||
|
||
if err == io.EOF {
|
||
fmt.Println("load geoLite2Country_embed_tgz err,", io.EOF)
|
||
os.Exit(1)
|
||
}
|
||
fmt.Println("load geoLite2Country_embed_tgz err,", err)
|
||
os.Exit(1)
|
||
}
|
||
|
||
switch header.Typeflag {
|
||
|
||
case tar.TypeReg:
|
||
io.Copy(outBuf, tarReader)
|
||
|
||
default:
|
||
log.Fatal("load geoLite2Country_embed_tgz, not a simple file??", header.Name)
|
||
}
|
||
|
||
//这个函数应该直接接管了 我们的bytes,所以不能用 common.PutBuf 放回
|
||
db, err := maxminddb.FromBytes(outBuf.Bytes())
|
||
if err != nil {
|
||
log.Fatal("maxminddb.FromBytes", err)
|
||
}
|
||
the_geoipdb = db
|
||
|
||
}
|