#!/usr/bin/python import sys,commands from optparse import OptionParser from dns.resolver import query from dns.exception import DNSException import re # default domain list config = '/etc/setroute.list' # read domains from file def read_list(file): lines = [line.strip() for line in open(config)] names = [] for name in lines: if name: names.append(name) return names # host to IP addresses def host_to_ip(name): ip = [] try: qa = query(name,"A") for i in qa: print name+"->"+i.to_text() ip.append(i.to_text()) except DNSException: return [] finally: return ip # convert names into IP addresses def to_ip(names): re_ip = re.compile('\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$') ip_list = [] for name in names: if re_ip.match(name): ip_list = list(set(ip_list + [name])) print name+' appended' else: ip = host_to_ip(name) ip_list = list(set(ip_list + ip)) return ip_list # set route def set_route(list,interface,gateway,dest,remove): for i in list: if remove: if interface: if gateway: command = "route del -net %s netmask 255.255.255.255 gw %s dev %s" % (i,gateway,interface) else: command = "route del -net %s netmask 255.255.255.255 dev %s" % (i,interface) elif dest: command = "iptables -t nat -D OUTPUT -p tcp -d %s -m tcp -j DNAT --to-destination %s" % (i,dest) elif gateway: command = "route del -net %s netmask 255.255.255.255 gw %s" % (i,gateway) elif ipset: command = "ipset del %s %s" %(ipset,i) print command commands.getoutput(command) else: if interface: if gateway: command = "route add -net %s netmask 255.255.255.255 gw %s dev %s" % (i,gateway,interface) else: command = "route add -net %s netmask 255.255.255.255 dev %s" % (i,interface) elif dest: command = "iptables -t nat -I OUTPUT -p tcp -d %s -m tcp -j DNAT --to-destination %s" % (i,dest) elif gateway: command = "route add -net %s netmask 255.255.255.255 gw %s" % (i,gateway) elif ipset: command = "ipset add %s %s" %(ipset,i) print command commands.getoutput(command) # main procedure - process input parameters, read file and set route def main(): global dest,interface,gateway,remove try: domain_list = read_list(config) except: print "Cannot get domains list from file", config exit() ip_list = to_ip(domain_list) set_route(ip_list,interface,gateway,dest,remove) if __name__ == "__main__": parser = OptionParser() parser.add_option("-l", "--list", dest="config", help="Domain names list (default /etc/setroute.list) " ) parser.add_option("-s", "--ipset", dest="ipset", help="IPset to fill in") parser.add_option("-d", "--destination", dest="destination", help="Proxy server (IP:Port)") parser.add_option("-i", "--interface", dest="interface", help="Interface name") parser.add_option("-g", "--gateway", dest="gateway", help="Gateway IP") parser.add_option("-r", "--remove", action="store_true", dest="remove", help="Remove redirection") (options, args) = parser.parse_args() opts = options.__dict__ if opts["config"]: config = opts["config"] if opts["destination"]: dest = opts["destination"] else: dest = None if opts["interface"]: interface = opts["interface"] else: interface = None if opts["gateway"]: gateway = opts["gateway"] else: gateway = None if opts["remove"]: remove = opts["remove"] else: remove = None if opts["ipset"]: ipset = opts["ipset"] else: ipset = None main()