65 lines
1.7 KiB
Go
65 lines
1.7 KiB
Go
|
package service
|
||
|
|
||
|
import (
|
||
|
"github.com/miekg/dns"
|
||
|
"github.com/spf13/viper"
|
||
|
"matrix-common/constants"
|
||
|
"matrix-common/pkg/logger"
|
||
|
"matrix-dnslog-service/pkg/config"
|
||
|
"matrix-dnslog-service/pkg/handler"
|
||
|
"strings"
|
||
|
)
|
||
|
|
||
|
func Main() {
|
||
|
viper.SetConfigName(constants.ConfigFileName)
|
||
|
viper.SetConfigType(constants.ConfigType)
|
||
|
for _, path := range constants.ConfigPaths {
|
||
|
viper.AddConfigPath(path)
|
||
|
}
|
||
|
|
||
|
if err := viper.ReadInConfig(); err != nil {
|
||
|
if _, ok := err.(viper.ConfigFileNotFoundError); ok {
|
||
|
_ = config.GenerateConfig()
|
||
|
logger.Log().Fatalf("未找到配置文件, 已生成示例配置文件于运行路径下")
|
||
|
} else {
|
||
|
logger.Log().Fatalf("配置解析失败 %s", err)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
conf := &config.Conf{}
|
||
|
err := viper.Unmarshal(conf)
|
||
|
if err != nil {
|
||
|
logger.Log().Fatalf("配置文件解析失败: %s, 请检查配置是否有误", err)
|
||
|
}
|
||
|
|
||
|
serv := &dns.Server{Addr: conf.Addr, Net: "udp"}
|
||
|
|
||
|
if conf.Proxy {
|
||
|
logger.Log().Infof("[Proxy] dns 代理已启用 代理将转发至服务器: %s", conf.ProxyServer)
|
||
|
dns.HandleFunc(".", func(w dns.ResponseWriter, r *dns.Msg) {
|
||
|
qname := r.Question[0].Name
|
||
|
logger.Log().Infof("[Proxy] 查询域名 %s\n", qname)
|
||
|
resp, _ := dns.Exchange(r, conf.ProxyServer)
|
||
|
_ = w.WriteMsg(resp)
|
||
|
})
|
||
|
}
|
||
|
|
||
|
dns.HandleFunc(conf.DomainPattern, func(w dns.ResponseWriter, r *dns.Msg) {
|
||
|
qname := r.Question[0].Name
|
||
|
logger.Log().Infof("接收值: %s\n", qname)
|
||
|
|
||
|
// 去除后缀 只保留前缀
|
||
|
name := strings.TrimSuffix(qname, conf.DomainPattern)
|
||
|
// 处理数据
|
||
|
handler.ProcessHandler(name)
|
||
|
|
||
|
m := new(dns.Msg)
|
||
|
m.SetReply(r)
|
||
|
_ = w.WriteMsg(m)
|
||
|
})
|
||
|
|
||
|
if err := serv.ListenAndServe(); err != nil {
|
||
|
logger.Log().Fatalf("服务启动失败: %v\n", err)
|
||
|
}
|
||
|
}
|