namecoin / nmcontrol

Namecoin Control. This repo is deprecated in favor of https://github.com/namecoin/ncdns
136 stars 38 forks source link

Can't recursively resolve nameservers #21

Open haasn opened 10 years ago

haasn commented 10 years ago

If I have a nameserver entry like {"ns": "ns.example.bit"} then nmcontrol doesn't try to resolve this .bit address internally, it just fails.

Want to back this issue? Post a bounty on it! We accept bounties via Bountysource.

brianmay commented 10 years ago

Top level domain lookups work, e.g.:

brian@aquitard:~$ nslookup -debug flightless.bit. localhost 
Server:         localhost
Address:        127.0.0.1#53

------------
    QUESTIONS:
        flightless.bit, type = A, class = IN
    ANSWERS:
    ->  flightless.bit
        internet address = 59.167.180.195
        ttl = 300
    AUTHORITY RECORDS:
    ADDITIONAL RECORDS:
------------
Name:   flightless.bit
Address: 59.167.180.195

but subdomain lookups don't work:

brian@aquitard:~$ nslookup -debug flightless.bit. localhost 
Server:         localhost
Address:        127.0.0.1#53

------------
    QUESTIONS:
        flightless.bit, type = A, class = IN
    ANSWERS:
    ->  flightless.bit
        internet address = 59.167.180.195
        ttl = 300
    AUTHORITY RECORDS:
    ADDITIONAL RECORDS:
------------
Name:   flightless.bit
Address: 59.167.180.195

The debug output generated by the first, working, query (flightless.bit):

Lookup: {'query': '', 'domain': 'flightless.bit', 'src_addr': ('127.0.0.1', 46293), 'qtype': 1, 'qclass': 1}
Resolving : flightless.bit getIp4
BackendDataNamecoin: ['name_show', 'd/flightless']
Processing import for {u'ns': [u'featherby.microcomaustralia.com.au']}
Possible domains : [[]]
Fetching ip for flightless.bit in sub-domain []
* result:  {"ip": ["ns"]}
Resolving : flightless.bit getNS
BackendDataNamecoin: ['name_show', 'd/flightless']
Processing import for {u'ns': [u'featherby.microcomaustralia.com.au']}
Possible domains : [[]]
Fetching ns for flightless.bit in sub-domain []
* result:  {"ns": ["featherby.microcomaustralia.com.au"]}
Resolving : flightless.bit getTranslate
BackendDataNamecoin: ['name_show', 'd/flightless']
Processing import for {u'ns': [u'featherby.microcomaustralia.com.au']}
Possible domains : [[]]
Fetching translate for flightless.bit in sub-domain []
* result:  {}
Fetching IP Address for:  flightless.bit with NS Server: featherby.microcomaustralia.com.au
* result:  [{'name': 'flightless.bit', 'data': '59.167.180.195', 'typename': 'A', 'classstr': 'IN', 'ttl': 86400, 'type': 1, 'class': 1, 'rdlength': 4}]

The domain lookup by the second (failing) query (www.flightless.bit):

Lookup: {'query': '', 'domain': 'www.flightless.bit', 'src_addr': ('127.0.0.1', 37162), 'qtype': 1, 'qclass': 1}
Resolving : www.flightless.bit getIp4
BackendDataNamecoin: ['name_show', 'd/flightless']
Processing import for {u'ns': [u'featherby.microcomaustralia.com.au']}
Possible domains : [['www'], ['*']]
* result:  {}
Lookup: {'query': '', 'domain': 'www.flightless.bit', 'src_addr': ('127.0.0.1', 54900), 'qtype': 1, 'qclass': 1}
Resolving : www.flightless.bit getIp4
BackendDataNamecoin: ['name_show', 'd/flightless']
Processing import for {u'ns': [u'featherby.microcomaustralia.com.au']}
Possible domains : [['www'], ['*']]
* result:  {}

Proof the nameserver has both these records:

brian@aquitard:~$ nslookup -debug flightless.bit. featherby.microcomaustralia.com.au
Server:         featherby.microcomaustralia.com.au
Address:        59.167.180.197#53

------------
    QUESTIONS:
        flightless.bit, type = A, class = IN
    ANSWERS:
    ->  flightless.bit
        internet address = 59.167.180.195
        ttl = 86400
    AUTHORITY RECORDS:
    ->  flightless.bit
        nameserver = featherby.microcomaustralia.com.au.
        ttl = 86400
    ADDITIONAL RECORDS:
    ->  featherby.microcomaustralia.com.au
        internet address = 59.167.180.197
        ttl = 86400
    ->  featherby.microcomaustralia.com.au
        has AAAA address 2001:44b8:4112:8a04::5
        ttl = 86400
------------
Name:   flightless.bit
Address: 59.167.180.195

brian@aquitard:~$ nslookup -debug www.flightless.bit. featherby.microcomaustralia.com.au
Server:         featherby.microcomaustralia.com.au
Address:        59.167.180.197#53

------------
    QUESTIONS:
        www.flightless.bit, type = A, class = IN
    ANSWERS:
    ->  www.flightless.bit
        internet address = 59.167.180.195
        ttl = 86400
    AUTHORITY RECORDS:
    ->  flightless.bit
        nameserver = featherby.microcomaustralia.com.au.
        ttl = 86400
    ADDITIONAL RECORDS:
    ->  featherby.microcomaustralia.com.au
        internet address = 59.167.180.197
        ttl = 86400
    ->  featherby.microcomaustralia.com.au
        has AAAA address 2001:44b8:4112:8a04::5
        ttl = 86400
------------
Name:   www.flightless.bit
Address: 59.167.180.195
brianmay commented 10 years ago

To get this to work with NMControl "as currently written" (as opposed to what may or may not be decided in #28), what is absolute minimum required. Would the following work?

{"ns": "ns.example.bit", 'map': "ns"}

or:

{"ns": "ns.example.bit", 'map': { '*': "ns" }

or do I need to repeat the ns server again?

{"ns": "ns.example.bit", 'map': { "*": { "ns": "ns.example.bit" }

Will this work with 4th level domains?

JeremyRand commented 10 years ago

I expect that you would need to repeat the ns server as in your last example. If I were writing the spec, I would make that syntax (with the asterisk) work for 4th/5th/etc. level domains as well. I'm not 100% certain whether NMControl in its current state does so. (If you try it, please let us know whether it works.) In the event that it doesn't do so (which may or may not be the case), I think any changes to that behavior would have to wait until we decide what to do about #28 , but you could possibly work around it in the meantime by nesting more "map" and "ns" fields until you have the desired number of levels.

Hope this helps.

brianmay commented 10 years ago

3rd level now working. 4th level lookup generates an exception. No time to look into this now though:

Fetching IP Address for:  meow.www.flightless.bit with NS Server: featherby.microcomaustralia.com.au
* result:  []
Traceback (most recent call last):
  File "/home/brian/tree/bitcoin/nmcontrol/lib/dnsServer/__init__.py", line 94, in serve
    rcode, an_resource_records = source_instance.get_response(query, ".".join(question), qtype, qclass, src_addr)
  File "/home/brian/tree/bitcoin/nmcontrol/lib/dnsServer/namecoindns.py", line 99, in get_response
    answers = app['services']['dns'].lookup({"query":query, "domain":domain, "qtype":qtype, "qclass":qclass, "src_addr":src_addr})
  File "/home/brian/tree/bitcoin/nmcontrol/service/serviceDNS.py", line 39, in lookup
    return app['plugins']['domain'].lookup(qdict)
  File "/home/brian/tree/bitcoin/nmcontrol/plugin/pluginNamespaceDomain.py", line 182, in lookup
    return self._bitLookup(qdict)
  File "/home/brian/tree/bitcoin/nmcontrol/plugin/pluginNamespaceDomain.py", line 209, in _bitLookup
    answers = app['plugins']['dns'].getIp4(qdict["domain"])
  File "/home/brian/tree/bitcoin/nmcontrol/plugin/pluginDns.py", line 97, in getIp4
    result = '["'+self._getIPv4FromNS(domain)+'"]'
  File "/home/brian/tree/bitcoin/nmcontrol/plugin/pluginDns.py", line 180, in _getIPv4FromNS
    return app['services']['dns']._lookup(domain, 1 , server)[0]['data']
IndexError: list index out of range

It seems like it might be working, however, the DNS server doesn't have this name, and probably returned an error, which is causing a confusing exception from nmcontrol.

JeremyRand commented 10 years ago

Thanks for checking. I haven't done anything myself with the DNS server querying code in NMControl, but I'll see whether I'm able to make that error less confusing. I might not be able to work on that one for a while though.