added -L option that makes nonamed ignore queries that don't come from
localhost.
This commit is contained in:
parent
730b6a20d0
commit
ab3b9ed760
@ -12,6 +12,7 @@ static const char version[] = "2.7";
|
|||||||
#define nil ((void*)0)
|
#define nil ((void*)0)
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <syslog.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
@ -78,6 +79,8 @@ static u32_t stale; /* Extension time for stale data. */
|
|||||||
static u32_t httl; /* TTL for /etc/hosts data. */
|
static u32_t httl; /* TTL for /etc/hosts data. */
|
||||||
static int reinit, done; /* Reinit config / program is done. */
|
static int reinit, done; /* Reinit config / program is done. */
|
||||||
static int single; /* Run single on a nondefault interface. */
|
static int single; /* Run single on a nondefault interface. */
|
||||||
|
static int localonly; /* Only accept local queries. */
|
||||||
|
#define LOCALHOST 0x7F000001
|
||||||
|
|
||||||
static void report(const char *label)
|
static void report(const char *label)
|
||||||
{
|
{
|
||||||
@ -801,7 +804,7 @@ static void init_config(ipaddr_t ifip)
|
|||||||
time_t ht, dt;
|
time_t ht, dt;
|
||||||
|
|
||||||
/* See if anything really changed. */
|
/* See if anything really changed. */
|
||||||
if (((ifip ^ HTONL(0x7F000000)) & HTONL(0xFF000000)) == 0) ifip= my_ip;
|
if (((ifip ^ HTONL(LOCALHOST)) & HTONL(0xFF000000)) == 0) ifip= my_ip;
|
||||||
ht= filetime(HOSTS);
|
ht= filetime(HOSTS);
|
||||||
dt= filetime(DHCPCACHE);
|
dt= filetime(DHCPCACHE);
|
||||||
if (ifip == my_ip && ht == hosts_time && dt == dhcp_time) return;
|
if (ifip == my_ip && ht == hosts_time && dt == dhcp_time) return;
|
||||||
@ -889,7 +892,7 @@ static int query_hosts(u8_t *qname, unsigned type, dns_t *dp, size_t *pdlen)
|
|||||||
unsigned ancount;
|
unsigned ancount;
|
||||||
struct hostent localhost;
|
struct hostent localhost;
|
||||||
static char *noaliases[]= { nil };
|
static char *noaliases[]= { nil };
|
||||||
static ipaddr_t localaddr= HTONL(0x7F000001L);
|
static ipaddr_t localaddr= HTONL(LOCALHOST);
|
||||||
static char *localaddrlist[]= { (char *) &localaddr, nil };
|
static char *localaddrlist[]= { (char *) &localaddr, nil };
|
||||||
|
|
||||||
if (single) return 0;
|
if (single) return 0;
|
||||||
@ -1404,6 +1407,15 @@ static int job_read_udp(void *data, int expired)
|
|||||||
/* A query. */
|
/* A query. */
|
||||||
if (udp.dns.hdr.dh_qdcount != HTONS(1)) return 1;
|
if (udp.dns.hdr.dh_qdcount != HTONS(1)) return 1;
|
||||||
|
|
||||||
|
if(localonly) {
|
||||||
|
/* Check if it's a local query. */
|
||||||
|
if(ntohl(udp.hdr.uih_src_addr) != LOCALHOST) {
|
||||||
|
syslog(LOG_WARNING, "nonamed: dropped query from %s",
|
||||||
|
inet_ntoa(udp.hdr.uih_src_addr));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Try to compose a reply from local data. */
|
/* Try to compose a reply from local data. */
|
||||||
if (compose_reply(&udp.dns, &dlen)) {
|
if (compose_reply(&udp.dns, &dlen)) {
|
||||||
udp.hdr.uih_dst_addr= udp.hdr.uih_src_addr;
|
udp.hdr.uih_dst_addr= udp.hdr.uih_src_addr;
|
||||||
@ -2039,6 +2051,9 @@ int main(int argc, char **argv)
|
|||||||
case 'q': /* Quit after printing cache contents. */
|
case 'q': /* Quit after printing cache contents. */
|
||||||
quit= 1;
|
quit= 1;
|
||||||
break;
|
break;
|
||||||
|
case 'L':
|
||||||
|
localonly= 1;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
usage();
|
usage();
|
||||||
}
|
}
|
||||||
@ -2102,6 +2117,9 @@ int main(int argc, char **argv)
|
|||||||
newjob(job_setup_listen, IMMEDIATE, nil);
|
newjob(job_setup_listen, IMMEDIATE, nil);
|
||||||
newjob(job_find_named, IMMEDIATE, nil);
|
newjob(job_find_named, IMMEDIATE, nil);
|
||||||
|
|
||||||
|
/* Open syslog. */
|
||||||
|
openlog("nonamed", LOG_PID, LOG_DAEMON);
|
||||||
|
|
||||||
while (!done) {
|
while (!done) {
|
||||||
/* There is always something in the queue. */
|
/* There is always something in the queue. */
|
||||||
assert(queue != nil);
|
assert(queue != nil);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user