From 9f39c52f84d183d237368f691ff7830949b98acd Mon Sep 17 00:00:00 2001 From: DL6ER Date: Fri, 6 Mar 2020 20:12:36 +0100 Subject: [PATCH 1/3] Add config setting FORCE_LOCAL_RESOLVER that can be used to prevent FTL forcing itself as the first resolver of the system Signed-off-by: DL6ER --- src/config.c | 13 +++++++++++++ src/config.h | 1 + src/resolve.c | 19 +++++++++++++------ 3 files changed, 27 insertions(+), 6 deletions(-) diff --git a/src/config.c b/src/config.c index 2ae1cd149..3d52c0af9 100644 --- a/src/config.c +++ b/src/config.c @@ -358,6 +358,19 @@ void read_FTLconf(void) else logg(" CNAME_DEEP_INSPECT: Inactive"); + // FORCE_LOCAL_RESOLVER + // defaults to: true + config.force_local_resolver = true; + buffer = parse_FTLconf(fp, "FORCE_LOCAL_RESOLVER"); + + if(buffer != NULL && strcasecmp(buffer, "false") == 0) + config.force_local_resolver = false; + + if(config.force_local_resolver) + logg(" FORCE_LOCAL_RESOLVER: Active"); + else + logg(" FORCE_LOCAL_RESOLVER: Inactive"); + // Read DEBUG_... setting from pihole-FTL.conf read_debuging_settings(fp); diff --git a/src/config.h b/src/config.h index 8ecfbbe2d..d064cb2eb 100644 --- a/src/config.h +++ b/src/config.h @@ -34,6 +34,7 @@ typedef struct { bool parse_arp_cache; bool regex_ignorecase; bool cname_inspection; + bool force_local_resolver; } ConfigStruct; typedef struct { diff --git a/src/resolve.c b/src/resolve.c index be3ff0323..a3b65c3cc 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -39,11 +39,15 @@ static char *resolveHostname(const char *addr) return hostname; } - // Back up first ns record in _res and ... - struct in_addr nsbck; - nsbck = _res.nsaddr_list[0].sin_addr; - // ... force FTL resolver to 127.0.0.1 - inet_pton(AF_INET, "127.0.0.1", &_res.nsaddr_list[0].sin_addr); + // Force first server used for lookups to 127.0.0.1 (FTL itself) + struct in_addr nsbck = { 0 }; + if(config.force_local_resolver) + { + // Back up first ns record in _res and ... + nsbck = _res.nsaddr_list[0].sin_addr; + // ... force FTL resolver to 127.0.0.1 + inet_pton(AF_INET, "127.0.0.1", &_res.nsaddr_list[0].sin_addr); + } // Test if we want to resolve an IPv6 address if(strstr(addr,":") != NULL) @@ -81,7 +85,10 @@ static char *resolveHostname(const char *addr) } // Restore first ns record in _res - _res.nsaddr_list[0].sin_addr = nsbck; + if(config.force_local_resolver) + { + _res.nsaddr_list[0].sin_addr = nsbck; + } // Return result return hostname; From 33b638ccda11312d020f50de23d2d33c191f5725 Mon Sep 17 00:00:00 2001 From: DL6ER Date: Fri, 6 Mar 2020 20:14:57 +0100 Subject: [PATCH 2/3] Do not force FTL as the first, but as the last server to be used Signed-off-by: DL6ER --- src/resolve.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/resolve.c b/src/resolve.c index a3b65c3cc..eab3e3d0f 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -44,9 +44,9 @@ static char *resolveHostname(const char *addr) if(config.force_local_resolver) { // Back up first ns record in _res and ... - nsbck = _res.nsaddr_list[0].sin_addr; + nsbck = _res.nsaddr_list[MAXNS-1].sin_addr; // ... force FTL resolver to 127.0.0.1 - inet_pton(AF_INET, "127.0.0.1", &_res.nsaddr_list[0].sin_addr); + inet_pton(AF_INET, "127.0.0.1", &_res.nsaddr_list[MAXNS-1].sin_addr); } // Test if we want to resolve an IPv6 address @@ -87,7 +87,7 @@ static char *resolveHostname(const char *addr) // Restore first ns record in _res if(config.force_local_resolver) { - _res.nsaddr_list[0].sin_addr = nsbck; + _res.nsaddr_list[MAXNS-1].sin_addr = nsbck; } // Return result From 5872ebbe469f88961ce2f90faf4a9a07fb830ae5 Mon Sep 17 00:00:00 2001 From: DL6ER Date: Wed, 25 Mar 2020 10:24:27 +0100 Subject: [PATCH 3/3] Remove option FORCE_LOCAL_RESOLVER as we do not need it. Signed-off-by: DL6ER --- src/config.c | 13 ------------- src/config.h | 1 - src/resolve.c | 20 +++++++------------- 3 files changed, 7 insertions(+), 27 deletions(-) diff --git a/src/config.c b/src/config.c index 3d52c0af9..2ae1cd149 100644 --- a/src/config.c +++ b/src/config.c @@ -358,19 +358,6 @@ void read_FTLconf(void) else logg(" CNAME_DEEP_INSPECT: Inactive"); - // FORCE_LOCAL_RESOLVER - // defaults to: true - config.force_local_resolver = true; - buffer = parse_FTLconf(fp, "FORCE_LOCAL_RESOLVER"); - - if(buffer != NULL && strcasecmp(buffer, "false") == 0) - config.force_local_resolver = false; - - if(config.force_local_resolver) - logg(" FORCE_LOCAL_RESOLVER: Active"); - else - logg(" FORCE_LOCAL_RESOLVER: Inactive"); - // Read DEBUG_... setting from pihole-FTL.conf read_debuging_settings(fp); diff --git a/src/config.h b/src/config.h index d064cb2eb..8ecfbbe2d 100644 --- a/src/config.h +++ b/src/config.h @@ -34,7 +34,6 @@ typedef struct { bool parse_arp_cache; bool regex_ignorecase; bool cname_inspection; - bool force_local_resolver; } ConfigStruct; typedef struct { diff --git a/src/resolve.c b/src/resolve.c index eab3e3d0f..4d67b8998 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -39,15 +39,12 @@ static char *resolveHostname(const char *addr) return hostname; } - // Force first server used for lookups to 127.0.0.1 (FTL itself) + // Force last available (MAXNS-1) server used for lookups to 127.0.0.1 (FTL itself) struct in_addr nsbck = { 0 }; - if(config.force_local_resolver) - { - // Back up first ns record in _res and ... - nsbck = _res.nsaddr_list[MAXNS-1].sin_addr; - // ... force FTL resolver to 127.0.0.1 - inet_pton(AF_INET, "127.0.0.1", &_res.nsaddr_list[MAXNS-1].sin_addr); - } + // Back up corresponding ns record in _res and ... + nsbck = _res.nsaddr_list[MAXNS-1].sin_addr; + // ... force FTL resolver to 127.0.0.1 + inet_pton(AF_INET, "127.0.0.1", &_res.nsaddr_list[MAXNS-1].sin_addr); // Test if we want to resolve an IPv6 address if(strstr(addr,":") != NULL) @@ -84,11 +81,8 @@ static char *resolveHostname(const char *addr) strtolower(hostname); } - // Restore first ns record in _res - if(config.force_local_resolver) - { - _res.nsaddr_list[MAXNS-1].sin_addr = nsbck; - } + // Restore ns record in _res + _res.nsaddr_list[MAXNS-1].sin_addr = nsbck; // Return result return hostname;