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
	 Markus Moeller
						Markus Moeller