Reverse DNS for IP networl.mask match
This commit is contained in:
parent
39d7bf6c70
commit
187731f80e
10
configure.ac
10
configure.ac
@ -101,6 +101,16 @@ if test x"$transparent_enabled" = x"yes"; then
|
|||||||
AC_DEFINE(TRANSPARENT_PROXY)
|
AC_DEFINE(TRANSPARENT_PROXY)
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
dnl Include support for reverse dns to match IP network/mask ?
|
||||||
|
AH_TEMPLATE([RDNS_ENABLE],
|
||||||
|
[Include support for reverse dns to match IP network/mask.])
|
||||||
|
TP_ARG_ENABLE(rdns,
|
||||||
|
[Enable support for reverse dns to match IP network/mask (default is YES)],
|
||||||
|
yes)
|
||||||
|
if test x"$rdns__enabled" = x"yes"; then
|
||||||
|
AC_DEFINE(RDNS_ENABLE)
|
||||||
|
fi
|
||||||
|
|
||||||
dnl Let user decide whether he wants support for manpages
|
dnl Let user decide whether he wants support for manpages
|
||||||
dnl Which require either pod2man or a tarball release
|
dnl Which require either pod2man or a tarball release
|
||||||
AH_TEMPLATE([MANPAGE_SUPPORT],
|
AH_TEMPLATE([MANPAGE_SUPPORT],
|
||||||
|
@ -2,6 +2,18 @@
|
|||||||
#include "hostspec.h"
|
#include "hostspec.h"
|
||||||
#include "heap.h"
|
#include "heap.h"
|
||||||
#include "network.h"
|
#include "network.h"
|
||||||
|
#ifdef RDNS_ENABLE
|
||||||
|
#include "log.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static int dotted_mask(char *bitmask_string, unsigned char array[])
|
||||||
|
{
|
||||||
|
unsigned char v4bits[4];
|
||||||
|
if (1 != inet_pton (AF_INET, bitmask_string, v4bits)) return -1;
|
||||||
|
memset (array, 0xff, IPV6_LEN-4);
|
||||||
|
memcpy (array + IPV6_LEN-4, v4bits, 4);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Fills in the netmask array given a numeric value.
|
* Fills in the netmask array given a numeric value.
|
||||||
@ -13,13 +25,17 @@
|
|||||||
*/
|
*/
|
||||||
static int
|
static int
|
||||||
fill_netmask_array (char *bitmask_string, int v6,
|
fill_netmask_array (char *bitmask_string, int v6,
|
||||||
unsigned char array[], size_t len)
|
unsigned char array[])
|
||||||
{
|
{
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
unsigned long int mask;
|
unsigned long int mask;
|
||||||
char *endptr;
|
char *endptr;
|
||||||
|
|
||||||
errno = 0; /* to distinguish success/failure after call */
|
errno = 0; /* to distinguish success/failure after call */
|
||||||
|
if (strchr (bitmask_string, '.')) {
|
||||||
|
if (v6) return -1; /* ipv6 doesn't supported dotted netmasks */
|
||||||
|
return dotted_mask(bitmask_string, array);
|
||||||
|
}
|
||||||
mask = strtoul (bitmask_string, &endptr, 10);
|
mask = strtoul (bitmask_string, &endptr, 10);
|
||||||
|
|
||||||
/* check for various conversion errors */
|
/* check for various conversion errors */
|
||||||
@ -35,11 +51,11 @@ fill_netmask_array (char *bitmask_string, int v6,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* check valid range for a bit mask */
|
/* check valid range for a bit mask */
|
||||||
if (mask > (8 * len))
|
if (mask > (8 * IPV6_LEN))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
/* we have a valid range to fill in the array */
|
/* we have a valid range to fill in the array */
|
||||||
for (i = 0; i != len; ++i) {
|
for (i = 0; i != IPV6_LEN; ++i) {
|
||||||
if (mask >= 8) {
|
if (mask >= 8) {
|
||||||
array[i] = 0xff;
|
array[i] = 0xff;
|
||||||
mask -= 8;
|
mask -= 8;
|
||||||
@ -88,7 +104,7 @@ int hostspec_parse(char *location, struct hostspec *h) {
|
|||||||
v6 = 0;
|
v6 = 0;
|
||||||
|
|
||||||
if (fill_netmask_array
|
if (fill_netmask_array
|
||||||
(mask, v6, &(h->address.ip.mask[0]), IPV6_LEN)
|
(mask, v6, &(h->address.ip.mask[0]))
|
||||||
< 0)
|
< 0)
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
@ -146,6 +162,42 @@ static int numeric_match(const uint8_t addr[], const struct hostspec *h)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef RDNS_ENABLE
|
||||||
|
static int reverse_dns_numeric_match(const char *ip, const struct hostspec *h)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
struct addrinfo *res, *ressave;
|
||||||
|
uint8_t numeric_addr[IPV6_LEN];
|
||||||
|
char ipbuf[512];
|
||||||
|
|
||||||
|
errno = 0;
|
||||||
|
|
||||||
|
ret =getaddrinfo (ip, NULL, NULL, &res);
|
||||||
|
|
||||||
|
ressave = res;
|
||||||
|
|
||||||
|
if (ret != 0) {
|
||||||
|
if (ret == EAI_SYSTEM)
|
||||||
|
log_message (LOG_ERR, "Could not retrieve address info for %s : %s",ip,strerror(errno));
|
||||||
|
else
|
||||||
|
log_message (LOG_ERR, "Could not retrieve address info for %s : %s",ip,gai_strerror(errno));
|
||||||
|
} else {
|
||||||
|
do {
|
||||||
|
/* return if IP matches */
|
||||||
|
get_ip_string (res->ai_addr, ipbuf, sizeof (ipbuf));
|
||||||
|
full_inet_pton (ipbuf, &numeric_addr);
|
||||||
|
if (numeric_match (numeric_addr, h)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} while ((res = res->ai_next) != NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
freeaddrinfo (ressave);
|
||||||
|
|
||||||
|
return numeric_match (numeric_addr, h);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* check whether ip matches hostspec.
|
/* check whether ip matches hostspec.
|
||||||
return 1 on match, 0 on non-match */
|
return 1 on match, 0 on non-match */
|
||||||
int hostspec_match(const char *ip, const struct hostspec *h) {
|
int hostspec_match(const char *ip, const struct hostspec *h) {
|
||||||
@ -158,6 +210,9 @@ int hostspec_match(const char *ip, const struct hostspec *h) {
|
|||||||
if(is_numeric_addr) return 0;
|
if(is_numeric_addr) return 0;
|
||||||
return string_match (ip, h->address.string);
|
return string_match (ip, h->address.string);
|
||||||
case HST_NUMERIC:
|
case HST_NUMERIC:
|
||||||
|
#ifdef RDNS_ENABLE
|
||||||
|
if(!is_numeric_addr) return reverse_dns_numeric_match(ip, h);
|
||||||
|
#endif
|
||||||
return numeric_match (numeric_addr, h);
|
return numeric_match (numeric_addr, h);
|
||||||
case HST_NONE:
|
case HST_NONE:
|
||||||
return 0;
|
return 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user