dig returns wrong record type - dns

This seems like I am either missing something obvious, or it would have been asked before. When I query dig using the -t parameter to specify a DNS record type, the result seems to contain an answer even if the record returned is a different record type. Here is an example:
$ dig -t A -q polestar.databaseguy.com.
; <<>> DiG 9.11.3-1ubuntu1.3-Ubuntu <<>> -t A polestar.databaseguy.com.
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 33130
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;polestar.databaseguy.com. IN A
;; ANSWER SECTION:
polestar.databaseguy.com. 3600 IN CNAME databaseguy.ddns.net.
databaseguy.ddns.net. 60 IN A 173.19.127.251
;; Query time: 30 msec
;; SERVER: 10.0.10.1#53(10.0.10.1)
;; WHEN: Mon Dec 10 14:41:50 STD 2018
;; MSG SIZE rcvd: 103
The CNAME and A records listed in the ANSWER SECTION are correct. However, the CNAME is for polestar.databaseguy.com. and the A is for databaseguy.ddns.net.. There is no A record forpolestar.databaseguy.com., which is what I queried for, so I expected there to be no results.
I am pretty confident this is the correct behavior, but I don't understand it and didn't see any explanation in the man dig pages. I also could not find other discussions online, either on this site or elsewhere. Can someone help me understand this?

This is the expected behaviour, that decreases the amount of exchanges needed, and is specific of the CNAME record.
It is covered by the core documents on DNS: RFC1034, section 3.6.2
See this:
CNAME RRs cause special action in DNS software. When a name server
fails to find a desired RR in the resource set associated with the
domain name, it checks to see if the resource set consists of a CNAME
record with a matching class. If so, the name server includes the
CNAME record in the response and restarts the query at the domain name
specified in the data field of the CNAME record. The one exception to
this rule is that queries which match the CNAME type are not
restarted.
With the clear example that completely matches your case:
For example, suppose a name server was processing a query with for
USC-ISIC.ARPA, asking for type A information, and had the following
resource records:
USC-ISIC.ARPA IN CNAME C.ISI.EDU
C.ISI.EDU IN A 10.0.0.52
Both of these RRs would be returned in the response to the type A
query, while a type CNAME or * query should return just the CNAME.
See section 5.2.2 for other points.
Sections 6.2.7 and 6.2.8 also gives examples.
It also depends if you query a recursive or an authoritative nameserver.
databaseguy.com has for nameservers:
pdns01.domaincontrol.com.
pdns02.domaincontrol.com.
If you query one of them:
$ dig A polestar.databaseguy.com. #pdns01.domaincontrol.com.
; <<>> DiG 9.12.0 <<>> A polestar.databaseguy.com. #pdns01.domaincontrol.com.
;; global options: +cmd
;; Sending:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 64115
;; flags: rd ad; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: e45ebc418c94c90a
;; QUESTION SECTION:
;polestar.databaseguy.com. IN A
;; QUERY SIZE: 65
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 64115
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;polestar.databaseguy.com. IN A
;; ANSWER SECTION:
polestar.databaseguy.com. 1h IN CNAME databaseguy.ddns.net.
You get only the CNAME value because this authoritative nameserver knows only that, and is not authoritative for ddns.net.
But if you ask any recursive nameserver it does the job of recursing and giving you the "full" reply:
$ for ns in 1.1.1.1 8.8.8.8 9.9.9.9 80.80.80.80 ; do dig A polestar.databaseguy.com. #$ns +noall +ans ; done
; <<>> DiG 9.12.0 <<>> A polestar.databaseguy.com. #1.1.1.1 +noall +ans
;; global options: +cmd
;; connection timed out; no servers could be reached
; <<>> DiG 9.12.0 <<>> A polestar.databaseguy.com. #8.8.8.8 +noall +ans
;; global options: +cmd
polestar.databaseguy.com. 59m59s IN CNAME databaseguy.ddns.net.
databaseguy.ddns.net. 59s IN A 173.19.127.251
; <<>> DiG 9.12.0 <<>> A polestar.databaseguy.com. #9.9.9.9 +noall +ans
;; global options: +cmd
polestar.databaseguy.com. 1h IN CNAME databaseguy.ddns.net.
databaseguy.ddns.net. 1m IN A 173.19.127.251
; <<>> DiG 9.12.0 <<>> A polestar.databaseguy.com. #80.80.80.80 +noall +ans
;; global options: +cmd
polestar.databaseguy.com. 1h IN CNAME databaseguy.ddns.net.
databaseguy.ddns.net. 1m IN A 173.19.127.251
(1.1.1.1 did not reply to my query but this is irrelevant here for this question)
So about "There is no A record forpolestar.databaseguy.com., which is what I queried for, so I expected there to be no results." this is halfway wrong because that name has a CNAME which means another canonical name and this canonical name has an A record so at the end of the day it is exactly as if the starting name had an A record. Any application locally asking the OS for the IP address of that host will get the A record, as the OS will take care of the full recursive resolution and "dereferencing" the CNAME.

Related

Unable to set TXT record to domain in Freenom provider

I would like to enable SSL for my domain assigned to the wordpress in Azure.
My domain is created in Freenom.
To finish the process I need to manually verify the domain from Azure:
Azure Domain Verification
Then I created TXT record in my domain in Freenom:
Freenom provider settings
But the TXT record is not created:
$ dig nemoz.ml TXT
; <<>> DiG 9.9.4-RedHat-9.9.4-61.el7 <<>> nemoz.ml TXT
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 29489
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 1, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; MBZ: 0005 , udp: 4096
;; QUESTION SECTION:
;nemoz.ml. IN TXT
;; ANSWER SECTION:
nemoz.ml. 5 IN CNAME nemoz.azurewebsites.net.
nemoz.azurewebsites.net. 5 IN CNAME waws-prod-am2-203.sip.azurewebsites.windows.net.
waws-prod-am2-203.sip.azurewebsites.windows.net. 5 IN CNAME waws-prod-am2-203.cloudapp.net.
;; AUTHORITY SECTION:
cloudapp.net. 5 IN SOA prd1.azuredns-cloud.net. msnhst.microsoft.com.cloudapp.net. 2110897293 900 300 604800 60
;; Query time: 299 msec
;; SERVER: 192.168.47.2#53(192.168.47.2)
;; WHEN: Tue Oct 02 16:56:54 EDT 2018
;; MSG SIZE rcvd: 250
And I am not able to verify the domain from Azure. I tried many configurations in Freenom, using networking tools, and searched many web pages. And nothing working.
Can you please help me find the problem?
It works!
I removed CNAMEs from Freenom and now I get TXT record:
$ dig nemoz.ml TXT
; <<>> DiG 9.9.4-RedHat-9.9.4-61.el7 <<>> nemoz.ml TXT
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 26447
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; MBZ: 0005 , udp: 4000
;; QUESTION SECTION:
;nemoz.ml. IN TXT
;; ANSWER SECTION:
nemoz.ml. 5 IN TXT "phkg1hlljofbujbrfvl8pe8l62"
nemoz.ml. 5 IN TXT "nemoz.azurewebsites.net"
;; Query time: 1677 msec
;; SERVER: 192.168.47.2#53(192.168.47.2)
;; WHEN: Wed Oct 03 03:33:42 EDT 2018
;; MSG SIZE rcvd: 112
Also in Azure the domain verification is successful. Thanks a lot.
But the question is why is that? Why CNAME record prevents TXT record in domain?
Make sure you type the correct TXT record format in your domain DNS zone. named # with a valid value ph*********62in Freenom provider. And wait a few minuies for DNS propagation.
Here is an example in Azure DNS.
In Freenom replace 1examplevalue1 with the token ph*********62.
One possible problem can be that you have two TXT records with the same value.
For some reason it causes a conflict and records won't take effect.

No way to get a domain name from IP address based on A record?

dig redhat.com
;; QUESTION SECTION:
;redhat.com. IN A
;; ANSWER SECTION:
redhat.com. 3600 IN A 209.132.183.105
We get the ip address 209.132.183.105----the A record of domain redhat.com.
Now i want to get the domain name from the ip--209.132.183.105.
Maybe you introduce two ways to get it.
nslookup 209.132.183.105
Server: 192.168.1.1
Address: 192.168.1.1#53
Non-authoritative answer:
105.183.132.209.in-addr.arpa name = redirect.redhat.com.
Authoritative answers can be found from:
dig -x 209.132.183.105
; <<>> DiG 9.9.5-9+deb8u7-Debian <<>> -x 209.132.183.105
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 62599
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1280
;; QUESTION SECTION:
;105.183.132.209.in-addr.arpa. IN PTR
;; ANSWER SECTION:
105.183.132.209.in-addr.arpa. 519 IN PTR redirect.redhat.com.
;; Query time: 1 msec
;; SERVER: 192.168.1.1#53(192.168.1.1)
;; WHEN: Sat Nov 19 15:11:33 CST 2016
;; MSG SIZE rcvd: 90
It is unlucky taht the result is not redhat.com and redirect.redhat.com is a PTR record with 209.132.183.105.
Could i draw a conclusion that no way to get a domain name from the IP address in condition of that the ip is A record of domain name?
You are correct in that there is no way to get the info reliably.
Anyone who owns a domain name can point any A, AAAA or CNAME to whatever IP address they like irrespective if they control that IP address.
It gets even more complex in that if you have the reverse delegation set up for your IP address(es) you can set whatever PTR record you like - even stuff that's invalid or none existent.
If you owned the domain rubber-chickens.com there is nothing stopping you creating the following;
google.rubber-chickens.com A 216.58.210.36 - Which points to google or
200.200.120.11 PTR msn.microsoft.com. - Which when you did a traceroute or dig would appear to show the hostname msn.microsoft.com
IP's and domains are just made up in this example.

Mismatch in the number of ADDITIONAL RECORDS in dig query

While doing the DNS query through dig utility, sometimes i got Additional records in the results while sometimes not. This is very much normal.
But today i saw something interesting in the output of the dig. While querying for fb.com domain, i got some additional records in the response.
Interesting part is the information displayed along with flags.
There dig utility informs that there are ADDITIONAL: 5 (five additional records) while in the actual output section, it displays only 4 additional responses.
This is not specific to fb.com domain only but i am also getting similar things (mismatch in Additional Section) in other domains too.
`[root#Kansal~]# dig fb.com
; <<>> DiG 9.10.3-P3 <<>> fb.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 34411
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 5
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;fb.com. IN A
;; ANSWER SECTION:
fb.com. 221 IN A 31.13.74.36
;; AUTHORITY SECTION:
fb.com. 735 IN NS b.ns.facebook.com.
fb.com. 735 IN NS a.ns.facebook.com.
;; ADDITIONAL SECTION:
a.ns.facebook.com. 3485 IN A 69.171.239.12
a.ns.facebook.com. 3485 IN AAAA 2a03:2880:fffe:c:face:b00c:0:35
b.ns.facebook.com. 3485 IN A 69.171.255.12
b.ns.facebook.com. 3485 IN AAAA 2a03:2880:ffff:c:face:b00c:0:35
;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Thu Oct 20 15:24:59 IST 2016
;; MSG SIZE rcvd: 183
[root#Kansal~]# `
Bind version is 9.10.3
Please explain what i am missing here ?
The fifth RR in the Additional section is the OPT pseudo-RR. Its information is displayed under the OPT PSEUDOSECTION header in your example, rather than among the other RRs, since it's special. You can read all about it in RFC 2671.

Why are multiple queries being made to my DNS Server?

As part of a project I've written a very simplistic DNS server whose only purpose is to resolve queries for the zone it serves, and to store the IP addresses of the server that made the query.
I've noticed that if I use dig, my DNS server gets queried multiple times - sometimes from the same IP address. Why does this happen? Is it due to the unreliable nature of UDP?
For example, here's a dig reply I made:
C:\Data>dig xyz.dns.example.com
; <<>> DiG 9.10.4-P2 <<>> xyz.dns.example.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 2539
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;xyz.dns.example.com. IN A
;; ANSWER SECTION:
xyz.dns.example.com. 12321 IN A 50.16.166.175
;; Query time: 224 msec
;; SERVER: 192.168.1.1#53(192.168.1.1)
;; WHEN: Thu Aug 11 15:07:42 Eastern Daylight Time 2016
;; MSG SIZE rcvd: 77
In this example, the zone file for example.com has an NS record for dns.example.com which is where my simplistic DNS server runs. Fror this one query, my server was called 4 times from 2 different IP addresses.
I also noticed that I'm supposedly returning an "Additional" record, but the data I return in bytes 10 and 11 are clearly 0. Could this be causing a problem?
Try dig's +trace option:
dig example.com +trace

What does it mean when a "dig" command with "+nssearch" option returns nothing?

When I run the following dig command on www.google.com with the +nssearch option I get no results:
mac$ dig www.google.com +nssearch
mac$
Can someone explain why no data is returned here? The +nssearch option reads the SOA of all the authoritative name servers I believe. Does this mean there are no authoritative name servers? How is that possible? The domain www.google.com obviously works so I was expecting some sort of result.
; <<>> DiG 9.9.5-3ubuntu0.2-Ubuntu <<>> www.google.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 40522
;; flags: qr rd ra; QUERY: 1, ANSWER: 6, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.google.com. IN A
;; ANSWER SECTION:
www.google.com. 20 IN A 74.125.196.106
www.google.com. 20 IN A 74.125.196.104
www.google.com. 20 IN A 74.125.196.99
www.google.com. 20 IN A 74.125.196.147
www.google.com. 20 IN A 74.125.196.105
www.google.com. 20 IN A 74.125.196.103
;; Query time: 2 msec
;; SERVER: 192.168.186.1#53(192.168.186.1)
;; WHEN: Wed Jun 17 17:17:37 CDT 2015
;; MSG SIZE rcvd: 139
From "man dig":
+[no]nssearch
When this option is set, dig attempts to find the authoritative name servers for the zone containing the name being
looked up and display
the SOA record that each name server has for the zone.
Since there's no authority section in the response, +nssearch is going to return nothing.
www.google.com is not a zone, but a name in a zone. Therefore it doesn't have any NS records (or SOA records) for dig to display. Try dropping the www. bit and you'll get more output.

Resources