45 lines
1.1 KiB
Go
45 lines
1.1 KiB
Go
package main
|
|
|
|
import (
|
|
"github.com/miekg/dns"
|
|
"log"
|
|
)
|
|
|
|
func main() {
|
|
// 注册 DNS 请求处理函数
|
|
dns.HandleFunc(".", handleDNSRequest)
|
|
// 设置服务器地址和协议
|
|
server := &dns.Server{Addr: ":53", Net: "udp"}
|
|
// 开始监听
|
|
log.Printf("Starting DNS server on %s\n", server.Addr)
|
|
if err := server.ListenAndServe(); err != nil {
|
|
log.Fatalf("Failed to start server: %s\n", err.Error())
|
|
}
|
|
}
|
|
|
|
func handleDNSRequest(w dns.ResponseWriter, r *dns.Msg) {
|
|
msg := new(dns.Msg)
|
|
msg.SetReply(r)
|
|
// 将 DNS 响应标记为权威应答
|
|
msg.Authoritative = true
|
|
// 将 DNS 响应标记为递归可用
|
|
// msg.RecursionAvailable = true
|
|
// 遍历请求中的问题部分,生成相应的回答
|
|
for _, question := range r.Question {
|
|
switch question.Qtype {
|
|
case dns.TypeA:
|
|
handleARecord(question, msg)
|
|
//case dns.TypeAAAA:
|
|
// handleAAAARecord(question, msg)
|
|
//case dns.TypeCNAME:
|
|
// handleCNAMERecord(question, msg)
|
|
//case dns.TypeMX:
|
|
// handleMXRecord(question, msg)
|
|
//case dns.TypeTXT:
|
|
// handleTXTRecord(question, msg)
|
|
}
|
|
}
|
|
// 发送响应
|
|
w.WriteMsg(msg)
|
|
}
|