@@ -16,7 +16,6 @@ import (
1616 "github.com/sagernet/sing-tun/internal/winipcfg"
1717 "github.com/sagernet/sing-tun/internal/winsys"
1818 "github.com/sagernet/sing-tun/internal/wintun"
19- "github.com/sagernet/sing/common"
2019 E "github.com/sagernet/sing/common/exceptions"
2120 "github.com/sagernet/sing/common/windnsapi"
2221
@@ -38,6 +37,9 @@ type NativeTun struct {
3837}
3938
4039func New (options Options ) (WinTun , error ) {
40+ if err := options .NormalizeDNSMode (); err != nil {
41+ return nil , err
42+ }
4143 if options .FileDescriptor != 0 {
4244 return nil , os .ErrInvalid
4345 }
@@ -74,16 +76,14 @@ func (t *NativeTun) configure() error {
7476 if err != nil {
7577 return E .Cause (err , "set ipv4 address" )
7678 }
77- if t .options .AutoRoute && ! t .options .EXP_DisableDNSHijack {
78- dnsServers := common . Filter ( t .options .DNSServers , netip . Addr . Is4 )
79- if len ( dnsServers ) == 0 && HasNextAddress ( t . options . Inet4Address [ 0 ], 1 ) {
80- dnsServers = []netip. Addr { t . options . Inet4Address [ 0 ]. Addr (). Next ()}
79+ if t .options .AutoRoute && t .options .DNSMode != DNSModeDisabled {
80+ dnsServers , err := t .options .Inet4DNSAddress ( )
81+ if err != nil {
82+ return err
8183 }
82- if len (dnsServers ) > 0 {
83- err = luid .SetDNS (winipcfg .AddressFamily (windows .AF_INET ), dnsServers , nil )
84- if err != nil {
85- return E .Cause (err , "set ipv4 dns" )
86- }
84+ err = luid .SetDNS (winipcfg .AddressFamily (windows .AF_INET ), dnsServers , nil )
85+ if err != nil {
86+ return E .Cause (err , "set ipv4 dns" )
8787 }
8888 } else {
8989 err = luid .SetDNS (winipcfg .AddressFamily (windows .AF_INET ), nil , nil )
@@ -97,16 +97,14 @@ func (t *NativeTun) configure() error {
9797 if err != nil {
9898 return E .Cause (err , "set ipv6 address" )
9999 }
100- if t .options .AutoRoute && ! t .options .EXP_DisableDNSHijack {
101- dnsServers := common . Filter ( t .options .DNSServers , netip . Addr . Is6 )
102- if len ( dnsServers ) == 0 && HasNextAddress ( t . options . Inet6Address [ 0 ], 1 ) {
103- dnsServers = []netip. Addr { t . options . Inet6Address [ 0 ]. Addr (). Next ()}
100+ if t .options .AutoRoute && t .options .DNSMode != DNSModeDisabled {
101+ dnsServers , err := t .options .Inet6DNSAddress ( )
102+ if err != nil {
103+ return err
104104 }
105- if len (dnsServers ) > 0 {
106- err = luid .SetDNS (winipcfg .AddressFamily (windows .AF_INET6 ), dnsServers , nil )
107- if err != nil {
108- return E .Cause (err , "set ipv6 dns" )
109- }
105+ err = luid .SetDNS (winipcfg .AddressFamily (windows .AF_INET6 ), dnsServers , nil )
106+ if err != nil {
107+ return E .Cause (err , "set ipv6 dns" )
110108 }
111109 } else {
112110 err = luid .SetDNS (winipcfg .AddressFamily (windows .AF_INET6 ), nil , nil )
@@ -327,7 +325,7 @@ func (t *NativeTun) Start() error {
327325 }
328326 }
329327
330- if ! t .options .EXP_DisableDNSHijack {
328+ if t .options .DNSMode == DNSModeHijack {
331329 blockDNSCondition := make ([]winsys.FWPM_FILTER_CONDITION0 , 1 )
332330 blockDNSCondition [0 ].FieldKey = winsys .FWPM_CONDITION_IP_REMOTE_PORT
333331 blockDNSCondition [0 ].MatchType = winsys .FWP_MATCH_EQUAL
0 commit comments