Skip to content

Commit bb3304e

Browse files
author
null
committed
resolvers
1 parent 8142bb1 commit bb3304e

5 files changed

Lines changed: 44 additions & 49 deletions

File tree

infra/conf/transport_internet.go

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1660,18 +1660,12 @@ func (c *Sudoku) Build() (proto.Message, error) {
16601660
}
16611661

16621662
type Xdns struct {
1663-
Domain string `json:"domain"`
16641663
Domains []string `json:"domains"`
16651664
Resolvers []string `json:"resolvers"`
16661665
}
16671666

16681667
func (c *Xdns) Build() (proto.Message, error) {
1669-
if c.Domain == "" && len(c.Domains) == 0 {
1670-
return nil, errors.New("empty domain")
1671-
}
1672-
16731668
return &xdns.Config{
1674-
Domain: c.Domain,
16751669
Domains: c.Domains,
16761670
Resolvers: c.Resolvers,
16771671
}, nil

transport/internet/finalmask/xdns/client.go

Lines changed: 30 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"io"
1111
"net"
1212
"strconv"
13+
"strings"
1314
"sync"
1415
"sync/atomic"
1516
"time"
@@ -43,7 +44,7 @@ type xdnsConnClient struct {
4344
resolverSend []atomic.Uint32
4445

4546
clientID []byte
46-
domain Name
47+
domains []Name
4748

4849
pollChan chan struct{}
4950
readQueue chan *packet
@@ -58,10 +59,25 @@ func NewConnClient(c *Config, raw net.PacketConn) (net.PacketConn, error) {
5859
return nil, errors.New("empty resolvers")
5960
}
6061

62+
var domains []Name
63+
var servers []string
64+
for _, rs := range c.Resolvers {
65+
parts := strings.Split(rs, "+udp://")
66+
if len(parts) != 2 {
67+
return nil, errors.New("invalid resolvers")
68+
}
69+
domain, err := ParseName(parts[0])
70+
if err != nil {
71+
return nil, err
72+
}
73+
domains = append(domains, domain)
74+
servers = append(servers, parts[1])
75+
}
76+
6177
var resolverConns []net.PacketConn
6278
var resolverAddrs []*net.UDPAddr
6379
var resolverSend []atomic.Uint32
64-
for _, rs := range c.Resolvers {
80+
for _, rs := range servers {
6581
h, p, err := net.SplitHostPort(rs)
6682
if err != nil {
6783
return nil, err
@@ -91,19 +107,14 @@ func NewConnClient(c *Config, raw net.PacketConn) (net.PacketConn, error) {
91107
}
92108
resolverSend = make([]atomic.Uint32, len(resolverConns))
93109

94-
domain, err := ParseName(c.Domain)
95-
if err != nil {
96-
return nil, err
97-
}
98-
99110
conn := &xdnsConnClient{
100111
conn: raw,
101112
resolverConns: resolverConns,
102113
resolverAddrs: resolverAddrs,
103114
resolverSend: resolverSend,
104115

105116
clientID: make([]byte, 8),
106-
domain: domain,
117+
domains: domains,
107118

108119
pollChan: make(chan struct{}, pollLimit),
109120
readQueue: make(chan *packet, 256),
@@ -147,7 +158,7 @@ func (c *xdnsConnClient) recvLoop() {
147158
continue
148159
}
149160

150-
payload, valid := dnsResponsePayload(&resp, c.domain)
161+
payload, valid := dnsResponsePayload(&resp, c.domains)
151162
if valid {
152163
c.resolverSend[i].Store(0)
153164
}
@@ -221,7 +232,7 @@ func (c *xdnsConnClient) sendLoop() {
221232
default:
222233
}
223234
} else {
224-
encoded, _ := encode(nil, c.clientID, c.domain)
235+
encoded, _ := encode(nil, c.clientID, c.domains[c.resolverIdx])
225236
p = &packet{
226237
p: encoded,
227238
}
@@ -281,7 +292,7 @@ func (c *xdnsConnClient) WriteTo(p []byte, addr net.Addr) (n int, err error) {
281292
return 0, io.ErrClosedPipe
282293
}
283294

284-
encoded, err := encode(p, c.clientID, c.domain)
295+
encoded, err := encode(p, c.clientID, c.domains[c.resolverIdx])
285296
if err != nil {
286297
errors.LogDebug(context.Background(), addr, " xdns wireformat err ", err, " ", len(p))
287298
return 0, nil
@@ -421,7 +432,7 @@ func nextPacket(r *bytes.Reader) ([]byte, error) {
421432
return p, err
422433
}
423434

424-
func dnsResponsePayload(resp *Message, domain Name) (payload []byte, valid bool) {
435+
func dnsResponsePayload(resp *Message, domains []Name) (payload []byte, valid bool) {
425436
payload = nil
426437
valid = false
427438

@@ -437,7 +448,13 @@ func dnsResponsePayload(resp *Message, domain Name) (payload []byte, valid bool)
437448
}
438449
answer := resp.Answer[0]
439450

440-
_, ok := answer.Name.TrimSuffix(domain)
451+
var ok bool
452+
for _, domain := range domains {
453+
_, ok = answer.Name.TrimSuffix(domain)
454+
if ok {
455+
break
456+
}
457+
}
441458
if !ok {
442459
return
443460
}

transport/internet/finalmask/xdns/config.pb.go

Lines changed: 6 additions & 15 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

transport/internet/finalmask/xdns/config.proto

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@ option java_package = "com.xray.transport.internet.finalmask.xdns";
77
option java_multiple_files = true;
88

99
message Config {
10-
string domain = 1;
11-
repeated string domains = 2;
12-
repeated string resolvers = 3;
13-
}
14-
10+
repeated string domains = 1;
11+
repeated string resolvers = 2;
12+
}

transport/internet/finalmask/xdns/server.go

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -63,21 +63,16 @@ type xdnsConnServer struct {
6363
}
6464

6565
func NewConnServer(c *Config, raw net.PacketConn) (net.PacketConn, error) {
66-
domains := make([]Name, 0, len(c.Domains))
6766
if len(c.Domains) == 0 {
68-
domain, err := ParseName(c.Domain)
67+
return nil, errors.New("empty domains")
68+
}
69+
domains := make([]Name, 0, len(c.Domains))
70+
for _, domain := range c.Domains {
71+
domain, err := ParseName(domain)
6972
if err != nil {
7073
return nil, err
7174
}
7275
domains = append(domains, domain)
73-
} else {
74-
for _, domain := range c.Domains {
75-
domain, err := ParseName(domain)
76-
if err != nil {
77-
return nil, err
78-
}
79-
domains = append(domains, domain)
80-
}
8176
}
8277

8378
conn := &xdnsConnServer{

0 commit comments

Comments
 (0)