Kill xfrprxy for now
This commit is contained in:
parent
4baa1df115
commit
5777e140c0
|
@ -3,10 +3,8 @@ chaos \
|
||||||
key2ds \
|
key2ds \
|
||||||
axfr \
|
axfr \
|
||||||
reflect \
|
reflect \
|
||||||
q
|
q \
|
||||||
# these need to be fixed
|
funkensturm
|
||||||
#xfrprx \
|
|
||||||
#funkensturm
|
|
||||||
|
|
||||||
all:
|
all:
|
||||||
for i in $(EXAMPLES); do gomake -C $$i; done
|
for i in $(EXAMPLES); do gomake -C $$i; done
|
||||||
|
|
|
@ -1,9 +0,0 @@
|
||||||
# Copyright 2009 The Go Authors. All rights reserved.
|
|
||||||
# Use of this source code is governed by a BSD-style
|
|
||||||
# license that can be found in the LICENSE file.
|
|
||||||
include $(GOROOT)/src/Make.inc
|
|
||||||
TARG=xfrprx
|
|
||||||
GOFILES=xfrprx.go\
|
|
||||||
xfr.go
|
|
||||||
DEPS=../../
|
|
||||||
include $(GOROOT)/src/Make.cmd
|
|
|
@ -1,101 +0,0 @@
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"os"
|
|
||||||
"dns"
|
|
||||||
"fmt"
|
|
||||||
)
|
|
||||||
|
|
||||||
func handleXfrOut(d *dns.Conn, i *dns.Msg) os.Error {
|
|
||||||
if i.IsAxfr() {
|
|
||||||
fmt.Printf("Incoming Axfr request seen\n")
|
|
||||||
if i.Question[0].Name == Zone.name {
|
|
||||||
fmt.Printf("Matches current zone\n")
|
|
||||||
if !Zone.correct {
|
|
||||||
fmt.Printf("Zone was not deemed correct\n")
|
|
||||||
if err := d.WriteMsg(i); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
} else {
|
|
||||||
fmt.Printf("Zone was correct\n")
|
|
||||||
}
|
|
||||||
|
|
||||||
m := make(chan *dns.Xfr)
|
|
||||||
e := make(chan os.Error)
|
|
||||||
go d.XfrWrite(i, m, e)
|
|
||||||
for j := 0; j < Zone.size; j++ {
|
|
||||||
select {
|
|
||||||
case m <- &dns.Xfr{Add: true, RR: Zone.rrs[j]}: //
|
|
||||||
case err := <-e:
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
close(m)
|
|
||||||
} else {
|
|
||||||
fmt.Printf("No matching zone found\n")
|
|
||||||
if err := d.WriteMsg(i); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func handleNotify(d *dns.Conn, i *dns.Msg) os.Error {
|
|
||||||
if i.IsNotify() {
|
|
||||||
fmt.Printf("Incoming notify seen\n")
|
|
||||||
q := new(dns.Msg)
|
|
||||||
q.SetReply(i)
|
|
||||||
err := d.WriteMsg(q)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
err = handleXfrIn(i)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func handleXfrIn(i *dns.Msg) os.Error {
|
|
||||||
q := new(dns.Msg)
|
|
||||||
q.SetAxfr(i.Question[0].Name)
|
|
||||||
|
|
||||||
m := make(chan *dns.Xfr)
|
|
||||||
fmt.Printf("Preparing Xfr for %s\n", i.Question[0].Name)
|
|
||||||
|
|
||||||
d := new(dns.Conn)
|
|
||||||
d.RemoteAddr = "127.0.0.1:53"
|
|
||||||
err := d.Dial("tcp")
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
defer d.Close()
|
|
||||||
|
|
||||||
fmt.Printf("Calling 127.0.0.1 successful\n")
|
|
||||||
go d.XfrRead(q, m)
|
|
||||||
|
|
||||||
Zone.name = i.Question[0].Name
|
|
||||||
j := 0
|
|
||||||
for x := range m {
|
|
||||||
Zone.rrs[j] = x.RR
|
|
||||||
j++
|
|
||||||
}
|
|
||||||
fmt.Printf("Success retrieved %s\n", Zone.name)
|
|
||||||
Zone.size = j
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func handleNotifyOut(addr string) {
|
|
||||||
if Zone.name == "" || !Zone.correct {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
d := new(dns.Conn)
|
|
||||||
d.RemoteAddr = addr
|
|
||||||
m := new(dns.Msg)
|
|
||||||
m.SetNotify(Zone.name)
|
|
||||||
fmt.Printf("Sending notifies: zone is ok\n")
|
|
||||||
dns.QueryRequest <- &dns.Query{Conn: d, Query: m}
|
|
||||||
}
|
|
|
@ -1,98 +0,0 @@
|
||||||
package main
|
|
||||||
|
|
||||||
// Xfrprx is a proxy that intercepts notify messages
|
|
||||||
// and then performs a ixfr/axfr to get the new
|
|
||||||
// zone contents.
|
|
||||||
// This zone is then checked cryptographically is
|
|
||||||
// everything is correct.
|
|
||||||
// When the message is deemed correct a remote
|
|
||||||
// server is sent a notify to retrieve the ixfr/axfr.
|
|
||||||
// If a new DNSKEY record is seen for the apex and
|
|
||||||
// it validates it writes this record to disk and
|
|
||||||
// this new key will be used in future validations.
|
|
||||||
|
|
||||||
import (
|
|
||||||
"os"
|
|
||||||
"os/signal"
|
|
||||||
"fmt"
|
|
||||||
"dns"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Static amount of RRs...
|
|
||||||
type zone struct {
|
|
||||||
name string
|
|
||||||
rrs [10000]dns.RR
|
|
||||||
size int
|
|
||||||
correct bool
|
|
||||||
}
|
|
||||||
|
|
||||||
var Zone zone
|
|
||||||
|
|
||||||
func handle(d *dns.Conn, i *dns.Msg) {
|
|
||||||
if i.MsgHdr.Response == true {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if err := handleNotify(d, i); err != nil {
|
|
||||||
fmt.Printf("err %v\n", err)
|
|
||||||
}
|
|
||||||
// handleNotifyOut("127.0.0.1:53") //
|
|
||||||
if err := handleXfrOut(d, i); err != nil {
|
|
||||||
fmt.Printf("err %v\n", err)
|
|
||||||
}
|
|
||||||
if Zone.name != "" {
|
|
||||||
// We have transfered a zone and can check it. For now assume ok.
|
|
||||||
Zone.correct = false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func listen(tcp string, addr string, e chan os.Error) {
|
|
||||||
switch tcp {
|
|
||||||
case "tcp":
|
|
||||||
err := dns.ListenAndServeTCP(addr, handle)
|
|
||||||
e <- err
|
|
||||||
case "udp":
|
|
||||||
err := dns.ListenAndServeUDP(addr, handle)
|
|
||||||
e <- err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func query(tcp string, e chan os.Error) {
|
|
||||||
switch tcp {
|
|
||||||
case "tcp":
|
|
||||||
err := dns.QueryAndServeTCP(dns.HandleQuery)
|
|
||||||
e <- err
|
|
||||||
case "udp":
|
|
||||||
err := dns.QueryAndServeUDP(dns.HandleQuery)
|
|
||||||
e <- err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
err := make(chan os.Error)
|
|
||||||
|
|
||||||
// Outgoing queries
|
|
||||||
dns.InitQueryChannels()
|
|
||||||
go query("tcp", err)
|
|
||||||
go query("udp", err)
|
|
||||||
|
|
||||||
// Incoming queries
|
|
||||||
go listen("tcp", "127.0.0.1:8053", err)
|
|
||||||
go listen("tcp", "[::1]:8053", err)
|
|
||||||
go listen("udp", "127.0.0.1:8053", err)
|
|
||||||
go listen("udp", "[::1]:8053", err)
|
|
||||||
|
|
||||||
forever:
|
|
||||||
for {
|
|
||||||
select {
|
|
||||||
case e := <-err:
|
|
||||||
fmt.Printf("Error received, stopping: %s\n", e.String())
|
|
||||||
break forever
|
|
||||||
case <-signal.Incoming:
|
|
||||||
fmt.Printf("Signal received, stopping\n")
|
|
||||||
break forever
|
|
||||||
case q := <-dns.QueryReply:
|
|
||||||
fmt.Printf("Query received:\n%v\n", q.Reply)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
close(err)
|
|
||||||
}
|
|
Loading…
Reference in New Issue