<div dir="ltr">I've asked in IRC but was instructed to ask here.<br><br>I'm interested (and trying to find an ideal way) to provide a recursor which will selectively modify certain records, or "smart DNS".<br><br>Being that some may be unaware what "smart DNS" is, it's a colloquial term for modifying certain strategic records so that instead of pointing directly to the original/authentic resource (say, a webserver), the traffic is pointed to a specific address that is internally controlled - usually a reverse proxy to the "true" resource that performs some sort of modification on the content being served not offered by the upstream/"true" resource.<br><br>I can't provide an actual example from implementation, because:<br><br>1.) This is still in the architectural stage, and<br>2.) The specific records will change from site to site.<br><br>However, I can use an existing domain as an example enough for POC purposes. Some IP addresses are, obviously, not actual (as they have yet to be determined). Configurations have been provided matching these.<br><br>FIRST, two reverse HTTP proxies (for round-robining) are turned up at address 1.2.3.4 and 4.3.2.1. For this example, we are assuming to be performing some modifications on <a href="http://www.w3schools.com">http://www.w3schools.com</a> by removing all javascript from the pages. The specifics for this content filtering proxy are left out for brevity and because they aren't important to the DNS component, but this is the model I'll use for example.<br><br>Authoritatively:<br><br>$ dig +short ns <a href="http://w3schools.com">w3schools.com</a><br><a href="http://ns2.maximumasp.com">ns2.maximumasp.com</a>.<br><a href="http://ns1.maximumasp.com">ns1.maximumasp.com</a>.<br>$ dig +short soa <a href="http://w3schools.com">w3schools.com</a><br><a href="http://ns1.maximumasp.com">ns1.maximumasp.com</a>. <a href="http://admin.maximumasp.com">admin.maximumasp.com</a>. 2005122568 7200 600 1209600 3600<br>$ host <a href="http://www.w3schools.com">www.w3schools.com</a><br><a href="http://www.w3schools.com">www.w3schools.com</a> is an alias for <a href="http://cs837.wac.edgecastcdn.net">cs837.wac.edgecastcdn.net</a>.<br><a href="http://cs837.wac.edgecastcdn.net">cs837.wac.edgecastcdn.net</a> has address 192.229.173.207<br>$ host -t A <a href="http://w3schools.com">w3schools.com</a><br><a href="http://w3schools.com">w3schools.com</a> has address 66.29.212.110<br><br>Second, an authoritative server is set up at 1.1.1.1 for the "overridden" records using pdns-4.1.3 on CentOS 7 via <a href="http://repo.powerdns.com">repo.powerdns.com</a>. The following configuration is used:<br><br>[root@auth ~]# egrep -Ev '^[[:space:]]*(#|$)' /etc/pdns/pdns.conf<br>daemon=no<br>dnsupdate=yes<br>guardian=no<br>launch=gmysql<br>gmysql-host=localhost<br>gmysql-user=[REDACTED]<br>gmysql-dbname=[REDACTED]<br>gmysql-password=[REDACTED]<br>local-address-nonexist-fail=no<br>resolver=8.8.8.8<br>setgid=pdns<br>setuid=pdns<br>version-string=anonymous<br><br>(NOTE: Not shown are log settings, as they're only currently set for debugging)<br><br>With the following records (apologies for display mangling):<br><br>[root@auth ~]# mysql -e "SELECT * FROM records" [REDACTED]<br>+----+-----------+-------------------+------+--------------------------------------------------------------------------+------+------+-------------+----------+-----------+------+<br>| id | domain_id | name              | type | content                                                                  | ttl  | prio | change_date | disabled | ordername | auth |<br>+----+-----------+-------------------+------+--------------------------------------------------------------------------+------+------+-------------+----------+-----------+------+<br>| 32 |         2 | <a href="http://w3schools.com">w3schools.com</a>     | SOA  | <a href="http://ns1.maximumasp.com">ns1.maximumasp.com</a> <a href="http://admin.maximumasp.com">admin.maximumasp.com</a> 2005122570 7200 600 1209600 3600 | 3600 |    0 |        NULL |        0 | NULL      |    1 |<br>| 33 |         2 | <a href="http://www.w3schools.com">www.w3schools.com</a> | A    | 1.2.3.4                                                                  | 3600 |    0 |        NULL |        0 | NULL      |    1 |<br>| 34 |         2 | <a href="http://www.w3schools.com">www.w3schools.com</a> | A    | 4.3.2.1                                                                  | 3600 |    0 |        NULL |        0 | NULL      |    1 |<br>+----+-----------+-------------------+------+--------------------------------------------------------------------------+------+------+-------------+----------+-----------+------+<br>[root@auth ~]# mysql -e "SELECT * FROM domains" [REDACTED]<br>+----+---------------+--------+------------+--------+-----------------+---------+<br>| id | name          | master | last_check | type   | notified_serial | account |<br>+----+---------------+--------+------------+--------+-----------------+---------+<br>|  2 | <a href="http://w3schools.com">w3schools.com</a> |        |       NULL | NATIVE |            NULL |         |<br>+----+---------------+--------+------------+--------+-----------------+---------+<br><br><br>Third, a recursor (pdns-recursor-4.1.3 on CentOS 7 via <a href="http://repo.powerdns.com">repo.powerdns.com</a>) is set up at 1.1.1.2 and client machines would be configured to use this as their resolver.<br>Configuration:<br><br>[root@resolver ~]# egrep -Ev '^[[:space:]]*(#|$)' /etc/pdns-recursor/recursor.conf<br>setuid=pdns-recursor<br>setgid=pdns-recursor<br>disable-packetcache=yes<br>forward-zones=.=1.1.1.1;8.8.8.8<br>local-address=0.0.0.0<br><br>(NOTE: Not shown are very low TTL settings and log settings, as they're only currently set for debugging)<br><br><br>THE TL;DR:<br><br>I need to be able to query 1.1.1.2 for <a href="http://www.w3schools.com">www.w3schools.com</a> and get a round-robin reply of 1.2.3.4 and 4.3.2.1 instead of the CNAME record "<a href="http://cs837.wac.edgecastcdn.net">cs837.wac.edgecastcdn.net</a>" (per above).<br><br>However, I need to *also* be able to query 1.1.1.2 for, say, <a href="http://w3schools.com">w3schools.com</a> (i.e. the "naked" domain) and have it return the response from the actual authoritative nameservers (or, more accurately/ideally, the root nameservers) (e.g. per above, 66.29.212.110). Or any other domain (e.g. <a href="http://google.com">google.com</a>, etc.) and have it return the record as resolved by either 1.1.1.1 or 1.1.1.2.<br><br>When the SOA record above is disabled, the "naked" domain is returned fine - *but* the record returned for <a href="http://www.w3schools.com">www.w3schools.com</a> is a CNAME to <a href="http://cs837.wac.edgecastcdn.net">cs837.wac.edgecastcdn.net</a> (in other words, as it is "upstream").<br><br>Is there a way to have, say, the recursor query 8.8.8.8 if 1.1.1.1 returns an NXDOMAIN for a record? Or the auth return a record from 8.8.8.8 if it doesn't find the record in its DB?</div>