Skip to content

Commit 44b1ffe

Browse files
committed
recover from DNS problems
1 parent db47dce commit 44b1ffe

File tree

3 files changed

+43
-4
lines changed

3 files changed

+43
-4
lines changed

.vscode/launch.json

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,16 @@
5656
"env": {},
5757
"args": ["list-proxies"],
5858
"showLog": true
59+
},
60+
{
61+
"name": "Launch - dnstest",
62+
"type": "go",
63+
"request": "launch",
64+
"mode": "debug",
65+
"program": "${workspaceRoot}/test/cmd/dns/dnstest.go",
66+
"env": {},
67+
"args": [],
68+
"showLog": true
5969
}
6070
]
6171
}

proxy/dnsproxy.go

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,21 +56,27 @@ func makeTargetAddr(parameters string) (target string, err error) {
5656
}
5757

5858
func newDNSProxy(parameters string) (Proxy, error) {
59-
target, err := makeTargetAddr(parameters)
59+
port, err := getFreeUDPPort()
6060
if err != nil {
6161
return nil, err
6262
}
6363

64-
fmt.Fprintln(os.Stderr, "newDNSProxy:", target)
65-
port, err := getFreeUDPPort()
64+
return NewDNSProxy(nil, port, parameters)
65+
}
66+
67+
func NewDNSProxy(dialer dialer.Dialer, port int, parameters string) (Proxy, error) {
68+
target, err := makeTargetAddr(parameters)
6669
if err != nil {
6770
return nil, err
6871
}
6972

73+
fmt.Fprintln(os.Stderr, "newDNSProxy:", target)
74+
7075
listenAddr := fmt.Sprintf("127.0.0.1:%d", port)
7176

7277
proxy := &dnsProxy{}
7378
proxy.Port = port
79+
proxy.Dialer = dialer
7480
go forwardDNS(listenAddr, target)
7581
return proxy, nil
7682
}
@@ -79,6 +85,11 @@ func forwardDNS(listenAddr, targetAddr string) error {
7985
fmt.Printf("Forward DNS requests to: %s\n", targetAddr)
8086

8187
dns.HandleFunc(".", func(w dns.ResponseWriter, r *dns.Msg) {
88+
defer func() {
89+
if err := recover(); err != nil {
90+
fmt.Println("panic occurred:", err)
91+
}
92+
}()
8293
switch r.Opcode {
8394
case dns.OpcodeQuery:
8495
dnsClient := new(dns.Client)
@@ -95,7 +106,11 @@ func forwardDNS(listenAddr, targetAddr string) error {
95106
}
96107
})
97108
server := &dns.Server{Addr: listenAddr, Net: "udp"}
98-
return server.ListenAndServe()
109+
err := server.ListenAndServe()
110+
if err != nil {
111+
panic(err)
112+
}
113+
return nil
99114
}
100115

101116
// cSpell: ignore miekg

test/cmd/dns/dnstest.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package main
2+
3+
import (
4+
"net"
5+
"time"
6+
7+
"github.com/dueckminor/go-sshtunnel/proxy"
8+
)
9+
10+
func main() {
11+
proxy.NewDNSProxy(&net.Dialer{}, 1053, "192.168.0.1:53")
12+
13+
time.Sleep(time.Minute * 5)
14+
}

0 commit comments

Comments
 (0)