PTR Fix + IPv6 Fix

This commit is contained in:
jbergner
2025-01-14 08:12:13 +01:00
parent 6c30aa2274
commit 025466f9d8
2 changed files with 50 additions and 3 deletions

View File

@@ -2,7 +2,7 @@
"friedhof8.hilden.de.": {
"dns": "friedhof8.hilden.de",
"ipv4": "1.1.1.2",
"ipv6": "",
"ipv6": "2001::5b:41",
"user": "friedhof",
"token": "ef797c8118f02dfb649607dd5d3f8c7623048c9c063d532cc95c5ed7a898a64f",
"lastseen": "2025-01-14 06:53:45.7690632 +0100 CET m=+27.298316601"

51
main.go
View File

@@ -6,6 +6,7 @@ import (
"encoding/json"
"fmt"
"log"
"net"
"net/http"
"os"
"os/signal"
@@ -79,6 +80,41 @@ func VerifyToken(token, storedHash string) bool {
return HashToken(token) == storedHash
}
func reverseString(s string) string {
// Konvertiere den String in eine Rune-Slice, um Unicode-Zeichen zu unterstützen
runes := []rune(s)
n := len(runes)
// Tausche die Elemente, um den String umzudrehen
for i := 0; i < n/2; i++ {
runes[i], runes[n-1-i] = runes[n-1-i], runes[i]
}
// Konvertiere die Rune-Slice zurück in einen String
return string(runes)
}
func IPv6ToPTR(ipv6 string) (string, error) {
// Parse the IPv6 address to validate it
parsedIP := net.ParseIP(ipv6)
if parsedIP == nil || parsedIP.To16() == nil || parsedIP.To4() != nil {
return "", fmt.Errorf("invalid IPv6 address: %s", ipv6)
}
// Expand the IPv6 address to its full form
expanded := parsedIP.To16()
// Convert to a reversed nibble format for PTR
var nibbles []string
for i := len(expanded) - 1; i >= 0; i-- {
hexByte := fmt.Sprintf("%02x", expanded[i])
// Add the nibbles in reverse order
nibbles = append(nibbles, string(hexByte[1]), string(hexByte[0]))
}
// Join the nibbles with dots and append the reverse domain
reversed := strings.Join(nibbles, ".")
return reversed + ".ip6.arpa.", nil
}
func handler(w http.ResponseWriter, r *http.Request) {
Dns := r.URL.Query().Get("DDNS")
Ip := r.URL.Query().Get("IP")
@@ -174,8 +210,19 @@ func handleDNSRequest(w dns.ResponseWriter, r *dns.Msg) {
}
case dns.TypePTR:
for a, b := range D {
fmt.Println(b.Ipv4, q.Name)
if b.Ipv4 == q.Name {
iptocheck := reverseString(b.Ipv4)
fmt.Println(iptocheck, q.Name)
if iptocheck+".in-addr.arpa." == q.Name {
rr, err := dns.NewRR(q.Name + " PTR " + a)
if err == nil {
msg.Answer = append(msg.Answer, rr)
}
}
ip6tocheck, _ := IPv6ToPTR(b.Ipv6)
fmt.Println(ip6tocheck, q.Name)
if ip6tocheck == q.Name {
rr, err := dns.NewRR(q.Name + " PTR " + a)
if err == nil {
msg.Answer = append(msg.Answer, rr)