refactor windows dns manager

This commit is contained in:
Nova 2025-03-07 05:45:15 +03:30
parent 818ab3e568
commit 1922600c62
5 changed files with 88 additions and 33 deletions

View File

@ -1,6 +1,7 @@
package boxdns
import (
"fmt"
"github.com/gofrs/uuid/v5"
"github.com/matsuridayo/libneko/iphlpapi"
"github.com/sagernet/sing/common/control"
@ -21,19 +22,25 @@ const (
var customDNS []netip.Addr
var dnsIsSet bool
func HandleInterfaceChange(_ *control.Interface, _ int) {
monitorForUnderlyingDNS(customDNS)
func (d *DnsManager) HandleSystemDNS(ifc *control.Interface, flag int) {
if d == nil {
fmt.Println("No DnsManager, you may need to restart nekoray")
return
}
if ifc == nil || ifc.Equals(d.lastIfc) {
return
}
if !dnsIsSet {
return
}
_ = SetDefaultDNS(customDNS, false, false)
_ = d.SetDefaultDNS(customDNS, false, false)
}
func getDefaultInterfaceGuid() (string, error) {
if DefaultIfcMonitor == nil {
return "", E.New("No default interface monitor")
func (d *DnsManager) getDefaultInterfaceGuid() (string, error) {
if d.Monitor == nil {
return "", E.New("No Dns Manager, you may need to restart nekoray")
}
ifc := DefaultIfcMonitor.DefaultInterface()
ifc := d.Monitor.DefaultInterface()
if ifc == nil {
log.Println("Default interface is nil!")
return "", E.New("Default interface is nil!")
@ -55,11 +62,11 @@ func getDefaultInterfaceGuid() (string, error) {
return guidStr, nil
}
func getDefaultInterfaceLUID() (winipcfg.LUID, error) {
if DefaultIfcMonitor == nil {
return 0, E.New("No default interface monitor")
func (d *DnsManager) getDefaultInterfaceLUID() (winipcfg.LUID, error) {
if d.Monitor == nil {
return 0, E.New("No DnsManager, you may need to restart nekoray")
}
ifc := DefaultIfcMonitor.DefaultInterface()
ifc := d.Monitor.DefaultInterface()
if ifc == nil {
log.Println("Default interface is nil!")
return 0, E.New("Default interface is nil!")
@ -73,8 +80,12 @@ func getDefaultInterfaceLUID() (winipcfg.LUID, error) {
return luid, nil
}
func GetDefaultDNS() (servers []netip.Addr, dhcp bool, err error) {
guidStr, err := getDefaultInterfaceGuid()
func (d *DnsManager) GetDefaultDNS() (servers []netip.Addr, dhcp bool, err error) {
if d == nil {
fmt.Println("No DnsManager, you may need to restart nekoray")
return nil, false, E.New("No Dns Manager, you may need to restart nekoray")
}
guidStr, err := d.getDefaultInterfaceGuid()
if err != nil {
return nil, false, err
}
@ -108,15 +119,22 @@ func GetDefaultDNS() (servers []netip.Addr, dhcp bool, err error) {
return resp, false, nil
}
func SetDefaultDNS(servers []netip.Addr, dhcp bool, clear bool) error {
func (d *DnsManager) SetDefaultDNS(servers []netip.Addr, dhcp bool, clear bool) error {
if d == nil {
fmt.Println("No DnsManager, you may need to restart nekoray")
return E.New("No dns Manager, you may need to restart nekoray")
}
if clear {
dnsIsSet = false
} else {
customDNS = servers
dnsIsSet = true
if ifc := d.Monitor.DefaultInterface(); ifc != nil {
d.lastIfc = *ifc
}
}
luid, err := getDefaultInterfaceLUID()
luid, err := d.getDefaultInterfaceLUID()
if err != nil {
return err
}

View File

@ -7,8 +7,17 @@ import (
"github.com/sagernet/sing/common/control"
)
var DefaultIfcMonitor tun.DefaultInterfaceMonitor
var DnsManagerInstance *DnsManager
func HandleInterfaceChange(_ *control.Interface, _ int) {
type DnsManager struct {
Monitor tun.DefaultInterfaceMonitor
lastIfc control.Interface
}
func (d *DnsManager) HandleSystemDNS(ifc *control.Interface, flag int) {
return
}
func (d *DnsManager) HandleUnderlyingDNS(ifc *control.Interface, flag int) {
return
}

View File

@ -1,9 +1,11 @@
package boxdns
import (
"fmt"
"github.com/matsuridayo/libneko/iphlpapi"
"github.com/sagernet/sing/common/control"
logger2 "github.com/sagernet/sing/common/logger"
"log"
"net/netip"
"strings"
tun "github.com/sagernet/sing-tun"
@ -12,14 +14,47 @@ import (
"golang.org/x/sys/windows/registry"
)
var DefaultIfcMonitor tun.DefaultInterfaceMonitor
func monitorForUnderlyingDNS(customDNS []netip.Addr) {
if DefaultIfcMonitor == nil {
log.Println("Default interface monitor not available!")
func init() {
logger := logger2.NOP()
updMonitor, err := tun.NewNetworkUpdateMonitor(logger)
if err != nil {
fmt.Println("Could not create NetworkUpdateMonitor")
return
}
monitor, err := tun.NewDefaultInterfaceMonitor(updMonitor, logger, tun.DefaultInterfaceMonitorOptions{
InterfaceFinder: control.NewDefaultInterfaceFinder(),
})
if err != nil {
fmt.Println("Could not create DefaultInterfaceMonitor")
return
}
DnsManagerInstance = &DnsManager{Monitor: monitor}
monitor.RegisterCallback(DnsManagerInstance.HandleUnderlyingDNS)
monitor.RegisterCallback(DnsManagerInstance.HandleSystemDNS)
if err = updMonitor.Start(); err != nil {
fmt.Println("Could not start updMonitor")
return
}
if err = monitor.Start(); err != nil {
fmt.Println("Could not start monitor")
return
}
//DnsManagerInstance.HandleUnderlyingDNS(monitor.DefaultInterface(), 0)
}
var DnsManagerInstance *DnsManager
type DnsManager struct {
Monitor tun.DefaultInterfaceMonitor
lastIfc control.Interface
}
func (d *DnsManager) HandleUnderlyingDNS(ifc *control.Interface, flag int) {
if d == nil {
fmt.Println("No DnsManager, you may need to restart nekoray")
return
}
ifc := DefaultIfcMonitor.DefaultInterface()
if ifc == nil {
log.Println("Default interface is nil!")
return

View File

@ -15,7 +15,6 @@ import (
"nekobox_core/gen"
"nekobox_core/internal/boxapi"
"nekobox_core/internal/boxbox"
"nekobox_core/internal/boxdns"
"nekobox_core/internal/boxmain"
"nekobox_core/internal/sys"
"net/http"
@ -68,12 +67,6 @@ func (s *server) Start(ctx context.Context, in *gen.LoadConfigReq) (out *gen.Err
if err != nil {
return
}
if runtime.GOOS == "windows" {
nm := boxInstance.Network()
boxdns.DefaultIfcMonitor = nm.InterfaceMonitor()
boxdns.HandleInterfaceChange(nil, 0)
boxdns.DefaultIfcMonitor.RegisterCallback(boxdns.HandleInterfaceChange)
}
if runtime.GOOS == "darwin" && strings.Contains(in.CoreConfig, "utun") {
err := sys.SetSystemDNS("172.19.0.2", boxInstance.Network().InterfaceMonitor())
if err != nil {

View File

@ -8,7 +8,7 @@ import (
)
func (s *server) GetSystemDNS(ctx context.Context, in *gen.EmptyReq) (*gen.GetSystemDNSResponse, error) {
servers, dhcp, err := boxdns.GetDefaultDNS()
servers, dhcp, err := boxdns.DnsManagerInstance.GetDefaultDNS()
if err != nil {
return nil, err
}
@ -33,7 +33,7 @@ func (s *server) SetSystemDNS(ctx context.Context, in *gen.SetSystemDNSRequest)
}
servers = append(servers, s)
}
err := boxdns.SetDefaultDNS(servers, in.SetDhcp, in.Clear)
err := boxdns.DnsManagerInstance.SetDefaultDNS(servers, in.SetDhcp, in.Clear)
if err != nil {
return nil, err
}