vmessin.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. package vmess
  2. import (
  3. "crypto/md5"
  4. "io"
  5. "net"
  6. "strconv"
  7. "github.com/v2ray/v2ray-core"
  8. v2io "github.com/v2ray/v2ray-core/io"
  9. vmessio "github.com/v2ray/v2ray-core/io/vmess"
  10. "github.com/v2ray/v2ray-core/log"
  11. )
  12. type VMessInboundHandler struct {
  13. vPoint *core.VPoint
  14. clients *core.VUserSet
  15. accepting bool
  16. }
  17. func NewVMessInboundHandler(vp *core.VPoint, clients *core.VUserSet) *VMessInboundHandler {
  18. handler := new(VMessInboundHandler)
  19. handler.vPoint = vp
  20. handler.clients = clients
  21. return handler
  22. }
  23. func (handler *VMessInboundHandler) Listen(port uint16) error {
  24. listener, err := net.Listen("tcp", ":"+strconv.Itoa(int(port)))
  25. if err != nil {
  26. return log.Error("Unable to listen tcp:%d", port)
  27. }
  28. handler.accepting = true
  29. go handler.AcceptConnections(listener)
  30. return nil
  31. }
  32. func (handler *VMessInboundHandler) AcceptConnections(listener net.Listener) error {
  33. for handler.accepting {
  34. connection, err := listener.Accept()
  35. if err != nil {
  36. return log.Error("Failed to accpet connection: %s", err.Error())
  37. }
  38. go handler.HandleConnection(connection)
  39. }
  40. return nil
  41. }
  42. func (handler *VMessInboundHandler) HandleConnection(connection net.Conn) error {
  43. defer connection.Close()
  44. reader := vmessio.NewVMessRequestReader(handler.clients)
  45. request, err := reader.Read(connection)
  46. if err != nil {
  47. return err
  48. }
  49. log.Debug("Received request for %s", request.Address.String())
  50. response := vmessio.NewVMessResponse(request)
  51. nBytes, err := connection.Write(response[:])
  52. log.Debug("Writing VMess response %v", response)
  53. if err != nil {
  54. return log.Error("Failed to write VMess response (%d bytes): %v", nBytes, err)
  55. }
  56. requestKey := request.RequestKey[:]
  57. requestIV := request.RequestIV[:]
  58. responseKey := md5.Sum(requestKey)
  59. responseIV := md5.Sum(requestIV)
  60. requestReader, err := v2io.NewAesDecryptReader(requestKey, requestIV, connection)
  61. if err != nil {
  62. return log.Error("Failed to create decrypt reader: %v", err)
  63. }
  64. responseWriter, err := v2io.NewAesEncryptWriter(responseKey[:], responseIV[:], connection)
  65. if err != nil {
  66. return log.Error("Failed to create encrypt writer: %v", err)
  67. }
  68. ray := handler.vPoint.NewInboundConnectionAccepted(request.Address)
  69. input := ray.InboundInput()
  70. output := ray.InboundOutput()
  71. finish := make(chan bool, 2)
  72. go handler.dumpInput(requestReader, input, finish)
  73. go handler.dumpOutput(responseWriter, output, finish)
  74. handler.waitForFinish(finish)
  75. return nil
  76. }
  77. func (handler *VMessInboundHandler) dumpInput(reader io.Reader, input chan<- []byte, finish chan<- bool) {
  78. for {
  79. buffer := make([]byte, BufferSize)
  80. nBytes, err := reader.Read(buffer)
  81. log.Debug("VMessInbound: Reading %d bytes with error %v", nBytes, err)
  82. if err == io.EOF {
  83. close(input)
  84. log.Debug("VMessInbound finishing input.")
  85. finish <- true
  86. break
  87. }
  88. input <- buffer[:nBytes]
  89. }
  90. }
  91. func (handler *VMessInboundHandler) dumpOutput(writer io.Writer, output <-chan []byte, finish chan<- bool) {
  92. for {
  93. buffer, open := <-output
  94. if !open {
  95. finish <- true
  96. log.Debug("VMessInbound finishing output.")
  97. break
  98. }
  99. nBytes, err := writer.Write(buffer)
  100. log.Debug("VmessInbound: Wrote %d bytes with error %v", nBytes, err)
  101. }
  102. }
  103. func (handler *VMessInboundHandler) waitForFinish(finish <-chan bool) {
  104. for i := 0; i < 2; i++ {
  105. <-finish
  106. }
  107. }
  108. type VMessInboundHandlerFactory struct {
  109. }
  110. func (factory *VMessInboundHandlerFactory) Create(vp *core.VPoint, rawConfig []byte) (core.InboundConnectionHandler, error) {
  111. config, err := loadInboundConfig(rawConfig)
  112. if err != nil {
  113. panic(log.Error("Failed to load VMess inbound config: %v", err))
  114. }
  115. allowedClients := core.NewVUserSet()
  116. for _, client := range config.AllowedClients {
  117. user, err := client.ToVUser()
  118. if err != nil {
  119. panic(log.Error("Failed to parse user id %s: %v", client.Id, err))
  120. }
  121. allowedClients.AddUser(user)
  122. }
  123. return NewVMessInboundHandler(vp, allowedClients), nil
  124. }
  125. func init() {
  126. core.RegisterInboundConnectionHandlerFactory("vmess", &VMessInboundHandlerFactory{})
  127. }