This commit is contained in:
Miek Gieben 2012-08-05 11:17:42 +02:00
parent 6259185838
commit 1ea0746ff8
7 changed files with 86 additions and 0 deletions

86
ex/fks-shield/shield.go Normal file
View File

@ -0,0 +1,86 @@
/*
* Funkensturm, a versatile DNS proxy
* Miek Gieben <miek@miek.nl> (c) 2011
* GPLv2
*/
package main
import (
"dns"
"flag"
"log"
"os/signal"
"strings"
)
func doFunkenSturm(pkt *dns.Msg) (ret []byte) {
// No matter what, we refuse to answer requests with the response bit set.
if pkt.MsgHdr.Response == true {
return nil
}
// Loop through the Funks and decide what to do with the packet.
for _, f := range f.Funk {
if m, ok := f.Match(pkt); ok {
ret = f.Action(m)
return
}
}
if f.Default == nil {
println("No f.Default set!")
return
}
ret = f.Default(pkt)
return
}
func serve(w dns.ResponseWriter, req *dns.Msg) {
if out := doFunkenSturm(req); out != nil {
w.Write(out)
}
}
func listenAndServe(add, net string) {
if err := dns.ListenAndServe(add, net, nil); err != nil {
log.Printf("fks-shield: failed to setup:", net, add)
}
}
func main() {
listen := flag.String("listen", "127.0.0.1:8053", "set the listener address")
server := flag.String("server", "127.0.0.1:53", "remote server address(es), seperate with commas")
verbose = flag.Bool("verbose", false, "Print packet as it flows through")
flag.Usage = func() {
flag.PrintDefaults()
}
flag.Parse()
clients := strings.Split(*server, ",")
qr = make([]*FunkClient, len(clients))
for i, ra := range clients {
qr[i] = new(FunkClient)
qr[i].Client = dns.NewClient()
qr[i].Addr = ra
}
f = NewFunkenSturm()
ok := f.Setup()
if !ok {
println("Setup failed")
return
}
dns.HandleFunc(".", serve)
go listenAndServe(*listen, "tcp")
go listenAndServe(*listen, "udp")
forever:
for {
select {
case <-signal.Incoming:
println("Signal received, stopping")
break forever
}
}
}