default_tcp.go 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. package inbound
  2. import (
  3. "context"
  4. "net"
  5. "net/netip"
  6. "github.com/sagernet/sing-box/adapter"
  7. "github.com/sagernet/sing-box/common/proxyproto"
  8. "github.com/sagernet/sing-box/log"
  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. "github.com/sagernet/tfo-go"
  13. )
  14. func (a *myInboundAdapter) ListenTCP() (net.Listener, error) {
  15. var err error
  16. bindAddr := M.SocksaddrFrom(netip.Addr(a.listenOptions.Listen), a.listenOptions.ListenPort)
  17. var tcpListener net.Listener
  18. if !a.listenOptions.TCPFastOpen {
  19. tcpListener, err = net.ListenTCP(M.NetworkFromNetAddr(N.NetworkTCP, bindAddr.Addr), bindAddr.TCPAddr())
  20. } else {
  21. tcpListener, err = tfo.ListenTCP(M.NetworkFromNetAddr(N.NetworkTCP, bindAddr.Addr), bindAddr.TCPAddr())
  22. }
  23. if err == nil {
  24. a.logger.Info("tcp server started at ", tcpListener.Addr())
  25. }
  26. if a.listenOptions.ProxyProtocol {
  27. a.logger.Debug("proxy protocol enabled")
  28. tcpListener = &proxyproto.Listener{Listener: tcpListener, AcceptNoHeader: a.listenOptions.ProxyProtocolAcceptNoHeader}
  29. }
  30. a.tcpListener = tcpListener
  31. return tcpListener, err
  32. }
  33. func (a *myInboundAdapter) loopTCPIn() {
  34. tcpListener := a.tcpListener
  35. for {
  36. conn, err := tcpListener.Accept()
  37. if err != nil {
  38. if E.IsClosed(err) {
  39. return
  40. }
  41. a.logger.Error("accept: ", err)
  42. continue
  43. }
  44. go a.injectTCP(conn, adapter.InboundContext{})
  45. }
  46. }
  47. func (a *myInboundAdapter) injectTCP(conn net.Conn, metadata adapter.InboundContext) {
  48. ctx := log.ContextWithNewID(a.ctx)
  49. metadata = a.createMetadata(conn, metadata)
  50. a.logger.InfoContext(ctx, "inbound connection from ", metadata.Source)
  51. hErr := a.connHandler.NewConnection(ctx, conn, metadata)
  52. if hErr != nil {
  53. conn.Close()
  54. a.NewError(ctx, E.Cause(hErr, "process connection from ", metadata.Source))
  55. }
  56. }
  57. func (a *myInboundAdapter) routeTCP(ctx context.Context, conn net.Conn, metadata adapter.InboundContext) {
  58. a.logger.InfoContext(ctx, "inbound connection from ", metadata.Source)
  59. hErr := a.newConnection(ctx, conn, metadata)
  60. if hErr != nil {
  61. conn.Close()
  62. a.NewError(ctx, E.Cause(hErr, "process connection from ", metadata.Source))
  63. }
  64. }