mirror of
https://github.com/SagerNet/sing-box.git
synced 2025-09-10 05:14:07 +08:00
Compare commits
5 Commits
a3c108b3a6
...
1d72a6b30e
Author | SHA1 | Date | |
---|---|---|---|
![]() |
1d72a6b30e | ||
![]() |
c54eb3381f | ||
![]() |
6ede2d9ea7 | ||
![]() |
30903e19fa | ||
![]() |
211aea73df |
@ -46,7 +46,7 @@ var (
|
|||||||
sharedFlags []string
|
sharedFlags []string
|
||||||
debugFlags []string
|
debugFlags []string
|
||||||
sharedTags []string
|
sharedTags []string
|
||||||
darwinTags []string
|
macOSTags []string
|
||||||
memcTags []string
|
memcTags []string
|
||||||
notMemcTags []string
|
notMemcTags []string
|
||||||
debugTags []string
|
debugTags []string
|
||||||
@ -63,7 +63,7 @@ func init() {
|
|||||||
debugFlags = append(debugFlags, "-ldflags", "-X github.com/sagernet/sing-box/constant.Version="+currentTag)
|
debugFlags = append(debugFlags, "-ldflags", "-X github.com/sagernet/sing-box/constant.Version="+currentTag)
|
||||||
|
|
||||||
sharedTags = append(sharedTags, "with_gvisor", "with_quic", "with_wireguard", "with_utls", "with_clash_api", "with_conntrack")
|
sharedTags = append(sharedTags, "with_gvisor", "with_quic", "with_wireguard", "with_utls", "with_clash_api", "with_conntrack")
|
||||||
darwinTags = append(darwinTags, "with_dhcp")
|
macOSTags = append(macOSTags, "with_dhcp")
|
||||||
memcTags = append(memcTags, "with_tailscale")
|
memcTags = append(memcTags, "with_tailscale")
|
||||||
notMemcTags = append(notMemcTags, "with_low_memory")
|
notMemcTags = append(notMemcTags, "with_low_memory")
|
||||||
debugTags = append(debugTags, "debug")
|
debugTags = append(debugTags, "debug")
|
||||||
@ -160,7 +160,9 @@ func buildApple() {
|
|||||||
"-tags-not-macos=with_low_memory",
|
"-tags-not-macos=with_low_memory",
|
||||||
}
|
}
|
||||||
if !withTailscale {
|
if !withTailscale {
|
||||||
args = append(args, "-tags-macos="+strings.Join(memcTags, ","))
|
args = append(args, "-tags-macos="+strings.Join(append(macOSTags, memcTags...), ","))
|
||||||
|
} else {
|
||||||
|
args = append(args, "-tags-macos="+strings.Join(macOSTags, ","))
|
||||||
}
|
}
|
||||||
|
|
||||||
if !debugEnabled {
|
if !debugEnabled {
|
||||||
@ -169,7 +171,7 @@ func buildApple() {
|
|||||||
args = append(args, debugFlags...)
|
args = append(args, debugFlags...)
|
||||||
}
|
}
|
||||||
|
|
||||||
tags := append(sharedTags, darwinTags...)
|
tags := sharedTags
|
||||||
if withTailscale {
|
if withTailscale {
|
||||||
tags = append(tags, memcTags...)
|
tags = append(tags, memcTags...)
|
||||||
}
|
}
|
||||||
|
@ -201,7 +201,11 @@ func (t *Transport) fetchServers0(ctx context.Context, iface *control.Interface)
|
|||||||
}
|
}
|
||||||
defer packetConn.Close()
|
defer packetConn.Close()
|
||||||
|
|
||||||
discovery, err := dhcpv4.NewDiscovery(iface.HardwareAddr, dhcpv4.WithBroadcast(true), dhcpv4.WithRequestedOptions(dhcpv4.OptionDomainNameServer, dhcpv4.OptionDNSDomainSearchList))
|
discovery, err := dhcpv4.NewDiscovery(iface.HardwareAddr, dhcpv4.WithBroadcast(true), dhcpv4.WithRequestedOptions(
|
||||||
|
dhcpv4.OptionDomainName,
|
||||||
|
dhcpv4.OptionDomainNameServer,
|
||||||
|
dhcpv4.OptionDNSDomainSearchList,
|
||||||
|
))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -253,8 +257,10 @@ func (t *Transport) fetchServersResponse(iface *control.Interface, packetConn ne
|
|||||||
|
|
||||||
func (t *Transport) recreateServers(iface *control.Interface, dhcpPacket *dhcpv4.DHCPv4) error {
|
func (t *Transport) recreateServers(iface *control.Interface, dhcpPacket *dhcpv4.DHCPv4) error {
|
||||||
searchList := dhcpPacket.DomainSearch()
|
searchList := dhcpPacket.DomainSearch()
|
||||||
if searchList != nil {
|
if searchList != nil && len(searchList.Labels) > 0 {
|
||||||
t.search = searchList.Labels
|
t.search = searchList.Labels
|
||||||
|
} else if dhcpPacket.DomainName() != "" {
|
||||||
|
t.search = []string{dhcpPacket.DomainName()}
|
||||||
}
|
}
|
||||||
serverAddrs := common.Map(dhcpPacket.DNS(), func(it net.IP) M.Socksaddr {
|
serverAddrs := common.Map(dhcpPacket.DNS(), func(it net.IP) M.Socksaddr {
|
||||||
return M.SocksaddrFrom(M.AddrFromIP(it), 53)
|
return M.SocksaddrFrom(M.AddrFromIP(it), 53)
|
||||||
|
@ -74,12 +74,14 @@ func (t *Transport) Start(stage adapter.StartStage) error {
|
|||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if t.fallback {
|
if !C.IsIos {
|
||||||
t.dhcpTransport = newDHCPTransport(t.TransportAdapter, log.ContextWithOverrideLevel(t.ctx, log.LevelDebug), t.dialer, t.logger)
|
if t.fallback {
|
||||||
if t.dhcpTransport != nil {
|
t.dhcpTransport = newDHCPTransport(t.TransportAdapter, log.ContextWithOverrideLevel(t.ctx, log.LevelDebug), t.dialer, t.logger)
|
||||||
err := t.dhcpTransport.Start(stage)
|
if t.dhcpTransport != nil {
|
||||||
if err != nil {
|
err := t.dhcpTransport.Start(stage)
|
||||||
return err
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -104,10 +106,12 @@ func (t *Transport) Exchange(ctx context.Context, message *mDNS.Msg) (*mDNS.Msg,
|
|||||||
if !t.fallback {
|
if !t.fallback {
|
||||||
return t.exchange(ctx, message, domain)
|
return t.exchange(ctx, message, domain)
|
||||||
}
|
}
|
||||||
if t.dhcpTransport != nil {
|
if !C.IsIos {
|
||||||
dhcpTransports, _ := t.dhcpTransport.Fetch()
|
if t.dhcpTransport != nil {
|
||||||
if len(dhcpTransports) > 0 {
|
dhcpTransports, _ := t.dhcpTransport.Fetch()
|
||||||
return t.dhcpTransport.Exchange0(ctx, message, dhcpTransports)
|
if len(dhcpTransports) > 0 {
|
||||||
|
return t.dhcpTransport.Exchange0(ctx, message, dhcpTransports)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if t.preferGo {
|
if t.preferGo {
|
||||||
@ -131,5 +135,9 @@ func (t *Transport) Exchange(ctx context.Context, message *mDNS.Msg) (*mDNS.Msg,
|
|||||||
}
|
}
|
||||||
return dns.FixedResponse(message.Id, question, addresses, C.DefaultDNSTTL), nil
|
return dns.FixedResponse(message.Id, question, addresses, C.DefaultDNSTTL), nil
|
||||||
}
|
}
|
||||||
return nil, E.New("only A and AAAA queries are supported on Apple platforms when using TUN and DHCP unavailable.")
|
if C.IsIos {
|
||||||
|
return nil, E.New("only A and AAAA queries are supported on iOS and tvOS when using NetworkExtension.")
|
||||||
|
} else {
|
||||||
|
return nil, E.New("only A and AAAA queries are supported on macOS when using NetworkExtension and DHCP unavailable.")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,15 +2,19 @@ package local
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"errors"
|
||||||
"os"
|
"os"
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
"github.com/sagernet/sing-box/adapter"
|
"github.com/sagernet/sing-box/adapter"
|
||||||
|
C "github.com/sagernet/sing-box/constant"
|
||||||
"github.com/sagernet/sing-box/service/resolved"
|
"github.com/sagernet/sing-box/service/resolved"
|
||||||
"github.com/sagernet/sing-tun"
|
"github.com/sagernet/sing-tun"
|
||||||
"github.com/sagernet/sing/common/atomic"
|
"github.com/sagernet/sing/common/atomic"
|
||||||
|
"github.com/sagernet/sing/common/control"
|
||||||
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"
|
||||||
|
"github.com/sagernet/sing/common/x/list"
|
||||||
"github.com/sagernet/sing/service"
|
"github.com/sagernet/sing/service"
|
||||||
|
|
||||||
"github.com/godbus/dbus/v5"
|
"github.com/godbus/dbus/v5"
|
||||||
@ -18,11 +22,18 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type DBusResolvedResolver struct {
|
type DBusResolvedResolver struct {
|
||||||
logger logger.ContextLogger
|
ctx context.Context
|
||||||
interfaceMonitor tun.DefaultInterfaceMonitor
|
logger logger.ContextLogger
|
||||||
systemBus *dbus.Conn
|
interfaceMonitor tun.DefaultInterfaceMonitor
|
||||||
resoledObject atomic.TypedValue[dbus.BusObject]
|
interfaceCallback *list.Element[tun.DefaultInterfaceUpdateCallback]
|
||||||
closeOnce sync.Once
|
systemBus *dbus.Conn
|
||||||
|
resoledObject atomic.Pointer[ResolvedObject]
|
||||||
|
closeOnce sync.Once
|
||||||
|
}
|
||||||
|
|
||||||
|
type ResolvedObject struct {
|
||||||
|
dbus.BusObject
|
||||||
|
InterfaceIndex int32
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewResolvedResolver(ctx context.Context, logger logger.ContextLogger) (ResolvedResolver, error) {
|
func NewResolvedResolver(ctx context.Context, logger logger.ContextLogger) (ResolvedResolver, error) {
|
||||||
@ -35,6 +46,7 @@ func NewResolvedResolver(ctx context.Context, logger logger.ContextLogger) (Reso
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return &DBusResolvedResolver{
|
return &DBusResolvedResolver{
|
||||||
|
ctx: ctx,
|
||||||
logger: logger,
|
logger: logger,
|
||||||
interfaceMonitor: interfaceMonitor,
|
interfaceMonitor: interfaceMonitor,
|
||||||
systemBus: systemBus,
|
systemBus: systemBus,
|
||||||
@ -43,6 +55,7 @@ func NewResolvedResolver(ctx context.Context, logger logger.ContextLogger) (Reso
|
|||||||
|
|
||||||
func (t *DBusResolvedResolver) Start() error {
|
func (t *DBusResolvedResolver) Start() error {
|
||||||
t.updateStatus()
|
t.updateStatus()
|
||||||
|
t.interfaceCallback = t.interfaceMonitor.RegisterCallback(t.updateDefaultInterface)
|
||||||
err := t.systemBus.BusObject().AddMatchSignal(
|
err := t.systemBus.BusObject().AddMatchSignal(
|
||||||
"org.freedesktop.DBus",
|
"org.freedesktop.DBus",
|
||||||
"NameOwnerChanged",
|
"NameOwnerChanged",
|
||||||
@ -58,6 +71,9 @@ func (t *DBusResolvedResolver) Start() error {
|
|||||||
|
|
||||||
func (t *DBusResolvedResolver) Close() error {
|
func (t *DBusResolvedResolver) Close() error {
|
||||||
t.closeOnce.Do(func() {
|
t.closeOnce.Do(func() {
|
||||||
|
if t.interfaceCallback != nil {
|
||||||
|
t.interfaceMonitor.UnregisterCallback(t.interfaceCallback)
|
||||||
|
}
|
||||||
if t.systemBus != nil {
|
if t.systemBus != nil {
|
||||||
_ = t.systemBus.Close()
|
_ = t.systemBus.Close()
|
||||||
}
|
}
|
||||||
@ -70,22 +86,23 @@ func (t *DBusResolvedResolver) Object() any {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (t *DBusResolvedResolver) Exchange(object any, ctx context.Context, message *mDNS.Msg) (*mDNS.Msg, error) {
|
func (t *DBusResolvedResolver) Exchange(object any, ctx context.Context, message *mDNS.Msg) (*mDNS.Msg, error) {
|
||||||
defaultInterface := t.interfaceMonitor.DefaultInterface()
|
|
||||||
if defaultInterface == nil {
|
|
||||||
return nil, E.New("missing default interface")
|
|
||||||
}
|
|
||||||
question := message.Question[0]
|
question := message.Question[0]
|
||||||
call := object.(*dbus.Object).CallWithContext(
|
resolvedObject := object.(*ResolvedObject)
|
||||||
|
call := resolvedObject.CallWithContext(
|
||||||
ctx,
|
ctx,
|
||||||
"org.freedesktop.resolve1.Manager.ResolveRecord",
|
"org.freedesktop.resolve1.Manager.ResolveRecord",
|
||||||
0,
|
0,
|
||||||
int32(defaultInterface.Index),
|
resolvedObject.InterfaceIndex,
|
||||||
question.Name,
|
question.Name,
|
||||||
question.Qclass,
|
question.Qclass,
|
||||||
question.Qtype,
|
question.Qtype,
|
||||||
uint64(0),
|
uint64(0),
|
||||||
)
|
)
|
||||||
if call.Err != nil {
|
if call.Err != nil {
|
||||||
|
var dbusError dbus.Error
|
||||||
|
if errors.As(call.Err, &dbusError) && dbusError.Name == "org.freedesktop.resolve1.NoNameServers" {
|
||||||
|
t.updateStatus()
|
||||||
|
}
|
||||||
return nil, E.Cause(call.Err, " resolve record via resolved")
|
return nil, E.Cause(call.Err, " resolve record via resolved")
|
||||||
}
|
}
|
||||||
var (
|
var (
|
||||||
@ -137,14 +154,76 @@ func (t *DBusResolvedResolver) loopUpdateStatus() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (t *DBusResolvedResolver) updateStatus() {
|
func (t *DBusResolvedResolver) updateStatus() {
|
||||||
dbusObject := t.systemBus.Object("org.freedesktop.resolve1", "/org/freedesktop/resolve1")
|
dbusObject, err := t.checkResolved(context.Background())
|
||||||
err := dbusObject.Call("org.freedesktop.DBus.Peer.Ping", 0).Err
|
oldValue := t.resoledObject.Swap(dbusObject)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if t.resoledObject.Swap(nil) != nil {
|
var dbusErr dbus.Error
|
||||||
|
if !errors.As(err, &dbusErr) || dbusErr.Name != "org.freedesktop.DBus.Error.NameHasNoOwnerCould" {
|
||||||
|
t.logger.Debug(E.Cause(err, "systemd-resolved service unavailable"))
|
||||||
|
}
|
||||||
|
if oldValue != nil {
|
||||||
t.logger.Debug("systemd-resolved service is gone")
|
t.logger.Debug("systemd-resolved service is gone")
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
|
} else if oldValue == nil {
|
||||||
|
t.logger.Debug("using systemd-resolved service as resolver")
|
||||||
}
|
}
|
||||||
t.resoledObject.Store(dbusObject)
|
}
|
||||||
t.logger.Debug("using systemd-resolved service as resolver")
|
|
||||||
|
func (t *DBusResolvedResolver) checkResolved(ctx context.Context) (*ResolvedObject, error) {
|
||||||
|
dbusObject := t.systemBus.Object("org.freedesktop.resolve1", "/org/freedesktop/resolve1")
|
||||||
|
err := dbusObject.Call("org.freedesktop.DBus.Peer.Ping", 0).Err
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
defaultInterface := t.interfaceMonitor.DefaultInterface()
|
||||||
|
if defaultInterface == nil {
|
||||||
|
return nil, E.New("missing default interface")
|
||||||
|
}
|
||||||
|
call := dbusObject.(*dbus.Object).CallWithContext(
|
||||||
|
ctx,
|
||||||
|
"org.freedesktop.resolve1.Manager.GetLink",
|
||||||
|
0,
|
||||||
|
int32(defaultInterface.Index),
|
||||||
|
)
|
||||||
|
if call.Err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
var linkPath dbus.ObjectPath
|
||||||
|
err = call.Store(&linkPath)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
linkObject := t.systemBus.Object("org.freedesktop.resolve1", linkPath)
|
||||||
|
if linkObject == nil {
|
||||||
|
return nil, E.New("missing link object for default interface")
|
||||||
|
}
|
||||||
|
dnsProp, err := linkObject.GetProperty("org.freedesktop.resolve1.Link.DNS")
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
var linkDNS []resolved.LinkDNS
|
||||||
|
err = dnsProp.Store(&linkDNS)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if len(linkDNS) == 0 {
|
||||||
|
for _, inbound := range service.FromContext[adapter.InboundManager](t.ctx).Inbounds() {
|
||||||
|
if inbound.Type() == C.TypeTun {
|
||||||
|
return nil, E.New("No appropriate name servers or networks for name found")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return &ResolvedObject{
|
||||||
|
BusObject: dbusObject,
|
||||||
|
}, nil
|
||||||
|
} else {
|
||||||
|
return &ResolvedObject{
|
||||||
|
BusObject: dbusObject,
|
||||||
|
InterfaceIndex: int32(defaultInterface.Index),
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *DBusResolvedResolver) updateDefaultInterface(defaultInterface *control.Interface, flags int) {
|
||||||
|
t.updateStatus()
|
||||||
}
|
}
|
||||||
|
@ -2,19 +2,63 @@
|
|||||||
icon: material/alert-decagram
|
icon: material/alert-decagram
|
||||||
---
|
---
|
||||||
|
|
||||||
|
#### 1.13.0-alpha.5
|
||||||
|
|
||||||
|
* Fixes and improvements
|
||||||
|
|
||||||
#### 1.12.3
|
#### 1.12.3
|
||||||
|
|
||||||
* Fixes and improvements
|
* Fixes and improvements
|
||||||
|
|
||||||
|
#### 1.13.0-alpha.4
|
||||||
|
|
||||||
|
* Fixes and improvements
|
||||||
|
|
||||||
#### 1.12.2
|
#### 1.12.2
|
||||||
|
|
||||||
* Fixes and improvements
|
* Fixes and improvements
|
||||||
|
|
||||||
|
#### 1.13.0-alpha.3
|
||||||
|
|
||||||
|
* Improve `local` DNS server **1**
|
||||||
|
* Fixes and improvements
|
||||||
|
|
||||||
|
**1**:
|
||||||
|
|
||||||
|
On Apple platforms, Windows, and Linux (when using systemd-resolved),
|
||||||
|
`local` DNS server now works with Tun inbound which overrides system DNS servers.
|
||||||
|
|
||||||
|
See [Local DNS Server](/configuration/dns/server/local/).
|
||||||
|
|
||||||
|
#### 1.13.0-alpha.2
|
||||||
|
|
||||||
|
* Add `preferred_by` rule item **1**
|
||||||
|
* Fixes and improvements
|
||||||
|
|
||||||
|
**1**:
|
||||||
|
|
||||||
|
The new `preferred_by` routing rule item allows you to
|
||||||
|
match preferred domains and addresses for specific outbounds.
|
||||||
|
|
||||||
|
See [Route Rule](/configuration/route/rule/#preferred_by).
|
||||||
|
|
||||||
|
#### 1.13.0-alpha.1
|
||||||
|
|
||||||
|
* Add interface address rule items **1**
|
||||||
|
* Fixes and improvements
|
||||||
|
|
||||||
|
**1**:
|
||||||
|
|
||||||
|
New interface address rules allow you to dynamically adjust rules based on your network environment.
|
||||||
|
|
||||||
|
See [Route Rule](/configuration/route/rule/), [DNS Route Rule](/configuration/dns/rule/)
|
||||||
|
and [Headless Rule](/configuration/rule-set/headless-rule/).
|
||||||
|
|
||||||
#### 1.12.1
|
#### 1.12.1
|
||||||
|
|
||||||
* Fixes and improvements
|
* Fixes and improvements
|
||||||
|
|
||||||
#### 1.12.0
|
### 1.12.0
|
||||||
|
|
||||||
* Refactor DNS servers **1**
|
* Refactor DNS servers **1**
|
||||||
* Add domain resolver options**2**
|
* Add domain resolver options**2**
|
||||||
@ -165,7 +209,7 @@ We continue to experience issues updating our sing-box apps on the App Store and
|
|||||||
Until we rewrite and resubmit the apps, they are considered irrecoverable.
|
Until we rewrite and resubmit the apps, they are considered irrecoverable.
|
||||||
Therefore, after this release, we will not be repeating this notice unless there is new information.
|
Therefore, after this release, we will not be repeating this notice unless there is new information.
|
||||||
|
|
||||||
### 1.11.15
|
#### 1.11.15
|
||||||
|
|
||||||
* Fixes and improvements
|
* Fixes and improvements
|
||||||
|
|
||||||
@ -181,7 +225,7 @@ violated the rules (TestFlight users are not affected)._
|
|||||||
|
|
||||||
We have significantly improved the performance of tun inbound on Apple platforms, especially in the gVisor stack.
|
We have significantly improved the performance of tun inbound on Apple platforms, especially in the gVisor stack.
|
||||||
|
|
||||||
### 1.11.14
|
#### 1.11.14
|
||||||
|
|
||||||
* Fixes and improvements
|
* Fixes and improvements
|
||||||
|
|
||||||
@ -231,7 +275,7 @@ You can now choose what the DERP home page shows, just like with derper's `-home
|
|||||||
|
|
||||||
See [DERP](/configuration/service/derp/#home).
|
See [DERP](/configuration/service/derp/#home).
|
||||||
|
|
||||||
### 1.11.13
|
#### 1.11.13
|
||||||
|
|
||||||
* Fixes and improvements
|
* Fixes and improvements
|
||||||
|
|
||||||
@ -269,7 +313,7 @@ SSM API service is a RESTful API server for managing Shadowsocks servers.
|
|||||||
|
|
||||||
See [SSM API Service](/configuration/service/ssm-api/).
|
See [SSM API Service](/configuration/service/ssm-api/).
|
||||||
|
|
||||||
### 1.11.11
|
#### 1.11.11
|
||||||
|
|
||||||
* Fixes and improvements
|
* Fixes and improvements
|
||||||
|
|
||||||
@ -301,7 +345,7 @@ You can now set `bind_interface`, `routing_mark` and `reuse_addr` in Listen Fiel
|
|||||||
|
|
||||||
See [Listen Fields](/configuration/shared/listen/).
|
See [Listen Fields](/configuration/shared/listen/).
|
||||||
|
|
||||||
### 1.11.10
|
#### 1.11.10
|
||||||
|
|
||||||
* Undeprecate the `block` outbound **1**
|
* Undeprecate the `block` outbound **1**
|
||||||
* Fixes and improvements
|
* Fixes and improvements
|
||||||
@ -319,7 +363,7 @@ violated the rules (TestFlight users are not affected)._
|
|||||||
* Update quic-go to v0.51.0
|
* Update quic-go to v0.51.0
|
||||||
* Fixes and improvements
|
* Fixes and improvements
|
||||||
|
|
||||||
### 1.11.9
|
#### 1.11.9
|
||||||
|
|
||||||
* Fixes and improvements
|
* Fixes and improvements
|
||||||
|
|
||||||
@ -330,7 +374,7 @@ violated the rules (TestFlight users are not affected)._
|
|||||||
|
|
||||||
* Fixes and improvements
|
* Fixes and improvements
|
||||||
|
|
||||||
### 1.11.8
|
#### 1.11.8
|
||||||
|
|
||||||
* Improve `auto_redirect` **1**
|
* Improve `auto_redirect` **1**
|
||||||
* Fixes and improvements
|
* Fixes and improvements
|
||||||
@ -347,7 +391,7 @@ violated the rules (TestFlight users are not affected)._
|
|||||||
|
|
||||||
* Fixes and improvements
|
* Fixes and improvements
|
||||||
|
|
||||||
### 1.11.7
|
#### 1.11.7
|
||||||
|
|
||||||
* Fixes and improvements
|
* Fixes and improvements
|
||||||
|
|
||||||
@ -363,7 +407,7 @@ violated the rules (TestFlight users are not affected)._
|
|||||||
Now `auto_redirect` fixes compatibility issues between tun and Docker bridge networks,
|
Now `auto_redirect` fixes compatibility issues between tun and Docker bridge networks,
|
||||||
see [Tun](/configuration/inbound/tun/#auto_redirect).
|
see [Tun](/configuration/inbound/tun/#auto_redirect).
|
||||||
|
|
||||||
### 1.11.6
|
#### 1.11.6
|
||||||
|
|
||||||
* Fixes and improvements
|
* Fixes and improvements
|
||||||
|
|
||||||
@ -404,7 +448,7 @@ See [Protocol Sniff](/configuration/route/sniff/).
|
|||||||
|
|
||||||
See [Dial Fields](/configuration/shared/dial/#domain_resolver).
|
See [Dial Fields](/configuration/shared/dial/#domain_resolver).
|
||||||
|
|
||||||
### 1.11.5
|
#### 1.11.5
|
||||||
|
|
||||||
* Fixes and improvements
|
* Fixes and improvements
|
||||||
|
|
||||||
@ -420,7 +464,7 @@ violated the rules (TestFlight users are not affected)._
|
|||||||
|
|
||||||
See [DNS Rule Action](/configuration/dns/rule_action/#predefined).
|
See [DNS Rule Action](/configuration/dns/rule_action/#predefined).
|
||||||
|
|
||||||
### 1.11.4
|
#### 1.11.4
|
||||||
|
|
||||||
* Fixes and improvements
|
* Fixes and improvements
|
||||||
|
|
||||||
@ -476,7 +520,7 @@ Due to maintenance difficulties, sing-box 1.12.0 requires at least Go 1.23 to co
|
|||||||
|
|
||||||
For Windows 7 users, legacy binaries now continue to compile with Go 1.23 and patches from [MetaCubeX/go](https://github.com/MetaCubeX/go).
|
For Windows 7 users, legacy binaries now continue to compile with Go 1.23 and patches from [MetaCubeX/go](https://github.com/MetaCubeX/go).
|
||||||
|
|
||||||
### 1.11.3
|
#### 1.11.3
|
||||||
|
|
||||||
* Fixes and improvements
|
* Fixes and improvements
|
||||||
|
|
||||||
@ -487,7 +531,7 @@ process._
|
|||||||
|
|
||||||
* Fixes and improvements
|
* Fixes and improvements
|
||||||
|
|
||||||
### 1.11.1
|
#### 1.11.1
|
||||||
|
|
||||||
* Fixes and improvements
|
* Fixes and improvements
|
||||||
|
|
||||||
@ -666,7 +710,7 @@ See [Hysteria2](/configuration/outbound/hysteria2/).
|
|||||||
|
|
||||||
When `up_mbps` and `down_mbps` are set, `ignore_client_bandwidth` instead denies clients from using BBR CC.
|
When `up_mbps` and `down_mbps` are set, `ignore_client_bandwidth` instead denies clients from using BBR CC.
|
||||||
|
|
||||||
### 1.10.7
|
#### 1.10.7
|
||||||
|
|
||||||
* Fixes and improvements
|
* Fixes and improvements
|
||||||
|
|
||||||
@ -761,7 +805,7 @@ and the old outbound will be removed in sing-box 1.13.0.
|
|||||||
See [Endpoint](/configuration/endpoint/), [WireGuard Endpoint](/configuration/endpoint/wireguard/)
|
See [Endpoint](/configuration/endpoint/), [WireGuard Endpoint](/configuration/endpoint/wireguard/)
|
||||||
and [Migrate WireGuard outbound fields to route options](/migration/#migrate-wireguard-outbound-to-endpoint).
|
and [Migrate WireGuard outbound fields to route options](/migration/#migrate-wireguard-outbound-to-endpoint).
|
||||||
|
|
||||||
### 1.10.2
|
#### 1.10.2
|
||||||
|
|
||||||
* Add deprecated warnings
|
* Add deprecated warnings
|
||||||
* Fix proxying websocket connections in HTTP/mixed inbounds
|
* Fix proxying websocket connections in HTTP/mixed inbounds
|
||||||
@ -898,7 +942,7 @@ See [Rule Action](/configuration/route/rule_action/).
|
|||||||
* Update quic-go to v0.48.0
|
* Update quic-go to v0.48.0
|
||||||
* Fixes and improvements
|
* Fixes and improvements
|
||||||
|
|
||||||
### 1.10.1
|
#### 1.10.1
|
||||||
|
|
||||||
* Fixes and improvements
|
* Fixes and improvements
|
||||||
|
|
||||||
|
@ -43,16 +43,18 @@ When enabled, `local` DNS server will resolve DNS by dialing itself whenever pos
|
|||||||
|
|
||||||
Specifically, it disables following behaviors which was added as features in sing-box 1.13.0:
|
Specifically, it disables following behaviors which was added as features in sing-box 1.13.0:
|
||||||
|
|
||||||
* On Apple platforms: Use `libresolv` for resolution, as it is the only one that works properly with NetworkExtension
|
1. On Apple platforms: Attempt to resolve A/AAAA requests using `getaddrinfo` in NetworkExtension.
|
||||||
that overrides DNS servers (DHCP is also possible but is not considered).
|
2. On Linux: Resolve through `systemd-resolvd`'s DBus interface when available.
|
||||||
* On Linux: Resolve through `systemd-resolvd`'s DBus interface when available.
|
|
||||||
|
|
||||||
As a sole exception, it cannot disable the following behavior:
|
As a sole exception, it cannot disable the following behavior:
|
||||||
|
|
||||||
In the Android graphical client, the `local` DNS server will always resolve DNS through the platform interface,
|
1. In the Android graphical client,
|
||||||
as there is no other way to obtain upstream DNS servers.
|
`local` will always resolve DNS through the platform interface,
|
||||||
|
as there is no other way to obtain upstream DNS servers;
|
||||||
|
On devices running Android versions lower than 10, this interface can only resolve A/AAAA requests.
|
||||||
|
|
||||||
On devices running Android versions lower than 10, this interface can only resolve IP queries.
|
2. On macOS, `local` will try DHCP first in Network Extension, since DHCP respects DIal Fields,
|
||||||
|
it will not be disabled by `prefer_go`.
|
||||||
|
|
||||||
### Dial Fields
|
### Dial Fields
|
||||||
|
|
||||||
|
@ -223,6 +223,9 @@ func (e *Endpoint) Close() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (e *Endpoint) Lookup(address netip.Addr) *device.Peer {
|
func (e *Endpoint) Lookup(address netip.Addr) *device.Peer {
|
||||||
|
if e.allowedIPs == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
return e.allowedIPs.Lookup(address.AsSlice())
|
return e.allowedIPs.Lookup(address.AsSlice())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user