linux – 以编程方式转到DNS SRV绑定
发布时间:2020-12-13 22:59:24 所属栏目:Linux 来源:网络整理
导读:有人知道如何在Go中本地设置SRV记录吗? 它用于测试目的.例如,我想在测试期间将test.com绑定到localhost.目前,我必须编辑主机/etc/bind/test.com.hosts test.com. IN SOA bindhostname. admin.test.com. (145260748810800360060480038400 )test.com. IN NS b
有人知道如何在Go中本地设置SRV记录吗?
它用于测试目的.例如,我想在测试期间将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,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 { } } 您可以检查此绑定服务器是否为dig提供了正确答案 dig @"127.0.0.1" _etcd-client._tcp. SRV 我假设您正在使用IPv4地址(它只增加了大约十行,但我希望代码在没有处理IPv6的情况下简洁). 您可以更改我作为const使用的DOM和SRV模式. 您可以将其集成为在进行测试时启动dns服务器的库.我正在使用端口53,您需要成为root用户.您可以将其更改为其他内容.当测试运行时,您可以从一些不同的端口获取它. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |