mirror of
https://github.com/SagerNet/sing-box.git
synced 2025-06-13 21:54:13 +08:00
Avoid nested direct outbound usage
This commit is contained in:
parent
081c45b9d7
commit
6fe582fcd7
@ -6,6 +6,7 @@ import (
|
|||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
"github.com/sagernet/sing-box/adapter"
|
"github.com/sagernet/sing-box/adapter"
|
||||||
|
C "github.com/sagernet/sing-box/constant"
|
||||||
E "github.com/sagernet/sing/common/exceptions"
|
E "github.com/sagernet/sing/common/exceptions"
|
||||||
M "github.com/sagernet/sing/common/metadata"
|
M "github.com/sagernet/sing/common/metadata"
|
||||||
N "github.com/sagernet/sing/common/network"
|
N "github.com/sagernet/sing/common/network"
|
||||||
@ -14,13 +15,18 @@ import (
|
|||||||
type DetourDialer struct {
|
type DetourDialer struct {
|
||||||
router adapter.Router
|
router adapter.Router
|
||||||
detour string
|
detour string
|
||||||
|
allowNestedDirect bool
|
||||||
dialer N.Dialer
|
dialer N.Dialer
|
||||||
initOnce sync.Once
|
initOnce sync.Once
|
||||||
initErr error
|
initErr error
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewDetour(router adapter.Router, detour string) N.Dialer {
|
func NewDetour(router adapter.Router, detour string, allowNestedDirect bool) N.Dialer {
|
||||||
return &DetourDialer{router: router, detour: detour}
|
return &DetourDialer{
|
||||||
|
router: router,
|
||||||
|
detour: detour,
|
||||||
|
allowNestedDirect: allowNestedDirect,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *DetourDialer) Start() error {
|
func (d *DetourDialer) Start() error {
|
||||||
@ -30,10 +36,17 @@ func (d *DetourDialer) Start() error {
|
|||||||
|
|
||||||
func (d *DetourDialer) Dialer() (N.Dialer, error) {
|
func (d *DetourDialer) Dialer() (N.Dialer, error) {
|
||||||
d.initOnce.Do(func() {
|
d.initOnce.Do(func() {
|
||||||
var loaded bool
|
var (
|
||||||
d.dialer, loaded = d.router.Outbound(d.detour)
|
dialer adapter.Outbound
|
||||||
|
loaded bool
|
||||||
|
)
|
||||||
|
dialer, loaded = d.router.Outbound(d.detour)
|
||||||
if !loaded {
|
if !loaded {
|
||||||
d.initErr = E.New("outbound detour not found: ", d.detour)
|
d.initErr = E.New("outbound detour not found: ", d.detour)
|
||||||
|
} else if !d.allowNestedDirect && dialer.Type() == C.TypeDirect {
|
||||||
|
d.initErr = E.New("using a direct outbound as a detour is illegal")
|
||||||
|
} else {
|
||||||
|
d.dialer = dialer
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
return d.dialer, d.initErr
|
return d.dialer, d.initErr
|
||||||
|
@ -23,7 +23,7 @@ func New(router adapter.Router, options option.DialerOptions) (N.Dialer, error)
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
dialer = NewDetour(router, options.Detour)
|
dialer = NewDetour(router, options.Detour, false)
|
||||||
}
|
}
|
||||||
domainStrategy := dns.DomainStrategy(options.DomainStrategy)
|
domainStrategy := dns.DomainStrategy(options.DomainStrategy)
|
||||||
if domainStrategy != dns.DomainStrategyAsIS || options.Detour == "" {
|
if domainStrategy != dns.DomainStrategyAsIS || options.Detour == "" {
|
||||||
|
@ -35,6 +35,9 @@ type Direct struct {
|
|||||||
|
|
||||||
func NewDirect(router adapter.Router, logger log.ContextLogger, tag string, options option.DirectOutboundOptions) (*Direct, error) {
|
func NewDirect(router adapter.Router, logger log.ContextLogger, tag string, options option.DirectOutboundOptions) (*Direct, error) {
|
||||||
options.UDPFragmentDefault = true
|
options.UDPFragmentDefault = true
|
||||||
|
if options.Detour != "" {
|
||||||
|
return nil, E.New("detour option for direct outbound is illegal")
|
||||||
|
}
|
||||||
outboundDialer, err := dialer.New(router, options.DialerOptions)
|
outboundDialer, err := dialer.New(router, options.DialerOptions)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -195,7 +195,7 @@ func NewRouter(
|
|||||||
if server.Detour == "" {
|
if server.Detour == "" {
|
||||||
detour = dialer.NewRouter(router)
|
detour = dialer.NewRouter(router)
|
||||||
} else {
|
} else {
|
||||||
detour = dialer.NewDetour(router, server.Detour)
|
detour = dialer.NewDetour(router, server.Detour, true)
|
||||||
}
|
}
|
||||||
switch server.Address {
|
switch server.Address {
|
||||||
case "local":
|
case "local":
|
||||||
|
Loading…
x
Reference in New Issue
Block a user