以编程方式进入DNS SRV绑定

任何人都可以知道如何在Go上本地设置SRVlogging吗?

这是为了testing目的。 例如,我想在testing期间将test.com绑定到localhost 。 目前,我必须编辑主机/etc/bind/test.com.hosts

 test.com. IN SOA bindhostname. admin.test.com. ( 1452607488 10800 3600 604800 38400 ) test.com. IN NS bindhostname. my1.test.com. 300 IN A 127.0.0.1 _etcd-client._tcp 300 IN SRV 0 0 5000 my1.test.com. 

我看着https://github.com/miekg/dns,但不知道从哪里开始。 有人可以帮忙吗?

谢谢!

首先你需要把你的本地ip添加到/etc/resolv.conf

那么你可以使用下面的代码:

 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.listnAndServe() 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 { } } 

你可以检查这个绑定服务器给出正确的答案

 dig @"127.0.0.1" _etcd-client._tcp. SRV 

我假设你使用的是IPv4地址(它只增加了大约十行,但我希望代码简洁而不需要处理IPv6)。

你可以改变我和const一样的DOM和SRV模式。

你可以把它作为库来启动dns服务器,当你测试的时候。 我正在使用您需要为root用户的端口53。 你可以把它改成别的东西。 而当测试运行时,你可以从一些不同的端口得到它。