listener_tcp.go 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. package listener
  2. import (
  3. "net"
  4. "time"
  5. "github.com/sagernet/sing-box/adapter"
  6. C "github.com/sagernet/sing-box/constant"
  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. "github.com/metacubex/tfo-go"
  12. )
  13. func (l *Listener) ListenTCP() (net.Listener, error) {
  14. var err error
  15. bindAddr := M.SocksaddrFrom(l.listenOptions.Listen.Build(), l.listenOptions.ListenPort)
  16. var tcpListener net.Listener
  17. var listenConfig net.ListenConfig
  18. if l.listenOptions.TCPKeepAlive >= 0 {
  19. keepIdle := time.Duration(l.listenOptions.TCPKeepAlive)
  20. if keepIdle == 0 {
  21. keepIdle = C.TCPKeepAliveInitial
  22. }
  23. keepInterval := time.Duration(l.listenOptions.TCPKeepAliveInterval)
  24. if keepInterval == 0 {
  25. keepInterval = C.TCPKeepAliveInterval
  26. }
  27. setKeepAliveConfig(&listenConfig, keepIdle, keepInterval)
  28. }
  29. if l.listenOptions.TCPMultiPath {
  30. if !go121Available {
  31. return nil, E.New("MultiPath TCP requires go1.21, please recompile your binary.")
  32. }
  33. setMultiPathTCP(&listenConfig)
  34. }
  35. if l.listenOptions.TCPFastOpen {
  36. var tfoConfig tfo.ListenConfig
  37. tfoConfig.ListenConfig = listenConfig
  38. tcpListener, err = tfoConfig.Listen(l.ctx, M.NetworkFromNetAddr(N.NetworkTCP, bindAddr.Addr), bindAddr.String())
  39. } else {
  40. tcpListener, err = listenConfig.Listen(l.ctx, M.NetworkFromNetAddr(N.NetworkTCP, bindAddr.Addr), bindAddr.String())
  41. }
  42. if err == nil {
  43. l.logger.Info("tcp server started at ", tcpListener.Addr())
  44. }
  45. //nolint:staticcheck
  46. if l.listenOptions.ProxyProtocol || l.listenOptions.ProxyProtocolAcceptNoHeader {
  47. return nil, E.New("Proxy Protocol is deprecated and removed in sing-box 1.6.0")
  48. }
  49. l.tcpListener = tcpListener
  50. return tcpListener, err
  51. }
  52. func (l *Listener) loopTCPIn() {
  53. tcpListener := l.tcpListener
  54. var metadata adapter.InboundContext
  55. for {
  56. conn, err := tcpListener.Accept()
  57. if err != nil {
  58. //nolint:staticcheck
  59. if netError, isNetError := err.(net.Error); isNetError && netError.Temporary() {
  60. l.logger.Error(err)
  61. continue
  62. }
  63. if l.shutdown.Load() && E.IsClosed(err) {
  64. return
  65. }
  66. l.tcpListener.Close()
  67. l.logger.Error("tcp listener closed: ", err)
  68. continue
  69. }
  70. //nolint:staticcheck
  71. metadata.InboundDetour = l.listenOptions.Detour
  72. //nolint:staticcheck
  73. metadata.InboundOptions = l.listenOptions.InboundOptions
  74. metadata.Source = M.SocksaddrFromNet(conn.RemoteAddr()).Unwrap()
  75. metadata.OriginDestination = M.SocksaddrFromNet(conn.LocalAddr()).Unwrap()
  76. ctx := log.ContextWithNewID(l.ctx)
  77. l.logger.InfoContext(ctx, "inbound connection from ", metadata.Source)
  78. go l.connHandler.NewConnectionEx(ctx, conn, metadata, nil)
  79. }
  80. }