Python:从DNS获取RA标志

Python:从DNS获取RA标志,python,dns,dnspython,Python,Dns,Dnspython,我正试图从DNS中获得递归可用(RA)标志。根据RFC1035,如果没有递归,它应该返回零,否则返回非零。如果一个DNS响应被Quad9 DNS服务阻止,它将返回一个带有“RA:0”的“NXDOMAIN” 但是,使用DNSPython is始终返回非零(128)。这个可以硬编码吗 允许的响应: [+] 172.217.214.100 [+] 172.217.214.101 [+] 172.217.214.138 [+] 172.217.214.139 [+] 172.217.214.113 [+

我正试图从DNS中获得递归可用(RA)标志。根据RFC1035,如果没有递归,它应该返回零,否则返回非零。如果一个DNS响应被Quad9 DNS服务阻止,它将返回一个带有“RA:0”的“NXDOMAIN”

但是,使用DNSPython is始终返回非零(128)。这个可以硬编码吗

允许的响应:

[+] 172.217.214.100
[+] 172.217.214.101
[+] 172.217.214.138
[+] 172.217.214.139
[+] 172.217.214.113
[+] 172.217.214.102
RA flag: 128
[+] NXDOMAIN
RA flag: 128
阻止响应:

[+] 172.217.214.100
[+] 172.217.214.101
[+] 172.217.214.138
[+] 172.217.214.139
[+] 172.217.214.113
[+] 172.217.214.102
RA flag: 128
[+] NXDOMAIN
RA flag: 128

您不使用已创建的冲突解决程序对象,因此查询将转到系统冲突解决程序。您应该改为使用此选项:

dns_response = my_resolver.query(domain, "A")
query()
执行搜索列表处理,因此应首先清除搜索列表,如下所示:

    my_resolver = dns.resolver.Resolver()
    my_resolver.nameservers = ['9.9.9.9']
    my_resolver.search = []
except dns.resolver.NXDOMAIN as e:
    print("[+] NXDOMAIN")
    for (name, resp) in e.responses().items():
        print(name, "RA flag:", resp.flags & dns.flags.RA)
最后,
NXDOMAIN
响应导致异常,您需要从异常中的响应对象读取标志,如下所示:

    my_resolver = dns.resolver.Resolver()
    my_resolver.nameservers = ['9.9.9.9']
    my_resolver.search = []
except dns.resolver.NXDOMAIN as e:
    print("[+] NXDOMAIN")
    for (name, resp) in e.responses().items():
        print(name, "RA flag:", resp.flags & dns.flags.RA)

我在“e.responses().items()”中遇到了“NameError:name'e'未定义”错误->缺少任何导入?您是否在
行中包含
作为e
,除了
之外?发现得很好!但是仍然有一个错误,这里的代码是:AttributeError:'NXDOMAIN'对象没有属性'responses'。您的Python和dnspython版本是什么?您的代码适用于Python 3.7.3和dnspython 1.16.0。