Казалось циклится он на адресах не имеющих имен. Проверил несколько: не записей.
Но пока разбирался 126.152.54.65 начал определяться.
Code:
17:29:07.894704 IP (tos 0x0, ttl 64, id 45185, offset 0, flags [DF], proto: UDP (17), length: 72) 212.220.107.8.1057 > ns1.urtc.ru.domain: [udp sum ok] 2043+ PTR? 126.152.54.65.in-addr.arpa. (44)
17:29:07.902492 IP (tos 0x0, ttl 61, id 52657, offset 0, flags [DF], proto: UDP (17), length: 140) ns1.urtc.ru.domain > 212.220.107.8.1057: [udp sum ok] 2043 NXDomain q: PTR? 126.152.54.65.in-addr.arpa. 0/1/0 ns: 152.54.65.in-addr.arpa. SOA ns1.msft.net. msnhst.microsoft.com. 2005111048 7200 900 7200000 3600 (112)
17:29:08.905374 IP (tos 0x0, ttl 64, id 45287, offset 0, flags [DF], proto: UDP (17), length: 72) 212.220.107.8.1057 > ns.urtc.ru.domain: [udp sum ok] 2044+ PTR? 192.179.54.65.in-addr.arpa. (44)
17:29:08.923330 IP (tos 0x0, ttl 62, id 53358, offset 0, flags [DF], proto: UDP (17), length: 143) ns.urtc.ru.domain > 212.220.107.8.1057: [udp sum ok] 2044 NXDomain q: PTR? 192.179.54.65.in-addr.arpa. 0/1/0 ns: 179.54.65.in-addr.arpa. SOA dns.cp.msft.net. msnhst.microsoft.com. 2006061501 1800 900 604800 3600 (115)
По исходникам, там нет никаких счетчиков попыток определить имя, поэтому стоит такому IP попасть в базу, он будет теребить DNS все время.
Фрагмент dns.c
Code:
void dns_polldb(int a) /* class A address space */
{
int i = 0;
host_record *h;
int db_used;
while (!shutting_down)
{
pthread_mutex_lock(&db_mutex);
db_used = host_db[a].used;
if (i == db_used)
{
/* end of this table */
pthread_mutex_unlock(&db_mutex);
return;
}
h = (host_record*)db_get(host_db[a], i);
pthread_mutex_unlock(&db_mutex);
/* resolve if it's not already resolved */
if (h->hostname == NULL)
{
h->hostname = name_from_ip(h->ip_addr);
if (verbose)
{
if (h->hostname)
printf("DNS: Resolved %s",
h->hostname);
else
printf("DNS: Resolution failed");
printf(" (%d/%d)\n", i+1, db_used);
}
if (want_resolve != IN_PROGRESS)
dns_sleep(WAIT_BETWEEN_QUERIES);
}
i++;
}
}
/* argument is ignored */
void dns_main(void *ignored unused)
{
printf("DNS: Thread is awake.\n");
up_dns = 1;
while (!host_db_used() && !shutting_down)
{
if (verbose) printf("DNS: Waiting for host_db to fill up.\n");
fflush(stdout);
dns_sleep(WAIT_BETWEEN_QUERIES);
}
while (!shutting_down)
{
int a;
while (want_resolve == OFF && !shutting_down)
{
if (verbose) printf("DNS: Disabled.\n");
dns_sleep(WAIT_BETWEEN_LOOPS);
}
for (a=0; a<256 && !shutting_down; a++) dns_polldb(a);
if (want_resolve == IN_PROGRESS)
want_resolve = OFF;
if (verbose) printf("DNS: Hit end of host_db\n");
dns_sleep(WAIT_BETWEEN_LOOPS);
}
printf("DNS: Thread down.\n");
up_dns = 0;
pthread_exit(0);
}