From bb16015dab05765245a2639c21c85e518ba7bdfb Mon Sep 17 00:00:00 2001 From: cubemaze Date: Sat, 26 Aug 2023 10:57:54 +0800 Subject: [PATCH 1/8] chore: refine config unmarshal --- conf/node.go | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/conf/node.go b/conf/node.go index 9a5d815..aa00ddd 100644 --- a/conf/node.go +++ b/conf/node.go @@ -33,9 +33,9 @@ type Options struct { CertConfig *CertConfig `json:"CertConfig"` } -func (n *NodeConfig) UnmarshalJSON(b []byte) (err error) { +func (n *NodeConfig) UnmarshalJSON(data []byte) (err error) { r := rawNodeConfig{} - err = json.Unmarshal(b, &r) + err = json.Unmarshal(data, &r) if err != nil { return err } @@ -48,14 +48,14 @@ func (n *NodeConfig) UnmarshalJSON(b []byte) (err error) { n.ApiConfig = ApiConfig{ Timeout: 30, } - err = json.Unmarshal(b, &n.ApiConfig) + err = json.Unmarshal(data, &n.ApiConfig) if err != nil { return } } - if r.OptRaw != nil { - err = json.Unmarshal(*r.OptRaw, &n.Options) + data = *r.OptRaw + err = json.Unmarshal(data, &n.Options) if err != nil { return } @@ -65,18 +65,18 @@ func (n *NodeConfig) UnmarshalJSON(b []byte) (err error) { ListenIP: "0.0.0.0", SendIP: "0.0.0.0", } - err = json.Unmarshal(b, &n.Options) + err = json.Unmarshal(data, &n.Options) if err != nil { return } - switch n.Options.Core { - case "xray": - n.Options.XrayOptions = NewXrayOptions() - return json.Unmarshal(b, n.Options.XrayOptions) - case "sing": - n.Options.SingOptions = NewSingOptions() - return json.Unmarshal(b, n.Options.SingOptions) - } + } + switch n.Options.Core { + case "xray": + n.Options.XrayOptions = NewXrayOptions() + return json.Unmarshal(data, n.Options.XrayOptions) + case "sing": + n.Options.SingOptions = NewSingOptions() + return json.Unmarshal(data, n.Options.SingOptions) } return } From 1aa0b2a8e1cbe7ef92d994bd74f8def952bdefda Mon Sep 17 00:00:00 2001 From: cubemaze Date: Sat, 26 Aug 2023 11:38:18 +0800 Subject: [PATCH 2/8] feat: ntp service --- conf/sing.go | 12 ++++++++++++ core/sing/sing.go | 8 ++++++++ example/config.json | 7 +++++++ 3 files changed, 27 insertions(+) diff --git a/conf/sing.go b/conf/sing.go index cdf4159..19120cc 100644 --- a/conf/sing.go +++ b/conf/sing.go @@ -2,6 +2,7 @@ package conf type SingConfig struct { LogConfig SingLogConfig `json:"Log"` + NtpConfig SingNtpConfig `json:"NTP"` OriginalPath string `json:"OriginalPath"` } @@ -18,6 +19,11 @@ func NewSingConfig() *SingConfig { Level: "error", Timestamp: true, }, + NtpConfig: SingNtpConfig{ + Enable: false, + Server: "time.apple.com", + ServerPort: 0, + }, } } @@ -29,6 +35,12 @@ type SingOptions struct { FallBackConfigs *FallBackConfigForSing `json:"FallBackConfigs"` } +type SingNtpConfig struct { + Enable bool `json:"Enable"` + Server string `json:"Server"` + ServerPort uint16 `json:"ServerPort"` +} + type FallBackConfigForSing struct { // sing-box FallBack FallBack `json:"FallBack"` diff --git a/core/sing/sing.go b/core/sing/sing.go index 30bece9..a38a858 100644 --- a/core/sing/sing.go +++ b/core/sing/sing.go @@ -59,6 +59,14 @@ func New(c *conf.CoreConfig) (vCore.Core, error) { Timestamp: c.SingConfig.LogConfig.Timestamp, Output: c.SingConfig.LogConfig.Output, } + options.NTP = &option.NTPOptions{ + Enabled: c.SingConfig.NtpConfig.Enable, + WriteToSystem: true, + ServerOptions: option.ServerOptions{ + Server: c.SingConfig.NtpConfig.Server, + ServerPort: c.SingConfig.NtpConfig.ServerPort, + }, + } ctx := context.Background() ctx = pause.ContextWithDefaultManager(ctx) createdAt := time.Now() diff --git a/example/config.json b/example/config.json index 3d087f7..d87f53c 100644 --- a/example/config.json +++ b/example/config.json @@ -16,6 +16,13 @@ "Level": "error", "Timestamp": true + }, + "NTP": { + // 同 SingBox ntp 部分配置 + // VMess VLESS 建议开启 + "Enable": true, + "Server": "time.apple.com", + "ServerPort": 0 } // More }, From de8402ecd56d2fe257eea99ce3cca6b34e5d55bc Mon Sep 17 00:00:00 2001 From: yuzuki999 Date: Sat, 26 Aug 2023 22:48:24 +0800 Subject: [PATCH 3/8] fix original config decode for sing --- core/sing/sing.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/sing/sing.go b/core/sing/sing.go index a38a858..8c50855 100644 --- a/core/sing/sing.go +++ b/core/sing/sing.go @@ -48,7 +48,7 @@ func New(c *conf.CoreConfig) (vCore.Core, error) { return nil, fmt.Errorf("open original config error: %s", err) } defer f.Close() - err = json.NewDecoder(f).Decode(options) + err = json.NewDecoder(f).Decode(&options) if err != nil { return nil, fmt.Errorf("decode original config error: %s", err) } From e51591c7f701dcd80d9186cd9b56b3314b228cc7 Mon Sep 17 00:00:00 2001 From: yuzuki999 Date: Sun, 27 Aug 2023 13:20:31 +0800 Subject: [PATCH 4/8] fix NetworkSettings decode for sing --- core/sing/node.go | 50 ++++++++++++++++++++++++++++------------------- 1 file changed, 30 insertions(+), 20 deletions(-) diff --git a/core/sing/node.go b/core/sing/node.go index 8670c48..3a11675 100644 --- a/core/sing/node.go +++ b/core/sing/node.go @@ -86,33 +86,43 @@ func getInboundOptions(tag string, info *panel.NodeInfo, c *conf.Options) (optio case "tcp": t.Type = "" case "ws": - network := WsNetworkConfig{} - err := json.Unmarshal(n.NetworkSettings, &network) - if err != nil { - return option.Inbound{}, fmt.Errorf("decode NetworkSettings error: %s", err) - } - var u *url.URL - u, err = url.Parse(network.Path) - if err != nil { - return option.Inbound{}, fmt.Errorf("parse path error: %s", err) - } - ed, _ := strconv.Atoi(u.Query().Get("ed")) - h := make(map[string]option.Listable[string], len(network.Headers)) - for k, v := range network.Headers { - h[k] = option.Listable[string]{ - v, + var ( + path string + ed int + headers map[string]option.Listable[string] + ) + if len(n.NetworkSettings) != 0 { + network := WsNetworkConfig{} + err := json.Unmarshal(n.NetworkSettings, &network) + if err != nil { + return option.Inbound{}, fmt.Errorf("decode NetworkSettings error: %s", err) + } + var u *url.URL + u, err = url.Parse(network.Path) + if err != nil { + return option.Inbound{}, fmt.Errorf("parse path error: %s", err) + } + path = u.Path + ed, _ = strconv.Atoi(u.Query().Get("ed")) + headers = make(map[string]option.Listable[string], len(network.Headers)) + for k, v := range network.Headers { + headers[k] = option.Listable[string]{ + v, + } } } t.WebsocketOptions = option.V2RayWebsocketOptions{ - Path: u.Path, + Path: path, EarlyDataHeaderName: "Sec-WebSocket-Protocol", MaxEarlyData: uint32(ed), - Headers: h, + Headers: headers, } case "grpc": - err := json.Unmarshal(n.NetworkSettings, &t.GRPCOptions) - if err != nil { - return option.Inbound{}, fmt.Errorf("decode NetworkSettings error: %s", err) + if len(n.NetworkSettings) != 0 { + err := json.Unmarshal(n.NetworkSettings, &t.GRPCOptions) + if err != nil { + return option.Inbound{}, fmt.Errorf("decode NetworkSettings error: %s", err) + } } } if info.Type == "vless" { From 55b26427606790ada7d0d37a24a35bbe78de8674 Mon Sep 17 00:00:00 2001 From: cubemaze Date: Mon, 28 Aug 2023 01:14:28 +0800 Subject: [PATCH 5/8] fix: reflect correct traffic direction --- node/user.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/node/user.go b/node/user.go index dcfd22e..1aceed1 100644 --- a/node/user.go +++ b/node/user.go @@ -12,7 +12,7 @@ func (c *Controller) reportUserTrafficTask() (err error) { // Get User traffic userTraffic := make([]panel.UserTraffic, 0) for i := range c.userList { - up, down := c.server.GetUserTraffic(c.tag, c.userList[i].Uuid, true) + down, up := c.server.GetUserTraffic(c.tag, c.userList[i].Uuid, true) if up > 0 || down > 0 { if c.LimitConfig.EnableDynamicSpeedLimit { if _, ok := c.traffic[c.userList[i].Uuid]; ok { From 13208c05413a67049f434ff836eb649215efd78e Mon Sep 17 00:00:00 2001 From: yuzuki999 Date: Mon, 28 Aug 2023 01:56:01 +0800 Subject: [PATCH 6/8] fix counter --- common/counter/conn.go | 20 ++++++++++---------- node/user.go | 2 +- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/common/counter/conn.go b/common/counter/conn.go index 8f9db03..e90c1ef 100644 --- a/common/counter/conn.go +++ b/common/counter/conn.go @@ -24,23 +24,23 @@ func NewConnCounter(conn net.Conn, s *TrafficStorage) net.Conn { ExtendedConn: bufio.NewExtendedConn(conn), storage: s, readFunc: func(n int64) { - s.DownCounter.Add(n) + s.UpCounter.Add(n) }, writeFunc: func(n int64) { - s.UpCounter.Add(n) + s.DownCounter.Add(n) }, } } func (c *ConnCounter) Read(b []byte) (n int, err error) { n, err = c.ExtendedConn.Read(b) - c.storage.DownCounter.Store(int64(n)) + c.storage.UpCounter.Store(int64(n)) return } func (c *ConnCounter) Write(b []byte) (n int, err error) { n, err = c.ExtendedConn.Write(b) - c.storage.UpCounter.Store(int64(n)) + c.storage.DownCounter.Store(int64(n)) return } @@ -50,7 +50,7 @@ func (c *ConnCounter) ReadBuffer(buffer *buf.Buffer) error { return err } if buffer.Len() > 0 { - c.storage.DownCounter.Add(int64(buffer.Len())) + c.storage.UpCounter.Add(int64(buffer.Len())) } return nil } @@ -62,7 +62,7 @@ func (c *ConnCounter) WriteBuffer(buffer *buf.Buffer) error { return err } if dataLen > 0 { - c.storage.UpCounter.Add(dataLen) + c.storage.DownCounter.Add(dataLen) } return nil } @@ -95,10 +95,10 @@ func NewPacketConnCounter(conn network.PacketConn, s *TrafficStorage) network.Pa PacketConn: conn, storage: s, readFunc: func(n int64) { - s.DownCounter.Add(n) + s.UpCounter.Add(n) }, writeFunc: func(n int64) { - s.UpCounter.Add(n) + s.DownCounter.Add(n) }, } } @@ -108,7 +108,7 @@ func (p *PacketConnCounter) ReadPacket(buff *buf.Buffer) (destination M.Socksadd if err != nil { return } - p.storage.DownCounter.Add(int64(buff.Len())) + p.storage.UpCounter.Add(int64(buff.Len())) return } @@ -119,7 +119,7 @@ func (p *PacketConnCounter) WritePacket(buff *buf.Buffer, destination M.Socksadd return } if n > 0 { - p.storage.UpCounter.Add(int64(n)) + p.storage.DownCounter.Add(int64(n)) } return } diff --git a/node/user.go b/node/user.go index 1aceed1..dcfd22e 100644 --- a/node/user.go +++ b/node/user.go @@ -12,7 +12,7 @@ func (c *Controller) reportUserTrafficTask() (err error) { // Get User traffic userTraffic := make([]panel.UserTraffic, 0) for i := range c.userList { - down, up := c.server.GetUserTraffic(c.tag, c.userList[i].Uuid, true) + up, down := c.server.GetUserTraffic(c.tag, c.userList[i].Uuid, true) if up > 0 || down > 0 { if c.LimitConfig.EnableDynamicSpeedLimit { if _, ok := c.traffic[c.userList[i].Uuid]; ok { From 5645d3d3c74cee55bae3328a76d2afe9b978717f Mon Sep 17 00:00:00 2001 From: cubemaze Date: Mon, 28 Aug 2023 15:24:28 +0800 Subject: [PATCH 7/8] feat: domain_strategy --- conf/sing.go | 5 +++++ core/sing/node.go | 1 + example/config.json | 8 +++++++- 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/conf/sing.go b/conf/sing.go index 19120cc..9501e67 100644 --- a/conf/sing.go +++ b/conf/sing.go @@ -1,5 +1,9 @@ package conf +import ( + "github.com/inazumav/sing-box/option" +) + type SingConfig struct { LogConfig SingLogConfig `json:"Log"` NtpConfig SingNtpConfig `json:"NTP"` @@ -31,6 +35,7 @@ type SingOptions struct { EnableProxyProtocol bool `json:"EnableProxyProtocol"` TCPFastOpen bool `json:"EnableTFO"` SniffEnabled bool `json:"EnableSniff"` + DomainStrategy option.DomainStrategy `json:"DomainStrategy"` SniffOverrideDestination bool `json:"SniffOverrideDestination"` FallBackConfigs *FallBackConfigForSing `json:"FallBackConfigs"` } diff --git a/core/sing/node.go b/core/sing/node.go index 3a11675..ea8bd69 100644 --- a/core/sing/node.go +++ b/core/sing/node.go @@ -38,6 +38,7 @@ func getInboundOptions(tag string, info *panel.NodeInfo, c *conf.Options) (optio InboundOptions: option.InboundOptions{ SniffEnabled: c.SingOptions.SniffEnabled, SniffOverrideDestination: c.SingOptions.SniffOverrideDestination, + DomainStrategy: c.SingOptions.DomainStrategy, }, } var tls option.InboundTLSOptions diff --git a/example/config.json b/example/config.json index d87f53c..51ee651 100644 --- a/example/config.json +++ b/example/config.json @@ -63,7 +63,12 @@ // 开启 Proxy Protocol,参见 https://github.com/haproxy/haproxy/blob/master/doc/proxy-protocol.txt "EnableProxyProtocol": false, // 开启 TCP Fast Open - "EnableTFO": true + "EnableTFO": true, + + // 设置 Domain Strategy + // 可选 prefer_ipv4 / prefer_ipv6 / ipv4_only / ipv6_only + "DomainStrategy": "ipv4_only", + // More } /*, @@ -81,6 +86,7 @@ "Core": "sing", "EnableProxyProtocol": true, "EnableTFO": true + "DomainStrategy": "ipv4_only", } }, { From ded1312d9fbae8ace5e97a1fba6a56a196a56f5b Mon Sep 17 00:00:00 2001 From: yuzuki999 Date: Wed, 30 Aug 2023 11:26:05 +0800 Subject: [PATCH 8/8] fix vless for xray --- core/xray/inbound.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/xray/inbound.go b/core/xray/inbound.go index b8a85a0..8fcca89 100644 --- a/core/xray/inbound.go +++ b/core/xray/inbound.go @@ -22,7 +22,7 @@ func buildInbound(option *conf.Options, nodeInfo *panel.NodeInfo, tag string) (* var err error var network string switch nodeInfo.Type { - case "v2ray": + case "vmess", "vless": err = buildV2ray(option, nodeInfo, in) network = nodeInfo.VAllss.Network case "trojan":