@@ -12,6 +12,8 @@ import (
1212 "strings"
1313 "syscall"
1414 "time"
15+ "bufio"
16+ "net"
1517
1618 "github.com/rajsinghtech/tsdnsproxy/internal/backend"
1719 "github.com/rajsinghtech/tsdnsproxy/internal/cache"
@@ -31,6 +33,49 @@ func envOr(key, defaultVal string) string {
3133 return defaultVal
3234}
3335
36+ func getHostDNSServers () []string {
37+ var servers []string
38+
39+ // Try to read from /etc/resolv.conf (Linux/Unix)
40+ if file , err := os .Open ("/etc/resolv.conf" ); err == nil {
41+ defer file .Close ()
42+ scanner := bufio .NewScanner (file )
43+ for scanner .Scan () {
44+ line := strings .TrimSpace (scanner .Text ())
45+ if strings .HasPrefix (line , "nameserver " ) {
46+ server := strings .TrimSpace (strings .TrimPrefix (line , "nameserver" ))
47+ // Add port if not specified
48+ if ! strings .Contains (server , ":" ) {
49+ server += ":53"
50+ }
51+ servers = append (servers , server )
52+ }
53+ }
54+ if len (servers ) > 0 {
55+ return servers
56+ }
57+ }
58+
59+ // Fallback to system DNS resolution
60+ config , err := net .DefaultResolver .LookupNS (context .Background (), "." )
61+ if err == nil && len (config ) > 0 {
62+ for _ , ns := range config {
63+ if ! strings .Contains (ns .Host , ":" ) {
64+ servers = append (servers , ns .Host + ":53" )
65+ } else {
66+ servers = append (servers , ns .Host )
67+ }
68+ }
69+ if len (servers ) > 0 {
70+ return servers
71+ }
72+ }
73+
74+ // Final fallback to common public DNS
75+ log .Println ("warning: could not determine host DNS servers, falling back to 8.8.8.8:53" )
76+ return []string {"8.8.8.8:53" }
77+ }
78+
3479func retryWithBackoff (ctx context.Context , maxRetries int , fn func () error ) error {
3580 return retry (ctx , maxRetries , time .Second , func (i int ) time.Duration {
3681 return time .Duration (1 << uint (i )) * time .Second
@@ -73,7 +118,7 @@ func main() {
73118 stateDir = flag .String ("statedir" , envOr ("TSDNSPROXY_STATE_DIR" , "/var/lib/tsdnsproxy" ), "state directory" )
74119 state = flag .String ("state" , os .Getenv ("TSDNSPROXY_STATE" ), "state storage (e.g., kube:<secret-name>)" )
75120 controlURL = flag .String ("controlurl" , os .Getenv ("TS_CONTROLURL" ), "optional alternate control server URL" )
76- defaultDNS = flag .String ("default -dns" , envOr ("TSDNSPROXY_DEFAULT_DNS " , "" ), "default DNS servers (comma-separated)" )
121+ overrideDNS = flag .String ("override -dns" , envOr ("TSDNSPROXY_OVERRIDE_DNS " , "" ), "override DNS servers (comma-separated, defaults to host resolvers )" )
77122 cacheExpiry = flag .Duration ("cache-expiry" , constants .DefaultCacheExpiry , "whois cache expiry duration" )
78123 healthAddr = flag .String ("health-addr" , envOr ("TSDNSPROXY_HEALTH_ADDR" , ":8080" ), "health check endpoint address" )
79124 listenAddrs = flag .String ("listen-addrs" , envOr ("TSDNSPROXY_LISTEN_ADDRS" , "tailscale" ), "listen addresses (comma-separated: tailscale,0.0.0.0:53,127.0.0.1:5353)" )
@@ -141,11 +186,17 @@ func main() {
141186 grantCache := cache .NewGrantCache (* cacheExpiry )
142187
143188 var defaultServers []string
144- if * defaultDNS != "" {
145- defaultServers = strings .Split (* defaultDNS , "," )
189+ if * overrideDNS != "" {
190+ // Use override DNS servers if specified
191+ defaultServers = strings .Split (* overrideDNS , "," )
146192 for i := range defaultServers {
147193 defaultServers [i ] = strings .TrimSpace (defaultServers [i ])
148194 }
195+ log .Printf ("using override DNS servers: %v" , defaultServers )
196+ } else {
197+ // Default to host's DNS resolvers
198+ defaultServers = getHostDNSServers ()
199+ log .Printf ("using host DNS servers: %v" , defaultServers )
149200 }
150201 backendMgr := backend .NewManager (defaultServers )
151202 defer backendMgr .Close ()
0 commit comments