mirror of
https://gitclone.com/github.com/MetaCubeX/Clash.Meta
synced 2025-02-23 01:43:15 +08:00
fix: system://
should ignore dns server setting by tun listener
This commit is contained in:
parent
e3b69b8ae2
commit
d84f88b50f
39
component/resolver/system.go
Normal file
39
component/resolver/system.go
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
package resolver
|
||||||
|
|
||||||
|
import "sync"
|
||||||
|
|
||||||
|
var blacklist struct {
|
||||||
|
Map map[string]struct{}
|
||||||
|
Mutex sync.Mutex
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
blacklist.Map = make(map[string]struct{})
|
||||||
|
}
|
||||||
|
|
||||||
|
func AddSystemDnsBlacklist(names ...string) {
|
||||||
|
blacklist.Mutex.Lock()
|
||||||
|
defer blacklist.Mutex.Unlock()
|
||||||
|
for _, name := range names {
|
||||||
|
blacklist.Map[name] = struct{}{}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func RemoveSystemDnsBlacklist(names ...string) {
|
||||||
|
blacklist.Mutex.Lock()
|
||||||
|
defer blacklist.Mutex.Unlock()
|
||||||
|
for _, name := range names {
|
||||||
|
delete(blacklist.Map, name)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func IsSystemDnsBlacklisted(names ...string) bool {
|
||||||
|
blacklist.Mutex.Lock()
|
||||||
|
defer blacklist.Mutex.Unlock()
|
||||||
|
for _, name := range names {
|
||||||
|
if _, ok := blacklist.Map[name]; ok {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
@ -8,6 +8,7 @@ import (
|
|||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/metacubex/mihomo/component/resolver"
|
||||||
"github.com/metacubex/mihomo/log"
|
"github.com/metacubex/mihomo/log"
|
||||||
|
|
||||||
D "github.com/miekg/dns"
|
D "github.com/miekg/dns"
|
||||||
@ -39,6 +40,9 @@ func (c *systemClient) getDnsClients() ([]dnsClient, error) {
|
|||||||
if nameservers, err = dnsReadConfig(); err == nil {
|
if nameservers, err = dnsReadConfig(); err == nil {
|
||||||
log.Debugln("[DNS] system dns update to %s", nameservers)
|
log.Debugln("[DNS] system dns update to %s", nameservers)
|
||||||
for _, addr := range nameservers {
|
for _, addr := range nameservers {
|
||||||
|
if resolver.IsSystemDnsBlacklisted(addr) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
if _, ok := c.dnsClients[addr]; !ok {
|
if _, ok := c.dnsClients[addr]; !ok {
|
||||||
clients := transform(
|
clients := transform(
|
||||||
[]NameServer{{
|
[]NameServer{{
|
||||||
|
@ -12,6 +12,7 @@ import (
|
|||||||
"github.com/metacubex/mihomo/adapter/inbound"
|
"github.com/metacubex/mihomo/adapter/inbound"
|
||||||
"github.com/metacubex/mihomo/component/dialer"
|
"github.com/metacubex/mihomo/component/dialer"
|
||||||
"github.com/metacubex/mihomo/component/iface"
|
"github.com/metacubex/mihomo/component/iface"
|
||||||
|
"github.com/metacubex/mihomo/component/resolver"
|
||||||
C "github.com/metacubex/mihomo/constant"
|
C "github.com/metacubex/mihomo/constant"
|
||||||
LC "github.com/metacubex/mihomo/listener/config"
|
LC "github.com/metacubex/mihomo/listener/config"
|
||||||
"github.com/metacubex/mihomo/listener/sing"
|
"github.com/metacubex/mihomo/listener/sing"
|
||||||
@ -39,6 +40,8 @@ type Listener struct {
|
|||||||
networkUpdateMonitor tun.NetworkUpdateMonitor
|
networkUpdateMonitor tun.NetworkUpdateMonitor
|
||||||
defaultInterfaceMonitor tun.DefaultInterfaceMonitor
|
defaultInterfaceMonitor tun.DefaultInterfaceMonitor
|
||||||
packageManager tun.PackageManager
|
packageManager tun.PackageManager
|
||||||
|
|
||||||
|
dnsServerIp []string
|
||||||
}
|
}
|
||||||
|
|
||||||
func CalculateInterfaceName(name string) (tunName string) {
|
func CalculateInterfaceName(name string) (tunName string) {
|
||||||
@ -147,12 +150,16 @@ func New(options LC.Tun, tunnel C.Tunnel, additions ...inbound.Addition) (l *Lis
|
|||||||
|
|
||||||
dnsAdds = append(dnsAdds, addrPort)
|
dnsAdds = append(dnsAdds, addrPort)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var dnsServerIp []string
|
||||||
for _, a := range options.Inet4Address {
|
for _, a := range options.Inet4Address {
|
||||||
addrPort := netip.AddrPortFrom(a.Addr().Next(), 53)
|
addrPort := netip.AddrPortFrom(a.Addr().Next(), 53)
|
||||||
|
dnsServerIp = append(dnsServerIp, a.Addr().Next().String())
|
||||||
dnsAdds = append(dnsAdds, addrPort)
|
dnsAdds = append(dnsAdds, addrPort)
|
||||||
}
|
}
|
||||||
for _, a := range options.Inet6Address {
|
for _, a := range options.Inet6Address {
|
||||||
addrPort := netip.AddrPortFrom(a.Addr().Next(), 53)
|
addrPort := netip.AddrPortFrom(a.Addr().Next(), 53)
|
||||||
|
dnsServerIp = append(dnsServerIp, a.Addr().Next().String())
|
||||||
dnsAdds = append(dnsAdds, addrPort)
|
dnsAdds = append(dnsAdds, addrPort)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -244,6 +251,10 @@ func New(options LC.Tun, tunnel C.Tunnel, additions ...inbound.Addition) (l *Lis
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
l.dnsServerIp = dnsServerIp
|
||||||
|
// after tun.New sing-tun has set DNS to TUN interface
|
||||||
|
resolver.AddSystemDnsBlacklist(dnsServerIp...)
|
||||||
|
|
||||||
stackOptions := tun.StackOptions{
|
stackOptions := tun.StackOptions{
|
||||||
Context: context.TODO(),
|
Context: context.TODO(),
|
||||||
Tun: tunIf,
|
Tun: tunIf,
|
||||||
@ -336,6 +347,7 @@ func parseRange(uidRanges []ranges.Range[uint32], rangeList []string) ([]ranges.
|
|||||||
|
|
||||||
func (l *Listener) Close() error {
|
func (l *Listener) Close() error {
|
||||||
l.closed = true
|
l.closed = true
|
||||||
|
resolver.RemoveSystemDnsBlacklist(l.dnsServerIp...)
|
||||||
return common.Close(
|
return common.Close(
|
||||||
l.tunStack,
|
l.tunStack,
|
||||||
l.tunIf,
|
l.tunIf,
|
||||||
|
Loading…
Reference in New Issue
Block a user