package be.neutrinet.ispng; import be.neutrinet.ispng.dns.RequestHandler; import be.neutrinet.ispng.dns.TCPServer; import be.neutrinet.ispng.dns.UDPServer; import be.neutrinet.ispng.dns.ZoneBuilder; import be.neutrinet.ispng.util.Zookeeper; import org.apache.log4j.ConsoleAppender; import org.apache.log4j.Level; import org.apache.log4j.Logger; import org.xbill.DNS.*; import java.io.FileInputStream; import java.net.InetAddress; import java.util.HashMap; import java.util.Map; import java.util.Properties; /** * Created by wannes on 1/24/15. */ public class DNS { public static Map<String, TSIG> TSIG = new HashMap<>(); public static Map<Name, Zone> zones = new HashMap<>(); public static Properties cfg; public static void main(String[] args) { try { Logger root = Logger.getRootLogger(); root.setLevel(Level.INFO); root.addAppender(new ConsoleAppender(VPN.LAYOUT)); cfg = new Properties(); cfg.load(new FileInputStream("dns.properties")); Zookeeper.boot(cfg.getProperty("zookeeper.connectionString")); String TSIGname = cfg.getProperty("tsig.name").toLowerCase() + "."; TSIG.put(TSIGname, new TSIG(cfg.getProperty("tsig.algorithm"), TSIGname, cfg.getProperty("tsig.key"))); ZoneBuilder zoneBuilder = new ZoneBuilder(); zoneBuilder.boot(cfg); zones = zoneBuilder.rebuildZones(); RequestHandler handler = new RequestHandler(); UDPServer udp = new UDPServer(InetAddress.getByName("0.0.0.0"), 5252, handler); new Thread(udp, "DNS-UDP").start(); TCPServer tcp = new TCPServer(InetAddress.getByName("0.0.0.0"), 5252, handler); new Thread(tcp, "DNS-TCP").start(); } catch (Exception ex) { Logger.getLogger(DNS.class).error("Failed to start DNS server", ex); } } private static void buildIPv4Zone() { try { Name ipv4 = Name.fromString("181.67.80.in-addr.arpa."); PTRRecord ptrRecord = new PTRRecord(Name.fromString("134", ipv4), DClass.IN, 3600, Name.fromString("seriouscat.net.")); PTRRecord vpn = new PTRRecord(Name.fromString("1", ipv4), DClass.IN, 3600, Name.fromString("vpn.neutrinet.be.")); NSRecord ns1Record = new NSRecord(Name.fromString("@", ipv4), DClass.IN, 3600, Name.fromString("ns1.neutrinet.be.")); NSRecord ns2Record = new NSRecord(Name.fromString("@", ipv4), DClass.IN, 3600, Name.fromString("ns2.neutrinet.be.")); SOARecord soaRecord = new SOARecord(Name.fromString("@", ipv4), DClass.IN, 3600, Name.fromString("ns.neutrinet.be."), Name.fromString("dns.neutrinet.be."), 20150125, 86400, 86400, 2419200, 86400); Zone zone = new Zone(ipv4, new Record[]{soaRecord, ptrRecord, ns1Record, ns2Record, vpn}); zones.put(ipv4, zone); } catch (Exception ex) { Logger.getLogger(DNS.class).error("Failed to build v4 zone", ex); } } private static void buildIPv6Zone() { try { Name ipv6 = Name.fromString("1.3.1.9.0.1.0.0.2.ip6.arpa."); PTRRecord ptrRecord = new PTRRecord(Name.fromString("1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.2.1.0.0.0", ipv6), DClass.IN, 3600, Name.fromString("seriouscat.net.")); PTRRecord vpn = new PTRRecord(Name.fromString("1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0", ipv6), DClass.IN, 3600, Name.fromString("vpn.neutrinet.be.")); NSRecord ns1Record = new NSRecord(Name.fromString("@", ipv6), DClass.IN, 3600, Name.fromString("ns1.neutrinet.be.")); NSRecord ns2Record = new NSRecord(Name.fromString("@", ipv6), DClass.IN, 3600, Name.fromString("ns2.neutrinet.be.")); SOARecord soaRecord = new SOARecord(Name.fromString("@", ipv6), DClass.IN, 3600, Name.fromString("ns.neutrinet.be."), Name.fromString("dns.neutrinet.be."), 20150125, 86400, 86400, 2419200, 86400); Zone zone = new Zone(ipv6, new Record[]{soaRecord, ptrRecord, ns1Record, ns2Record, vpn}); zones.put(ipv6, zone); } catch (Exception ex) { Logger.getLogger(DNS.class).error("Failed to build v6 zone", ex); } } }