Skip to content
This repository has been archived by the owner on Mar 15, 2024. It is now read-only.

Commit

Permalink
Support for fake domain with -domain switch
Browse files Browse the repository at this point in the history
  • Loading branch information
kamilchm committed Feb 1, 2018
1 parent 3105a7e commit f6c3f79
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 24 deletions.
24 changes: 24 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -50,3 +50,27 @@ is to add it to **DNSMASQ** config:
server=/./127.0.0.1#5300
```

#### Fake domains

**NixOps-DNS** can translate fake development domains like `.dev` or `.ops` if you
want to use it along with other DNS servers and route only part of the queries to it.

Start **NixOps-DNS** with the `domain` switch:

```
nixops-dns -domain=.ops
```

Modify **DNSMASQ** config:

```
server=/ops/127.0.0.1#5300
```

and you can query **NixOps** machines under `.ops` domain:

```
$ dig +short proxy.ops
192.168.56.103
```

52 changes: 28 additions & 24 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,30 +40,32 @@ func nixopsHostIp(hostname string) (net.IP, error) {
return net.ParseIP(ip), nil
}

func handleRequest(w dns.ResponseWriter, r *dns.Msg) {
q := r.Question[0]

log.Printf("Question: Type=%s Class=%s Name=%s\n", dns.TypeToString[q.Qtype], dns.ClassToString[q.Qclass], q.Name)

if q.Qtype != dns.TypeA || q.Qclass != dns.ClassINET {
handleNotFound(w, r)
return
}

ip, err := nixopsHostIp(strings.TrimSuffix(q.Name, "."))
if err != nil {
log.Println(err)
handleNotFound(w, r)
return
func domainHandler(domain string) func(dns.ResponseWriter, *dns.Msg) {
return func(w dns.ResponseWriter, r *dns.Msg) {
q := r.Question[0]

log.Printf("Question: Type=%s Class=%s Name=%s\n", dns.TypeToString[q.Qtype], dns.ClassToString[q.Qclass], q.Name)

if q.Qtype != dns.TypeA || q.Qclass != dns.ClassINET {
handleNotFound(w, r)
return
}

ip, err := nixopsHostIp(strings.TrimSuffix(q.Name, fmt.Sprintf("%s.", domain)))
if err != nil {
log.Println(err)
handleNotFound(w, r)
return
}

m := new(dns.Msg)
m.SetReply(r)
a := new(dns.A)
a.Hdr = dns.RR_Header{Name: q.Name, Rrtype: dns.TypeA, Class: dns.ClassINET, Ttl: 30}
a.A = ip
m.Answer = []dns.RR{a}
w.WriteMsg(m)
}

m := new(dns.Msg)
m.SetReply(r)
a := new(dns.A)
a.Hdr = dns.RR_Header{Name: q.Name, Rrtype: dns.TypeA, Class: dns.ClassINET, Ttl: 30}
a.A = ip
m.Answer = []dns.RR{a}
w.WriteMsg(m)
}

func handleNotFound(w dns.ResponseWriter, r *dns.Msg) {
Expand All @@ -75,14 +77,16 @@ func handleNotFound(w dns.ResponseWriter, r *dns.Msg) {

func main() {
var addr = flag.String("addr", "127.0.0.1:5300", "listen address")
var domain = flag.String("domain", "",
"fake domain name to strip from requests e.g. host.ops -> host if -domain=.ops")

flag.Parse()

nixopsStateDb = openNixopsStateDb()
defer nixopsStateDb.Close()

server := &dns.Server{Addr: *addr, Net: "udp"}
server.Handler = dns.HandlerFunc(handleRequest)
server.Handler = dns.HandlerFunc(domainHandler(*domain))

log.Printf("Listening on %s\n", *addr)
log.Fatal(server.ListenAndServe())
Expand Down

0 comments on commit f6c3f79

Please sign in to comment.