Allow customizing TUN DNS mode and hijack interface DNS by default

This commit is contained in:
世界
2026-05-02 18:36:58 +08:00
parent 59ad93ef52
commit 84eb7a103f
15 changed files with 184 additions and 60 deletions
+17 -6
View File
@@ -7,13 +7,19 @@ import (
"github.com/sagernet/sing-box/option"
tun "github.com/sagernet/sing-tun"
"github.com/sagernet/sing/common"
E "github.com/sagernet/sing/common/exceptions"
)
const (
DNSModeDisabled = tun.DNSModeDisabled
DNSModeNative = tun.DNSModeNative
DNSModeHijack = tun.DNSModeHijack
)
type TunOptions interface {
GetInet4Address() RoutePrefixIterator
GetInet6Address() RoutePrefixIterator
GetDNSServerAddress() (*StringBox, error)
GetDNSMode() *StringBox
GetDNSServerAddress() (StringIterator, error)
GetMTU() int32
GetAutoRoute() bool
GetStrictRoute() bool
@@ -89,11 +95,16 @@ func (o *tunOptions) GetInet6Address() RoutePrefixIterator {
return mapRoutePrefix(o.Inet6Address)
}
func (o *tunOptions) GetDNSServerAddress() (*StringBox, error) {
if len(o.Inet4Address) == 0 || o.Inet4Address[0].Bits() == 32 {
return nil, E.New("need one more IPv4 address for DNS hijacking")
func (o *tunOptions) GetDNSMode() *StringBox {
return wrapString(o.Options.DNSMode)
}
func (o *tunOptions) GetDNSServerAddress() (StringIterator, error) {
dnsServers, err := o.Options.DNSServerAddress()
if err != nil {
return nil, err
}
return wrapString(o.Inet4Address[0].Addr().Next().String()), nil
return newIterator(common.Map(dnsServers, netip.Addr.String)), nil
}
func (o *tunOptions) GetMTU() int32 {