Highly-opinionated (ex-bullshit-free) MTPROTO proxy for Telegram. If you use v1.0 or upgrade broke you proxy, please read the chapter Version 2
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

server.go 4.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. package server
  2. import (
  3. "context"
  4. "fmt"
  5. "net"
  6. "strconv"
  7. "sync"
  8. "github.com/9seconds/mtg/obfuscated2"
  9. "github.com/juju/errors"
  10. uuid "github.com/satori/go.uuid"
  11. "go.uber.org/zap"
  12. )
  13. type Server struct {
  14. ip net.IP
  15. port int
  16. secret []byte
  17. logger *zap.SugaredLogger
  18. lsock net.Listener
  19. ctx context.Context
  20. }
  21. func (s *Server) Serve() error {
  22. lsock, err := net.Listen("tcp", s.Addr())
  23. if err != nil {
  24. return errors.Annotate(err, "Cannot create listen socket")
  25. }
  26. for {
  27. if conn, err := lsock.Accept(); err != nil {
  28. s.logger.Warn("Cannot allocate incoming connection", "error", err)
  29. } else {
  30. go s.accept(conn)
  31. }
  32. }
  33. return nil
  34. }
  35. func (s *Server) Addr() string {
  36. return net.JoinHostPort(s.ip.String(), strconv.Itoa(s.port))
  37. }
  38. func (s *Server) accept(conn net.Conn) {
  39. defer conn.Close()
  40. ctx, cancel := context.WithCancel(context.Background())
  41. socketID := s.makeSocketID()
  42. s.logger.Debugw("Client connected",
  43. "secret", s.secret,
  44. "addr", conn.RemoteAddr().String(),
  45. "socketid", socketID,
  46. )
  47. clientConn, dc, err := s.getClientStream(conn, ctx, cancel, socketID)
  48. if err != nil {
  49. s.logger.Warnw("Cannot initialize client connection",
  50. "secret", s.secret,
  51. "addr", conn.RemoteAddr().String(),
  52. "socketid", socketID,
  53. "error", err,
  54. )
  55. return
  56. }
  57. defer clientConn.Close()
  58. tgConn, err := s.getTelegramStream(dc, ctx, cancel, socketID)
  59. if err != nil {
  60. s.logger.Warnw("Cannot initialize Telegram connection",
  61. "socketid", socketID,
  62. "error", err,
  63. )
  64. return
  65. }
  66. defer tgConn.Close()
  67. wait := &sync.WaitGroup{}
  68. wait.Add(2)
  69. go func() {
  70. defer wait.Done()
  71. buf := make([]byte, 128)
  72. for {
  73. fmt.Println("client loop")
  74. n, err := clientConn.Read(buf)
  75. if err != nil {
  76. fmt.Println("client read error", err)
  77. return
  78. }
  79. _, err = tgConn.Write(buf[:n])
  80. if err != nil {
  81. fmt.Println("tgConn write error", err)
  82. return
  83. }
  84. }
  85. }()
  86. go func() {
  87. defer wait.Done()
  88. buf := make([]byte, 128)
  89. for {
  90. fmt.Println("tg loop")
  91. n, err := tgConn.Read(buf)
  92. if err != nil {
  93. fmt.Println("tgConn read error", err)
  94. return
  95. }
  96. _, err = clientConn.Write(buf[:n])
  97. if err != nil {
  98. fmt.Println("client write error", err)
  99. return
  100. }
  101. }
  102. }()
  103. <-ctx.Done()
  104. wait.Wait()
  105. s.logger.Debugw("Client disconnected",
  106. "secret", s.secret,
  107. "addr", conn.RemoteAddr().String(),
  108. "socketid", socketID,
  109. )
  110. }
  111. func (s *Server) makeSocketID() string {
  112. return uuid.NewV4().String()
  113. }
  114. func (s *Server) getClientStream(conn net.Conn, ctx context.Context, cancel context.CancelFunc, socketID string) (*CipherReadWriteCloser, int16, error) {
  115. frame, err := obfuscated2.ExtractFrame(conn)
  116. if err != nil {
  117. return nil, 0, errors.Annotate(err, "Cannot create client stream")
  118. }
  119. obfs2, dc, err := obfuscated2.ParseObfuscated2ClientFrame(s.secret, frame)
  120. if err != nil {
  121. return nil, 0, errors.Annotate(err, "Cannot create client stream")
  122. }
  123. wConn := newCipherReadWriteCloser(conn, obfs2)
  124. return wConn, dc, nil
  125. // cipherConn := newCipherReadWriteCloser(conn, obfs2)
  126. // ctxConn := newCtxReadWriteCloser(cipherConn, ctx, cancel)
  127. // // logConn := newLogReadWriteCloser(ctxConn, s.logger, socketID, "client")
  128. // return ctxConn, dc, nil
  129. }
  130. func (s *Server) getTelegramStream(dc int16, ctx context.Context, cancel context.CancelFunc, socketID string) (*CipherReadWriteCloser, error) {
  131. socket, err := dialToTelegram(dc)
  132. if err != nil {
  133. return nil, errors.Annotate(err, "Cannot dial")
  134. }
  135. obfs2, frame := obfuscated2.MakeTelegramObfuscated2Frame()
  136. if n, err := socket.Write(frame); err != nil || n != len(frame) {
  137. return nil, errors.Annotate(err, "Cannot write hadnshake frame")
  138. }
  139. wConn := newCipherReadWriteCloser(socket, obfs2)
  140. return wConn, nil
  141. // cipherConn := newCipherReadWriteCloser(socket, obfs2)
  142. // ctxConn := newCtxReadWriteCloser(cipherConn, ctx, cancel)
  143. // logConn := newLogReadWriteCloser(ctxConn, s.logger, socketID, "telegram")
  144. // return logConn, nil
  145. }
  146. func NewServer(ip net.IP, port int, secret []byte, logger *zap.SugaredLogger) *Server {
  147. return &Server{
  148. ip: ip,
  149. port: port,
  150. secret: secret,
  151. ctx: context.Background(),
  152. logger: logger,
  153. }
  154. }