Routing local requests directly to server instead of cloudflare tunnel
Hey everyone,
I wanted to ask for some help regarding my DNS setup and for routing requests to my selfhosted services.
Currently I use Pi-Hole as a DNS server with my routers default DNS server as the upstream server. This allowed me to define local DNS entries using Pi-hole and route my requests to these domains directly to my local services. For example I bought a domain a while ago and in preparation for setting it up, I had it entered as a local DNS entry pointing directly to my servers IP address.
Earlier today I finally got around to setting up a cloudflare tunnel to expose one of my services to the outside world using the domain I bought. Ever since I did that, all requests to that domain seem to exit my home network, go through cloudflares network and then return through the tunnel, even though I have a local DNS entry for that domain name.
What I would prefer is for the request to be routed directly to my server instead, since I am in the same network already. Since my DNS server is the Pi-Hole, I figured this should happen automatically.
Is there an issue with my Pi-Hole setup?
If there is any information missing I'll be happy to provide it. I wasn't sure what information I could safely post here.
Solution
I think I managed to fix the problem. After enabling the option Never forward reverse lookups for private IP ranges in Pi-Hole and clearing my DNS cache again, nslookup only returns local IP addresses instead of the IPv6 address of two cloudflare servers.
Ah that makes sense, if your server has an IPv6 address you could add another A record in Pihole for that. But it sounds like clearing the cache and stuff solved it.
In my config, the requests asking for my own servers from the internal network get answered the local address 192.something, and so they cannot get routed 'outside'.
When asking from the outside, I do not answer it, so they get the public address from a public DNS.
Thanks for your reply. I think I managed to solve this issue and have updated my post to reflect this. Apparently I had a setting disabled in Pi-Hole which caused my DNS requests to be forwarded upstream for some reason, even though there existed a local DNS entry.
I have the (more or less) same setup. Your DNS entries on your pihole instance should point to the local ip of your server (192.168.x.x).
If thats the case check the dns settings of your router. Under DHCP settings there should be a input field for your dns server. This has to be the local IP of your pihole.
One thing you could do to start diagnosing the Problem is running this command: nslookup servicename.yourdomain.tld. This should return your local IP and not a public one.
How do you determine that the requests are leaving your Network?
When I use tracert I can see the package going through a server in Frankfurt which is definetely outside of my local network. The final IP address that tracert shows me is from a cloudflare server in california (2606:4700:3033::ac43:b10f) according to this site: https://whatismyipaddress.com/ip-lookup
Using nslookup for my domain I get 3 addresses. The first two are cloudflare addresses in the US. The final one is my servers local IP address.
Pihole seems to upstream your requests although there is a local entry for that domain in your settings.
Maybe it has something to do with using IPv6?
Maybe your device prefers the cloudflare IPv6 over your local IPv4 address.
Or Maybe your device queries your pihole as well as your Router to get the IP.
Check your current dns server on your device: ipconfig /all (Windows)
Split DNS is a huge source of headaches. Be really sure that this is the route you want to go. It can easily lead to really weird situations and hard to diagnose errors.
Do you have a better alternative you can recommend? My upload rate isn't all that good so I would like to avoid having more traffic than necessary leaving my network if the target is within my network anyway.
I’m going to get stoned for suggesting this in this community, but if your upstream is poor you should consider hosting it outside. Of course this depends on many things.
The most obvious solution is to have an alias for both ways to actress the service, and configure the service accordingly. It needs a bit of care to set up reverse proxies and certificates and everything but it makes it clear whether you want to connect to the inside or the outside version. Obviously this means that it won’t switch automatically when your connection changes, but that is a feature.
Another option is to keep doing what you’re doing and just is the tunnel.
The final way is just to keep it inside and use something like zero tier or tailscale.