Surveillance dns
Un article de Casys (Canadian Sysadmins).
Ce script permet de verifier la cohérence de nos noms de domaine.
Il permet de faire la resolution de chaque nom de domaine sur une liste de serveur DNS. L'intérêt est de pouvoir vérifier que le nom de domaine résout correctement chez les clients.
Source : http://pbastida.net/~pior/up/checkdns-sample.py
#!/usr/bin/env python
"""Check a list of hostnames against a list of dns servers
Return 0 if all hostnames resolved well from all dns servers
Return 1 otherwise
Install:
centos:
add rpmforge repo
yum install python-dns
debian/ubuntu:
apt-get install python-dnspython
Note on the test done:
A hostname resolve well if a least one of the answer match
the ip given in the config section.
"""
dnsserver = dict()
hostname = dict()
################### CONFIG #####################
dnsserver['opendns'] = '208.67.222.222'
dnsserver['level3'] = '4.2.2.1'
dnsserver['free.fr'] = '212.27.40.241'
dnsserver['neuf'] = '212.30.96.108'
hostname['example.com'] = '208.77.188.166'
hostname['endoftheinternet.com'] = '66.146.2.196'
################### END OF CONFIG ################
############ DO NOT CROSS THIS LINE ##############
import sys
import dns.resolver
from threading import Thread
import logging
logging.basicConfig(level=logging.DEBUG)
class resolverthread(Thread):
def __init__ (self, name, server, joblist):
Thread.__init__(self)
self.joblist = joblist
self.name = name
self.server = server
self.result = dict()
self.error = False
def run(self):
logging.info('Thread[%s] starting...' % (self.name))
import dns.resolver
R = dns.resolver.Resolver(configure=False)
R.nameservers = [self.server]
R.lifetime = 5
dns.resolver.default_resolver = R
for host in self.joblist:
try:
answer = dns.resolver.query(host)
except dns.resolver.NoAnswer:
self.result[host] = None
except dns.resolver.Timeout:
logging.error('Timeout when waiting for %s (%s)' % (self.name, self.server))
self.error = True
break
else:
self.result[host] = [h.address for h in answer.rrset]
logging.info('Thread[%s] host=%s result=%s' % (self.name, host, str(self.result[host])))
def main():
workers = []
error = False
# Launch the threads
for dsname, dsaddr in dnsserver.iteritems():
logging.info('Start thread for dns server %s' % dsname)
worker = resolverthread(dsname, dsaddr, hostname.keys())
workers.append(worker)
worker.start()
# Wait and check the result
for worker in workers:
worker.join()
if worker.error:
error = True
continue
for host, addr in hostname.iteritems():
if addr not in worker.result[host]:
logging.error('%s is %s and should be %s on %s' % (host, str(worker.result[host]), addr, worker.server))
error = True
sys.exit(error)
if __name__ == "__main__":
main()
A ajouter à /etc/zabbix/zabbix_agentd.conf :
UserParameter=checkdns,/usr/local/bin/checkdns.py &> /dev/null ; echo $?
