I've had a setup for a while that worked quite well - I don't know if it's the *best* way - but I thought it was correct.  I have a single physical server with some virtual servers I turn up/down as needed.

pdns-auth on my server provides both my internal lan & external public zones - bound to a private & port. pdns-recursor is exposed to the Internet and provides services to the LAN via port 53.  The recursor is pointed to the auth via forward-zones.

To provide split-horizon type records for public names of LAN hosts to LAN clients I've had a simple lua script:

lanDomains = newDS()
lanDomains:add(dofile("/etc/powerdns/lanDomains"))
function preresolve(dq)
    if(dq.qtype==pdns.A and lanDomains:check(dq.qname)) then
        dq:addAnswer(pdns.A,"192.168.0.4")
        return true
    end
    return false
end

and then lanDomains just has

        return{"domain1.com","domain2.com","domain3.com",...}

for each of my public domains that are provided by my internal host - all services are on 192.168.0.4.

This works - and I always welcome ideas for improvement but the above isn't my question - merely my preamble.

I'm in the process of migrating to another server - and I'm moving individual services so both servers will be operational during the transition.  What I've come up with is:

function preresolve(dq)
    if(dq.qtype==pdns.A and lanDomains:check(dq.qname)) then
        if(dq.qname:equal("smtp.domain1.com") or 
dq.qname:equal("imap.domain2.com")) then
            dq:addAnswer(pdns.A,"192.168.0.4")
        else
            dq:addAnswer(pdns.A,"192.168.0.6")
        end
        return true
    end
return false

This works but I don't like it.  But I don't see a method where I can have a list similar to my lanDomains file and test against it in one operation.  Unless...would the newDS() construct be valid if my file "oldServer" contained:

return{"oldhost.smtp.domain.com","oldhost.imap.domain.com",...}

So...would this mean each of the "real" hostnames like "smtp.domain.com" would strip the leading bogus name off for the test?  So now instead of an extended

    if(dq.qname:equal("oldservice.domain1.com") or dq.qname:equal(...) or ...)

I could simply write

function preresolve(dq)
    if(dq.qtype==pdns.A and lanDomains:check(dq.qname)) then
        if(oldServer:check(dq.qname)) then
            dq:addAnswer(pdns.A,"192.168.0.4")
        else
            dq:addAnswer(pdns.A,"192.168.0.6")
        end
        return true
    end
return false

Would this be a "correct" setup for this process?

--
Daniel

_______________________________________________
Pdns-users mailing list
[email protected]
https://mailman.powerdns.com/mailman/listinfo/pdns-users

Reply via email to