90 lines
1.9 KiB
Go
90 lines
1.9 KiB
Go
|
// inspired from:
|
||
|
// https://github.com/mactsouk/opensource.com.git
|
||
|
// and
|
||
|
// https://coderwall.com/p/wohavg/creating-a-simple-tcp-server-in-go
|
||
|
|
||
|
package dnssecsocket
|
||
|
|
||
|
// import "fmt"
|
||
|
// import "os"
|
||
|
|
||
|
import "bufio"
|
||
|
import "math/rand"
|
||
|
import "net"
|
||
|
import "strconv"
|
||
|
import "strings"
|
||
|
// import "time"
|
||
|
import "log"
|
||
|
|
||
|
// will try to get this hosts FQDN
|
||
|
// import "github.com/Showmax/go-fqdn"
|
||
|
|
||
|
import "github.com/miekg/dns"
|
||
|
|
||
|
// import "github.com/davecgh/go-spew/spew"
|
||
|
|
||
|
const MIN = 1
|
||
|
const MAX = 100
|
||
|
|
||
|
func random() int {
|
||
|
return rand.Intn(MAX-MIN) + MIN
|
||
|
}
|
||
|
|
||
|
func GetRemoteAddr(c net.Conn) string {
|
||
|
clientAddr := c.RemoteAddr().String()
|
||
|
parts := strings.Split(clientAddr, "]")
|
||
|
ipv6 := parts[0]
|
||
|
return ipv6[1:]
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Handle each connection
|
||
|
// Each client must send it's hostname as the first line
|
||
|
// Then each hostname is verified with DNSSEC
|
||
|
//
|
||
|
func HandleConnection(c net.Conn) {
|
||
|
ipv6client := GetRemoteAddr(c)
|
||
|
log.Println("Serving to %s as the IPv6 client", ipv6client)
|
||
|
|
||
|
log.Println("Waiting for the client to tell me its name")
|
||
|
netData, err := bufio.NewReader(c).ReadString('\n')
|
||
|
if err != nil {
|
||
|
log.Println(err)
|
||
|
return
|
||
|
}
|
||
|
clientHostname := strings.TrimSpace(netData)
|
||
|
log.Println("Recieved client hostname as:", clientHostname)
|
||
|
|
||
|
dnsRR := Dnstrace(clientHostname, "AAAA")
|
||
|
ipaddr := dns.Field(dnsRR, 1)
|
||
|
log.Println("Client claims to be: ", ipaddr)
|
||
|
log.Println("Serving to IPv6 client:", ipv6client)
|
||
|
if (ipaddr != ipv6client) {
|
||
|
log.Println()
|
||
|
log.Println("DNSSEC ERROR: client IPv6 does not work")
|
||
|
log.Println("DNSSEC ERROR: client IPv6 does not work")
|
||
|
log.Println("DNSSEC ERROR: client IPv6 does not work")
|
||
|
log.Println()
|
||
|
c.Close()
|
||
|
return
|
||
|
}
|
||
|
|
||
|
for {
|
||
|
netData, err := bufio.NewReader(c).ReadString('\n')
|
||
|
if err != nil {
|
||
|
log.Println(err)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
temp := strings.TrimSpace(string(netData))
|
||
|
if temp == "STOP" {
|
||
|
break
|
||
|
}
|
||
|
log.Println("Recieved: ", temp)
|
||
|
|
||
|
result := strconv.Itoa(random()) + "\n"
|
||
|
c.Write([]byte(string(result)))
|
||
|
}
|
||
|
c.Close()
|
||
|
}
|