mirror of
https://github.com/Mahdi-zarei/nekoray.git
synced 2025-12-24 10:33:15 +08:00
fix system dns
This commit is contained in:
parent
8e49c30828
commit
83413c19e8
@ -2,7 +2,6 @@ package boxdns
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
"fmt"
|
|
||||||
"github.com/gofrs/uuid/v5"
|
"github.com/gofrs/uuid/v5"
|
||||||
"github.com/sagernet/sing/common/control"
|
"github.com/sagernet/sing/common/control"
|
||||||
E "github.com/sagernet/sing/common/exceptions"
|
E "github.com/sagernet/sing/common/exceptions"
|
||||||
@ -24,16 +23,19 @@ var dnsIsSet bool
|
|||||||
|
|
||||||
func (d *DnsManager) HandleSystemDNS(ifc *control.Interface, flag int) {
|
func (d *DnsManager) HandleSystemDNS(ifc *control.Interface, flag int) {
|
||||||
if d == nil {
|
if d == nil {
|
||||||
fmt.Println("No DnsManager, you may need to restart nekoray")
|
log.Println("No DnsManager, you may need to restart nekoray")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if !dnsIsSet || ifc == nil {
|
if ifc != nil {
|
||||||
return
|
if !dnsIsSet {
|
||||||
|
d.restoreSystemDNS(*ifc)
|
||||||
|
} else {
|
||||||
|
d.setSystemDNS(*ifc)
|
||||||
|
}
|
||||||
|
if d.lastIfc != nil && d.lastIfc.Index != ifc.Index {
|
||||||
|
d.restoreSystemDNS(*d.lastIfc)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if d.lastIfc != nil && d.lastIfc.Index != ifc.Index {
|
|
||||||
d.restoreSystemDNS(*d.lastIfc)
|
|
||||||
}
|
|
||||||
d.setSystemDNS(*ifc)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *DnsManager) getInterfaceGuid(ifc control.Interface) (string, error) {
|
func (d *DnsManager) getInterfaceGuid(ifc control.Interface) (string, error) {
|
||||||
@ -79,9 +81,27 @@ func ifcIdxtoUUID(index int) (*uuid.UUID, error) {
|
|||||||
|
|
||||||
func (d *DnsManager) isIfcDNSDhcp(ifc control.Interface) (dhcp bool, err error) {
|
func (d *DnsManager) isIfcDNSDhcp(ifc control.Interface) (dhcp bool, err error) {
|
||||||
if d == nil {
|
if d == nil {
|
||||||
fmt.Println("No DnsManager, you may need to restart nekoray")
|
log.Println("No DnsManager, you may need to restart nekoray")
|
||||||
return false, E.New("No Dns Manager, you may need to restart nekoray")
|
return false, E.New("No Dns Manager, you may need to restart nekoray")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
luid, err := winipcfg.LUIDFromIndex(uint32(ifc.Index))
|
||||||
|
if err != nil {
|
||||||
|
log.Println("[isIfcDNSDhcp] failed to get luid from index:", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
dnsServers, err := luid.DNS()
|
||||||
|
if err != nil {
|
||||||
|
log.Println("[isIfcDNSDhcp] failed to get luid dns servers:", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
for _, server := range dnsServers {
|
||||||
|
if server.String() == dhcpMarkAddr {
|
||||||
|
return true, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
guidStr, err := d.getInterfaceGuid(ifc)
|
guidStr, err := d.getInterfaceGuid(ifc)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, err
|
return false, err
|
||||||
@ -106,48 +126,55 @@ func (d *DnsManager) isIfcDNSDhcp(ifc control.Interface) (dhcp bool, err error)
|
|||||||
func (d *DnsManager) restoreSystemDNS(ifx control.Interface) {
|
func (d *DnsManager) restoreSystemDNS(ifx control.Interface) {
|
||||||
luid, err := winipcfg.LUIDFromIndex(uint32(ifx.Index))
|
luid, err := winipcfg.LUIDFromIndex(uint32(ifx.Index))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println("[restoreSystemDNS] failed to get luid from index:", err)
|
log.Println("[restoreSystemDNS] failed to get luid from index:", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
dnsServers, err := luid.DNS()
|
dnsServers, err := luid.DNS()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println("[restoreSystemDNS] failed to get luid dns servers:", err)
|
log.Println("[restoreSystemDNS] failed to get luid dns servers:", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
isDhcp := false
|
isDhcp := false
|
||||||
newDnsServers := make([]netip.Addr, 0)
|
newDnsServers := make([]netip.Addr, 0)
|
||||||
|
wasSet := false
|
||||||
for _, server := range dnsServers {
|
for _, server := range dnsServers {
|
||||||
if server.String() == localAddr || server.String() == dhcpMarkAddr {
|
if server.String() == localAddr || server.String() == dhcpMarkAddr {
|
||||||
isDhcp = server.String() == dhcpMarkAddr
|
isDhcp = server.String() == dhcpMarkAddr
|
||||||
|
wasSet = true
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
newDnsServers = append(newDnsServers, server)
|
newDnsServers = append(newDnsServers, server)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if !wasSet {
|
||||||
|
log.Println("[restoreSystemDNS] no action needed")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
if isDhcp {
|
if isDhcp {
|
||||||
err = luid.SetDNS(winipcfg.AddressFamily(windows.AF_INET), nil, nil)
|
err = luid.SetDNS(winipcfg.AddressFamily(windows.AF_INET), nil, nil)
|
||||||
} else {
|
} else {
|
||||||
err = luid.SetDNS(winipcfg.AddressFamily(windows.AF_INET), newDnsServers, nil)
|
err = luid.SetDNS(winipcfg.AddressFamily(windows.AF_INET), newDnsServers, nil)
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println("[restoreSystemDNS] failed to set dns servers:", err)
|
log.Println("[restoreSystemDNS] failed to set dns servers:", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
fmt.Println("[restoreSystemDNS] Local DNS Server removed for:", ifx.Name)
|
log.Println("[restoreSystemDNS] Local DNS Server removed for:", ifx.Name)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *DnsManager) setSystemDNS(ifx control.Interface) {
|
func (d *DnsManager) setSystemDNS(ifx control.Interface) {
|
||||||
luid, err := winipcfg.LUIDFromIndex(uint32(ifx.Index))
|
luid, err := winipcfg.LUIDFromIndex(uint32(ifx.Index))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println("[setSystemDNS] failed to get luid from index:", err)
|
log.Println("[setSystemDNS] failed to get luid from index:", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
dnsServers, err := luid.DNS()
|
dnsServers, err := luid.DNS()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println("[setSystemDNS] failed to get luid dns servers:", err)
|
log.Println("[setSystemDNS] failed to get luid dns servers:", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -165,7 +192,7 @@ func (d *DnsManager) setSystemDNS(ifx control.Interface) {
|
|||||||
if !hasLocal {
|
if !hasLocal {
|
||||||
dhcp, err := d.isIfcDNSDhcp(ifx)
|
dhcp, err := d.isIfcDNSDhcp(ifx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println("[setSystemDNS] failed to determine whether ifc DNS is dhcp:", err)
|
log.Println("[setSystemDNS] failed to determine whether ifc DNS is dhcp:", err)
|
||||||
}
|
}
|
||||||
if dhcp {
|
if dhcp {
|
||||||
markAddr, _ := netip.ParseAddr(dhcpMarkAddr)
|
markAddr, _ := netip.ParseAddr(dhcpMarkAddr)
|
||||||
@ -174,15 +201,15 @@ func (d *DnsManager) setSystemDNS(ifx control.Interface) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if err = luid.SetDNS(winipcfg.AddressFamily(windows.AF_INET), newDnsServers, nil); err != nil {
|
if err = luid.SetDNS(winipcfg.AddressFamily(windows.AF_INET), newDnsServers, nil); err != nil {
|
||||||
fmt.Println("[setSystemDNS] failed to set dns servers:", err)
|
log.Println("[setSystemDNS] failed to set dns servers:", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
fmt.Println("[setSystemDNS] Local DNS Server added for:", ifx.Name)
|
log.Println("[setSystemDNS] Local DNS Server added for:", ifx.Name)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *DnsManager) SetSystemDNS(ifc *control.Interface, clear bool) error {
|
func (d *DnsManager) SetSystemDNS(ifc *control.Interface, clear bool) error {
|
||||||
if d == nil {
|
if d == nil {
|
||||||
fmt.Println("No DnsManager, you may need to restart nekoray")
|
log.Println("No DnsManager, you may need to restart nekoray")
|
||||||
return E.New("No dns Manager, you may need to restart nekoray")
|
return E.New("No dns Manager, you may need to restart nekoray")
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -193,6 +220,7 @@ func (d *DnsManager) SetSystemDNS(ifc *control.Interface, clear bool) error {
|
|||||||
return E.New("Default interface is nil!")
|
return E.New("Default interface is nil!")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
log.Println("[SetSystemDNS] Setting system dns for", ifc.Name, "clear is", clear)
|
||||||
|
|
||||||
if clear {
|
if clear {
|
||||||
dnsIsSet = false
|
dnsIsSet = false
|
||||||
|
|||||||
@ -45,7 +45,7 @@ type DnsManager struct {
|
|||||||
|
|
||||||
func (d *DnsManager) HandleUnderlyingDNS(ifc *control.Interface, flag int) {
|
func (d *DnsManager) HandleUnderlyingDNS(ifc *control.Interface, flag int) {
|
||||||
if d == nil {
|
if d == nil {
|
||||||
fmt.Println("No DnsManager, you may need to restart nekoray")
|
log.Println("No DnsManager, you may need to restart nekoray")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if ifc == nil {
|
if ifc == nil {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user