2024-08-24 01:16:10 +03:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
2024-08-25 01:43:44 +03:00
|
|
|
"context"
|
2024-08-24 01:16:10 +03:00
|
|
|
"fmt"
|
|
|
|
"log"
|
2024-08-24 21:26:49 +03:00
|
|
|
"os"
|
|
|
|
"os/signal"
|
|
|
|
"syscall"
|
2024-08-25 01:43:44 +03:00
|
|
|
|
|
|
|
dnsProxy "kvas2-go/dns-proxy"
|
|
|
|
iptablesHelper "kvas2-go/iptables-helper"
|
|
|
|
ruleComposer "kvas2-go/rule-composer"
|
2024-08-24 01:16:10 +03:00
|
|
|
)
|
|
|
|
|
|
|
|
var (
|
2024-08-25 01:43:44 +03:00
|
|
|
ChainPostfix = "KVAS2"
|
2024-08-24 17:46:34 +03:00
|
|
|
ListenPort = uint16(7548)
|
2024-08-25 01:43:44 +03:00
|
|
|
TargetDNSServerAddress = "127.0.0.1:53"
|
2024-08-24 01:16:10 +03:00
|
|
|
)
|
|
|
|
|
|
|
|
func main() {
|
2024-08-24 19:47:10 +03:00
|
|
|
records := ruleComposer.NewRecords()
|
2024-08-25 01:43:44 +03:00
|
|
|
proxy := dnsProxy.New(ListenPort, TargetDNSServerAddress)
|
|
|
|
dnsOverrider, err := iptablesHelper.NewDNSOverrider(fmt.Sprintf("%s_DNSOVERRIDER", ChainPostfix), ListenPort)
|
|
|
|
if err != nil {
|
|
|
|
log.Fatalf("failed to initialize DNS overrider: %v", err)
|
|
|
|
}
|
|
|
|
|
2024-08-24 17:46:34 +03:00
|
|
|
proxy.MsgHandler = func(msg *dnsProxy.Message) {
|
2024-08-25 01:43:44 +03:00
|
|
|
printKnownRecords := func() {
|
|
|
|
for _, q := range msg.QD {
|
|
|
|
fmt.Printf("%04x: DBG Known addresses for: %s\n", msg.ID, q.QName.String())
|
|
|
|
for idx, addr := range records.GetARecords(q.QName.String(), true) {
|
|
|
|
fmt.Printf("%04x: #%d: %s\n", msg.ID, idx, addr.String())
|
|
|
|
}
|
2024-08-25 00:18:15 +03:00
|
|
|
}
|
2024-08-24 01:16:10 +03:00
|
|
|
}
|
2024-08-25 01:43:44 +03:00
|
|
|
parseResponseRecord := func(rr dnsProxy.ResourceRecord) {
|
|
|
|
switch v := rr.(type) {
|
2024-08-24 17:46:34 +03:00
|
|
|
case dnsProxy.Address:
|
2024-08-25 01:43:44 +03:00
|
|
|
fmt.Printf("%04x: -> A: Name: %s; Address: %s; TTL: %d\n", msg.ID, v.Name, v.Address.String(), v.TTL)
|
2024-08-25 00:18:15 +03:00
|
|
|
records.PutARecord(v.Name.String(), v.Address, int64(v.TTL))
|
2024-08-24 17:46:34 +03:00
|
|
|
case dnsProxy.CName:
|
2024-08-25 01:43:44 +03:00
|
|
|
fmt.Printf("%04x: -> CNAME: Name: %s; CName: %s\n", msg.ID, v.Name, v.CName)
|
2024-08-25 00:18:15 +03:00
|
|
|
records.PutCNameRecord(v.Name.String(), v.CName.String(), int64(v.TTL))
|
2024-08-24 17:46:34 +03:00
|
|
|
default:
|
2024-08-25 01:43:44 +03:00
|
|
|
fmt.Printf("%04x: -> Unknown: %x\n", msg.ID, v.EncodeResource())
|
2024-08-24 17:46:34 +03:00
|
|
|
}
|
2024-08-24 01:16:10 +03:00
|
|
|
}
|
2024-08-25 01:43:44 +03:00
|
|
|
|
|
|
|
printKnownRecords()
|
|
|
|
for _, q := range msg.QD {
|
|
|
|
fmt.Printf("%04x: <- Request name: %s\n", msg.ID, q.QName.String())
|
|
|
|
}
|
|
|
|
for _, a := range msg.AN {
|
|
|
|
parseResponseRecord(a)
|
|
|
|
}
|
2024-08-24 17:46:34 +03:00
|
|
|
for _, a := range msg.NS {
|
2024-08-25 01:43:44 +03:00
|
|
|
parseResponseRecord(a)
|
2024-08-24 01:16:10 +03:00
|
|
|
}
|
2024-08-24 17:46:34 +03:00
|
|
|
for _, a := range msg.AR {
|
2024-08-25 01:43:44 +03:00
|
|
|
parseResponseRecord(a)
|
2024-08-24 19:47:10 +03:00
|
|
|
}
|
2024-08-25 01:43:44 +03:00
|
|
|
printKnownRecords()
|
2024-08-24 01:16:10 +03:00
|
|
|
}
|
2024-08-24 21:26:49 +03:00
|
|
|
|
2024-08-25 01:43:44 +03:00
|
|
|
ctx, cancel := context.WithCancel(context.Background())
|
|
|
|
|
2024-08-24 21:26:49 +03:00
|
|
|
go func() {
|
2024-08-25 01:43:44 +03:00
|
|
|
err := proxy.Listen(ctx)
|
2024-08-24 21:26:49 +03:00
|
|
|
if err != nil {
|
|
|
|
log.Fatal(err)
|
|
|
|
}
|
|
|
|
}()
|
|
|
|
|
2024-08-25 01:43:44 +03:00
|
|
|
err = dnsOverrider.Enable()
|
|
|
|
if err != nil {
|
|
|
|
log.Fatalf("failed to override DNS: %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
fmt.Printf("Started service on port '%d'\n", ListenPort)
|
|
|
|
|
2024-08-24 21:26:49 +03:00
|
|
|
c := make(chan os.Signal, 1)
|
|
|
|
signal.Notify(c, os.Interrupt, syscall.SIGTERM)
|
|
|
|
|
|
|
|
for {
|
|
|
|
select {
|
|
|
|
case <-c:
|
2024-08-25 01:43:44 +03:00
|
|
|
fmt.Printf("Graceful shutdown...")
|
|
|
|
cancel()
|
|
|
|
err = dnsOverrider.Disable()
|
|
|
|
if err != nil {
|
|
|
|
log.Fatalf("failed to rollback override DNS changes: %v", err)
|
|
|
|
}
|
2024-08-24 21:26:49 +03:00
|
|
|
return
|
|
|
|
}
|
2024-08-24 01:16:10 +03:00
|
|
|
}
|
|
|
|
}
|