def evaluate(self,
hints # Information used for doing identification
):
"""Given a set of hints, evaluate this identifier and return True if
an identification is made.
"""
try:
ip = hints['requester']
except KeyError:
return False
octets = dns.reversename.from_address(ip)[0:-3]
host = '.'.join(octets)
host += '.v4.fullbogons.cymru.com' if len(octets) == 4 \
else '.v6.fullbogons.cymru.com'
# The query for this is always for an 'A' record, even for
# IPv6 hosts.
try:
resolved = self.resolver.query(host, 'A')[0]
except dns.resolver.NXDOMAIN:
return False
except (dns.exception.Timeout,
dns.resolver.NoAnswer,
dns.resolver.NoNameservers):
return self.fail_result
# The query will return 127.0.0.2 if it's in the bogon list.
# See http://www.team-cymru.org/bogon-reference-dns.html.
if str(resolved) != '127.0.0.2':
return False
# At this point, we have a bogon. Filter out exclusions.
net_ip = ipaddr.IPAddress(ip)
for exclude in self.exclude:
if net_ip in exclude:
return False
# Not excluded; must be a legit bogon.
return True
# A short test program
评论列表
文章目录