refine remote dns

This commit is contained in:
cubemaze 2023-10-19 13:18:07 +08:00
parent 99e68846d7
commit ebefcd6343
4 changed files with 49 additions and 14 deletions

View File

@ -12,7 +12,11 @@ import (
func updateDNSConfig(node *panel.NodeInfo) (err error) { func updateDNSConfig(node *panel.NodeInfo) (err error) {
dnsPath := os.Getenv("SING_DNS_PATH") dnsPath := os.Getenv("SING_DNS_PATH")
if len(node.RawDNS.DNSJson) != 0 { if len(node.RawDNS.DNSJson) != 0 {
err = saveDnsConfig(node.RawDNS.DNSJson, dnsPath) var prettyJSON bytes.Buffer
if err := json.Indent(&prettyJSON, node.RawDNS.DNSJson, "", " "); err != nil {
return err
}
err = saveDnsConfig(prettyJSON.Bytes(), dnsPath)
} else if len(node.RawDNS.DNSMap) != 0 { } else if len(node.RawDNS.DNSMap) != 0 {
dnsConfig := DNSConfig{ dnsConfig := DNSConfig{
Servers: []map[string]interface{}{ Servers: []map[string]interface{}{

View File

@ -3,6 +3,9 @@ package sing
import ( import (
"context" "context"
"fmt" "fmt"
"github.com/inazumav/sing-box/constant"
"github.com/inazumav/sing-box/log"
vlog "github.com/sirupsen/logrus"
"io" "io"
"os" "os"
"runtime/debug" "runtime/debug"
@ -75,13 +78,16 @@ func New(c *conf.CoreConfig) (vCore.Core, error) {
}, },
} }
os.Setenv("SING_DNS_PATH", "") os.Setenv("SING_DNS_PATH", "")
options.DNS = &option.DNSOptions{}
if c.SingConfig.DnsConfigPath != "" { if c.SingConfig.DnsConfigPath != "" {
if f, err := os.Open(c.SingConfig.DnsConfigPath); err != nil { f, err := os.OpenFile(c.SingConfig.DnsConfigPath, os.O_RDWR|os.O_CREATE, 0755)
log.Error("Failed to read DNS config file") if err != nil {
} else { log.Error("Failed to open or create sing dns config file: %s", err)
if err = json.NewDecoder(f).Decode(&option.DNSOptions{}); err != nil {
log.Error("Failed to unmarshal DNS config")
} }
defer f.Close()
if err := json.NewDecoder(f).Decode(options.DNS); err != nil {
log.Error(fmt.Sprintf("Failed to unmarshal sing dns config from file '%v': %v. Using default DNS options.", f.Name(), err))
options.DNS = &option.DNSOptions{}
} }
os.Setenv("SING_DNS_PATH", c.SingConfig.DnsConfigPath) os.Setenv("SING_DNS_PATH", c.SingConfig.DnsConfigPath)
} }
@ -230,6 +236,7 @@ func (b *Box) preStart() error {
} }
func (b *Box) start() error { func (b *Box) start() error {
vlog.Info("Sing Core Version: ", constant.Version)
err := b.preStart() err := b.preStart()
if err != nil { if err != nil {
return err return err

View File

@ -6,13 +6,20 @@ import (
"github.com/goccy/go-json" "github.com/goccy/go-json"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
coreConf "github.com/xtls/xray-core/infra/conf" coreConf "github.com/xtls/xray-core/infra/conf"
"net"
"os" "os"
"strconv"
"strings"
) )
func updateDNSConfig(node *panel.NodeInfo) (err error) { func updateDNSConfig(node *panel.NodeInfo) (err error) {
dnsPath := os.Getenv("XRAY_DNS_PATH") dnsPath := os.Getenv("XRAY_DNS_PATH")
if len(node.RawDNS.DNSJson) != 0 { if len(node.RawDNS.DNSJson) != 0 {
err = saveDnsConfig(node.RawDNS.DNSJson, dnsPath) var prettyJSON bytes.Buffer
if err := json.Indent(&prettyJSON, node.RawDNS.DNSJson, "", " "); err != nil {
return err
}
err = saveDnsConfig(prettyJSON.Bytes(), dnsPath)
} else if len(node.RawDNS.DNSMap) != 0 { } else if len(node.RawDNS.DNSMap) != 0 {
dnsConfig := DNSConfig{ dnsConfig := DNSConfig{
Servers: []interface{}{ Servers: []interface{}{
@ -21,7 +28,21 @@ func updateDNSConfig(node *panel.NodeInfo) (err error) {
Tag: "dns_inbound", Tag: "dns_inbound",
} }
for _, value := range node.RawDNS.DNSMap { for _, value := range node.RawDNS.DNSMap {
address := value["address"].(string)
if strings.Contains(address, ":") && !strings.Contains(address, "/") {
host, port, err := net.SplitHostPort(address)
if err != nil {
return err
}
var uint16Port uint16
if port, err := strconv.ParseUint(port, 10, 16); err == nil {
uint16Port = uint16(port)
}
value["address"] = host
value["port"] = uint16Port
}
dnsConfig.Servers = append(dnsConfig.Servers, value) dnsConfig.Servers = append(dnsConfig.Servers, value)
} }
dnsConfigJSON, err := json.MarshalIndent(dnsConfig, "", " ") dnsConfigJSON, err := json.MarshalIndent(dnsConfig, "", " ")
if err != nil { if err != nil {

View File

@ -1,6 +1,7 @@
package xray package xray
import ( import (
"fmt"
"os" "os"
"sync" "sync"
@ -63,12 +64,14 @@ func getCore(c *conf.XrayConfig) *core.Instance {
coreDnsConfig := &coreConf.DNSConfig{} coreDnsConfig := &coreConf.DNSConfig{}
os.Setenv("XRAY_DNS_PATH", "") os.Setenv("XRAY_DNS_PATH", "")
if c.DnsConfigPath != "" { if c.DnsConfigPath != "" {
if f, err := os.Open(c.DnsConfigPath); err != nil { f, err := os.OpenFile(c.DnsConfigPath, os.O_RDWR|os.O_CREATE, 0755)
log.WithField("err", err).Panic("Failed to read DNS config file") if err != nil {
} else { log.Error("Failed to open or create xray dns config file: %v", err)
if err = json.NewDecoder(f).Decode(coreDnsConfig); err != nil {
log.WithField("err", err).Error("Failed to unmarshal DNS config")
} }
defer f.Close()
if err := json.NewDecoder(f).Decode(coreDnsConfig); err != nil {
log.Error(fmt.Sprintf("Failed to unmarshal xray dns config from file '%v': %v. Using default DNS options.", f.Name(), err))
coreDnsConfig = &coreConf.DNSConfig{}
} }
os.Setenv("XRAY_DNS_PATH", c.DnsConfigPath) os.Setenv("XRAY_DNS_PATH", c.DnsConfigPath)
} }