mirror of
https://github.com/SagerNet/sing-box.git
synced 2026-04-11 17:47:20 +10:00
Remove overdue deprecated features
This commit is contained in:
@@ -62,13 +62,10 @@ type InboundContext struct {
|
|||||||
// cache
|
// cache
|
||||||
|
|
||||||
// Deprecated: implement in rule action
|
// Deprecated: implement in rule action
|
||||||
InboundDetour string
|
InboundDetour string
|
||||||
LastInbound string
|
LastInbound string
|
||||||
OriginDestination M.Socksaddr
|
OriginDestination M.Socksaddr
|
||||||
RouteOriginalDestination M.Socksaddr
|
RouteOriginalDestination M.Socksaddr
|
||||||
// Deprecated: to be removed
|
|
||||||
//nolint:staticcheck
|
|
||||||
InboundOptions option.InboundOptions
|
|
||||||
UDPDisableDomainUnmapping bool
|
UDPDisableDomainUnmapping bool
|
||||||
UDPConnect bool
|
UDPConnect bool
|
||||||
UDPTimeout time.Duration
|
UDPTimeout time.Duration
|
||||||
|
|||||||
@@ -99,8 +99,6 @@ func (l *Listener) loopTCPIn() {
|
|||||||
}
|
}
|
||||||
//nolint:staticcheck
|
//nolint:staticcheck
|
||||||
metadata.InboundDetour = l.listenOptions.Detour
|
metadata.InboundDetour = l.listenOptions.Detour
|
||||||
//nolint:staticcheck
|
|
||||||
metadata.InboundOptions = l.listenOptions.InboundOptions
|
|
||||||
metadata.Source = M.SocksaddrFromNet(conn.RemoteAddr()).Unwrap()
|
metadata.Source = M.SocksaddrFromNet(conn.RemoteAddr()).Unwrap()
|
||||||
metadata.OriginDestination = M.SocksaddrFromNet(conn.LocalAddr()).Unwrap()
|
metadata.OriginDestination = M.SocksaddrFromNet(conn.LocalAddr()).Unwrap()
|
||||||
ctx := log.ContextWithNewID(l.ctx)
|
ctx := log.ContextWithNewID(l.ctx)
|
||||||
|
|||||||
@@ -15,7 +15,6 @@ import (
|
|||||||
|
|
||||||
"github.com/sagernet/sing-box/adapter"
|
"github.com/sagernet/sing-box/adapter"
|
||||||
"github.com/sagernet/sing-box/dns"
|
"github.com/sagernet/sing-box/dns"
|
||||||
"github.com/sagernet/sing-box/experimental/deprecated"
|
|
||||||
"github.com/sagernet/sing-box/option"
|
"github.com/sagernet/sing-box/option"
|
||||||
E "github.com/sagernet/sing/common/exceptions"
|
E "github.com/sagernet/sing/common/exceptions"
|
||||||
aTLS "github.com/sagernet/sing/common/tls"
|
aTLS "github.com/sagernet/sing/common/tls"
|
||||||
@@ -38,7 +37,7 @@ func parseECHClientConfig(ctx context.Context, clientConfig ECHCapableConfig, op
|
|||||||
}
|
}
|
||||||
//nolint:staticcheck
|
//nolint:staticcheck
|
||||||
if options.ECH.PQSignatureSchemesEnabled || options.ECH.DynamicRecordSizingDisabled {
|
if options.ECH.PQSignatureSchemesEnabled || options.ECH.DynamicRecordSizingDisabled {
|
||||||
deprecated.Report(ctx, deprecated.OptionLegacyECHOptions)
|
return nil, E.New("legacy ECH options are deprecated in sing-box 1.12.0 and removed in sing-box 1.13.0")
|
||||||
}
|
}
|
||||||
if len(echConfig) > 0 {
|
if len(echConfig) > 0 {
|
||||||
block, rest := pem.Decode(echConfig)
|
block, rest := pem.Decode(echConfig)
|
||||||
@@ -77,7 +76,7 @@ func parseECHServerConfig(ctx context.Context, options option.InboundTLSOptions,
|
|||||||
tlsConfig.EncryptedClientHelloKeys = echKeys
|
tlsConfig.EncryptedClientHelloKeys = echKeys
|
||||||
//nolint:staticcheck
|
//nolint:staticcheck
|
||||||
if options.ECH.PQSignatureSchemesEnabled || options.ECH.DynamicRecordSizingDisabled {
|
if options.ECH.PQSignatureSchemesEnabled || options.ECH.DynamicRecordSizingDisabled {
|
||||||
deprecated.Report(ctx, deprecated.OptionLegacyECHOptions)
|
return E.New("legacy ECH options are deprecated in sing-box 1.12.0 and removed in sing-box 1.13.0")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -57,96 +57,6 @@ func (n Note) MessageWithLink() string {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var OptionBadMatchSource = Note{
|
|
||||||
Name: "bad-match-source",
|
|
||||||
Description: "legacy match source rule item",
|
|
||||||
DeprecatedVersion: "1.10.0",
|
|
||||||
ScheduledVersion: "1.11.0",
|
|
||||||
EnvName: "BAD_MATCH_SOURCE",
|
|
||||||
MigrationLink: "https://sing-box.sagernet.org/deprecated/#match-source-rule-items-are-renamed",
|
|
||||||
}
|
|
||||||
|
|
||||||
var OptionGEOIP = Note{
|
|
||||||
Name: "geoip",
|
|
||||||
Description: "geoip database",
|
|
||||||
DeprecatedVersion: "1.8.0",
|
|
||||||
ScheduledVersion: "1.12.0",
|
|
||||||
EnvName: "GEOIP",
|
|
||||||
MigrationLink: "https://sing-box.sagernet.org/migration/#migrate-geoip-to-rule-sets",
|
|
||||||
}
|
|
||||||
|
|
||||||
var OptionGEOSITE = Note{
|
|
||||||
Name: "geosite",
|
|
||||||
Description: "geosite database",
|
|
||||||
DeprecatedVersion: "1.8.0",
|
|
||||||
ScheduledVersion: "1.12.0",
|
|
||||||
EnvName: "GEOSITE",
|
|
||||||
MigrationLink: "https://sing-box.sagernet.org/migration/#migrate-geosite-to-rule-sets",
|
|
||||||
}
|
|
||||||
|
|
||||||
var OptionTUNAddressX = Note{
|
|
||||||
Name: "tun-address-x",
|
|
||||||
Description: "legacy tun address fields",
|
|
||||||
DeprecatedVersion: "1.10.0",
|
|
||||||
ScheduledVersion: "1.12.0",
|
|
||||||
EnvName: "TUN_ADDRESS_X",
|
|
||||||
MigrationLink: "https://sing-box.sagernet.org/migration/#tun-address-fields-are-merged",
|
|
||||||
}
|
|
||||||
|
|
||||||
var OptionSpecialOutbounds = Note{
|
|
||||||
Name: "special-outbounds",
|
|
||||||
Description: "legacy special outbounds",
|
|
||||||
DeprecatedVersion: "1.11.0",
|
|
||||||
ScheduledVersion: "1.13.0",
|
|
||||||
EnvName: "SPECIAL_OUTBOUNDS",
|
|
||||||
MigrationLink: "https://sing-box.sagernet.org/migration/#migrate-legacy-special-outbounds-to-rule-actions",
|
|
||||||
}
|
|
||||||
|
|
||||||
var OptionInboundOptions = Note{
|
|
||||||
Name: "inbound-options",
|
|
||||||
Description: "legacy inbound fields",
|
|
||||||
DeprecatedVersion: "1.11.0",
|
|
||||||
ScheduledVersion: "1.13.0",
|
|
||||||
EnvName: "INBOUND_OPTIONS",
|
|
||||||
MigrationLink: "https://sing-box.sagernet.org/migration/#migrate-legacy-special-outbounds-to-rule-actions",
|
|
||||||
}
|
|
||||||
|
|
||||||
var OptionDestinationOverrideFields = Note{
|
|
||||||
Name: "destination-override-fields",
|
|
||||||
Description: "destination override fields in direct outbound",
|
|
||||||
DeprecatedVersion: "1.11.0",
|
|
||||||
ScheduledVersion: "1.13.0",
|
|
||||||
EnvName: "DESTINATION_OVERRIDE_FIELDS",
|
|
||||||
MigrationLink: "https://sing-box.sagernet.org/migration/#migrate-destination-override-fields-to-route-options",
|
|
||||||
}
|
|
||||||
|
|
||||||
var OptionWireGuardOutbound = Note{
|
|
||||||
Name: "wireguard-outbound",
|
|
||||||
Description: "legacy wireguard outbound",
|
|
||||||
DeprecatedVersion: "1.11.0",
|
|
||||||
ScheduledVersion: "1.13.0",
|
|
||||||
EnvName: "WIREGUARD_OUTBOUND",
|
|
||||||
MigrationLink: "https://sing-box.sagernet.org/migration/#migrate-wireguard-outbound-to-endpoint",
|
|
||||||
}
|
|
||||||
|
|
||||||
var OptionWireGuardGSO = Note{
|
|
||||||
Name: "wireguard-gso",
|
|
||||||
Description: "GSO option in wireguard outbound",
|
|
||||||
DeprecatedVersion: "1.11.0",
|
|
||||||
ScheduledVersion: "1.13.0",
|
|
||||||
EnvName: "WIREGUARD_GSO",
|
|
||||||
MigrationLink: "https://sing-box.sagernet.org/migration/#migrate-wireguard-outbound-to-endpoint",
|
|
||||||
}
|
|
||||||
|
|
||||||
var OptionTUNGSO = Note{
|
|
||||||
Name: "tun-gso",
|
|
||||||
Description: "GSO option in tun",
|
|
||||||
DeprecatedVersion: "1.11.0",
|
|
||||||
ScheduledVersion: "1.12.0",
|
|
||||||
EnvName: "TUN_GSO",
|
|
||||||
MigrationLink: "https://sing-box.sagernet.org/deprecated/#gso-option-in-tun",
|
|
||||||
}
|
|
||||||
|
|
||||||
var OptionLegacyDNSTransport = Note{
|
var OptionLegacyDNSTransport = Note{
|
||||||
Name: "legacy-dns-transport",
|
Name: "legacy-dns-transport",
|
||||||
Description: "legacy DNS servers",
|
Description: "legacy DNS servers",
|
||||||
@@ -183,15 +93,6 @@ var OptionMissingDomainResolver = Note{
|
|||||||
MigrationLink: "https://sing-box.sagernet.org/migration/#migrate-outbound-dns-rule-items-to-domain-resolver",
|
MigrationLink: "https://sing-box.sagernet.org/migration/#migrate-outbound-dns-rule-items-to-domain-resolver",
|
||||||
}
|
}
|
||||||
|
|
||||||
var OptionLegacyECHOptions = Note{
|
|
||||||
Name: "legacy-ech-options",
|
|
||||||
Description: "legacy ECH options",
|
|
||||||
DeprecatedVersion: "1.12.0",
|
|
||||||
ScheduledVersion: "1.13.0",
|
|
||||||
EnvName: "LEGACY_ECH_OPTIONS",
|
|
||||||
MigrationLink: "https://sing-box.sagernet.org/deprecated/#legacy-ech-fields",
|
|
||||||
}
|
|
||||||
|
|
||||||
var OptionLegacyDomainStrategyOptions = Note{
|
var OptionLegacyDomainStrategyOptions = Note{
|
||||||
Name: "legacy-domain-strategy-options",
|
Name: "legacy-domain-strategy-options",
|
||||||
Description: "legacy domain strategy options",
|
Description: "legacy domain strategy options",
|
||||||
@@ -202,20 +103,9 @@ var OptionLegacyDomainStrategyOptions = Note{
|
|||||||
}
|
}
|
||||||
|
|
||||||
var Options = []Note{
|
var Options = []Note{
|
||||||
OptionBadMatchSource,
|
|
||||||
OptionGEOIP,
|
|
||||||
OptionGEOSITE,
|
|
||||||
OptionTUNAddressX,
|
|
||||||
OptionSpecialOutbounds,
|
|
||||||
OptionInboundOptions,
|
|
||||||
OptionDestinationOverrideFields,
|
|
||||||
OptionWireGuardOutbound,
|
|
||||||
OptionWireGuardGSO,
|
|
||||||
OptionTUNGSO,
|
|
||||||
OptionLegacyDNSTransport,
|
OptionLegacyDNSTransport,
|
||||||
OptionLegacyDNSFakeIPOptions,
|
OptionLegacyDNSFakeIPOptions,
|
||||||
OptionOutboundDNSRuleItem,
|
OptionOutboundDNSRuleItem,
|
||||||
OptionMissingDomainResolver,
|
OptionMissingDomainResolver,
|
||||||
OptionLegacyECHOptions,
|
|
||||||
OptionLegacyDomainStrategyOptions,
|
OptionLegacyDomainStrategyOptions,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,7 +20,6 @@ import (
|
|||||||
"github.com/sagernet/sing-box/protocol/anytls"
|
"github.com/sagernet/sing-box/protocol/anytls"
|
||||||
"github.com/sagernet/sing-box/protocol/block"
|
"github.com/sagernet/sing-box/protocol/block"
|
||||||
"github.com/sagernet/sing-box/protocol/direct"
|
"github.com/sagernet/sing-box/protocol/direct"
|
||||||
protocolDNS "github.com/sagernet/sing-box/protocol/dns"
|
|
||||||
"github.com/sagernet/sing-box/protocol/group"
|
"github.com/sagernet/sing-box/protocol/group"
|
||||||
"github.com/sagernet/sing-box/protocol/http"
|
"github.com/sagernet/sing-box/protocol/http"
|
||||||
"github.com/sagernet/sing-box/protocol/mixed"
|
"github.com/sagernet/sing-box/protocol/mixed"
|
||||||
@@ -76,7 +75,6 @@ func OutboundRegistry() *outbound.Registry {
|
|||||||
direct.RegisterOutbound(registry)
|
direct.RegisterOutbound(registry)
|
||||||
|
|
||||||
block.RegisterOutbound(registry)
|
block.RegisterOutbound(registry)
|
||||||
protocolDNS.RegisterOutbound(registry)
|
|
||||||
|
|
||||||
group.RegisterSelector(registry)
|
group.RegisterSelector(registry)
|
||||||
group.RegisterURLTest(registry)
|
group.RegisterURLTest(registry)
|
||||||
@@ -94,7 +92,6 @@ func OutboundRegistry() *outbound.Registry {
|
|||||||
anytls.RegisterOutbound(registry)
|
anytls.RegisterOutbound(registry)
|
||||||
|
|
||||||
registerQUICOutbounds(registry)
|
registerQUICOutbounds(registry)
|
||||||
registerWireGuardOutbound(registry)
|
|
||||||
registerStubForRemovedOutbounds(registry)
|
registerStubForRemovedOutbounds(registry)
|
||||||
|
|
||||||
return registry
|
return registry
|
||||||
@@ -152,4 +149,7 @@ func registerStubForRemovedOutbounds(registry *outbound.Registry) {
|
|||||||
outbound.Register[option.ShadowsocksROutboundOptions](registry, C.TypeShadowsocksR, func(ctx context.Context, router adapter.Router, logger log.ContextLogger, tag string, options option.ShadowsocksROutboundOptions) (adapter.Outbound, error) {
|
outbound.Register[option.ShadowsocksROutboundOptions](registry, C.TypeShadowsocksR, func(ctx context.Context, router adapter.Router, logger log.ContextLogger, tag string, options option.ShadowsocksROutboundOptions) (adapter.Outbound, error) {
|
||||||
return nil, E.New("ShadowsocksR is deprecated and removed in sing-box 1.6.0")
|
return nil, E.New("ShadowsocksR is deprecated and removed in sing-box 1.6.0")
|
||||||
})
|
})
|
||||||
|
outbound.Register[option.StubOptions](registry, C.TypeWireGuard, func(ctx context.Context, router adapter.Router, logger log.ContextLogger, tag string, options option.StubOptions) (adapter.Outbound, error) {
|
||||||
|
return nil, E.New("WireGuard outbound is deprecated in sing-box 1.11.0 and removed in sing-box 1.13.0, use WireGuard endpoint instead")
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,14 +4,9 @@ package include
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/sagernet/sing-box/adapter/endpoint"
|
"github.com/sagernet/sing-box/adapter/endpoint"
|
||||||
"github.com/sagernet/sing-box/adapter/outbound"
|
|
||||||
"github.com/sagernet/sing-box/protocol/wireguard"
|
"github.com/sagernet/sing-box/protocol/wireguard"
|
||||||
)
|
)
|
||||||
|
|
||||||
func registerWireGuardOutbound(registry *outbound.Registry) {
|
|
||||||
wireguard.RegisterOutbound(registry)
|
|
||||||
}
|
|
||||||
|
|
||||||
func registerWireGuardEndpoint(registry *endpoint.Registry) {
|
func registerWireGuardEndpoint(registry *endpoint.Registry) {
|
||||||
wireguard.RegisterEndpoint(registry)
|
wireguard.RegisterEndpoint(registry)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,19 +7,12 @@ import (
|
|||||||
|
|
||||||
"github.com/sagernet/sing-box/adapter"
|
"github.com/sagernet/sing-box/adapter"
|
||||||
"github.com/sagernet/sing-box/adapter/endpoint"
|
"github.com/sagernet/sing-box/adapter/endpoint"
|
||||||
"github.com/sagernet/sing-box/adapter/outbound"
|
|
||||||
C "github.com/sagernet/sing-box/constant"
|
C "github.com/sagernet/sing-box/constant"
|
||||||
"github.com/sagernet/sing-box/log"
|
"github.com/sagernet/sing-box/log"
|
||||||
"github.com/sagernet/sing-box/option"
|
"github.com/sagernet/sing-box/option"
|
||||||
E "github.com/sagernet/sing/common/exceptions"
|
E "github.com/sagernet/sing/common/exceptions"
|
||||||
)
|
)
|
||||||
|
|
||||||
func registerWireGuardOutbound(registry *outbound.Registry) {
|
|
||||||
outbound.Register[option.LegacyWireGuardOutboundOptions](registry, C.TypeWireGuard, func(ctx context.Context, router adapter.Router, logger log.ContextLogger, tag string, options option.LegacyWireGuardOutboundOptions) (adapter.Outbound, error) {
|
|
||||||
return nil, E.New(`WireGuard is not included in this build, rebuild with -tags with_wireguard`)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func registerWireGuardEndpoint(registry *endpoint.Registry) {
|
func registerWireGuardEndpoint(registry *endpoint.Registry) {
|
||||||
endpoint.Register[option.WireGuardEndpointOptions](registry, C.TypeWireGuard, func(ctx context.Context, router adapter.Router, logger log.ContextLogger, tag string, options option.WireGuardEndpointOptions) (adapter.Endpoint, error) {
|
endpoint.Register[option.WireGuardEndpointOptions](registry, C.TypeWireGuard, func(ctx context.Context, router adapter.Router, logger log.ContextLogger, tag string, options option.WireGuardEndpointOptions) (adapter.Endpoint, error) {
|
||||||
return nil, E.New(`WireGuard is not included in this build, rebuild with -tags with_wireguard`)
|
return nil, E.New(`WireGuard is not included in this build, rebuild with -tags with_wireguard`)
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ package option
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
|
||||||
"github.com/sagernet/sing-box/experimental/deprecated"
|
E "github.com/sagernet/sing/common/exceptions"
|
||||||
"github.com/sagernet/sing/common/json"
|
"github.com/sagernet/sing/common/json"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -31,8 +31,9 @@ func (d *DirectOutboundOptions) UnmarshalJSONContext(ctx context.Context, conten
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
//nolint:staticcheck
|
||||||
if d.OverrideAddress != "" || d.OverridePort != 0 {
|
if d.OverrideAddress != "" || d.OverridePort != 0 {
|
||||||
deprecated.Report(ctx, deprecated.OptionDestinationOverrideFields)
|
return E.New("destination override fields in direct outbound are deprecated in sing-box 1.11.0 and removed in sing-box 1.13.0, use route options instead")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -55,7 +55,6 @@ type InboundOptions struct {
|
|||||||
SniffTimeout badoption.Duration `json:"sniff_timeout,omitempty"`
|
SniffTimeout badoption.Duration `json:"sniff_timeout,omitempty"`
|
||||||
DomainStrategy DomainStrategy `json:"domain_strategy,omitempty"`
|
DomainStrategy DomainStrategy `json:"domain_strategy,omitempty"`
|
||||||
UDPDisableDomainUnmapping bool `json:"udp_disable_domain_unmapping,omitempty"`
|
UDPDisableDomainUnmapping bool `json:"udp_disable_domain_unmapping,omitempty"`
|
||||||
Detour string `json:"detour,omitempty"`
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type ListenOptions struct {
|
type ListenOptions struct {
|
||||||
@@ -73,6 +72,7 @@ type ListenOptions struct {
|
|||||||
UDPFragment *bool `json:"udp_fragment,omitempty"`
|
UDPFragment *bool `json:"udp_fragment,omitempty"`
|
||||||
UDPFragmentDefault bool `json:"-"`
|
UDPFragmentDefault bool `json:"-"`
|
||||||
UDPTimeout UDPTimeoutCompat `json:"udp_timeout,omitempty"`
|
UDPTimeout UDPTimeoutCompat `json:"udp_timeout,omitempty"`
|
||||||
|
Detour string `json:"detour,omitempty"`
|
||||||
|
|
||||||
// Deprecated: removed
|
// Deprecated: removed
|
||||||
ProxyProtocol bool `json:"proxy_protocol,omitempty"`
|
ProxyProtocol bool `json:"proxy_protocol,omitempty"`
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
|
|
||||||
C "github.com/sagernet/sing-box/constant"
|
C "github.com/sagernet/sing-box/constant"
|
||||||
"github.com/sagernet/sing-box/experimental/deprecated"
|
|
||||||
E "github.com/sagernet/sing/common/exceptions"
|
E "github.com/sagernet/sing/common/exceptions"
|
||||||
"github.com/sagernet/sing/common/json"
|
"github.com/sagernet/sing/common/json"
|
||||||
"github.com/sagernet/sing/common/json/badjson"
|
"github.com/sagernet/sing/common/json/badjson"
|
||||||
@@ -40,7 +39,7 @@ func (h *Outbound) UnmarshalJSONContext(ctx context.Context, content []byte) err
|
|||||||
}
|
}
|
||||||
switch h.Type {
|
switch h.Type {
|
||||||
case C.TypeDNS:
|
case C.TypeDNS:
|
||||||
deprecated.Report(ctx, deprecated.OptionSpecialOutbounds)
|
return E.New("dns outbound is deprecated in sing-box 1.11.0 and removed in sing-box 1.13.0, use rule actions instead")
|
||||||
}
|
}
|
||||||
options, loaded := registry.CreateOptions(h.Type)
|
options, loaded := registry.CreateOptions(h.Type)
|
||||||
if !loaded {
|
if !loaded {
|
||||||
@@ -51,8 +50,9 @@ func (h *Outbound) UnmarshalJSONContext(ctx context.Context, content []byte) err
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if listenWrapper, isListen := options.(ListenOptionsWrapper); isListen {
|
if listenWrapper, isListen := options.(ListenOptionsWrapper); isListen {
|
||||||
|
//nolint:staticcheck
|
||||||
if listenWrapper.TakeListenOptions().InboundOptions != (InboundOptions{}) {
|
if listenWrapper.TakeListenOptions().InboundOptions != (InboundOptions{}) {
|
||||||
deprecated.Report(ctx, deprecated.OptionInboundOptions)
|
return E.New("legacy inbound fields are deprecated in sing-box 1.11.0 and removed in sing-box 1.13.0, use rule actions instead")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
h.Options = options
|
h.Options = options
|
||||||
|
|||||||
@@ -28,28 +28,3 @@ type WireGuardPeer struct {
|
|||||||
PersistentKeepaliveInterval uint16 `json:"persistent_keepalive_interval,omitempty"`
|
PersistentKeepaliveInterval uint16 `json:"persistent_keepalive_interval,omitempty"`
|
||||||
Reserved []uint8 `json:"reserved,omitempty"`
|
Reserved []uint8 `json:"reserved,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type LegacyWireGuardOutboundOptions struct {
|
|
||||||
DialerOptions
|
|
||||||
SystemInterface bool `json:"system_interface,omitempty"`
|
|
||||||
GSO bool `json:"gso,omitempty"`
|
|
||||||
InterfaceName string `json:"interface_name,omitempty"`
|
|
||||||
LocalAddress badoption.Listable[netip.Prefix] `json:"local_address"`
|
|
||||||
PrivateKey string `json:"private_key"`
|
|
||||||
Peers []LegacyWireGuardPeer `json:"peers,omitempty"`
|
|
||||||
ServerOptions
|
|
||||||
PeerPublicKey string `json:"peer_public_key"`
|
|
||||||
PreSharedKey string `json:"pre_shared_key,omitempty"`
|
|
||||||
Reserved []uint8 `json:"reserved,omitempty"`
|
|
||||||
Workers int `json:"workers,omitempty"`
|
|
||||||
MTU uint32 `json:"mtu,omitempty"`
|
|
||||||
Network NetworkList `json:"network,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type LegacyWireGuardPeer struct {
|
|
||||||
ServerOptions
|
|
||||||
PublicKey string `json:"public_key,omitempty"`
|
|
||||||
PreSharedKey string `json:"pre_shared_key,omitempty"`
|
|
||||||
AllowedIPs badoption.Listable[netip.Prefix] `json:"allowed_ips,omitempty"`
|
|
||||||
Reserved []uint8 `json:"reserved,omitempty"`
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -122,7 +122,6 @@ func (h *inboundHandler) NewConnectionEx(ctx context.Context, conn net.Conn, sou
|
|||||||
//nolint:staticcheck
|
//nolint:staticcheck
|
||||||
metadata.InboundDetour = h.listener.ListenOptions().Detour
|
metadata.InboundDetour = h.listener.ListenOptions().Detour
|
||||||
//nolint:staticcheck
|
//nolint:staticcheck
|
||||||
metadata.InboundOptions = h.listener.ListenOptions().InboundOptions
|
|
||||||
metadata.Source = source
|
metadata.Source = source
|
||||||
metadata.Destination = destination.Unwrap()
|
metadata.Destination = destination.Unwrap()
|
||||||
if userName, _ := auth.UserFromContext[string](ctx); userName != "" {
|
if userName, _ := auth.UserFromContext[string](ctx); userName != "" {
|
||||||
|
|||||||
@@ -111,7 +111,6 @@ func (i *Inbound) NewPacketConnectionEx(ctx context.Context, conn N.PacketConn,
|
|||||||
//nolint:staticcheck
|
//nolint:staticcheck
|
||||||
metadata.InboundDetour = i.listener.ListenOptions().Detour
|
metadata.InboundDetour = i.listener.ListenOptions().Detour
|
||||||
//nolint:staticcheck
|
//nolint:staticcheck
|
||||||
metadata.InboundOptions = i.listener.ListenOptions().InboundOptions
|
|
||||||
metadata.Source = source
|
metadata.Source = source
|
||||||
destination = i.listener.UDPAddr()
|
destination = i.listener.UDPAddr()
|
||||||
switch i.overrideOption {
|
switch i.overrideOption {
|
||||||
|
|||||||
@@ -16,7 +16,6 @@ import (
|
|||||||
"github.com/sagernet/sing-tun"
|
"github.com/sagernet/sing-tun"
|
||||||
"github.com/sagernet/sing-tun/ping"
|
"github.com/sagernet/sing-tun/ping"
|
||||||
"github.com/sagernet/sing/common"
|
"github.com/sagernet/sing/common"
|
||||||
"github.com/sagernet/sing/common/bufio"
|
|
||||||
E "github.com/sagernet/sing/common/exceptions"
|
E "github.com/sagernet/sing/common/exceptions"
|
||||||
"github.com/sagernet/sing/common/logger"
|
"github.com/sagernet/sing/common/logger"
|
||||||
M "github.com/sagernet/sing/common/metadata"
|
M "github.com/sagernet/sing/common/metadata"
|
||||||
@@ -36,14 +35,12 @@ var (
|
|||||||
|
|
||||||
type Outbound struct {
|
type Outbound struct {
|
||||||
outbound.Adapter
|
outbound.Adapter
|
||||||
ctx context.Context
|
ctx context.Context
|
||||||
logger logger.ContextLogger
|
logger logger.ContextLogger
|
||||||
dialer dialer.ParallelInterfaceDialer
|
dialer dialer.ParallelInterfaceDialer
|
||||||
domainStrategy C.DomainStrategy
|
domainStrategy C.DomainStrategy
|
||||||
fallbackDelay time.Duration
|
fallbackDelay time.Duration
|
||||||
overrideOption int
|
isEmpty bool
|
||||||
overrideDestination M.Socksaddr
|
|
||||||
isEmpty bool
|
|
||||||
// loopBack *loopBackDetector
|
// loopBack *loopBackDetector
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -69,25 +66,13 @@ func NewOutbound(ctx context.Context, router adapter.Router, logger log.ContextL
|
|||||||
domainStrategy: C.DomainStrategy(options.DomainStrategy),
|
domainStrategy: C.DomainStrategy(options.DomainStrategy),
|
||||||
fallbackDelay: time.Duration(options.FallbackDelay),
|
fallbackDelay: time.Duration(options.FallbackDelay),
|
||||||
dialer: outboundDialer.(dialer.ParallelInterfaceDialer),
|
dialer: outboundDialer.(dialer.ParallelInterfaceDialer),
|
||||||
//nolint:staticcheck
|
isEmpty: reflect.DeepEqual(options.DialerOptions, option.DialerOptions{UDPFragmentDefault: true}),
|
||||||
isEmpty: reflect.DeepEqual(options.DialerOptions, option.DialerOptions{UDPFragmentDefault: true}) && options.OverrideAddress == "" && options.OverridePort == 0,
|
|
||||||
// loopBack: newLoopBackDetector(router),
|
// loopBack: newLoopBackDetector(router),
|
||||||
}
|
}
|
||||||
//nolint:staticcheck
|
//nolint:staticcheck
|
||||||
if options.ProxyProtocol != 0 {
|
if options.ProxyProtocol != 0 {
|
||||||
return nil, E.New("Proxy Protocol is deprecated and removed in sing-box 1.6.0")
|
return nil, E.New("Proxy Protocol is deprecated and removed in sing-box 1.6.0")
|
||||||
}
|
}
|
||||||
//nolint:staticcheck
|
|
||||||
if options.OverrideAddress != "" && options.OverridePort != 0 {
|
|
||||||
outbound.overrideOption = 1
|
|
||||||
outbound.overrideDestination = M.ParseSocksaddrHostPort(options.OverrideAddress, options.OverridePort)
|
|
||||||
} else if options.OverrideAddress != "" {
|
|
||||||
outbound.overrideOption = 2
|
|
||||||
outbound.overrideDestination = M.ParseSocksaddrHostPort(options.OverrideAddress, options.OverridePort)
|
|
||||||
} else if options.OverridePort != 0 {
|
|
||||||
outbound.overrideOption = 3
|
|
||||||
outbound.overrideDestination = M.Socksaddr{Port: options.OverridePort}
|
|
||||||
}
|
|
||||||
return outbound, nil
|
return outbound, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -95,16 +80,6 @@ func (h *Outbound) DialContext(ctx context.Context, network string, destination
|
|||||||
ctx, metadata := adapter.ExtendContext(ctx)
|
ctx, metadata := adapter.ExtendContext(ctx)
|
||||||
metadata.Outbound = h.Tag()
|
metadata.Outbound = h.Tag()
|
||||||
metadata.Destination = destination
|
metadata.Destination = destination
|
||||||
switch h.overrideOption {
|
|
||||||
case 1:
|
|
||||||
destination = h.overrideDestination
|
|
||||||
case 2:
|
|
||||||
newDestination := h.overrideDestination
|
|
||||||
newDestination.Port = destination.Port
|
|
||||||
destination = newDestination
|
|
||||||
case 3:
|
|
||||||
destination.Port = h.overrideDestination.Port
|
|
||||||
}
|
|
||||||
network = N.NetworkName(network)
|
network = N.NetworkName(network)
|
||||||
switch network {
|
switch network {
|
||||||
case N.NetworkTCP:
|
case N.NetworkTCP:
|
||||||
@@ -124,30 +99,12 @@ func (h *Outbound) ListenPacket(ctx context.Context, destination M.Socksaddr) (n
|
|||||||
ctx, metadata := adapter.ExtendContext(ctx)
|
ctx, metadata := adapter.ExtendContext(ctx)
|
||||||
metadata.Outbound = h.Tag()
|
metadata.Outbound = h.Tag()
|
||||||
metadata.Destination = destination
|
metadata.Destination = destination
|
||||||
originDestination := destination
|
h.logger.InfoContext(ctx, "outbound packet connection")
|
||||||
switch h.overrideOption {
|
|
||||||
case 1:
|
|
||||||
destination = h.overrideDestination
|
|
||||||
case 2:
|
|
||||||
newDestination := h.overrideDestination
|
|
||||||
newDestination.Port = destination.Port
|
|
||||||
destination = newDestination
|
|
||||||
case 3:
|
|
||||||
destination.Port = h.overrideDestination.Port
|
|
||||||
}
|
|
||||||
if h.overrideOption == 0 {
|
|
||||||
h.logger.InfoContext(ctx, "outbound packet connection")
|
|
||||||
} else {
|
|
||||||
h.logger.InfoContext(ctx, "outbound packet connection to ", destination)
|
|
||||||
}
|
|
||||||
conn, err := h.dialer.ListenPacket(ctx, destination)
|
conn, err := h.dialer.ListenPacket(ctx, destination)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
// conn = h.loopBack.NewPacketConn(bufio.NewPacketConn(conn), destination)
|
// conn = h.loopBack.NewPacketConn(bufio.NewPacketConn(conn), destination)
|
||||||
if originDestination != destination {
|
|
||||||
conn = bufio.NewNATPacketConn(bufio.NewPacketConn(conn), destination, originDestination)
|
|
||||||
}
|
|
||||||
return conn, nil
|
return conn, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -165,13 +122,6 @@ func (h *Outbound) DialParallel(ctx context.Context, network string, destination
|
|||||||
ctx, metadata := adapter.ExtendContext(ctx)
|
ctx, metadata := adapter.ExtendContext(ctx)
|
||||||
metadata.Outbound = h.Tag()
|
metadata.Outbound = h.Tag()
|
||||||
metadata.Destination = destination
|
metadata.Destination = destination
|
||||||
switch h.overrideOption {
|
|
||||||
case 1, 2:
|
|
||||||
// override address
|
|
||||||
return h.DialContext(ctx, network, destination)
|
|
||||||
case 3:
|
|
||||||
destination.Port = h.overrideDestination.Port
|
|
||||||
}
|
|
||||||
network = N.NetworkName(network)
|
network = N.NetworkName(network)
|
||||||
switch network {
|
switch network {
|
||||||
case N.NetworkTCP:
|
case N.NetworkTCP:
|
||||||
@@ -186,13 +136,6 @@ func (h *Outbound) DialParallelNetwork(ctx context.Context, network string, dest
|
|||||||
ctx, metadata := adapter.ExtendContext(ctx)
|
ctx, metadata := adapter.ExtendContext(ctx)
|
||||||
metadata.Outbound = h.Tag()
|
metadata.Outbound = h.Tag()
|
||||||
metadata.Destination = destination
|
metadata.Destination = destination
|
||||||
switch h.overrideOption {
|
|
||||||
case 1, 2:
|
|
||||||
// override address
|
|
||||||
return h.DialContext(ctx, network, destination)
|
|
||||||
case 3:
|
|
||||||
destination.Port = h.overrideDestination.Port
|
|
||||||
}
|
|
||||||
network = N.NetworkName(network)
|
network = N.NetworkName(network)
|
||||||
switch network {
|
switch network {
|
||||||
case N.NetworkTCP:
|
case N.NetworkTCP:
|
||||||
@@ -207,21 +150,7 @@ func (h *Outbound) ListenSerialNetworkPacket(ctx context.Context, destination M.
|
|||||||
ctx, metadata := adapter.ExtendContext(ctx)
|
ctx, metadata := adapter.ExtendContext(ctx)
|
||||||
metadata.Outbound = h.Tag()
|
metadata.Outbound = h.Tag()
|
||||||
metadata.Destination = destination
|
metadata.Destination = destination
|
||||||
switch h.overrideOption {
|
h.logger.InfoContext(ctx, "outbound packet connection")
|
||||||
case 1:
|
|
||||||
destination = h.overrideDestination
|
|
||||||
case 2:
|
|
||||||
newDestination := h.overrideDestination
|
|
||||||
newDestination.Port = destination.Port
|
|
||||||
destination = newDestination
|
|
||||||
case 3:
|
|
||||||
destination.Port = h.overrideDestination.Port
|
|
||||||
}
|
|
||||||
if h.overrideOption == 0 {
|
|
||||||
h.logger.InfoContext(ctx, "outbound packet connection")
|
|
||||||
} else {
|
|
||||||
h.logger.InfoContext(ctx, "outbound packet connection to ", destination)
|
|
||||||
}
|
|
||||||
conn, newDestination, err := dialer.ListenSerialNetworkPacket(ctx, h.dialer, destination, destinationAddresses, networkStrategy, networkType, fallbackNetworkType, fallbackDelay)
|
conn, newDestination, err := dialer.ListenSerialNetworkPacket(ctx, h.dialer, destination, destinationAddresses, networkStrategy, networkType, fallbackNetworkType, fallbackDelay)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, netip.Addr{}, err
|
return nil, netip.Addr{}, err
|
||||||
|
|||||||
@@ -118,7 +118,6 @@ func (h *Inbound) NewConnectionEx(ctx context.Context, conn net.Conn, source M.S
|
|||||||
//nolint:staticcheck
|
//nolint:staticcheck
|
||||||
metadata.InboundDetour = h.listener.ListenOptions().Detour
|
metadata.InboundDetour = h.listener.ListenOptions().Detour
|
||||||
//nolint:staticcheck
|
//nolint:staticcheck
|
||||||
metadata.InboundOptions = h.listener.ListenOptions().InboundOptions
|
|
||||||
metadata.OriginDestination = h.listener.UDPAddr()
|
metadata.OriginDestination = h.listener.UDPAddr()
|
||||||
metadata.Source = source
|
metadata.Source = source
|
||||||
metadata.Destination = destination
|
metadata.Destination = destination
|
||||||
@@ -141,7 +140,6 @@ func (h *Inbound) NewPacketConnectionEx(ctx context.Context, conn N.PacketConn,
|
|||||||
//nolint:staticcheck
|
//nolint:staticcheck
|
||||||
metadata.InboundDetour = h.listener.ListenOptions().Detour
|
metadata.InboundDetour = h.listener.ListenOptions().Detour
|
||||||
//nolint:staticcheck
|
//nolint:staticcheck
|
||||||
metadata.InboundOptions = h.listener.ListenOptions().InboundOptions
|
|
||||||
metadata.OriginDestination = h.listener.UDPAddr()
|
metadata.OriginDestination = h.listener.UDPAddr()
|
||||||
metadata.Source = source
|
metadata.Source = source
|
||||||
metadata.Destination = destination
|
metadata.Destination = destination
|
||||||
|
|||||||
@@ -151,7 +151,6 @@ func (h *Inbound) NewConnectionEx(ctx context.Context, conn net.Conn, source M.S
|
|||||||
//nolint:staticcheck
|
//nolint:staticcheck
|
||||||
metadata.InboundDetour = h.listener.ListenOptions().Detour
|
metadata.InboundDetour = h.listener.ListenOptions().Detour
|
||||||
//nolint:staticcheck
|
//nolint:staticcheck
|
||||||
metadata.InboundOptions = h.listener.ListenOptions().InboundOptions
|
|
||||||
metadata.OriginDestination = h.listener.UDPAddr()
|
metadata.OriginDestination = h.listener.UDPAddr()
|
||||||
metadata.Source = source
|
metadata.Source = source
|
||||||
metadata.Destination = destination
|
metadata.Destination = destination
|
||||||
@@ -174,7 +173,6 @@ func (h *Inbound) NewPacketConnectionEx(ctx context.Context, conn N.PacketConn,
|
|||||||
//nolint:staticcheck
|
//nolint:staticcheck
|
||||||
metadata.InboundDetour = h.listener.ListenOptions().Detour
|
metadata.InboundDetour = h.listener.ListenOptions().Detour
|
||||||
//nolint:staticcheck
|
//nolint:staticcheck
|
||||||
metadata.InboundOptions = h.listener.ListenOptions().InboundOptions
|
|
||||||
metadata.OriginDestination = h.listener.UDPAddr()
|
metadata.OriginDestination = h.listener.UDPAddr()
|
||||||
metadata.Source = source
|
metadata.Source = source
|
||||||
metadata.Destination = destination
|
metadata.Destination = destination
|
||||||
|
|||||||
@@ -209,7 +209,6 @@ func (n *Inbound) newConnection(ctx context.Context, waitForClose bool, conn net
|
|||||||
//nolint:staticcheck
|
//nolint:staticcheck
|
||||||
metadata.InboundDetour = n.listener.ListenOptions().Detour
|
metadata.InboundDetour = n.listener.ListenOptions().Detour
|
||||||
//nolint:staticcheck
|
//nolint:staticcheck
|
||||||
metadata.InboundOptions = n.listener.ListenOptions().InboundOptions
|
|
||||||
metadata.Source = source
|
metadata.Source = source
|
||||||
metadata.Destination = destination
|
metadata.Destination = destination
|
||||||
metadata.OriginDestination = M.SocksaddrFromNet(conn.LocalAddr()).Unwrap()
|
metadata.OriginDestination = M.SocksaddrFromNet(conn.LocalAddr()).Unwrap()
|
||||||
|
|||||||
@@ -175,7 +175,6 @@ func (h *MultiInbound) newConnection(ctx context.Context, conn net.Conn, metadat
|
|||||||
//nolint:staticcheck
|
//nolint:staticcheck
|
||||||
metadata.InboundDetour = h.listener.ListenOptions().Detour
|
metadata.InboundDetour = h.listener.ListenOptions().Detour
|
||||||
//nolint:staticcheck
|
//nolint:staticcheck
|
||||||
metadata.InboundOptions = h.listener.ListenOptions().InboundOptions
|
|
||||||
if h.tracker != nil {
|
if h.tracker != nil {
|
||||||
conn = h.tracker.TrackConnection(conn, metadata)
|
conn = h.tracker.TrackConnection(conn, metadata)
|
||||||
}
|
}
|
||||||
@@ -201,7 +200,6 @@ func (h *MultiInbound) newPacketConnection(ctx context.Context, conn N.PacketCon
|
|||||||
//nolint:staticcheck
|
//nolint:staticcheck
|
||||||
metadata.InboundDetour = h.listener.ListenOptions().Detour
|
metadata.InboundDetour = h.listener.ListenOptions().Detour
|
||||||
//nolint:staticcheck
|
//nolint:staticcheck
|
||||||
metadata.InboundOptions = h.listener.ListenOptions().InboundOptions
|
|
||||||
if h.tracker != nil {
|
if h.tracker != nil {
|
||||||
conn = h.tracker.TrackPacketConnection(conn, metadata)
|
conn = h.tracker.TrackPacketConnection(conn, metadata)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -135,7 +135,6 @@ func (h *RelayInbound) newConnection(ctx context.Context, conn net.Conn, metadat
|
|||||||
//nolint:staticcheck
|
//nolint:staticcheck
|
||||||
metadata.InboundDetour = h.listener.ListenOptions().Detour
|
metadata.InboundDetour = h.listener.ListenOptions().Detour
|
||||||
//nolint:staticcheck
|
//nolint:staticcheck
|
||||||
metadata.InboundOptions = h.listener.ListenOptions().InboundOptions
|
|
||||||
return h.router.RouteConnection(ctx, conn, metadata)
|
return h.router.RouteConnection(ctx, conn, metadata)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -158,7 +157,6 @@ func (h *RelayInbound) newPacketConnection(ctx context.Context, conn N.PacketCon
|
|||||||
//nolint:staticcheck
|
//nolint:staticcheck
|
||||||
metadata.InboundDetour = h.listener.ListenOptions().Detour
|
metadata.InboundDetour = h.listener.ListenOptions().Detour
|
||||||
//nolint:staticcheck
|
//nolint:staticcheck
|
||||||
metadata.InboundOptions = h.listener.ListenOptions().InboundOptions
|
|
||||||
return h.router.RoutePacketConnection(ctx, conn, metadata)
|
return h.router.RoutePacketConnection(ctx, conn, metadata)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -129,7 +129,6 @@ func (h *inboundHandler) NewConnectionEx(ctx context.Context, conn net.Conn, sou
|
|||||||
//nolint:staticcheck
|
//nolint:staticcheck
|
||||||
metadata.InboundDetour = h.listener.ListenOptions().Detour
|
metadata.InboundDetour = h.listener.ListenOptions().Detour
|
||||||
//nolint:staticcheck
|
//nolint:staticcheck
|
||||||
metadata.InboundOptions = h.listener.ListenOptions().InboundOptions
|
|
||||||
metadata.Source = source
|
metadata.Source = source
|
||||||
metadata.Destination = destination
|
metadata.Destination = destination
|
||||||
if userName, _ := auth.UserFromContext[string](ctx); userName != "" {
|
if userName, _ := auth.UserFromContext[string](ctx); userName != "" {
|
||||||
|
|||||||
@@ -257,7 +257,6 @@ func (h *inboundTransportHandler) NewConnectionEx(ctx context.Context, conn net.
|
|||||||
//nolint:staticcheck
|
//nolint:staticcheck
|
||||||
metadata.InboundDetour = h.listener.ListenOptions().Detour
|
metadata.InboundDetour = h.listener.ListenOptions().Detour
|
||||||
//nolint:staticcheck
|
//nolint:staticcheck
|
||||||
metadata.InboundOptions = h.listener.ListenOptions().InboundOptions
|
|
||||||
h.logger.InfoContext(ctx, "inbound connection from ", metadata.Source)
|
h.logger.InfoContext(ctx, "inbound connection from ", metadata.Source)
|
||||||
(*Inbound)(h).NewConnectionEx(ctx, conn, metadata, onClose)
|
(*Inbound)(h).NewConnectionEx(ctx, conn, metadata, onClose)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -108,7 +108,6 @@ func (h *Inbound) NewConnectionEx(ctx context.Context, conn net.Conn, source M.S
|
|||||||
//nolint:staticcheck
|
//nolint:staticcheck
|
||||||
metadata.InboundDetour = h.listener.ListenOptions().Detour
|
metadata.InboundDetour = h.listener.ListenOptions().Detour
|
||||||
//nolint:staticcheck
|
//nolint:staticcheck
|
||||||
metadata.InboundOptions = h.listener.ListenOptions().InboundOptions
|
|
||||||
metadata.OriginDestination = h.listener.UDPAddr()
|
metadata.OriginDestination = h.listener.UDPAddr()
|
||||||
metadata.Source = source
|
metadata.Source = source
|
||||||
metadata.Destination = destination
|
metadata.Destination = destination
|
||||||
@@ -131,7 +130,6 @@ func (h *Inbound) NewPacketConnectionEx(ctx context.Context, conn N.PacketConn,
|
|||||||
//nolint:staticcheck
|
//nolint:staticcheck
|
||||||
metadata.InboundDetour = h.listener.ListenOptions().Detour
|
metadata.InboundDetour = h.listener.ListenOptions().Detour
|
||||||
//nolint:staticcheck
|
//nolint:staticcheck
|
||||||
metadata.InboundOptions = h.listener.ListenOptions().InboundOptions
|
|
||||||
metadata.OriginDestination = h.listener.UDPAddr()
|
metadata.OriginDestination = h.listener.UDPAddr()
|
||||||
metadata.Source = source
|
metadata.Source = source
|
||||||
metadata.Destination = destination
|
metadata.Destination = destination
|
||||||
|
|||||||
@@ -14,7 +14,6 @@ import (
|
|||||||
"github.com/sagernet/sing-box/adapter/inbound"
|
"github.com/sagernet/sing-box/adapter/inbound"
|
||||||
"github.com/sagernet/sing-box/common/taskmonitor"
|
"github.com/sagernet/sing-box/common/taskmonitor"
|
||||||
C "github.com/sagernet/sing-box/constant"
|
C "github.com/sagernet/sing-box/constant"
|
||||||
"github.com/sagernet/sing-box/experimental/deprecated"
|
|
||||||
"github.com/sagernet/sing-box/log"
|
"github.com/sagernet/sing-box/log"
|
||||||
"github.com/sagernet/sing-box/option"
|
"github.com/sagernet/sing-box/option"
|
||||||
"github.com/sagernet/sing-box/route/rule"
|
"github.com/sagernet/sing-box/route/rule"
|
||||||
@@ -36,13 +35,11 @@ func RegisterInbound(registry *inbound.Registry) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type Inbound struct {
|
type Inbound struct {
|
||||||
tag string
|
tag string
|
||||||
ctx context.Context
|
ctx context.Context
|
||||||
router adapter.Router
|
router adapter.Router
|
||||||
networkManager adapter.NetworkManager
|
networkManager adapter.NetworkManager
|
||||||
logger log.ContextLogger
|
logger log.ContextLogger
|
||||||
//nolint:staticcheck
|
|
||||||
inboundOptions option.InboundOptions
|
|
||||||
tunOptions tun.Options
|
tunOptions tun.Options
|
||||||
udpTimeout time.Duration
|
udpTimeout time.Duration
|
||||||
stack string
|
stack string
|
||||||
@@ -60,20 +57,18 @@ type Inbound struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func NewInbound(ctx context.Context, router adapter.Router, logger log.ContextLogger, tag string, options option.TunInboundOptions) (adapter.Inbound, error) {
|
func NewInbound(ctx context.Context, router adapter.Router, logger log.ContextLogger, tag string, options option.TunInboundOptions) (adapter.Inbound, error) {
|
||||||
|
//nolint:staticcheck
|
||||||
|
if len(options.Inet4Address) > 0 || len(options.Inet6Address) > 0 ||
|
||||||
|
len(options.Inet4RouteAddress) > 0 || len(options.Inet6RouteAddress) > 0 ||
|
||||||
|
len(options.Inet4RouteExcludeAddress) > 0 || len(options.Inet6RouteExcludeAddress) > 0 {
|
||||||
|
return nil, E.New("legacy tun address fields are deprecated in sing-box 1.10.0 and removed in sing-box 1.12.0")
|
||||||
|
}
|
||||||
|
//nolint:staticcheck
|
||||||
|
if options.GSO {
|
||||||
|
return nil, E.New("GSO option in tun is deprecated in sing-box 1.11.0 and removed in sing-box 1.12.0")
|
||||||
|
}
|
||||||
|
|
||||||
address := options.Address
|
address := options.Address
|
||||||
var deprecatedAddressUsed bool
|
|
||||||
|
|
||||||
//nolint:staticcheck
|
|
||||||
if len(options.Inet4Address) > 0 {
|
|
||||||
address = append(address, options.Inet4Address...)
|
|
||||||
deprecatedAddressUsed = true
|
|
||||||
}
|
|
||||||
|
|
||||||
//nolint:staticcheck
|
|
||||||
if len(options.Inet6Address) > 0 {
|
|
||||||
address = append(address, options.Inet6Address...)
|
|
||||||
deprecatedAddressUsed = true
|
|
||||||
}
|
|
||||||
inet4Address := common.Filter(address, func(it netip.Prefix) bool {
|
inet4Address := common.Filter(address, func(it netip.Prefix) bool {
|
||||||
return it.Addr().Is4()
|
return it.Addr().Is4()
|
||||||
})
|
})
|
||||||
@@ -82,18 +77,6 @@ func NewInbound(ctx context.Context, router adapter.Router, logger log.ContextLo
|
|||||||
})
|
})
|
||||||
|
|
||||||
routeAddress := options.RouteAddress
|
routeAddress := options.RouteAddress
|
||||||
|
|
||||||
//nolint:staticcheck
|
|
||||||
if len(options.Inet4RouteAddress) > 0 {
|
|
||||||
routeAddress = append(routeAddress, options.Inet4RouteAddress...)
|
|
||||||
deprecatedAddressUsed = true
|
|
||||||
}
|
|
||||||
|
|
||||||
//nolint:staticcheck
|
|
||||||
if len(options.Inet6RouteAddress) > 0 {
|
|
||||||
routeAddress = append(routeAddress, options.Inet6RouteAddress...)
|
|
||||||
deprecatedAddressUsed = true
|
|
||||||
}
|
|
||||||
inet4RouteAddress := common.Filter(routeAddress, func(it netip.Prefix) bool {
|
inet4RouteAddress := common.Filter(routeAddress, func(it netip.Prefix) bool {
|
||||||
return it.Addr().Is4()
|
return it.Addr().Is4()
|
||||||
})
|
})
|
||||||
@@ -102,18 +85,6 @@ func NewInbound(ctx context.Context, router adapter.Router, logger log.ContextLo
|
|||||||
})
|
})
|
||||||
|
|
||||||
routeExcludeAddress := options.RouteExcludeAddress
|
routeExcludeAddress := options.RouteExcludeAddress
|
||||||
|
|
||||||
//nolint:staticcheck
|
|
||||||
if len(options.Inet4RouteExcludeAddress) > 0 {
|
|
||||||
routeExcludeAddress = append(routeExcludeAddress, options.Inet4RouteExcludeAddress...)
|
|
||||||
deprecatedAddressUsed = true
|
|
||||||
}
|
|
||||||
|
|
||||||
//nolint:staticcheck
|
|
||||||
if len(options.Inet6RouteExcludeAddress) > 0 {
|
|
||||||
routeExcludeAddress = append(routeExcludeAddress, options.Inet6RouteExcludeAddress...)
|
|
||||||
deprecatedAddressUsed = true
|
|
||||||
}
|
|
||||||
inet4RouteExcludeAddress := common.Filter(routeExcludeAddress, func(it netip.Prefix) bool {
|
inet4RouteExcludeAddress := common.Filter(routeExcludeAddress, func(it netip.Prefix) bool {
|
||||||
return it.Addr().Is4()
|
return it.Addr().Is4()
|
||||||
})
|
})
|
||||||
@@ -121,15 +92,6 @@ func NewInbound(ctx context.Context, router adapter.Router, logger log.ContextLo
|
|||||||
return it.Addr().Is6()
|
return it.Addr().Is6()
|
||||||
})
|
})
|
||||||
|
|
||||||
if deprecatedAddressUsed {
|
|
||||||
deprecated.Report(ctx, deprecated.OptionTUNAddressX)
|
|
||||||
}
|
|
||||||
|
|
||||||
//nolint:staticcheck
|
|
||||||
if options.GSO {
|
|
||||||
deprecated.Report(ctx, deprecated.OptionTUNGSO)
|
|
||||||
}
|
|
||||||
|
|
||||||
platformInterface := service.FromContext[adapter.PlatformInterface](ctx)
|
platformInterface := service.FromContext[adapter.PlatformInterface](ctx)
|
||||||
tunMTU := options.MTU
|
tunMTU := options.MTU
|
||||||
enableGSO := C.IsLinux && options.Stack == "gvisor" && platformInterface == nil && tunMTU > 0 && tunMTU < 49152
|
enableGSO := C.IsLinux && options.Stack == "gvisor" && platformInterface == nil && tunMTU > 0 && tunMTU < 49152
|
||||||
@@ -202,7 +164,6 @@ func NewInbound(ctx context.Context, router adapter.Router, logger log.ContextLo
|
|||||||
router: router,
|
router: router,
|
||||||
networkManager: networkManager,
|
networkManager: networkManager,
|
||||||
logger: logger,
|
logger: logger,
|
||||||
inboundOptions: options.InboundOptions,
|
|
||||||
tunOptions: tun.Options{
|
tunOptions: tun.Options{
|
||||||
Name: options.InterfaceName,
|
Name: options.InterfaceName,
|
||||||
MTU: tunMTU,
|
MTU: tunMTU,
|
||||||
@@ -478,13 +439,12 @@ func (t *Inbound) PrepareConnection(network string, source M.Socksaddr, destinat
|
|||||||
ipVersion = 6
|
ipVersion = 6
|
||||||
}
|
}
|
||||||
routeDestination, err := t.router.PreMatch(adapter.InboundContext{
|
routeDestination, err := t.router.PreMatch(adapter.InboundContext{
|
||||||
Inbound: t.tag,
|
Inbound: t.tag,
|
||||||
InboundType: C.TypeTun,
|
InboundType: C.TypeTun,
|
||||||
IPVersion: ipVersion,
|
IPVersion: ipVersion,
|
||||||
Network: network,
|
Network: network,
|
||||||
Source: source,
|
Source: source,
|
||||||
Destination: destination,
|
Destination: destination,
|
||||||
InboundOptions: t.inboundOptions,
|
|
||||||
}, routeContext, timeout, false)
|
}, routeContext, timeout, false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
switch {
|
switch {
|
||||||
@@ -508,8 +468,7 @@ func (t *Inbound) NewConnectionEx(ctx context.Context, conn net.Conn, source M.S
|
|||||||
metadata.InboundType = C.TypeTun
|
metadata.InboundType = C.TypeTun
|
||||||
metadata.Source = source
|
metadata.Source = source
|
||||||
metadata.Destination = destination
|
metadata.Destination = destination
|
||||||
//nolint:staticcheck
|
|
||||||
metadata.InboundOptions = t.inboundOptions
|
|
||||||
t.logger.InfoContext(ctx, "inbound connection from ", metadata.Source)
|
t.logger.InfoContext(ctx, "inbound connection from ", metadata.Source)
|
||||||
t.logger.InfoContext(ctx, "inbound connection to ", metadata.Destination)
|
t.logger.InfoContext(ctx, "inbound connection to ", metadata.Destination)
|
||||||
t.router.RouteConnectionEx(ctx, conn, metadata, onClose)
|
t.router.RouteConnectionEx(ctx, conn, metadata, onClose)
|
||||||
@@ -522,8 +481,7 @@ func (t *Inbound) NewPacketConnectionEx(ctx context.Context, conn N.PacketConn,
|
|||||||
metadata.InboundType = C.TypeTun
|
metadata.InboundType = C.TypeTun
|
||||||
metadata.Source = source
|
metadata.Source = source
|
||||||
metadata.Destination = destination
|
metadata.Destination = destination
|
||||||
//nolint:staticcheck
|
|
||||||
metadata.InboundOptions = t.inboundOptions
|
|
||||||
t.logger.InfoContext(ctx, "inbound packet connection from ", metadata.Source)
|
t.logger.InfoContext(ctx, "inbound packet connection from ", metadata.Source)
|
||||||
t.logger.InfoContext(ctx, "inbound packet connection to ", metadata.Destination)
|
t.logger.InfoContext(ctx, "inbound packet connection to ", metadata.Destination)
|
||||||
t.router.RoutePacketConnectionEx(ctx, conn, metadata, onClose)
|
t.router.RoutePacketConnectionEx(ctx, conn, metadata, onClose)
|
||||||
@@ -539,13 +497,12 @@ func (t *autoRedirectHandler) PrepareConnection(network string, source M.Socksad
|
|||||||
ipVersion = 6
|
ipVersion = 6
|
||||||
}
|
}
|
||||||
routeDestination, err := t.router.PreMatch(adapter.InboundContext{
|
routeDestination, err := t.router.PreMatch(adapter.InboundContext{
|
||||||
Inbound: t.tag,
|
Inbound: t.tag,
|
||||||
InboundType: C.TypeTun,
|
InboundType: C.TypeTun,
|
||||||
IPVersion: ipVersion,
|
IPVersion: ipVersion,
|
||||||
Network: network,
|
Network: network,
|
||||||
Source: source,
|
Source: source,
|
||||||
Destination: destination,
|
Destination: destination,
|
||||||
InboundOptions: t.inboundOptions,
|
|
||||||
}, routeContext, timeout, true)
|
}, routeContext, timeout, true)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
switch {
|
switch {
|
||||||
@@ -569,8 +526,7 @@ func (t *autoRedirectHandler) NewConnectionEx(ctx context.Context, conn net.Conn
|
|||||||
metadata.InboundType = C.TypeTun
|
metadata.InboundType = C.TypeTun
|
||||||
metadata.Source = source
|
metadata.Source = source
|
||||||
metadata.Destination = destination
|
metadata.Destination = destination
|
||||||
//nolint:staticcheck
|
|
||||||
metadata.InboundOptions = t.inboundOptions
|
|
||||||
t.logger.InfoContext(ctx, "inbound redirect connection from ", metadata.Source)
|
t.logger.InfoContext(ctx, "inbound redirect connection from ", metadata.Source)
|
||||||
t.logger.InfoContext(ctx, "inbound connection to ", metadata.Destination)
|
t.logger.InfoContext(ctx, "inbound connection to ", metadata.Destination)
|
||||||
t.router.RouteConnectionEx(ctx, conn, metadata, onClose)
|
t.router.RouteConnectionEx(ctx, conn, metadata, onClose)
|
||||||
|
|||||||
@@ -217,7 +217,6 @@ func (h *inboundTransportHandler) NewConnectionEx(ctx context.Context, conn net.
|
|||||||
//nolint:staticcheck
|
//nolint:staticcheck
|
||||||
metadata.InboundDetour = h.listener.ListenOptions().Detour
|
metadata.InboundDetour = h.listener.ListenOptions().Detour
|
||||||
//nolint:staticcheck
|
//nolint:staticcheck
|
||||||
metadata.InboundOptions = h.listener.ListenOptions().InboundOptions
|
|
||||||
h.logger.InfoContext(ctx, "inbound connection from ", metadata.Source)
|
h.logger.InfoContext(ctx, "inbound connection from ", metadata.Source)
|
||||||
(*Inbound)(h).NewConnectionEx(ctx, conn, metadata, onClose)
|
(*Inbound)(h).NewConnectionEx(ctx, conn, metadata, onClose)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -223,7 +223,6 @@ func (h *inboundTransportHandler) NewConnectionEx(ctx context.Context, conn net.
|
|||||||
//nolint:staticcheck
|
//nolint:staticcheck
|
||||||
metadata.InboundDetour = h.listener.ListenOptions().Detour
|
metadata.InboundDetour = h.listener.ListenOptions().Detour
|
||||||
//nolint:staticcheck
|
//nolint:staticcheck
|
||||||
metadata.InboundOptions = h.listener.ListenOptions().InboundOptions
|
|
||||||
h.logger.InfoContext(ctx, "inbound connection from ", metadata.Source)
|
h.logger.InfoContext(ctx, "inbound connection from ", metadata.Source)
|
||||||
(*Inbound)(h).NewConnectionEx(ctx, conn, metadata, onClose)
|
(*Inbound)(h).NewConnectionEx(ctx, conn, metadata, onClose)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,176 +0,0 @@
|
|||||||
package wireguard
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"net"
|
|
||||||
"net/netip"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/sagernet/sing-box/adapter"
|
|
||||||
"github.com/sagernet/sing-box/adapter/outbound"
|
|
||||||
"github.com/sagernet/sing-box/common/dialer"
|
|
||||||
C "github.com/sagernet/sing-box/constant"
|
|
||||||
"github.com/sagernet/sing-box/experimental/deprecated"
|
|
||||||
"github.com/sagernet/sing-box/log"
|
|
||||||
"github.com/sagernet/sing-box/option"
|
|
||||||
"github.com/sagernet/sing-box/transport/wireguard"
|
|
||||||
tun "github.com/sagernet/sing-tun"
|
|
||||||
"github.com/sagernet/sing/common"
|
|
||||||
E "github.com/sagernet/sing/common/exceptions"
|
|
||||||
"github.com/sagernet/sing/common/logger"
|
|
||||||
M "github.com/sagernet/sing/common/metadata"
|
|
||||||
N "github.com/sagernet/sing/common/network"
|
|
||||||
"github.com/sagernet/sing/service"
|
|
||||||
)
|
|
||||||
|
|
||||||
var _ adapter.OutboundWithPreferredRoutes = (*Outbound)(nil)
|
|
||||||
|
|
||||||
func RegisterOutbound(registry *outbound.Registry) {
|
|
||||||
outbound.Register[option.LegacyWireGuardOutboundOptions](registry, C.TypeWireGuard, NewOutbound)
|
|
||||||
}
|
|
||||||
|
|
||||||
type Outbound struct {
|
|
||||||
outbound.Adapter
|
|
||||||
ctx context.Context
|
|
||||||
dnsRouter adapter.DNSRouter
|
|
||||||
logger logger.ContextLogger
|
|
||||||
localAddresses []netip.Prefix
|
|
||||||
endpoint *wireguard.Endpoint
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewOutbound(ctx context.Context, router adapter.Router, logger log.ContextLogger, tag string, options option.LegacyWireGuardOutboundOptions) (adapter.Outbound, error) {
|
|
||||||
deprecated.Report(ctx, deprecated.OptionWireGuardOutbound)
|
|
||||||
if options.GSO {
|
|
||||||
deprecated.Report(ctx, deprecated.OptionWireGuardGSO)
|
|
||||||
}
|
|
||||||
outbound := &Outbound{
|
|
||||||
Adapter: outbound.NewAdapterWithDialerOptions(C.TypeWireGuard, tag, []string{N.NetworkTCP, N.NetworkUDP, N.NetworkICMP}, options.DialerOptions),
|
|
||||||
ctx: ctx,
|
|
||||||
dnsRouter: service.FromContext[adapter.DNSRouter](ctx),
|
|
||||||
logger: logger,
|
|
||||||
localAddresses: options.LocalAddress,
|
|
||||||
}
|
|
||||||
if options.Detour != "" && options.GSO {
|
|
||||||
return nil, E.New("gso is conflict with detour")
|
|
||||||
}
|
|
||||||
outboundDialer, err := dialer.NewWithOptions(dialer.Options{
|
|
||||||
Context: ctx,
|
|
||||||
Options: options.DialerOptions,
|
|
||||||
RemoteIsDomain: options.ServerIsDomain() || common.Any(options.Peers, func(it option.LegacyWireGuardPeer) bool {
|
|
||||||
return it.ServerIsDomain()
|
|
||||||
}),
|
|
||||||
ResolverOnDetour: true,
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
peers := common.Map(options.Peers, func(it option.LegacyWireGuardPeer) wireguard.PeerOptions {
|
|
||||||
return wireguard.PeerOptions{
|
|
||||||
Endpoint: it.ServerOptions.Build(),
|
|
||||||
PublicKey: it.PublicKey,
|
|
||||||
PreSharedKey: it.PreSharedKey,
|
|
||||||
AllowedIPs: it.AllowedIPs,
|
|
||||||
// PersistentKeepaliveInterval: time.Duration(it.PersistentKeepaliveInterval),
|
|
||||||
Reserved: it.Reserved,
|
|
||||||
}
|
|
||||||
})
|
|
||||||
if len(peers) == 0 {
|
|
||||||
peers = []wireguard.PeerOptions{{
|
|
||||||
Endpoint: options.ServerOptions.Build(),
|
|
||||||
PublicKey: options.PeerPublicKey,
|
|
||||||
PreSharedKey: options.PreSharedKey,
|
|
||||||
AllowedIPs: []netip.Prefix{netip.PrefixFrom(netip.IPv4Unspecified(), 0), netip.PrefixFrom(netip.IPv6Unspecified(), 0)},
|
|
||||||
Reserved: options.Reserved,
|
|
||||||
}}
|
|
||||||
}
|
|
||||||
wgEndpoint, err := wireguard.NewEndpoint(wireguard.EndpointOptions{
|
|
||||||
Context: ctx,
|
|
||||||
Logger: logger,
|
|
||||||
System: options.SystemInterface,
|
|
||||||
Dialer: outboundDialer,
|
|
||||||
CreateDialer: func(interfaceName string) N.Dialer {
|
|
||||||
return common.Must1(dialer.NewDefault(ctx, option.DialerOptions{
|
|
||||||
BindInterface: interfaceName,
|
|
||||||
}))
|
|
||||||
},
|
|
||||||
Name: options.InterfaceName,
|
|
||||||
MTU: options.MTU,
|
|
||||||
Address: options.LocalAddress,
|
|
||||||
PrivateKey: options.PrivateKey,
|
|
||||||
ResolvePeer: func(domain string) (netip.Addr, error) {
|
|
||||||
endpointAddresses, lookupErr := outbound.dnsRouter.Lookup(ctx, domain, outboundDialer.(dialer.ResolveDialer).QueryOptions())
|
|
||||||
if lookupErr != nil {
|
|
||||||
return netip.Addr{}, lookupErr
|
|
||||||
}
|
|
||||||
return endpointAddresses[0], nil
|
|
||||||
},
|
|
||||||
Peers: peers,
|
|
||||||
Workers: options.Workers,
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
outbound.endpoint = wgEndpoint
|
|
||||||
return outbound, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (o *Outbound) Start(stage adapter.StartStage) error {
|
|
||||||
switch stage {
|
|
||||||
case adapter.StartStateStart:
|
|
||||||
return o.endpoint.Start(false)
|
|
||||||
case adapter.StartStatePostStart:
|
|
||||||
return o.endpoint.Start(true)
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (o *Outbound) Close() error {
|
|
||||||
return o.endpoint.Close()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (o *Outbound) DialContext(ctx context.Context, network string, destination M.Socksaddr) (net.Conn, error) {
|
|
||||||
switch network {
|
|
||||||
case N.NetworkTCP:
|
|
||||||
o.logger.InfoContext(ctx, "outbound connection to ", destination)
|
|
||||||
case N.NetworkUDP:
|
|
||||||
o.logger.InfoContext(ctx, "outbound packet connection to ", destination)
|
|
||||||
}
|
|
||||||
if destination.IsFqdn() {
|
|
||||||
destinationAddresses, err := o.dnsRouter.Lookup(ctx, destination.Fqdn, adapter.DNSQueryOptions{})
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return N.DialSerial(ctx, o.endpoint, network, destination, destinationAddresses)
|
|
||||||
} else if !destination.Addr.IsValid() {
|
|
||||||
return nil, E.New("invalid destination: ", destination)
|
|
||||||
}
|
|
||||||
return o.endpoint.DialContext(ctx, network, destination)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (o *Outbound) ListenPacket(ctx context.Context, destination M.Socksaddr) (net.PacketConn, error) {
|
|
||||||
o.logger.InfoContext(ctx, "outbound packet connection to ", destination)
|
|
||||||
if destination.IsFqdn() {
|
|
||||||
destinationAddresses, err := o.dnsRouter.Lookup(ctx, destination.Fqdn, adapter.DNSQueryOptions{})
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
packetConn, _, err := N.ListenSerial(ctx, o.endpoint, destination, destinationAddresses)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return packetConn, err
|
|
||||||
}
|
|
||||||
return o.endpoint.ListenPacket(ctx, destination)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (o *Outbound) PreferredDomain(domain string) bool {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
func (o *Outbound) PreferredAddress(address netip.Addr) bool {
|
|
||||||
return o.endpoint.Lookup(address) != nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (o *Outbound) NewDirectRouteConnection(metadata adapter.InboundContext, routeContext tun.DirectRouteContext, timeout time.Duration) (tun.DirectRouteDestination, error) {
|
|
||||||
return o.endpoint.NewDirectRouteConnection(metadata, routeContext, timeout)
|
|
||||||
}
|
|
||||||
@@ -12,7 +12,6 @@ import (
|
|||||||
"github.com/sagernet/sing-box/common/process"
|
"github.com/sagernet/sing-box/common/process"
|
||||||
"github.com/sagernet/sing-box/common/sniff"
|
"github.com/sagernet/sing-box/common/sniff"
|
||||||
C "github.com/sagernet/sing-box/constant"
|
C "github.com/sagernet/sing-box/constant"
|
||||||
"github.com/sagernet/sing-box/option"
|
|
||||||
R "github.com/sagernet/sing-box/route/rule"
|
R "github.com/sagernet/sing-box/route/rule"
|
||||||
"github.com/sagernet/sing-mux"
|
"github.com/sagernet/sing-mux"
|
||||||
"github.com/sagernet/sing-tun"
|
"github.com/sagernet/sing-tun"
|
||||||
@@ -468,37 +467,6 @@ func (r *Router) matchRule(
|
|||||||
metadata.IPVersion = 6
|
metadata.IPVersion = 6
|
||||||
}
|
}
|
||||||
|
|
||||||
//nolint:staticcheck
|
|
||||||
if metadata.InboundOptions != common.DefaultValue[option.InboundOptions]() {
|
|
||||||
if !preMatch && metadata.InboundOptions.SniffEnabled {
|
|
||||||
newBuffer, newPackerBuffers, newErr := r.actionSniff(ctx, metadata, &R.RuleActionSniff{
|
|
||||||
OverrideDestination: metadata.InboundOptions.SniffOverrideDestination,
|
|
||||||
Timeout: time.Duration(metadata.InboundOptions.SniffTimeout),
|
|
||||||
}, inputConn, inputPacketConn, nil, nil)
|
|
||||||
if newBuffer != nil {
|
|
||||||
buffers = []*buf.Buffer{newBuffer}
|
|
||||||
} else if len(newPackerBuffers) > 0 {
|
|
||||||
packetBuffers = newPackerBuffers
|
|
||||||
}
|
|
||||||
if newErr != nil {
|
|
||||||
fatalErr = newErr
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if C.DomainStrategy(metadata.InboundOptions.DomainStrategy) != C.DomainStrategyAsIS {
|
|
||||||
fatalErr = r.actionResolve(ctx, metadata, &R.RuleActionResolve{
|
|
||||||
Strategy: C.DomainStrategy(metadata.InboundOptions.DomainStrategy),
|
|
||||||
})
|
|
||||||
if fatalErr != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if metadata.InboundOptions.UDPDisableDomainUnmapping {
|
|
||||||
metadata.UDPDisableDomainUnmapping = true
|
|
||||||
}
|
|
||||||
metadata.InboundOptions = option.InboundOptions{}
|
|
||||||
}
|
|
||||||
|
|
||||||
match:
|
match:
|
||||||
for currentRuleIndex, currentRule := range r.rules {
|
for currentRuleIndex, currentRule := range r.rules {
|
||||||
metadata.ResetRuleCache()
|
metadata.ResetRuleCache()
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ import (
|
|||||||
|
|
||||||
"github.com/sagernet/sing-box/adapter"
|
"github.com/sagernet/sing-box/adapter"
|
||||||
C "github.com/sagernet/sing-box/constant"
|
C "github.com/sagernet/sing-box/constant"
|
||||||
"github.com/sagernet/sing-box/experimental/deprecated"
|
|
||||||
"github.com/sagernet/sing-box/log"
|
"github.com/sagernet/sing-box/log"
|
||||||
"github.com/sagernet/sing-box/option"
|
"github.com/sagernet/sing-box/option"
|
||||||
"github.com/sagernet/sing/common"
|
"github.com/sagernet/sing/common"
|
||||||
@@ -267,14 +266,13 @@ func NewDefaultRule(ctx context.Context, logger log.ContextLogger, options optio
|
|||||||
rule.allItems = append(rule.allItems, item)
|
rule.allItems = append(rule.allItems, item)
|
||||||
}
|
}
|
||||||
if len(options.RuleSet) > 0 {
|
if len(options.RuleSet) > 0 {
|
||||||
|
//nolint:staticcheck
|
||||||
|
if options.Deprecated_RulesetIPCIDRMatchSource {
|
||||||
|
return nil, E.New("rule_set_ipcidr_match_source is deprecated in sing-box 1.10.0 and removed in sing-box 1.11.0")
|
||||||
|
}
|
||||||
var matchSource bool
|
var matchSource bool
|
||||||
if options.RuleSetIPCIDRMatchSource {
|
if options.RuleSetIPCIDRMatchSource {
|
||||||
matchSource = true
|
matchSource = true
|
||||||
} else
|
|
||||||
//nolint:staticcheck
|
|
||||||
if options.Deprecated_RulesetIPCIDRMatchSource {
|
|
||||||
matchSource = true
|
|
||||||
deprecated.Report(ctx, deprecated.OptionBadMatchSource)
|
|
||||||
}
|
}
|
||||||
item := NewRuleSetItem(router, options.RuleSet, matchSource, false)
|
item := NewRuleSetItem(router, options.RuleSet, matchSource, false)
|
||||||
rule.items = append(rule.items, item)
|
rule.items = append(rule.items, item)
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ import (
|
|||||||
|
|
||||||
"github.com/sagernet/sing-box/adapter"
|
"github.com/sagernet/sing-box/adapter"
|
||||||
C "github.com/sagernet/sing-box/constant"
|
C "github.com/sagernet/sing-box/constant"
|
||||||
"github.com/sagernet/sing-box/experimental/deprecated"
|
|
||||||
"github.com/sagernet/sing-box/log"
|
"github.com/sagernet/sing-box/log"
|
||||||
"github.com/sagernet/sing-box/option"
|
"github.com/sagernet/sing-box/option"
|
||||||
"github.com/sagernet/sing/common"
|
"github.com/sagernet/sing/common"
|
||||||
@@ -263,14 +262,13 @@ func NewDefaultDNSRule(ctx context.Context, logger log.ContextLogger, options op
|
|||||||
rule.allItems = append(rule.allItems, item)
|
rule.allItems = append(rule.allItems, item)
|
||||||
}
|
}
|
||||||
if len(options.RuleSet) > 0 {
|
if len(options.RuleSet) > 0 {
|
||||||
|
//nolint:staticcheck
|
||||||
|
if options.Deprecated_RulesetIPCIDRMatchSource {
|
||||||
|
return nil, E.New("rule_set_ipcidr_match_source is deprecated in sing-box 1.10.0 and removed in sing-box 1.11.0")
|
||||||
|
}
|
||||||
var matchSource bool
|
var matchSource bool
|
||||||
if options.RuleSetIPCIDRMatchSource {
|
if options.RuleSetIPCIDRMatchSource {
|
||||||
matchSource = true
|
matchSource = true
|
||||||
} else
|
|
||||||
//nolint:staticcheck
|
|
||||||
if options.Deprecated_RulesetIPCIDRMatchSource {
|
|
||||||
matchSource = true
|
|
||||||
deprecated.Report(ctx, deprecated.OptionBadMatchSource)
|
|
||||||
}
|
}
|
||||||
item := NewRuleSetItem(router, options.RuleSet, matchSource, options.RuleSetIPCIDRAcceptEmpty)
|
item := NewRuleSetItem(router, options.RuleSet, matchSource, options.RuleSetIPCIDRAcceptEmpty)
|
||||||
rule.items = append(rule.items, item)
|
rule.items = append(rule.items, item)
|
||||||
|
|||||||
@@ -32,9 +32,6 @@ func TestTUICDomainUDP(t *testing.T) {
|
|||||||
ListenOptions: option.ListenOptions{
|
ListenOptions: option.ListenOptions{
|
||||||
Listen: common.Ptr(badoption.Addr(netip.IPv4Unspecified())),
|
Listen: common.Ptr(badoption.Addr(netip.IPv4Unspecified())),
|
||||||
ListenPort: serverPort,
|
ListenPort: serverPort,
|
||||||
InboundOptions: option.InboundOptions{
|
|
||||||
DomainStrategy: option.DomainStrategy(C.DomainStrategyIPv6Only),
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
Users: []option.TUICUser{{
|
Users: []option.TUICUser{{
|
||||||
UUID: uuid.Nil.String(),
|
UUID: uuid.Nil.String(),
|
||||||
|
|||||||
@@ -32,9 +32,7 @@ func TestChainedInbound(t *testing.T) {
|
|||||||
ListenOptions: option.ListenOptions{
|
ListenOptions: option.ListenOptions{
|
||||||
Listen: common.Ptr(badoption.Addr(netip.IPv4Unspecified())),
|
Listen: common.Ptr(badoption.Addr(netip.IPv4Unspecified())),
|
||||||
ListenPort: serverPort,
|
ListenPort: serverPort,
|
||||||
InboundOptions: option.InboundOptions{
|
Detour: "detour",
|
||||||
Detour: "detour",
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
Method: method,
|
Method: method,
|
||||||
Password: password,
|
Password: password,
|
||||||
|
|||||||
@@ -75,10 +75,7 @@ func testShadowTLS(t *testing.T, version int, password string, utlsEanbled bool,
|
|||||||
ListenOptions: option.ListenOptions{
|
ListenOptions: option.ListenOptions{
|
||||||
Listen: common.Ptr(badoption.Addr(netip.IPv4Unspecified())),
|
Listen: common.Ptr(badoption.Addr(netip.IPv4Unspecified())),
|
||||||
ListenPort: serverPort,
|
ListenPort: serverPort,
|
||||||
|
Detour: "detour",
|
||||||
InboundOptions: option.InboundOptions{
|
|
||||||
Detour: "detour",
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
Handshake: option.ShadowTLSHandshakeOptions{
|
Handshake: option.ShadowTLSHandshakeOptions{
|
||||||
ServerOptions: option.ServerOptions{
|
ServerOptions: option.ServerOptions{
|
||||||
@@ -343,9 +340,7 @@ func TestShadowTLSInbound(t *testing.T) {
|
|||||||
ListenOptions: option.ListenOptions{
|
ListenOptions: option.ListenOptions{
|
||||||
Listen: common.Ptr(badoption.Addr(netip.IPv4Unspecified())),
|
Listen: common.Ptr(badoption.Addr(netip.IPv4Unspecified())),
|
||||||
ListenPort: serverPort,
|
ListenPort: serverPort,
|
||||||
InboundOptions: option.InboundOptions{
|
Detour: "detour",
|
||||||
Detour: "detour",
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
Handshake: option.ShadowTLSHandshakeOptions{
|
Handshake: option.ShadowTLSHandshakeOptions{
|
||||||
ServerOptions: option.ServerOptions{
|
ServerOptions: option.ServerOptions{
|
||||||
|
|||||||
Reference in New Issue
Block a user