Skip to content

Commit 5861d00

Browse files
committed
dnscrypt: namespace-aware dialer during certs, relays setup
1 parent bddb65b commit 5861d00

File tree

2 files changed

+34
-23
lines changed

2 files changed

+34
-23
lines changed

intra/dnscrypt/certs.go

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import (
2222
"strings"
2323
"time"
2424

25+
"github.com/celzero/firestack/intra/dialers"
2526
"github.com/celzero/firestack/intra/log"
2627
"github.com/miekg/dns"
2728
"golang.org/x/crypto/ed25519"
@@ -287,12 +288,9 @@ func _dnsExchange(proxy *DcMulti, proto string, query *dns.Msg, serverAddress st
287288
if err != nil {
288289
return dnsExchangeResponse{err: err}
289290
}
290-
upstreamAddr, err := net.ResolveUDPAddr("udp", serverAddress)
291-
if err != nil {
292-
return dnsExchangeResponse{err: err}
293-
}
291+
294292
now := time.Now()
295-
pc, err := proxy.dialer.DialUDP("udp", nil, upstreamAddr)
293+
pc, err := dialers.Dial(proxy.dialer, "udp", serverAddress)
296294
if err != nil {
297295
return dnsExchangeResponse{err: err}
298296
}
@@ -315,11 +313,6 @@ func _dnsExchange(proxy *DcMulti, proto string, query *dns.Msg, serverAddress st
315313
if err != nil {
316314
return dnsExchangeResponse{err: err}
317315
}
318-
tcpAddr, err := net.ResolveTCPAddr("tcp", serverAddress)
319-
if err != nil {
320-
return dnsExchangeResponse{err: err}
321-
}
322-
upstreamAddr := tcpAddr
323316
// FIXME: for time-being, tcp validation is used only
324317
// when relay addresses are nil. Uncomment the code
325318
// below when udp transport for dnscrypt-proxy is ready.
@@ -331,7 +324,7 @@ func _dnsExchange(proxy *DcMulti, proto string, query *dns.Msg, serverAddress st
331324
*/
332325
now := time.Now()
333326
var pc net.Conn
334-
pc, err = proxy.dialer.DialTCP("tcp", nil, upstreamAddr)
327+
pc, err = dialers.Dial(proxy.dialer, "tcp", serverAddress)
335328
if err != nil {
336329
return dnsExchangeResponse{err: err}
337330
}

intra/dnscrypt/servers.go

Lines changed: 30 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,13 @@ import (
2020
"fmt"
2121
"math/rand"
2222
"net"
23+
"net/netip"
24+
"strconv"
2325
"strings"
2426
"sync"
2527

2628
"github.com/celzero/firestack/intra/core"
29+
"github.com/celzero/firestack/intra/dialers"
2730
"github.com/celzero/firestack/intra/dnsx"
2831
"github.com/celzero/firestack/intra/ipn"
2932
"github.com/celzero/firestack/intra/log"
@@ -232,7 +235,7 @@ func fetchDoHServerInfo(proxy *DcMulti, name string, stamp stamps.ServerStamp) (
232235
func route(proxy *DcMulti, name string) (udpaddr *net.UDPAddr, tcpaddr *net.TCPAddr, err error) {
233236
relayNames := proxy.routes
234237
if relayNames == nil {
235-
log.I("dnscrypt: No relay routes found.")
238+
err = errors.New("dnscrypt: no relay routes")
236239
return
237240
}
238241

@@ -243,32 +246,47 @@ func route(proxy *DcMulti, name string) (udpaddr *net.UDPAddr, tcpaddr *net.TCPA
243246
}
244247
var relayCandidateStamp *stamps.ServerStamp
245248
if len(relayName) == 0 {
246-
err = fmt.Errorf("route declared for [%v] but an empty relay list", name)
249+
err = fmt.Errorf("route declared for [%s] but no relays", name)
247250
return
248251
} else if relayStamp, err := stamps.NewServerStampFromString(relayName); err == nil {
249252
relayCandidateStamp = &relayStamp
250-
} else if _, err := net.ResolveTCPAddr("tcp", relayName); err == nil {
253+
} else {
251254
relayCandidateStamp = &stamps.ServerStamp{
252-
ServerAddrStr: relayName,
255+
ServerAddrStr: relayName, // may be a hostname or ip-address
253256
Proto: stamps.StampProtoTypeDNSCryptRelay,
254257
}
255258
}
256-
if relayCandidateStamp == nil {
257-
err = fmt.Errorf("undefined relay [%v] for server [%v]", relayName, name)
258-
return
259-
}
259+
260+
s, p := hostport(relayCandidateStamp.ServerAddrStr)
260261
if relayCandidateStamp.Proto == stamps.StampProtoTypeDNSCrypt ||
261262
relayCandidateStamp.Proto == stamps.StampProtoTypeDNSCryptRelay {
262-
tcpaddr, err = net.ResolveTCPAddr("tcp", relayCandidateStamp.ServerAddrStr)
263-
if err == nil {
264-
udpaddr, err = net.ResolveUDPAddr("udp", relayCandidateStamp.ServerAddrStr)
263+
if ips := dialers.For(s); len(ips) > 0 {
264+
ipp := netip.AddrPortFrom(ips[0], p)
265+
tcpaddr = net.TCPAddrFromAddrPort(ipp)
266+
udpaddr = net.UDPAddrFromAddrPort(ipp)
267+
} else {
268+
err = fmt.Errorf("zero ips for relay [%s@%s] for server [%s]", relayName, s, name)
265269
}
266270
} else {
267-
err = fmt.Errorf("invalid relay [%v] for server [%v]", relayName, name)
271+
err = fmt.Errorf("invalid relay [%s] for server [%s]", relayName, name)
268272
}
269273
return
270274
}
271275

276+
func hostport(x string) (string, uint16) {
277+
s, port, err := net.SplitHostPort(x)
278+
if err != nil || len(port) <= 0 {
279+
log.W("dnscrypt: host-port og(%s); err? %v", x, err)
280+
s = x
281+
port = "443" // use default port
282+
}
283+
p, err := strconv.Atoi(port)
284+
if err != nil {
285+
p = 443 // use default port
286+
}
287+
return s, uint16(p)
288+
}
289+
272290
func (s *ServerInfo) String() string {
273291
serverid := s.ID()
274292
servername := s.GetAddr()

0 commit comments

Comments
 (0)