diff --git a/cmd/internal/build_libbox/main.go b/cmd/internal/build_libbox/main.go index c7bdf6cf..0f4db850 100644 --- a/cmd/internal/build_libbox/main.go +++ b/cmd/internal/build_libbox/main.go @@ -46,7 +46,7 @@ var ( sharedFlags []string debugFlags []string sharedTags []string - darwinTags []string + macOSTags []string memcTags []string notMemcTags []string debugTags []string @@ -63,7 +63,7 @@ func init() { 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") - darwinTags = append(darwinTags, "with_dhcp") + macOSTags = append(macOSTags, "with_dhcp") memcTags = append(memcTags, "with_tailscale") notMemcTags = append(notMemcTags, "with_low_memory") debugTags = append(debugTags, "debug") @@ -160,7 +160,9 @@ func buildApple() { "-tags-not-macos=with_low_memory", } 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 { @@ -169,7 +171,7 @@ func buildApple() { args = append(args, debugFlags...) } - tags := append(sharedTags, darwinTags...) + tags := sharedTags if withTailscale { tags = append(tags, memcTags...) } diff --git a/dns/transport/dhcp/dhcp.go b/dns/transport/dhcp/dhcp.go index 82b14bfb..b56a60e7 100644 --- a/dns/transport/dhcp/dhcp.go +++ b/dns/transport/dhcp/dhcp.go @@ -201,7 +201,11 @@ func (t *Transport) fetchServers0(ctx context.Context, iface *control.Interface) } 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 { 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 { searchList := dhcpPacket.DomainSearch() - if searchList != nil { + if searchList != nil && len(searchList.Labels) > 0 { t.search = searchList.Labels + } else if dhcpPacket.DomainName() != "" { + t.search = []string{dhcpPacket.DomainName()} } serverAddrs := common.Map(dhcpPacket.DNS(), func(it net.IP) M.Socksaddr { return M.SocksaddrFrom(M.AddrFromIP(it), 53) diff --git a/dns/transport/local/local_darwin.go b/dns/transport/local/local_darwin.go index 6bf9e455..5a8b4113 100644 --- a/dns/transport/local/local_darwin.go +++ b/dns/transport/local/local_darwin.go @@ -7,6 +7,7 @@ import ( "errors" "net" + mDNS "github.com/miekg/dns" "github.com/sagernet/sing-box/adapter" C "github.com/sagernet/sing-box/constant" "github.com/sagernet/sing-box/dns" @@ -19,8 +20,6 @@ import ( M "github.com/sagernet/sing/common/metadata" N "github.com/sagernet/sing/common/network" "github.com/sagernet/sing/service" - - mDNS "github.com/miekg/dns" ) func RegisterTransport(registry *dns.TransportRegistry) { @@ -74,12 +73,14 @@ func (t *Transport) Start(stage adapter.StartStage) error { break } } - if t.fallback { - t.dhcpTransport = newDHCPTransport(t.TransportAdapter, log.ContextWithOverrideLevel(t.ctx, log.LevelDebug), t.dialer, t.logger) - if t.dhcpTransport != nil { - err := t.dhcpTransport.Start(stage) - if err != nil { - return err + if !C.IsIos { + if t.fallback { + t.dhcpTransport = newDHCPTransport(t.TransportAdapter, log.ContextWithOverrideLevel(t.ctx, log.LevelDebug), t.dialer, t.logger) + if t.dhcpTransport != nil { + err := t.dhcpTransport.Start(stage) + if err != nil { + return err + } } } } @@ -104,10 +105,12 @@ func (t *Transport) Exchange(ctx context.Context, message *mDNS.Msg) (*mDNS.Msg, if !t.fallback { return t.exchange(ctx, message, domain) } - if t.dhcpTransport != nil { - dhcpTransports, _ := t.dhcpTransport.Fetch() - if len(dhcpTransports) > 0 { - return t.dhcpTransport.Exchange0(ctx, message, dhcpTransports) + if !C.IsIos { + if t.dhcpTransport != nil { + dhcpTransports, _ := t.dhcpTransport.Fetch() + if len(dhcpTransports) > 0 { + return t.dhcpTransport.Exchange0(ctx, message, dhcpTransports) + } } } if t.preferGo { @@ -131,5 +134,9 @@ func (t *Transport) Exchange(ctx context.Context, message *mDNS.Msg) (*mDNS.Msg, } 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.") + } }