diff --git a/dns.cpp b/dns.cpp index 8127a3e..e189995 100644 --- a/dns.cpp +++ b/dns.cpp @@ -425,7 +425,7 @@ int dnsserver(dns_opt_t *opt) { memset((char *) &si_me, 0, sizeof(si_me)); si_me.sin6_family = AF_INET6; si_me.sin6_port = htons(opt->port); - si_me.sin6_addr = in6addr_any; + inet_pton(AF_INET6, opt->addr, &si_me.sin6_addr); if (bind(listenSocket, (struct sockaddr*)&si_me, sizeof(si_me))==-1) return -2; } diff --git a/dns.h b/dns.h index 252fa83..4966010 100644 --- a/dns.h +++ b/dns.h @@ -16,6 +16,7 @@ struct dns_opt_t { int datattl; int nsttl; const char *host; + const char *addr; const char *ns; const char *mbox; int (*cb)(void *opt, char *requested_hostname, addr_t *addr, int max, int ipv4, int ipv6); diff --git a/main.cpp b/main.cpp index 2d3d346..150d716 100644 --- a/main.cpp +++ b/main.cpp @@ -28,11 +28,12 @@ public: const char *ns; const char *host; const char *tor; + const char *ip_addr; const char *ipv4_proxy; const char *ipv6_proxy; std::set filter_whitelist; - CDnsSeedOpts() : nThreads(96), nDnsThreads(4), nPort(53), mbox(NULL), ns(NULL), host(NULL), tor(NULL), fUseTestNet(false), fWipeBan(false), fWipeIgnore(false), ipv4_proxy(NULL), ipv6_proxy(NULL) {} + CDnsSeedOpts() : nThreads(96), nDnsThreads(4), ip_addr("::"), nPort(53), mbox(NULL), ns(NULL), host(NULL), tor(NULL), fUseTestNet(false), fWipeBan(false), fWipeIgnore(false), ipv4_proxy(NULL), ipv6_proxy(NULL) {} void ParseCommandLine(int argc, char **argv) { static const char *help = "Bitcoin-seeder\n" @@ -44,6 +45,7 @@ public: "-m E-Mail address reported in SOA records\n" "-t Number of crawlers to run in parallel (default 96)\n" "-d Number of DNS server threads (default 4)\n" + "-a
Address to listen on (default ::)\n" "-p UDP port to listen on (default 53)\n" "-o Tor proxy IP/Port\n" "-i IPV4 SOCKS5 proxy IP/Port\n" @@ -63,6 +65,7 @@ public: {"mbox", required_argument, 0, 'm'}, {"threads", required_argument, 0, 't'}, {"dnsthreads", required_argument, 0, 'd'}, + {"address", required_argument, 0, 'a'}, {"port", required_argument, 0, 'p'}, {"onion", required_argument, 0, 'o'}, {"proxyipv4", required_argument, 0, 'i'}, @@ -75,7 +78,7 @@ public: {0, 0, 0, 0} }; int option_index = 0; - int c = getopt_long(argc, argv, "h:n:m:t:p:d:o:i:k:w:", long_options, &option_index); + int c = getopt_long(argc, argv, "h:n:m:t:a:p:d:o:i:k:w:", long_options, &option_index); if (c == -1) break; switch (c) { case 'h': { @@ -105,6 +108,18 @@ public: break; } + case 'a': { + if (strchr(optarg, ':')==NULL) { + char* ip4_addr = (char*) malloc(strlen(optarg)+8); + strcpy(ip4_addr, "::FFFF:"); + strcat(ip4_addr, optarg); + ip_addr = ip4_addr; + } else { + ip_addr = optarg; + } + break; + } + case 'p': { int p = strtol(optarg, NULL, 10); if (p > 0 && p < 65536) nPort = p; @@ -261,6 +276,7 @@ public: dns_opt.datattl = 3600; dns_opt.nsttl = 40000; dns_opt.cb = GetIPList; + dns_opt.addr = opts->ip_addr; dns_opt.port = opts->nPort; dns_opt.nRequests = 0; dbQueries = 0;