2016-05-24 7 views
4

Könnte jemand wissen, wie SRV-Eintrag lokal in Go eingerichtet wird?Gehen Sie für DNS-SRV-Bindung programmgesteuert

Es ist für Testzwecke. Zum Beispiel möchte ich während der Tests test.com an localhost binden. Derzeit habe ich Host bearbeiten /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. 

ich https://github.com/miekg/dns aussah, aber kann nicht herausfinden, wo ich anfangen soll. Könnte jemand helfen?

Danke!

+2

'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

+0

Vielen Dank. Ich möchte bind Server ersetzen, wenn ich kann. –

+0

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

Antwort

3

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.