fix(client): add forward ip support in PTR query-name (#1261)
* feat(client): add forward ip support in PTR query-name * fix(identation): spaces back to tabs * Update client/client.go * Update client/client.go --------- Co-authored-by: Denis Evers <git@evers.sh> Co-authored-by: TwiN <twin@linux.com>
This commit is contained in:
@@ -5,6 +5,7 @@ import (
|
|||||||
"crypto/tls"
|
"crypto/tls"
|
||||||
"crypto/x509"
|
"crypto/x509"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"encoding/hex"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
@@ -410,6 +411,17 @@ func QueryDNS(queryType, queryName, url string) (connected bool, dnsRcode string
|
|||||||
url = fmt.Sprintf("%s:%d", url, dnsPort)
|
url = fmt.Sprintf("%s:%d", url, dnsPort)
|
||||||
}
|
}
|
||||||
queryTypeAsUint16 := dns.StringToType[queryType]
|
queryTypeAsUint16 := dns.StringToType[queryType]
|
||||||
|
// Special handling: if this is a PTR query and queryName looks like a plain IP,
|
||||||
|
// convert it to the proper reverse lookup domain automatically.
|
||||||
|
if queryTypeAsUint16 == dns.TypePTR &&
|
||||||
|
!strings.HasSuffix(queryName, ".in-addr.arpa.") &&
|
||||||
|
!strings.HasSuffix(queryName, ".ip6.arpa.") {
|
||||||
|
if rev, convErr := reverseNameForIP(queryName); convErr == nil {
|
||||||
|
queryName = rev
|
||||||
|
} else {
|
||||||
|
return false, "", nil, convErr
|
||||||
|
}
|
||||||
|
}
|
||||||
c := new(dns.Client)
|
c := new(dns.Client)
|
||||||
m := new(dns.Msg)
|
m := new(dns.Msg)
|
||||||
m.SetQuestion(queryName, queryTypeAsUint16)
|
m.SetQuestion(queryName, queryTypeAsUint16)
|
||||||
@@ -481,3 +493,27 @@ func rdapQuery(hostname string) (*whois.Response, error) {
|
|||||||
}
|
}
|
||||||
return &response, nil
|
return &response, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// helper to reverse IP and add in-addr.arpa. IPv4 and IPv6
|
||||||
|
func reverseNameForIP(ipStr string) (string, error) {
|
||||||
|
ip := net.ParseIP(ipStr)
|
||||||
|
if ip == nil {
|
||||||
|
return "", fmt.Errorf("invalid IP: %s", ipStr)
|
||||||
|
}
|
||||||
|
|
||||||
|
if ipv4 := ip.To4(); ipv4 != nil {
|
||||||
|
parts := strings.Split(ipv4.String(), ".")
|
||||||
|
for i, j := 0, len(parts)-1; i < j; i, j = i+1, j-1 {
|
||||||
|
parts[i], parts[j] = parts[j], parts[i]
|
||||||
|
}
|
||||||
|
return strings.Join(parts, ".") + ".in-addr.arpa.", nil
|
||||||
|
}
|
||||||
|
|
||||||
|
ip = ip.To16()
|
||||||
|
hexStr := hex.EncodeToString(ip)
|
||||||
|
nibbles := strings.Split(hexStr, "")
|
||||||
|
for i, j := 0, len(nibbles)-1; i < j; i, j = i+1, j-1 {
|
||||||
|
nibbles[i], nibbles[j] = nibbles[j], nibbles[i]
|
||||||
|
}
|
||||||
|
return strings.Join(nibbles, ".") + ".ip6.arpa.", nil
|
||||||
|
}
|
||||||
@@ -451,6 +451,16 @@ func TestQueryDNS(t *testing.T) {
|
|||||||
expectedDNSCode: "NOERROR",
|
expectedDNSCode: "NOERROR",
|
||||||
expectedBody: "dns.google.",
|
expectedBody: "dns.google.",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "test Config with type PTR and forward IP / no in-addr",
|
||||||
|
inputDNS: dns.Config{
|
||||||
|
QueryType: "PTR",
|
||||||
|
QueryName: "1.0.0.1",
|
||||||
|
},
|
||||||
|
inputURL: "1.1.1.1",
|
||||||
|
expectedDNSCode: "NOERROR",
|
||||||
|
expectedBody: "one.one.one.one.",
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: "test Config with fake type and retrieve error",
|
name: "test Config with fake type and retrieve error",
|
||||||
inputDNS: dns.Config{
|
inputDNS: dns.Config{
|
||||||
|
|||||||
Reference in New Issue
Block a user