default_tcp.go 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  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/database64128/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}
  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. return
  39. }
  40. go a.injectTCP(conn, adapter.InboundContext{})
  41. }
  42. }
  43. func (a *myInboundAdapter) injectTCP(conn net.Conn, metadata adapter.InboundContext) {
  44. ctx := log.ContextWithNewID(a.ctx)
  45. metadata = a.createMetadata(conn, metadata)
  46. a.logger.InfoContext(ctx, "inbound connection from ", metadata.Source)
  47. hErr := a.connHandler.NewConnection(ctx, conn, metadata)
  48. if hErr != nil {
  49. conn.Close()
  50. a.NewError(ctx, E.Cause(hErr, "process connection from ", metadata.Source))
  51. }
  52. }
  53. func (a *myInboundAdapter) routeTCP(ctx context.Context, conn net.Conn, metadata adapter.InboundContext) {
  54. a.logger.InfoContext(ctx, "inbound connection from ", metadata.Source)
  55. hErr := a.newConnection(ctx, conn, metadata)
  56. if hErr != nil {
  57. conn.Close()
  58. a.NewError(ctx, E.Cause(hErr, "process connection from ", metadata.Source))
  59. }
  60. }