Compare commits

..

109 Commits

Author SHA1 Message Date
世界
ea149f2401
documentation: Bump version 2025-06-15 17:55:13 +08:00
Sukka
fe732ec51a
Improve AdGuard rule-set parser 2025-06-15 17:55:13 +08:00
Restia-Ashbell
e650a8fdb0
Add ECH support for uTLS 2025-06-15 17:38:05 +08:00
世界
95f242086d
Improve TLS fragments 2025-06-15 17:38:05 +08:00
世界
ed7fc2f366
Add cache support for ssm-api 2025-06-15 17:38:05 +08:00
世界
aabc089d26
Fix service will not be closed 2025-06-15 17:38:05 +08:00
世界
6db3c448b2
Add loopback address support for tun 2025-06-15 17:38:05 +08:00
世界
d4789529e4
documentation: Bump version 2025-06-15 17:38:05 +08:00
世界
6da963bb4f
release: Update Go to 1.24.4 2025-06-15 17:38:04 +08:00
世界
a721c50745
Fix tproxy listener 2025-06-15 17:38:04 +08:00
世界
de96ccdd64
Fix systemd package 2025-06-15 17:38:04 +08:00
世界
dd80c94b07
Fix missing home for derp service 2025-06-15 17:38:04 +08:00
Zero Clover
48f0e37dde
documentation: Fix services 2025-06-15 17:38:04 +08:00
世界
cff3c9e538
Fix dns.client_subnet ignored 2025-06-15 17:38:03 +08:00
世界
fc04e6e3c7
documentation: Minor fixes 2025-06-15 17:38:03 +08:00
世界
9375b542c5
Fix tailscale forward 2025-06-15 17:38:03 +08:00
世界
696b59373b
Minor fixes 2025-06-15 17:38:03 +08:00
世界
0135405735
Add SSM API service 2025-06-15 17:38:03 +08:00
世界
a7b269514e
Add resolved service and DNS server 2025-06-15 17:38:02 +08:00
世界
b11311af1e
Add DERP service 2025-06-15 17:38:02 +08:00
世界
628cd5f993
Add service component type 2025-06-15 17:38:02 +08:00
世界
252894192d
Fix tproxy tcp control 2025-06-15 17:38:02 +08:00
愚者
177feafd2b
release: Fix build tags for android
Signed-off-by: 愚者 <11926619+FansChou@users.noreply.github.com>
2025-06-15 17:38:02 +08:00
世界
26d86e3831
prevent creation of bind and mark controls on unsupported platforms 2025-06-15 17:38:01 +08:00
PuerNya
49ed32ec8e
documentation: Fix description of reject DNS action behavior 2025-06-15 17:38:01 +08:00
Restia-Ashbell
ff264ad692
Fix TLS record fragment 2025-06-15 17:38:01 +08:00
世界
9489ced466
Add missing accept_routes option for Tailscale 2025-06-15 17:38:00 +08:00
世界
b43901001c
Add TLS record fragment support 2025-06-15 17:38:00 +08:00
世界
3687120b79
Fix set edns0 client subnet 2025-06-15 17:38:00 +08:00
世界
f847aad67e
Update minor dependencies 2025-06-15 17:37:59 +08:00
世界
f7c72286dd
Update certmagic and providers 2025-06-15 17:37:59 +08:00
世界
fa6d18b202
Update protobuf and grpc 2025-06-15 17:37:59 +08:00
世界
b8f0dc16fb
Add control options for listeners 2025-06-15 17:37:59 +08:00
世界
c4eb22e954
Update quic-go to v0.52.0 2025-06-15 17:37:59 +08:00
世界
8acfc8be59
Update utls to v1.7.2 2025-06-15 17:37:58 +08:00
世界
355410f78d
Handle EDNS version downgrade 2025-06-15 17:37:15 +08:00
世界
0ca65510e5
documentation: Fix anytls padding scheme description 2025-06-15 17:37:15 +08:00
安容
6444016923
Report invalid DNS address early 2025-06-15 17:37:15 +08:00
世界
45fc68705c
Fix wireguard listen_port 2025-06-15 17:37:14 +08:00
世界
0891c0b972
clash-api: Add more meta api 2025-06-15 17:37:14 +08:00
世界
e6854baeb0
Fix DNS lookup 2025-06-15 17:37:14 +08:00
世界
00c2fe7085
Fix fetch ECH configs 2025-06-15 17:37:14 +08:00
reletor
a426679f64
documentation: Minor fixes 2025-06-15 17:37:14 +08:00
caelansar
eb05fa9240
Fix callback deletion in UDP transport 2025-06-15 17:37:13 +08:00
世界
ccee51c9ea
documentation: Try to make the play review happy 2025-06-15 17:37:13 +08:00
世界
92dc32c851
Fix missing handling of legacy domain_strategy options 2025-06-15 17:37:13 +08:00
世界
788b6a3512
Improve local DNS server 2025-06-15 17:37:13 +08:00
anytls
0a235149d6
Update anytls
Co-authored-by: anytls <anytls>
2025-06-15 17:35:32 +08:00
世界
adc9b6a919
Fix DNS dialer 2025-06-15 17:35:32 +08:00
世界
ce264ed690
release: Skip override version for iOS 2025-06-15 17:35:31 +08:00
iikira
fe963060f1
Fix UDP DNS server crash
Signed-off-by: iikira <i2@mail.iikira.com>
2025-06-15 17:35:31 +08:00
ReleTor
07babae9bc
Fix fetch ECH configs 2025-06-15 17:35:31 +08:00
世界
876f4999d5
Allow direct outbounds without domain_resolver 2025-06-15 17:35:31 +08:00
世界
641f65df00
Fix Tailscale dialer 2025-06-15 17:35:30 +08:00
dyhkwong
7dbd4c5a7c
Fix DNS over QUIC stream close 2025-06-15 17:35:30 +08:00
anytls
d72ae3f17f
Update anytls
Co-authored-by: anytls <anytls>
2025-06-15 17:35:29 +08:00
Rambling2076
4af5d6c276
Fix missing with_tailscale in Dockerfile
Signed-off-by: Rambling2076 <Rambling2076@proton.me>
2025-06-15 17:35:29 +08:00
世界
d527c441be
Fail when default DNS server not found 2025-06-15 17:35:28 +08:00
世界
af6ee6b245
Update gVisor to 20250319.0 2025-06-15 17:35:28 +08:00
世界
873364c8fb
Explicitly reject detour to empty direct outbounds 2025-06-15 17:35:28 +08:00
世界
0980b2db93
Add netns support 2025-06-15 17:35:27 +08:00
世界
6f9b3b93be
Add wildcard name support for predefined records 2025-06-15 17:35:27 +08:00
世界
236c0d9f6e
Remove map usage in options 2025-06-15 17:35:27 +08:00
世界
30115b6b68
Fix unhandled DNS loop 2025-06-15 17:35:27 +08:00
世界
7c69371e49
Add wildcard-sni support for shadow-tls inbound 2025-06-15 17:35:26 +08:00
k9982874
3decd70c59
Add ntp protocol sniffing 2025-06-15 17:35:05 +08:00
世界
cb18b7aac2
option: Fix marshal legacy DNS options 2025-06-15 17:35:05 +08:00
世界
52a7bb75f5
Make domain_resolver optional when only one DNS server is configured 2025-06-15 17:35:04 +08:00
世界
da0e88f960
Fix DNS lookup context pollution 2025-06-15 17:35:04 +08:00
世界
82418e4978
Fix http3 DNS server connecting to wrong address 2025-06-15 17:35:03 +08:00
Restia-Ashbell
4f60f9b7da
documentation: Fix typo 2025-06-15 17:35:03 +08:00
anytls
4324aa3e91
Update sing-anytls
Co-authored-by: anytls <anytls>
2025-06-15 17:35:03 +08:00
k9982874
736a0d3a73
Fix hosts DNS server 2025-06-15 17:35:03 +08:00
世界
5c3c5b2493
Fix UDP DNS server crash 2025-06-15 17:35:03 +08:00
世界
60fe58ff2b
documentation: Fix missing ip_accept_any DNS rule option 2025-06-15 17:35:03 +08:00
世界
3748e63d03
Fix anytls dialer usage 2025-06-15 17:35:02 +08:00
世界
6d5f8958f7
Move predefined DNS server to rule action 2025-06-15 17:35:02 +08:00
世界
e3c29ac877
Fix domain resolver on direct outbound 2025-06-15 17:35:01 +08:00
Zephyruso
cc27586995
Fix missing AnyTLS display name 2025-06-15 17:35:01 +08:00
anytls
e093fe3307
Update sing-anytls
Co-authored-by: anytls <anytls>
2025-06-15 17:35:01 +08:00
Estel
e8a2cb638f
documentation: Fix typo
Signed-off-by: Estel <callmebedrockdigger@gmail.com>
2025-06-15 17:35:01 +08:00
TargetLocked
e42302a1a9
Fix parsing legacy DNS options 2025-06-15 17:35:00 +08:00
世界
c02ab0db8b
Fix DNS fallback 2025-06-15 17:35:00 +08:00
世界
2f6b7e5b25
documentation: Fix missing hosts DNS server 2025-06-15 17:34:59 +08:00
anytls
81c5656dc6
Add MinIdleSession option to AnyTLS outbound
Co-authored-by: anytls <anytls>
2025-06-15 17:34:59 +08:00
ReleTor
293ada693f
documentation: Minor fixes 2025-06-15 17:34:58 +08:00
libtry486
6df1994608
documentation: Fix typo
fix typo

Signed-off-by: libtry486 <89328481+libtry486@users.noreply.github.com>
2025-06-15 17:34:58 +08:00
Alireza Ahmadi
d84e1ba87c
Fix Outbound deadlock 2025-06-15 17:34:58 +08:00
世界
3c6c44ec42
documentation: Fix AnyTLS doc 2025-06-15 17:34:58 +08:00
anytls
2b64f43f1f
Add AnyTLS protocol 2025-06-15 17:34:58 +08:00
世界
9b13090ac4
Migrate to stdlib ECH support 2025-06-15 17:34:57 +08:00
世界
89a582b609
Add fallback local DNS server for iOS 2025-06-15 17:34:57 +08:00
世界
4d6a1cc296
Get darwin local DNS server from libresolv 2025-06-15 17:34:56 +08:00
世界
d13b00a118
Improve resolve action 2025-06-15 17:34:56 +08:00
世界
e69b173464
Add back port hopping to hysteria 1 2025-06-15 17:34:56 +08:00
xchacha20-poly1305
1e02700f6e
Remove single quotes of raw Moziila certs 2025-06-15 17:34:55 +08:00
世界
bc49dd9d3e
Add Tailscale endpoint 2025-06-15 17:34:55 +08:00
世界
7278d2a71f
Build legacy binaries with latest Go 2025-06-15 17:34:54 +08:00
世界
4a7a3e42b8
documentation: Remove outdated icons 2025-06-15 17:34:54 +08:00
世界
8ab8d32b9b
documentation: Certificate store 2025-06-15 17:34:53 +08:00
世界
df916b55bb
documentation: TLS fragment 2025-06-15 17:34:53 +08:00
世界
d4ef59f3aa
documentation: Outbound domain resolver 2025-06-15 17:34:53 +08:00
世界
2936207436
documentation: Refactor DNS 2025-06-15 17:34:53 +08:00
世界
9e8f33c4f2
Add certificate store 2025-06-15 17:34:52 +08:00
世界
9e6967186b
Add TLS fragment support 2025-06-15 17:34:52 +08:00
世界
c1cebdda2e
refactor: Outbound domain resolver 2025-06-15 17:33:38 +08:00
世界
9806a34411
refactor: DNS 2025-06-15 17:33:38 +08:00
世界
5dc74f93f4
Fix "Fix gLazyConn race" 2025-06-15 17:33:07 +08:00
世界
80f02962f9
Fix gLazyConn race 2025-06-14 16:11:15 +08:00
8 changed files with 45 additions and 164 deletions

View File

@ -54,7 +54,7 @@ func convertRuleSet(sourcePath string) error {
var rules []option.HeadlessRule
switch flagRuleSetConvertType {
case "adguard":
rules, err = adguard.ToOptions(reader, log.StdLogger())
rules, err = adguard.Convert(reader, log.StdLogger())
case "":
return E.New("source type is required")
default:

View File

@ -6,10 +6,7 @@ import (
"strings"
"github.com/sagernet/sing-box/common/srs"
C "github.com/sagernet/sing-box/constant"
"github.com/sagernet/sing-box/log"
"github.com/sagernet/sing-box/option"
E "github.com/sagernet/sing/common/exceptions"
"github.com/sagernet/sing/common/json"
"github.com/spf13/cobra"
@ -53,11 +50,6 @@ func decompileRuleSet(sourcePath string) error {
if err != nil {
return err
}
if hasRule(ruleSet.Options.Rules, func(rule option.DefaultHeadlessRule) bool {
return len(rule.AdGuardDomain) > 0
}) {
return E.New("unable to decompile binary AdGuard rules to rule-set.")
}
var outputPath string
if flagRuleSetDecompileOutput == flagRuleSetDecompileDefaultOutput {
if strings.HasSuffix(sourcePath, ".srs") {
@ -83,19 +75,3 @@ func decompileRuleSet(sourcePath string) error {
outputFile.Close()
return nil
}
func hasRule(rules []option.HeadlessRule, cond func(rule option.DefaultHeadlessRule) bool) bool {
for _, rule := range rules {
switch rule.Type {
case C.RuleTypeDefault:
if cond(rule.DefaultOptions) {
return true
}
case C.RuleTypeLogical:
if hasRule(rule.LogicalOptions.Rules, cond) {
return true
}
}
}
return false
}

View File

@ -2,7 +2,6 @@ package adguard
import (
"bufio"
"bytes"
"io"
"net/netip"
"os"
@ -28,7 +27,7 @@ type agdguardRuleLine struct {
isImportant bool
}
func ToOptions(reader io.Reader, logger logger.Logger) ([]option.HeadlessRule, error) {
func Convert(reader io.Reader, logger logger.Logger) ([]option.HeadlessRule, error) {
scanner := bufio.NewScanner(reader)
var (
ruleLines []agdguardRuleLine
@ -37,17 +36,45 @@ func ToOptions(reader io.Reader, logger logger.Logger) ([]option.HeadlessRule, e
parseLine:
for scanner.Scan() {
ruleLine := scanner.Text()
// Empty line
if ruleLine == "" {
continue
}
// Comment (both line comment and in-line comment)
if strings.Contains(ruleLine, "!") {
continue
}
// Either comment or cosmetic filter
if strings.Contains(ruleLine, "#") {
ignoredLines++
logger.Debug("ignored unsupported cosmetic filter: ", ruleLine)
continue
}
// We don't support URL query anyway
if strings.Contains(ruleLine, "?") || strings.Contains(ruleLine, "&") {
ignoredLines++
logger.Debug("ignored unsupported rule with query: ", ruleLine)
continue
}
// Commonly seen in CSS selectors of cosmetic filters
if strings.Contains(ruleLine, "[") || strings.Contains(ruleLine, "]") {
ignoredLines++
logger.Debug("ignored unsupported cosmetic filter: ", ruleLine)
continue
}
if strings.Contains(ruleLine, "(") || strings.Contains(ruleLine, ")") {
ignoredLines++
logger.Debug("ignored unsupported cosmetic filter: ", ruleLine)
continue
}
// We don't support $domain modifier
if strings.Contains(ruleLine, "~") {
ignoredLines++
logger.Debug("ignored unsupported rule modifier: ", ruleLine)
continue
}
originRuleLine := ruleLine
if M.IsDomainName(ruleLine) {
ruleLines = append(ruleLines, agdguardRuleLine{
@ -142,26 +169,6 @@ parseLine:
logger.Debug("ignored unsupported rule with path: ", ruleLine)
continue
}
if strings.Contains(ruleLine, "?") || strings.Contains(ruleLine, "&") {
ignoredLines++
logger.Debug("ignored unsupported rule with query: ", ruleLine)
continue
}
if strings.Contains(ruleLine, "[") || strings.Contains(ruleLine, "]") {
ignoredLines++
logger.Debug("ignored unsupported cosmetic filter: ", ruleLine)
continue
}
if strings.Contains(ruleLine, "(") || strings.Contains(ruleLine, ")") {
ignoredLines++
logger.Debug("ignored unsupported cosmetic filter: ", ruleLine)
continue
}
if strings.Contains(ruleLine, "~") {
ignoredLines++
logger.Debug("ignored unsupported rule modifier: ", ruleLine)
continue
}
var domainCheck string
if strings.HasPrefix(ruleLine, ".") || strings.HasPrefix(ruleLine, "-") {
domainCheck = "r" + ruleLine
@ -306,106 +313,6 @@ parseLine:
return []option.HeadlessRule{currentRule}, nil
}
var ErrInvalid = E.New("invalid binary AdGuard rule-set")
func FromOptions(rules []option.HeadlessRule) ([]byte, error) {
if len(rules) != 1 {
return nil, ErrInvalid
}
rule := rules[0]
var (
importantDomain []string
importantDomainRegex []string
importantExcludeDomain []string
importantExcludeDomainRegex []string
domain []string
domainRegex []string
excludeDomain []string
excludeDomainRegex []string
)
parse:
for {
switch rule.Type {
case C.RuleTypeLogical:
if !(len(rule.LogicalOptions.Rules) == 2 && rule.LogicalOptions.Rules[0].Type == C.RuleTypeDefault) {
return nil, ErrInvalid
}
if rule.LogicalOptions.Mode == C.LogicalTypeAnd && rule.LogicalOptions.Rules[0].DefaultOptions.Invert {
if len(importantExcludeDomain) == 0 && len(importantExcludeDomainRegex) == 0 {
importantExcludeDomain = rule.LogicalOptions.Rules[0].DefaultOptions.AdGuardDomain
importantExcludeDomainRegex = rule.LogicalOptions.Rules[0].DefaultOptions.DomainRegex
if len(importantExcludeDomain)+len(importantExcludeDomainRegex) == 0 {
return nil, ErrInvalid
}
} else {
excludeDomain = rule.LogicalOptions.Rules[0].DefaultOptions.AdGuardDomain
excludeDomainRegex = rule.LogicalOptions.Rules[0].DefaultOptions.DomainRegex
if len(excludeDomain)+len(excludeDomainRegex) == 0 {
return nil, ErrInvalid
}
}
} else if rule.LogicalOptions.Mode == C.LogicalTypeOr && !rule.LogicalOptions.Rules[0].DefaultOptions.Invert {
importantDomain = rule.LogicalOptions.Rules[0].DefaultOptions.AdGuardDomain
importantDomainRegex = rule.LogicalOptions.Rules[0].DefaultOptions.DomainRegex
if len(importantDomain)+len(importantDomainRegex) == 0 {
return nil, ErrInvalid
}
} else {
return nil, ErrInvalid
}
rule = rule.LogicalOptions.Rules[1]
case C.RuleTypeDefault:
domain = rule.DefaultOptions.AdGuardDomain
domainRegex = rule.DefaultOptions.DomainRegex
if len(domain)+len(domainRegex) == 0 {
return nil, ErrInvalid
}
break parse
}
}
var output bytes.Buffer
for _, ruleLine := range importantDomain {
output.WriteString(ruleLine)
output.WriteString("$important\n")
}
for _, ruleLine := range importantDomainRegex {
output.WriteString("/")
output.WriteString(ruleLine)
output.WriteString("/$important\n")
}
for _, ruleLine := range importantExcludeDomain {
output.WriteString("@@")
output.WriteString(ruleLine)
output.WriteString("$important\n")
}
for _, ruleLine := range importantExcludeDomainRegex {
output.WriteString("@@/")
output.WriteString(ruleLine)
output.WriteString("/$important\n")
}
for _, ruleLine := range domain {
output.WriteString(ruleLine)
output.WriteString("\n")
}
for _, ruleLine := range domainRegex {
output.WriteString("/")
output.WriteString(ruleLine)
output.WriteString("/\n")
}
for _, ruleLine := range excludeDomain {
output.WriteString("@@")
output.WriteString(ruleLine)
output.WriteString("\n")
}
for _, ruleLine := range excludeDomainRegex {
output.WriteString("@@/")
output.WriteString(ruleLine)
output.WriteString("/\n")
}
return output.Bytes(), nil
}
func ignoreIPCIDRRegexp(ruleLine string) bool {
if strings.HasPrefix(ruleLine, "(http?:\\/\\/)") {
ruleLine = ruleLine[12:]

View File

@ -14,8 +14,7 @@ import (
func TestConverter(t *testing.T) {
t.Parallel()
ruleString := `||sagernet.org^$important
@@|sing-box.sagernet.org^$important
rules, err := Convert(strings.NewReader(`
||example.org^
|example.com^
example.net^
@ -23,9 +22,10 @@ example.net^
||example.edu.tw^
|example.gov
example.arpa
@@|sagernet.example.org^
`
rules, err := ToOptions(strings.NewReader(ruleString), logger.NOP())
@@|sagernet.example.org|
||sagernet.org^$important
@@|sing-box.sagernet.org^$important
`), logger.NOP())
require.NoError(t, err)
require.Len(t, rules, 1)
rule, err := rule.NewHeadlessRule(context.Background(), rules[0])
@ -76,14 +76,11 @@ example.arpa
Domain: domain,
}), domain)
}
ruleFromOptions, err := FromOptions(rules)
require.NoError(t, err)
require.Equal(t, ruleString, string(ruleFromOptions))
}
func TestHosts(t *testing.T) {
t.Parallel()
rules, err := ToOptions(strings.NewReader(`
rules, err := Convert(strings.NewReader(`
127.0.0.1 localhost
::1 localhost #[IPv6]
0.0.0.0 google.com
@ -114,7 +111,7 @@ func TestHosts(t *testing.T) {
func TestSimpleHosts(t *testing.T) {
t.Parallel()
rules, err := ToOptions(strings.NewReader(`
rules, err := Convert(strings.NewReader(`
example.com
www.example.org
`), logger.NOP())

View File

@ -215,15 +215,16 @@ func readDefaultRule(reader varbin.Reader, recover bool) (rule option.DefaultHea
case ruleItemWIFIBSSID:
rule.WIFIBSSID, err = readRuleItemString(reader)
case ruleItemAdGuardDomain:
if recover {
err = E.New("unable to decompile binary AdGuard rules to rule-set")
return
}
var matcher *domain.AdGuardMatcher
matcher, err = domain.ReadAdGuardMatcher(reader)
if err != nil {
return
}
rule.AdGuardDomainMatcher = matcher
if recover {
rule.AdGuardDomain = matcher.Dump()
}
case ruleItemNetworkType:
rule.NetworkType, err = readRuleItemUint8[option.InterfaceType](reader)
case ruleItemNetworkIsExpensive:

View File

@ -2,7 +2,7 @@
icon: material/alert-decagram
---
#### 1.12.0-beta.26
#### 1.12.0-beta.25
* Fixes and improvements

2
go.mod
View File

@ -34,7 +34,7 @@ require (
github.com/sagernet/sing-shadowsocks v0.2.8
github.com/sagernet/sing-shadowsocks2 v0.2.1
github.com/sagernet/sing-shadowtls v0.2.1-0.20250503051639-fcd445d33c11
github.com/sagernet/sing-tun v0.6.9-0.20250617062442-df4458520f26
github.com/sagernet/sing-tun v0.6.8-0.20250615093440-d1f6001b58c2
github.com/sagernet/sing-vmess v0.2.4-0.20250605032146-38cc72672c88
github.com/sagernet/smux v1.5.34-mod.2
github.com/sagernet/tailscale v1.80.3-mod.5

4
go.sum
View File

@ -180,8 +180,8 @@ github.com/sagernet/sing-shadowsocks2 v0.2.1 h1:dWV9OXCeFPuYGHb6IRqlSptVnSzOelnq
github.com/sagernet/sing-shadowsocks2 v0.2.1/go.mod h1:RnXS0lExcDAovvDeniJ4IKa2IuChrdipolPYWBv9hWQ=
github.com/sagernet/sing-shadowtls v0.2.1-0.20250503051639-fcd445d33c11 h1:tK+75l64tm9WvEFrYRE1t0YxoFdWQqw/h7Uhzj0vJ+w=
github.com/sagernet/sing-shadowtls v0.2.1-0.20250503051639-fcd445d33c11/go.mod h1:sWqKnGlMipCHaGsw1sTTlimyUpgzP4WP3pjhCsYt9oA=
github.com/sagernet/sing-tun v0.6.9-0.20250617062442-df4458520f26 h1:N9yAoqtQlawlJzLONjdQvIO3GJLEg9tZBfyKToSi0cM=
github.com/sagernet/sing-tun v0.6.9-0.20250617062442-df4458520f26/go.mod h1:fisFCbC4Vfb6HqQNcwPJi2CDK2bf0Xapyz3j3t4cnHE=
github.com/sagernet/sing-tun v0.6.8-0.20250615093440-d1f6001b58c2 h1:leio5dGtYCKHQam+SyLszq4bbXGaxF4ElK5Aif/lUb8=
github.com/sagernet/sing-tun v0.6.8-0.20250615093440-d1f6001b58c2/go.mod h1:fisFCbC4Vfb6HqQNcwPJi2CDK2bf0Xapyz3j3t4cnHE=
github.com/sagernet/sing-vmess v0.2.4-0.20250605032146-38cc72672c88 h1:0pVm8sPOel+BoiCddW3pV3cKDKEaSioVTYDdTSKjyFI=
github.com/sagernet/sing-vmess v0.2.4-0.20250605032146-38cc72672c88/go.mod h1:IL8Rr+EGwuqijszZkNrEFTQDKhilEpkqFqOlvdpS6/w=
github.com/sagernet/smux v1.5.34-mod.2 h1:gkmBjIjlJ2zQKpLigOkFur5kBKdV6bNRoFu2WkltRQ4=