Zuerst müssen Sie Ihre lokale IP hinzuzufügen /etc/resolv.conf
Dann können Sie folgenden Code verwenden:
package main
import (
"log"
"net"
"github.com/miekg/dns"
)
const (
DOM = "test.com."
srvDom = "_etcd-client._tcp."
)
func handleSRV(w dns.ResponseWriter, r *dns.Msg) {
var a net.IP
m := new(dns.Msg)
m.SetReply(r)
if ip, ok := w.RemoteAddr().(*net.UDPAddr); ok {
a = ip.IP
}
if ip, ok := w.RemoteAddr().(*net.TCPAddr); ok {
a = ip.IP
}
// Add in case you are using IPv6 alongwith AAAA
/*if a.To4() !=nil {
a = a.To4()
}
*/
// Checking which type of query has come
switch r.Question[0].Qtype {
default:
fallthrough
case dns.TypeA:
rr := new(dns.A)
rr.Hdr = dns.RR_Header{Name: DOM, Rrtype: dns.TypeA, Class: dns.ClassINET, Ttl: 0}
rr.A = a.To4()
m.Answer = append(m.Answer, rr)
case dns.TypeSRV:
rr := new(dns.SRV)
rr.Hdr = dns.RR_Header{Name: srvDom, Rrtype: dns.TypeSRV, Class: dns.ClassINET, Ttl: 0}
rr.Priority = 0
rr.Weight = 0
rr.Port = 5000
rr.Target = DOM
m.Answer = append(m.Answer, rr)
}
w.WriteMsg(m)
}
func serve(net string) {
server := &dns.Server{Addr: ":53", Net: net, TsigSecret: nil}
err := server.ListenAndServe()
if err != nil {
log.Fatal("Server can't be started")
}
}
func main() {
dns.HandleFunc(DOM, handleSRV)
dns.HandleFunc(srvDom, handleSRV)
go serve("tcp")
go serve("udp")
for {
}
}
Sie können überprüfen, dass diese bind Server richtige Antwort für dig
gibt
Ich habe angenommen, dass Sie IPv4-Adresse verwenden (Es ist die Addition von nur zehn Zeilen, aber ich wollte Code kurz und prägnant sein, ohne IPv6 zu behandeln).
Sie können DOM und SRV-Muster ändern, die ich als const genommen habe.
Sie können dies als Bibliothek integrieren, die den DNS-Server starten, wenn Sie testen. Ich benutze Port 53, für den Sie Root-Benutzer sein müssen. Sie können es zu etwas anderem ändern. Und wenn Tests ausgeführt werden, können Sie es von einem anderen Anschluss erhalten.
'bind' ist ein Daemon, den Sie neu konfigurieren. Versuchen Sie, die Neukonfiguration von Go zu schreiben, oder versuchen Sie, einen DNS-Server auszuführen (in diesem Fall müssen Sie den Bind-Server durch Ihren eigenen ersetzen) – JimB
Vielen Dank. Ich möchte bind Server ersetzen, wenn ich kann. –
kommt "test.com" von Drittanbietern oder ist es in Ihrer App/lib fest codiert? Suchen Sie SRV-Datensatz direkt über net.LookupSRV, oder wird es aus einer Bibliothek aufgerufen (unterstützt es benutzerdefinierte net.Transport oder net.Dialer)? – Darigaaz