vmessin_udp.go 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. package vmess
  2. import (
  3. "bytes"
  4. "crypto/md5"
  5. "net"
  6. v2io "github.com/v2ray/v2ray-core/common/io"
  7. "github.com/v2ray/v2ray-core/common/log"
  8. v2net "github.com/v2ray/v2ray-core/common/net"
  9. "github.com/v2ray/v2ray-core/proxy/vmess/protocol"
  10. )
  11. const (
  12. bufferSize = 2 * 1024
  13. )
  14. func (handler *VMessInboundHandler) ListenUDP(port uint16) error {
  15. addr := &net.UDPAddr{
  16. IP: net.IP{0, 0, 0, 0},
  17. Port: int(port),
  18. Zone: "",
  19. }
  20. conn, err := net.ListenUDP("udp", addr)
  21. if err != nil {
  22. log.Error("VMessIn failed to listen UDP on port %d: %v", port, err)
  23. return err
  24. }
  25. go handler.AcceptPackets(conn)
  26. return nil
  27. }
  28. func (handler *VMessInboundHandler) AcceptPackets(conn *net.UDPConn) error {
  29. for {
  30. buffer := make([]byte, 0, bufferSize)
  31. nBytes, addr, err := conn.ReadFromUDP(buffer)
  32. if err != nil {
  33. log.Error("VMessIn failed to read UDP packets: %v", err)
  34. return err
  35. }
  36. reader := bytes.NewReader(buffer[:nBytes])
  37. requestReader := protocol.NewVMessRequestReader(handler.clients)
  38. request, err := requestReader.Read(reader)
  39. if err != nil {
  40. log.Warning("VMessIn: Invalid request from (%s): %v", addr.String(), err)
  41. return err
  42. }
  43. cryptReader, err := v2io.NewAesDecryptReader(request.RequestKey[:], request.RequestIV[:], reader)
  44. if err != nil {
  45. log.Error("VMessIn: Failed to create decrypt reader: %v", err)
  46. return err
  47. }
  48. data := make([]byte, bufferSize)
  49. nBytes, err = cryptReader.Read(data)
  50. if err != nil {
  51. log.Warning("VMessIn: Unable to decrypt data: %v", err)
  52. return err
  53. }
  54. packet := v2net.NewPacket(request.Destination(), data, false)
  55. go handler.handlePacket(conn, request, packet, addr)
  56. }
  57. }
  58. func (handler *VMessInboundHandler) handlePacket(conn *net.UDPConn, request *protocol.VMessRequest, packet v2net.Packet, clientAddr *net.UDPAddr) {
  59. ray := handler.vPoint.DispatchToOutbound(packet)
  60. close(ray.InboundInput())
  61. responseKey := md5.Sum(request.RequestKey[:])
  62. responseIV := md5.Sum(request.RequestIV[:])
  63. buffer := bytes.NewBuffer(make([]byte, 0, bufferSize))
  64. response := protocol.NewVMessResponse(request)
  65. responseWriter, err := v2io.NewAesEncryptWriter(responseKey[:], responseIV[:], buffer)
  66. if err != nil {
  67. log.Error("VMessIn: Failed to create encrypt writer: %v", err)
  68. return
  69. }
  70. responseWriter.Write(response[:])
  71. hasData := false
  72. if data, ok := <-ray.InboundOutput(); ok {
  73. hasData = true
  74. responseWriter.Write(data)
  75. }
  76. if hasData {
  77. conn.WriteToUDP(buffer.Bytes(), clientAddr)
  78. }
  79. }