|
|
@@ -13,7 +13,7 @@ import (
|
|
13
|
13
|
"github.com/9seconds/mtg/v2/mtglib/internal/dc"
|
|
14
|
14
|
"github.com/9seconds/mtg/v2/mtglib/internal/faketls"
|
|
15
|
15
|
"github.com/9seconds/mtg/v2/mtglib/internal/faketls/record"
|
|
16
|
|
- "github.com/9seconds/mtg/v2/mtglib/internal/obfuscated2"
|
|
|
16
|
+ "github.com/9seconds/mtg/v2/mtglib/internal/obfuscation"
|
|
17
|
17
|
"github.com/9seconds/mtg/v2/mtglib/internal/relay"
|
|
18
|
18
|
"github.com/panjf2000/ants/v2"
|
|
19
|
19
|
)
|
|
|
@@ -29,6 +29,7 @@ type Proxy struct {
|
|
29
|
29
|
domainFrontingPort int
|
|
30
|
30
|
workerPool *ants.PoolWithFunc
|
|
31
|
31
|
telegram *dc.Telegram
|
|
|
32
|
+ clientObfuscatror obfuscation.Obfuscator
|
|
32
|
33
|
|
|
33
|
34
|
secret Secret
|
|
34
|
35
|
network Network
|
|
|
@@ -70,8 +71,8 @@ func (p *Proxy) ServeConn(conn essentials.Conn) {
|
|
70
|
71
|
return
|
|
71
|
72
|
}
|
|
72
|
73
|
|
|
73
|
|
- if err := p.doObfuscated2Handshake(ctx); err != nil {
|
|
74
|
|
- p.logger.InfoError("obfuscated2 handshake is failed", err)
|
|
|
74
|
+ if err := p.doObfuscatedHandshake(ctx); err != nil {
|
|
|
75
|
+ p.logger.InfoError("obfuscated handshake is failed", err)
|
|
75
|
76
|
|
|
76
|
77
|
return
|
|
77
|
78
|
}
|
|
|
@@ -201,19 +202,15 @@ func (p *Proxy) doFakeTLSHandshake(ctx *streamContext) bool {
|
|
201
|
202
|
return true
|
|
202
|
203
|
}
|
|
203
|
204
|
|
|
204
|
|
-func (p *Proxy) doObfuscated2Handshake(ctx *streamContext) error {
|
|
205
|
|
- dc, encryptor, decryptor, err := obfuscated2.ClientHandshake(p.secret.Key[:], ctx.clientConn)
|
|
|
205
|
+func (p *Proxy) doObfuscatedHandshake(ctx *streamContext) error {
|
|
|
206
|
+ dc, conn, err := p.clientObfuscatror.ReadHandshake(ctx.clientConn)
|
|
206
|
207
|
if err != nil {
|
|
207
|
208
|
return fmt.Errorf("cannot process client handshake: %w", err)
|
|
208
|
209
|
}
|
|
209
|
210
|
|
|
210
|
211
|
ctx.dc = dc
|
|
|
212
|
+ ctx.clientConn = conn
|
|
211
|
213
|
ctx.logger = ctx.logger.BindInt("dc", dc)
|
|
212
|
|
- ctx.clientConn = obfuscated2.Conn{
|
|
213
|
|
- Conn: ctx.clientConn,
|
|
214
|
|
- Encryptor: encryptor,
|
|
215
|
|
- Decryptor: decryptor,
|
|
216
|
|
- }
|
|
217
|
214
|
|
|
218
|
215
|
return nil
|
|
219
|
216
|
}
|
|
|
@@ -223,17 +220,22 @@ func (p *Proxy) doTelegramCall(ctx *streamContext) error {
|
|
223
|
220
|
|
|
224
|
221
|
addresses := p.telegram.GetAddresses(dcid)
|
|
225
|
222
|
if len(addresses) == 0 && p.allowFallbackOnUnknownDC {
|
|
226
|
|
- ctx.logger = ctx.logger.BindInt("fallback_dc", dc.DefaultDC)
|
|
|
223
|
+ ctx.logger = ctx.logger.BindInt("original_dc", dcid)
|
|
227
|
224
|
ctx.logger.Warning("unknown DC, fallbacks")
|
|
|
225
|
+ ctx.dc = dc.DefaultDC
|
|
228
|
226
|
addresses = p.telegram.GetAddresses(dc.DefaultDC)
|
|
229
|
227
|
}
|
|
230
|
228
|
|
|
231
|
|
- var conn essentials.Conn
|
|
232
|
|
- var err error
|
|
|
229
|
+ var (
|
|
|
230
|
+ conn essentials.Conn
|
|
|
231
|
+ err error
|
|
|
232
|
+ foundAddr dc.Addr
|
|
|
233
|
+ )
|
|
233
|
234
|
|
|
234
|
235
|
for _, addr := range addresses {
|
|
235
|
236
|
conn, err = p.network.Dial(addr.Network, addr.Address)
|
|
236
|
237
|
if err == nil {
|
|
|
238
|
+ foundAddr = addr
|
|
237
|
239
|
break
|
|
238
|
240
|
}
|
|
239
|
241
|
}
|
|
|
@@ -241,22 +243,17 @@ func (p *Proxy) doTelegramCall(ctx *streamContext) error {
|
|
241
|
243
|
return fmt.Errorf("no addresses to call: %w", err)
|
|
242
|
244
|
}
|
|
243
|
245
|
|
|
244
|
|
- encryptor, decryptor, err := obfuscated2.ServerHandshake(conn)
|
|
|
246
|
+ conn, err = foundAddr.Obfuscator.SendHandshake(conn, ctx.dc)
|
|
245
|
247
|
if err != nil {
|
|
246
|
|
- conn.Close() //nolint: errcheck
|
|
247
|
|
-
|
|
248
|
|
- return fmt.Errorf("cannot perform obfuscated2 handshake: %w", err)
|
|
|
248
|
+ conn.Close()
|
|
|
249
|
+ return fmt.Errorf("cannot perform server handshake: %w", err)
|
|
249
|
250
|
}
|
|
250
|
251
|
|
|
251
|
|
- ctx.telegramConn = obfuscated2.Conn{
|
|
252
|
|
- Conn: connTraffic{
|
|
253
|
|
- Conn: conn,
|
|
254
|
|
- streamID: ctx.streamID,
|
|
255
|
|
- stream: p.eventStream,
|
|
256
|
|
- ctx: ctx,
|
|
257
|
|
- },
|
|
258
|
|
- Encryptor: encryptor,
|
|
259
|
|
- Decryptor: decryptor,
|
|
|
252
|
+ ctx.telegramConn = connTraffic{
|
|
|
253
|
+ Conn: conn,
|
|
|
254
|
+ streamID: ctx.streamID,
|
|
|
255
|
+ stream: p.eventStream,
|
|
|
256
|
+ ctx: ctx,
|
|
260
|
257
|
}
|
|
261
|
258
|
|
|
262
|
259
|
p.eventStream.Send(ctx,
|
|
|
@@ -320,6 +317,9 @@ func NewProxy(opts ProxyOpts) (*Proxy, error) {
|
|
320
|
317
|
tolerateTimeSkewness: opts.getTolerateTimeSkewness(),
|
|
321
|
318
|
allowFallbackOnUnknownDC: opts.AllowFallbackOnUnknownDC,
|
|
322
|
319
|
telegram: tg,
|
|
|
320
|
+ clientObfuscatror: obfuscation.Obfuscator{
|
|
|
321
|
+ Secret: opts.Secret.Key[:],
|
|
|
322
|
+ },
|
|
323
|
323
|
}
|
|
324
|
324
|
|
|
325
|
325
|
pool, err := ants.NewPoolWithFunc(opts.getConcurrency(),
|