Cleanups and allow for multple resovers -- needs testing
This commit is contained in:
parent
8a5a288006
commit
986a0d7b78
|
@ -29,8 +29,8 @@ func match(m *dns.Msg, d int) (*dns.Msg, bool) {
|
|||
func send(m *dns.Msg, ok bool) *dns.Msg {
|
||||
switch ok {
|
||||
case true, false:
|
||||
qr <- resolver.Msg{m, nil, nil}
|
||||
in := <-qr
|
||||
qr[0] <- resolver.Msg{m, nil, nil}
|
||||
in := <-qr[0]
|
||||
return in.Dns
|
||||
}
|
||||
return nil
|
||||
|
|
|
@ -58,13 +58,13 @@ func delay(m *dns.Msg, ok bool) *dns.Msg {
|
|||
return nil
|
||||
} else {
|
||||
fmt.Fprintf(os.Stderr, "Info: Ok: let it through\n")
|
||||
qr <- resolver.Msg{m, nil, nil}
|
||||
in := <-qr
|
||||
qr[0] <- resolver.Msg{m, nil, nil}
|
||||
in := <-qr[0]
|
||||
return in.Dns
|
||||
}
|
||||
case false:
|
||||
qr <- resolver.Msg{m, nil, nil}
|
||||
in := <-qr
|
||||
qr[0] <- resolver.Msg{m, nil, nil}
|
||||
in := <-qr[0]
|
||||
return in.Dns
|
||||
}
|
||||
return nil
|
||||
|
|
|
@ -29,8 +29,8 @@ func match(m *dns.Msg, d int) (*dns.Msg, bool) {
|
|||
func send(m *dns.Msg, ok bool) *dns.Msg {
|
||||
switch ok {
|
||||
case true, false:
|
||||
qr <- resolver.Msg{m, nil, nil}
|
||||
in := <-qr
|
||||
qr[0] <- resolver.Msg{m, nil, nil}
|
||||
in := <-qr[0]
|
||||
return in.Dns
|
||||
}
|
||||
return nil
|
||||
|
|
|
@ -62,8 +62,8 @@ func match(m *dns.Msg, d int) (*dns.Msg, bool) {
|
|||
func send(m *dns.Msg, ok bool) *dns.Msg {
|
||||
switch ok {
|
||||
case true, false:
|
||||
qr <- resolver.Msg{m, nil, nil}
|
||||
in := <-qr
|
||||
qr[0] <- resolver.Msg{m, nil, nil}
|
||||
in := <-qr[0]
|
||||
return in.Dns
|
||||
}
|
||||
return nil
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Funkensturm
|
||||
* Funkensturm, a versatile DNS proxy
|
||||
* Miek Gieben <miek@miek.nl> (c) 2011
|
||||
* GPLv2
|
||||
*/
|
||||
|
@ -15,17 +15,21 @@ import (
|
|||
"dns/resolver"
|
||||
"dns/responder"
|
||||
"os/signal"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// Setup a responder takes takes care of the incoming queries.
|
||||
type server responder.Server
|
||||
|
||||
// Setup a initial resolver for sending the queries somewhere else.
|
||||
var qr chan resolver.Msg
|
||||
var qr []chan resolver.Msg
|
||||
|
||||
// The configuration of Funkensturm
|
||||
var f *Funkensturm
|
||||
|
||||
// Verbose flag
|
||||
var verbose *bool
|
||||
|
||||
// Where does the packet come from?
|
||||
// IN: initial packet received by the Responder
|
||||
// any modifications here will reflect what kind of
|
||||
|
@ -175,37 +179,49 @@ func (s *server) ResponderTCP(c *net.TCPConn, i []byte) {
|
|||
// nothing is send back
|
||||
}
|
||||
|
||||
var verbose *bool
|
||||
// split 127.0.0.1:53 into components
|
||||
// TODO IPv6
|
||||
func splitAddrPort(s string) (a, p string) {
|
||||
items := strings.Split(s, ":", 2)
|
||||
a = items[0]
|
||||
p = items[1]
|
||||
return
|
||||
}
|
||||
|
||||
func main() {
|
||||
var sserver *string = flag.String("sserver", "127.0.0.1", "Set the listener address")
|
||||
var sport *string = flag.String("sport", "8053", "Set the listener port")
|
||||
var rserver *string = flag.String("rserver", "127.0.0.1", "Remote server address")
|
||||
// multiple rservers??
|
||||
var rport *string = flag.String("rpost", "53", "Remote server port to forward queries to")
|
||||
verbose = flag.Bool("verbose", false, "Print packet as the flow through") // needs to be global
|
||||
var sserver *string = flag.String("sserver", "127.0.0.1:8053", "Set the listener address")
|
||||
var rserver *string = flag.String("rserver", "127.0.0.1:53", "Remote server address(es)")
|
||||
verbose = flag.Bool("verbose", false, "Print packet as they flow through") // verbose needs to be global
|
||||
flag.Usage = func() {
|
||||
fmt.Fprintf(os.Stderr, "Usage: %s\n", os.Args[0])
|
||||
flag.PrintDefaults()
|
||||
}
|
||||
flag.Parse()
|
||||
|
||||
resolvers := strings.Split(*rserver, ",", -1)
|
||||
qr = make([]chan resolver.Msg, len(resolvers))
|
||||
for i, ra := range resolvers {
|
||||
addr, port := splitAddrPort(ra)
|
||||
// TODO error checking
|
||||
// The resolver(s)
|
||||
r := new(resolver.Resolver)
|
||||
r.Servers = []string{addr}
|
||||
r.Port = port
|
||||
qr[i] = r.NewQuerier() // connect to global qr
|
||||
}
|
||||
|
||||
f = funkensturm()
|
||||
ok := f.Setup()
|
||||
if !ok {
|
||||
fmt.Fprintf(os.Stderr, "Setup failed")
|
||||
return
|
||||
}
|
||||
// The resolver
|
||||
r := new(resolver.Resolver)
|
||||
r.Servers = []string{*rserver}
|
||||
r.Port = *rport
|
||||
qr = r.NewQuerier() // connect to global qr
|
||||
|
||||
// The responder
|
||||
addr, port := splitAddrPort(*sserver)
|
||||
s := new(responder.Server)
|
||||
s.Address = *sserver
|
||||
s.Port = *sport
|
||||
s.Address = addr
|
||||
s.Port = port
|
||||
var srv *server
|
||||
rs := make(chan bool)
|
||||
go s.NewResponder(srv, rs)
|
||||
|
@ -219,8 +235,11 @@ forever:
|
|||
break forever
|
||||
}
|
||||
}
|
||||
rs <- true // shutdown responder and resolver
|
||||
qr <- resolver.Msg{}
|
||||
rs <- true // shutdown responder
|
||||
<-rs // wait for confirmation
|
||||
<-qr
|
||||
// And the resolvers
|
||||
for _, q := range qr {
|
||||
q <- resolver.Msg{}
|
||||
<-q
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue