default_tcp.go 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. package inbound
  2. import (
  3. "context"
  4. "net"
  5. "github.com/sagernet/sing-box/adapter"
  6. C "github.com/sagernet/sing-box/constant"
  7. "github.com/sagernet/sing-box/log"
  8. "github.com/sagernet/sing/common/control"
  9. E "github.com/sagernet/sing/common/exceptions"
  10. M "github.com/sagernet/sing/common/metadata"
  11. N "github.com/sagernet/sing/common/network"
  12. )
  13. func (a *myInboundAdapter) ListenTCP() (net.Listener, error) {
  14. var err error
  15. bindAddr := M.SocksaddrFrom(a.listenOptions.Listen.Build(), a.listenOptions.ListenPort)
  16. var tcpListener net.Listener
  17. var listenConfig net.ListenConfig
  18. // TODO: Add an option to customize the keep alive period
  19. listenConfig.KeepAlive = C.TCPKeepAliveInitial
  20. listenConfig.Control = control.Append(listenConfig.Control, control.SetKeepAlivePeriod(C.TCPKeepAliveInitial, C.TCPKeepAliveInterval))
  21. if a.listenOptions.TCPMultiPath {
  22. if !go121Available {
  23. return nil, E.New("MultiPath TCP requires go1.21, please recompile your binary.")
  24. }
  25. setMultiPathTCP(&listenConfig)
  26. }
  27. if a.listenOptions.TCPFastOpen {
  28. if !go120Available {
  29. return nil, E.New("TCP Fast Open requires go1.20, please recompile your binary.")
  30. }
  31. tcpListener, err = listenTFO(listenConfig, a.ctx, M.NetworkFromNetAddr(N.NetworkTCP, bindAddr.Addr), bindAddr.String())
  32. } else {
  33. tcpListener, err = listenConfig.Listen(a.ctx, M.NetworkFromNetAddr(N.NetworkTCP, bindAddr.Addr), bindAddr.String())
  34. }
  35. if err == nil {
  36. a.logger.Info("tcp server started at ", tcpListener.Addr())
  37. }
  38. if a.listenOptions.ProxyProtocol || a.listenOptions.ProxyProtocolAcceptNoHeader {
  39. return nil, E.New("Proxy Protocol is deprecated and removed in sing-box 1.6.0")
  40. }
  41. a.tcpListener = tcpListener
  42. return tcpListener, err
  43. }
  44. func (a *myInboundAdapter) loopTCPIn() {
  45. tcpListener := a.tcpListener
  46. for {
  47. conn, err := tcpListener.Accept()
  48. if err != nil {
  49. //goland:noinspection GoDeprecation
  50. //nolint:staticcheck
  51. if netError, isNetError := err.(net.Error); isNetError && netError.Temporary() {
  52. a.logger.Error(err)
  53. continue
  54. }
  55. if a.inShutdown.Load() && E.IsClosed(err) {
  56. return
  57. }
  58. a.tcpListener.Close()
  59. a.logger.Error("serve error: ", err)
  60. continue
  61. }
  62. go a.injectTCP(conn, adapter.InboundContext{})
  63. }
  64. }
  65. func (a *myInboundAdapter) injectTCP(conn net.Conn, metadata adapter.InboundContext) {
  66. ctx := log.ContextWithNewID(a.ctx)
  67. metadata = a.createMetadata(conn, metadata)
  68. a.logger.InfoContext(ctx, "inbound connection from ", metadata.Source)
  69. hErr := a.connHandler.NewConnection(ctx, conn, metadata)
  70. if hErr != nil {
  71. conn.Close()
  72. a.NewError(ctx, E.Cause(hErr, "process connection from ", metadata.Source))
  73. }
  74. }
  75. func (a *myInboundAdapter) routeTCP(ctx context.Context, conn net.Conn, metadata adapter.InboundContext) {
  76. a.logger.InfoContext(ctx, "inbound connection from ", metadata.Source)
  77. hErr := a.newConnection(ctx, conn, metadata)
  78. if hErr != nil {
  79. conn.Close()
  80. a.NewError(ctx, E.Cause(hErr, "process connection from ", metadata.Source))
  81. }
  82. }