inbound.go 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. package anytls
  2. import (
  3. "context"
  4. "net"
  5. "strings"
  6. "github.com/sagernet/sing-box/adapter"
  7. "github.com/sagernet/sing-box/adapter/inbound"
  8. "github.com/sagernet/sing-box/common/listener"
  9. "github.com/sagernet/sing-box/common/tls"
  10. "github.com/sagernet/sing-box/common/uot"
  11. C "github.com/sagernet/sing-box/constant"
  12. "github.com/sagernet/sing-box/log"
  13. "github.com/sagernet/sing-box/option"
  14. "github.com/sagernet/sing/common"
  15. "github.com/sagernet/sing/common/auth"
  16. E "github.com/sagernet/sing/common/exceptions"
  17. "github.com/sagernet/sing/common/logger"
  18. M "github.com/sagernet/sing/common/metadata"
  19. N "github.com/sagernet/sing/common/network"
  20. anytls "github.com/anytls/sing-anytls"
  21. "github.com/anytls/sing-anytls/padding"
  22. )
  23. func RegisterInbound(registry *inbound.Registry) {
  24. inbound.Register[option.AnyTLSInboundOptions](registry, C.TypeAnyTLS, NewInbound)
  25. }
  26. type Inbound struct {
  27. inbound.Adapter
  28. tlsConfig tls.ServerConfig
  29. router adapter.ConnectionRouterEx
  30. logger logger.ContextLogger
  31. listener *listener.Listener
  32. service *anytls.Service
  33. }
  34. func NewInbound(ctx context.Context, router adapter.Router, logger log.ContextLogger, tag string, options option.AnyTLSInboundOptions) (adapter.Inbound, error) {
  35. inbound := &Inbound{
  36. Adapter: inbound.NewAdapter(C.TypeAnyTLS, tag),
  37. router: uot.NewRouter(router, logger),
  38. logger: logger,
  39. }
  40. if options.TLS != nil && options.TLS.Enabled {
  41. tlsConfig, err := tls.NewServer(ctx, logger, common.PtrValueOrDefault(options.TLS))
  42. if err != nil {
  43. return nil, err
  44. }
  45. inbound.tlsConfig = tlsConfig
  46. }
  47. paddingScheme := padding.DefaultPaddingScheme
  48. if len(options.PaddingScheme) > 0 {
  49. paddingScheme = []byte(strings.Join(options.PaddingScheme, "\n"))
  50. }
  51. service, err := anytls.NewService(anytls.ServiceConfig{
  52. Users: common.Map(options.Users, func(it option.AnyTLSUser) anytls.User {
  53. return (anytls.User)(it)
  54. }),
  55. PaddingScheme: paddingScheme,
  56. Handler: (*inboundHandler)(inbound),
  57. Logger: logger,
  58. })
  59. if err != nil {
  60. return nil, err
  61. }
  62. inbound.service = service
  63. inbound.listener = listener.New(listener.Options{
  64. Context: ctx,
  65. Logger: logger,
  66. Network: []string{N.NetworkTCP},
  67. Listen: options.ListenOptions,
  68. ConnectionHandler: inbound,
  69. })
  70. return inbound, nil
  71. }
  72. func (h *Inbound) Start(stage adapter.StartStage) error {
  73. if stage != adapter.StartStateStart {
  74. return nil
  75. }
  76. if h.tlsConfig != nil {
  77. err := h.tlsConfig.Start()
  78. if err != nil {
  79. return err
  80. }
  81. }
  82. return h.listener.Start()
  83. }
  84. func (h *Inbound) Close() error {
  85. return common.Close(h.listener, h.tlsConfig)
  86. }
  87. func (h *Inbound) NewConnectionEx(ctx context.Context, conn net.Conn, metadata adapter.InboundContext, onClose N.CloseHandlerFunc) {
  88. if h.tlsConfig != nil {
  89. tlsConn, err := tls.ServerHandshake(ctx, conn, h.tlsConfig)
  90. if err != nil {
  91. N.CloseOnHandshakeFailure(conn, onClose, err)
  92. h.logger.ErrorContext(ctx, E.Cause(err, "process connection from ", metadata.Source, ": TLS handshake"))
  93. return
  94. }
  95. conn = tlsConn
  96. }
  97. err := h.service.NewConnection(adapter.WithContext(ctx, &metadata), conn, metadata.Source, onClose)
  98. if err != nil {
  99. N.CloseOnHandshakeFailure(conn, onClose, err)
  100. h.logger.ErrorContext(ctx, E.Cause(err, "process connection from ", metadata.Source))
  101. }
  102. }
  103. type inboundHandler Inbound
  104. func (h *inboundHandler) NewConnectionEx(ctx context.Context, conn net.Conn, source M.Socksaddr, destination M.Socksaddr, onClose N.CloseHandlerFunc) {
  105. var metadata adapter.InboundContext
  106. metadata.Inbound = h.Tag()
  107. metadata.InboundType = h.Type()
  108. //nolint:staticcheck
  109. metadata.InboundDetour = h.listener.ListenOptions().Detour
  110. //nolint:staticcheck
  111. metadata.InboundOptions = h.listener.ListenOptions().InboundOptions
  112. metadata.Source = source
  113. metadata.Destination = destination.Unwrap()
  114. if userName, _ := auth.UserFromContext[string](ctx); userName != "" {
  115. metadata.User = userName
  116. h.logger.InfoContext(ctx, "[", userName, "] inbound connection to ", metadata.Destination)
  117. } else {
  118. h.logger.InfoContext(ctx, "inbound connection to ", metadata.Destination)
  119. }
  120. h.router.RouteConnectionEx(ctx, conn, metadata, onClose)
  121. }