default_tcp.go 2.7 KB

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