diff --git a/go.mod b/go.mod index 25b791c..5acb403 100644 --- a/go.mod +++ b/go.mod @@ -9,8 +9,8 @@ require ( github.com/go-chi/render v1.0.3 github.com/miekg/dns v1.1.59 github.com/sagernet/bbolt v0.0.0-20231014093535-ea5cb2fe9f0a - github.com/sagernet/sing v0.4.0-beta.19 - github.com/sagernet/sing-box v1.9.0-rc.19 + github.com/sagernet/sing v0.5.0-alpha.7 + github.com/sagernet/sing-box v1.10.0-alpha.2 github.com/sagernet/sing-dns v0.2.0-beta.18 github.com/spf13/cobra v1.8.0 golang.org/x/mod v0.17.0 @@ -59,14 +59,15 @@ require ( github.com/quic-go/qtls-go1-20 v0.4.1 // indirect github.com/sagernet/cloudflare-tls v0.0.0-20231208171750-a4483c1b7cd1 // indirect github.com/sagernet/gvisor v0.0.0-20240428053021-e691de28565f // indirect - github.com/sagernet/netlink v0.0.0-20220905062125-8043b4a9aa97 // indirect + github.com/sagernet/netlink v0.0.0-20240523065131-45e60152f9ba // indirect github.com/sagernet/quic-go v0.43.1-beta.1 // indirect github.com/sagernet/reality v0.0.0-20230406110435-ee17307e7691 // indirect github.com/sagernet/sing-mux v0.2.0 // indirect github.com/sagernet/sing-quic v0.2.0-beta.5 // indirect + github.com/sagernet/sing-shadowsocks v0.2.6 // indirect github.com/sagernet/sing-shadowsocks2 v0.2.0 // indirect github.com/sagernet/sing-shadowtls v0.1.4 // indirect - github.com/sagernet/sing-tun v0.3.0-beta.2 // indirect + github.com/sagernet/sing-tun v0.3.0-beta.6 // indirect github.com/sagernet/sing-vmess v0.1.8 // indirect github.com/sagernet/smux v0.0.0-20231208180855-7041f6ea79e7 // indirect github.com/sagernet/tfo-go v0.0.0-20231209031829-7b5343ac1dc6 // indirect diff --git a/go.sum b/go.sum index 65d8753..c3f0e99 100644 --- a/go.sum +++ b/go.sum @@ -113,29 +113,35 @@ github.com/sagernet/cloudflare-tls v0.0.0-20231208171750-a4483c1b7cd1 h1:YbmpqPQ github.com/sagernet/cloudflare-tls v0.0.0-20231208171750-a4483c1b7cd1/go.mod h1:J2yAxTFPDjrDPhuAi9aWFz2L3ox9it4qAluBBbN0H5k= github.com/sagernet/gvisor v0.0.0-20240428053021-e691de28565f h1:NkhuupzH5ch7b/Y/6ZHJWrnNLoiNnSJaow6DPb8VW2I= github.com/sagernet/gvisor v0.0.0-20240428053021-e691de28565f/go.mod h1:KXmw+ouSJNOsuRpg4wgwwCQuunrGz4yoAqQjsLjc6N0= -github.com/sagernet/netlink v0.0.0-20220905062125-8043b4a9aa97 h1:iL5gZI3uFp0X6EslacyapiRz7LLSJyr4RajF/BhMVyE= -github.com/sagernet/netlink v0.0.0-20220905062125-8043b4a9aa97/go.mod h1:xLnfdiJbSp8rNqYEdIW/6eDO4mVoogml14Bh2hSiFpM= +github.com/sagernet/netlink v0.0.0-20240523065131-45e60152f9ba h1:EY5AS7CCtfmARNv2zXUOrsEMPFDGYxaw65JzA2p51Vk= +github.com/sagernet/netlink v0.0.0-20240523065131-45e60152f9ba/go.mod h1:xLnfdiJbSp8rNqYEdIW/6eDO4mVoogml14Bh2hSiFpM= github.com/sagernet/quic-go v0.43.1-beta.1 h1:alizUjpvWYcz08dBCQsULOd+1xu0o7UtlyYf6SLbRNg= github.com/sagernet/quic-go v0.43.1-beta.1/go.mod h1:BkrQYeop7Jx3hN3TW8/76CXcdhYiNPyYEBL/BVJ1ifc= github.com/sagernet/reality v0.0.0-20230406110435-ee17307e7691 h1:5Th31OC6yj8byLGkEnIYp6grlXfo1QYUfiYFGjewIdc= github.com/sagernet/reality v0.0.0-20230406110435-ee17307e7691/go.mod h1:B8lp4WkQ1PwNnrVMM6KyuFR20pU8jYBD+A4EhJovEXU= github.com/sagernet/sing v0.2.18/go.mod h1:OL6k2F0vHmEzXz2KW19qQzu172FDgSbUSODylighuVo= -github.com/sagernet/sing v0.4.0-beta.19 h1:Kzh2f6eaxt09S+bEL8F4Bgy03qkNf+4Tt8g7/5lxp/o= -github.com/sagernet/sing v0.4.0-beta.19/go.mod h1:PFQKbElc2Pke7faBLv8oEba5ehtKO21Ho+TkYemTI3Y= -github.com/sagernet/sing-box v1.9.0-rc.19 h1:pFVSepj0brtWLbyoakLjD1vJkfQCDLmb8eH3QpiJdt8= -github.com/sagernet/sing-box v1.9.0-rc.19/go.mod h1:irDVISS/9jCcf+Js5sscJ44Okbjx5IiKZzk7IFO4K6g= +github.com/sagernet/sing v0.5.0-alpha.5 h1:Y1uv06KfUVQWo4Bw2tFVoGVatpzYJnfbgeZxrhrnl5s= +github.com/sagernet/sing v0.5.0-alpha.5/go.mod h1:Xh4KO9nGdvm4K/LVg9Xn9jSxJdqe9KcXbAzNC1S2qfw= +github.com/sagernet/sing v0.5.0-alpha.7 h1:yxjiH0vQAotu87JNJ9B0BGO0OJqsFjug84xcYdwyDm4= +github.com/sagernet/sing v0.5.0-alpha.7/go.mod h1:Xh4KO9nGdvm4K/LVg9Xn9jSxJdqe9KcXbAzNC1S2qfw= +github.com/sagernet/sing-box v1.10.0-alpha.1 h1:ahDvE9e7sqcy9+9Tmp0Ba02DVkQRUXRfnAhXuDfGGCQ= +github.com/sagernet/sing-box v1.10.0-alpha.1/go.mod h1:skqvO7cGD3pmRNomE6mT++yIJ2sKURY7QPHDlu0FyuY= +github.com/sagernet/sing-box v1.10.0-alpha.2 h1:lt+nivIaqhltiWw5uA89XK8/CXxgl1aCrHOD4nXQ89c= +github.com/sagernet/sing-box v1.10.0-alpha.2/go.mod h1:KYAOtxT/fb98V3n842Z4H9JGPgrvUEg2XBUvRoXEuH8= github.com/sagernet/sing-dns v0.2.0-beta.18 h1:6vzXZThRdA7YUzBOpSbUT48XRumtl/KIpIHFSOP0za8= github.com/sagernet/sing-dns v0.2.0-beta.18/go.mod h1:k/dmFcQpg6+m08gC1yQBy+13+QkuLqpKr4bIreq4U24= github.com/sagernet/sing-mux v0.2.0 h1:4C+vd8HztJCWNYfufvgL49xaOoOHXty2+EAjnzN3IYo= github.com/sagernet/sing-mux v0.2.0/go.mod h1:khzr9AOPocLa+g53dBplwNDz4gdsyx/YM3swtAhlkHQ= github.com/sagernet/sing-quic v0.2.0-beta.5 h1:ceKFLd1iS5AtM+pScKmcDp5k7R6WgYIe8vl6nB0aVsE= github.com/sagernet/sing-quic v0.2.0-beta.5/go.mod h1:lfad61lScAZhAxZ0DHZWvEIcAaT38O6zPTR4vLsHeP0= +github.com/sagernet/sing-shadowsocks v0.2.6 h1:xr7ylAS/q1cQYS8oxKKajhuQcchd5VJJ4K4UZrrpp0s= +github.com/sagernet/sing-shadowsocks v0.2.6/go.mod h1:j2YZBIpWIuElPFL/5sJAj470bcn/3QQ5lxZUNKLDNAM= github.com/sagernet/sing-shadowsocks2 v0.2.0 h1:wpZNs6wKnR7mh1wV9OHwOyUr21VkS3wKFHi+8XwgADg= github.com/sagernet/sing-shadowsocks2 v0.2.0/go.mod h1:RnXS0lExcDAovvDeniJ4IKa2IuChrdipolPYWBv9hWQ= github.com/sagernet/sing-shadowtls v0.1.4 h1:aTgBSJEgnumzFenPvc+kbD9/W0PywzWevnVpEx6Tw3k= github.com/sagernet/sing-shadowtls v0.1.4/go.mod h1:F8NBgsY5YN2beQavdgdm1DPlhaKQlaL6lpDdcBglGK4= -github.com/sagernet/sing-tun v0.3.0-beta.2 h1:sfeHWnBTKGpFUjXpT+O/JEwFP8oVAo3M0Xx94ghesjU= -github.com/sagernet/sing-tun v0.3.0-beta.2/go.mod h1:xPaOkQhngPMILx+/9DMLCFl4vSxUU2tMnCPSlf05HLo= +github.com/sagernet/sing-tun v0.3.0-beta.6 h1:L11kMrM7UfUW0pzQiU66Fffh4o86KZc1SFGbkYi8Ma8= +github.com/sagernet/sing-tun v0.3.0-beta.6/go.mod h1:DxLIyhjWU/HwGYoX0vNGg2c5QgTQIakphU1MuERR5tQ= github.com/sagernet/sing-vmess v0.1.8 h1:XVWad1RpTy9b5tPxdm5MCU8cGfrTGdR8qCq6HV2aCNc= github.com/sagernet/sing-vmess v0.1.8/go.mod h1:vhx32UNzTDUkNwOyIjcZQohre1CaytquC5mPplId8uA= github.com/sagernet/smux v0.0.0-20231208180855-7041f6ea79e7 h1:DImB4lELfQhplLTxeq2z31Fpv8CQqqrUwTbrIRumZqQ= diff --git a/option/template.go b/option/template.go index 90b1782..80bf7db 100644 --- a/option/template.go +++ b/option/template.go @@ -29,6 +29,7 @@ type Template struct { // Inbound Inbounds []option.Inbound `json:"inbounds,omitempty"` + AutoRedirect bool `json:"auto_redirect,omitempty"` DisableTUN bool `json:"disable_tun,omitempty"` DisableSystemProxy bool `json:"disable_system_proxy,omitempty"` CustomTUN *TypedMessage[option.TunInboundOptions] `json:"custom_tun,omitempty"` diff --git a/template/filter/filter_1100.go b/template/filter/filter_1100.go new file mode 100644 index 0000000..c0c0d55 --- /dev/null +++ b/template/filter/filter_1100.go @@ -0,0 +1,26 @@ +package filter + +import ( + "github.com/sagernet/serenity/common/metadata" + "github.com/sagernet/serenity/common/semver" + C "github.com/sagernet/sing-box/constant" + "github.com/sagernet/sing-box/option" +) + +func init() { + filters = append(filters, filter1100) +} + +func filter1100(metadata metadata.Metadata, options *option.Options) { + if metadata.Version == nil || metadata.Version.GreaterThanOrEqual(semver.ParseVersion("1.10.0-alpha.2")) { + return + } + newInbounds := make([]option.Inbound, 0, len(options.Inbounds)) + for _, inbound := range options.Inbounds { + if inbound.Type == C.TypeTun && inbound.TunOptions.AutoRedirect { + inbound.TunOptions.AutoRedirect = false + } + newInbounds = append(newInbounds, inbound) + } + options.Inbounds = newInbounds +} diff --git a/template/render_inbounds.go b/template/render_inbounds.go index d6d39f4..b31832f 100644 --- a/template/render_inbounds.go +++ b/template/render_inbounds.go @@ -4,6 +4,7 @@ import ( "net/netip" M "github.com/sagernet/serenity/common/metadata" + "github.com/sagernet/serenity/common/semver" C "github.com/sagernet/sing-box/constant" "github.com/sagernet/sing-box/option" "github.com/sagernet/sing-dns" @@ -25,6 +26,9 @@ func (t *Template) renderInbounds(metadata M.Metadata, options *option.Options) domainStrategy = option.DomainStrategy(dns.DomainStrategyPreferIPv4) } } + autoRedirect := t.AutoRedirect && + !metadata.Platform.IsApple() && + (metadata.Version == nil || metadata.Version.GreaterThanOrEqual(semver.ParseVersion("1.10.0-alpha.2"))) disableTun := t.DisableTUN && !metadata.Platform.TunOnly() if !disableTun { options.Route.AutoDetectInterface = true @@ -44,6 +48,9 @@ func (t *Template) renderInbounds(metadata M.Metadata, options *option.Options) }, }, } + if autoRedirect { + tunInbound.TunOptions.AutoRedirect = true + } if t.EnableFakeIP { tunInbound.TunOptions.InboundOptions.DomainStrategy = domainStrategy }