75 lines
1.9 KiB
Go
75 lines
1.9 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
dnsProxy "kvas2-go/dns-proxy"
|
|
ruleComposer "kvas2-go/rule-composer"
|
|
"log"
|
|
"os"
|
|
"os/signal"
|
|
"syscall"
|
|
)
|
|
|
|
var (
|
|
ListenPort = uint16(7548)
|
|
UsableDNSServerAddress = "127.0.0.1"
|
|
UsableDNSServerPort = uint16(53)
|
|
)
|
|
|
|
func main() {
|
|
records := ruleComposer.NewRecords()
|
|
proxy := dnsProxy.New("", ListenPort, UsableDNSServerAddress, UsableDNSServerPort)
|
|
proxy.MsgHandler = func(msg *dnsProxy.Message) {
|
|
for _, q := range msg.QD {
|
|
fmt.Printf("%x: <- Request name: %s\n", msg.ID, q.QName.String())
|
|
fmt.Printf("%x: DBG (Before) Known addresses for: %s\n", msg.ID, q.QName.String())
|
|
for idx, addr := range records.GetARecords(q.QName.String(), true) {
|
|
fmt.Printf("%x: #%d: %s\n", msg.ID, idx, addr.String())
|
|
}
|
|
}
|
|
for _, a := range msg.AN {
|
|
switch v := a.(type) {
|
|
case dnsProxy.Address:
|
|
fmt.Printf("%x: -> A: Name: %s; Address: %s; TTL: %d\n", msg.ID, v.Name, v.Address.String(), v.TTL)
|
|
records.PutARecord(v.Name.String(), v.Address, int64(v.TTL))
|
|
case dnsProxy.CName:
|
|
fmt.Printf("%x: -> CNAME: Name: %s; CName: %s\n", msg.ID, v.Name, v.CName)
|
|
records.PutCNameRecord(v.Name.String(), v.CName.String(), int64(v.TTL))
|
|
default:
|
|
fmt.Printf("%x: -> Unknown: %x\n", msg.ID, v.EncodeResource())
|
|
}
|
|
}
|
|
for _, a := range msg.NS {
|
|
fmt.Printf("%x: -> NS: %x\n", msg.ID, a.EncodeResource())
|
|
}
|
|
for _, a := range msg.AR {
|
|
fmt.Printf("%x: -> NS: %x\n", msg.ID, a.EncodeResource())
|
|
}
|
|
|
|
for _, q := range msg.QD {
|
|
fmt.Printf("%x: DBG (After) Known addresses for: %s\n", msg.ID, q.QName.String())
|
|
for idx, addr := range records.GetARecords(q.QName.String(), true) {
|
|
fmt.Printf("%x: #%d: %s\n", msg.ID, idx, addr.String())
|
|
}
|
|
}
|
|
}
|
|
|
|
go func() {
|
|
err := proxy.Listen()
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
}()
|
|
|
|
c := make(chan os.Signal, 1)
|
|
signal.Notify(c, os.Interrupt, syscall.SIGTERM)
|
|
|
|
for {
|
|
select {
|
|
case <-c:
|
|
proxy.Close()
|
|
return
|
|
}
|
|
}
|
|
}
|