为了账号安全,请及时绑定邮箱和手机立即绑定

以编程方式进行 DNS SRV 绑定

以编程方式进行 DNS SRV 绑定

Go
慕标5832272 2022-01-10 19:08:22
有人知道如何在 Go 中本地设置 SRV 记录吗?这是为了测试目的。例如,我想在测试期间绑定test.com到localhost。目前,我必须编辑主机/etc/bind/test.com.hoststest.com.   IN  SOA bindhostname. admin.test.com. (145260748810800360060480038400 )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但不知道从哪里开始。有人可以帮忙吗?谢谢!
查看完整描述

1 回答

?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

首先,您需要将本地 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.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 服务器。我正在使用您需要成为 root 用户的端口 53。您可以将其更改为其他内容。运行测试时,您可以从某个不同的端口获取它。


查看完整回答
反对 回复 2022-01-10
  • 1 回答
  • 0 关注
  • 136 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信