server_udp.go 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. package socks
  2. import (
  3. "v2ray.com/core/common/buf"
  4. "v2ray.com/core/common/log"
  5. v2net "v2ray.com/core/common/net"
  6. "v2ray.com/core/proxy"
  7. "v2ray.com/core/proxy/socks/protocol"
  8. "v2ray.com/core/transport/internet/udp"
  9. )
  10. func (v *Server) listenUDP() error {
  11. v.udpServer = udp.NewServer(v.packetDispatcher)
  12. udpHub, err := udp.ListenUDP(v.meta.Address, v.meta.Port, udp.ListenOption{Callback: v.handleUDPPayload})
  13. if err != nil {
  14. log.Error("Socks: Failed to listen on udp (", v.meta.Address, ":", v.meta.Port, "): ", err)
  15. return err
  16. }
  17. v.udpMutex.Lock()
  18. v.udpAddress = v2net.UDPDestination(v.config.GetNetAddress(), v.meta.Port)
  19. v.udpHub = udpHub
  20. v.udpMutex.Unlock()
  21. return nil
  22. }
  23. func (v *Server) handleUDPPayload(payload *buf.Buffer, session *proxy.SessionInfo) {
  24. source := session.Source
  25. log.Info("Socks: Client UDP connection from ", source)
  26. request, err := protocol.ReadUDPRequest(payload.Bytes())
  27. payload.Release()
  28. if err != nil {
  29. log.Error("Socks: Failed to parse UDP request: ", err)
  30. return
  31. }
  32. if request.Data.Len() == 0 {
  33. request.Data.Release()
  34. return
  35. }
  36. if request.Fragment != 0 {
  37. log.Warning("Socks: Dropping fragmented UDP packets.")
  38. // TODO handle fragments
  39. request.Data.Release()
  40. return
  41. }
  42. log.Info("Socks: Send packet to ", request.Destination(), " with ", request.Data.Len(), " bytes")
  43. log.Access(source, request.Destination, log.AccessAccepted, "")
  44. v.udpServer.Dispatch(&proxy.SessionInfo{Source: source, Destination: request.Destination(), Inbound: v.meta}, request.Data, func(destination v2net.Destination, payload *buf.Buffer) {
  45. response := &protocol.Socks5UDPRequest{
  46. Fragment: 0,
  47. Address: request.Destination().Address,
  48. Port: request.Destination().Port,
  49. Data: payload,
  50. }
  51. log.Info("Socks: Writing back UDP response with ", payload.Len(), " bytes to ", destination)
  52. udpMessage := buf.NewLocal(2048)
  53. response.Write(udpMessage)
  54. v.udpMutex.RLock()
  55. if !v.accepting {
  56. v.udpMutex.RUnlock()
  57. return
  58. }
  59. nBytes, err := v.udpHub.WriteTo(udpMessage.Bytes(), destination)
  60. v.udpMutex.RUnlock()
  61. udpMessage.Release()
  62. response.Data.Release()
  63. if err != nil {
  64. log.Error("Socks: failed to write UDP message (", nBytes, " bytes) to ", destination, ": ", err)
  65. }
  66. })
  67. }