shadowtls.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. package inbound
  2. import (
  3. "context"
  4. "net"
  5. "github.com/sagernet/sing-box/adapter"
  6. "github.com/sagernet/sing-box/common/dialer"
  7. C "github.com/sagernet/sing-box/constant"
  8. "github.com/sagernet/sing-box/log"
  9. "github.com/sagernet/sing-box/option"
  10. "github.com/sagernet/sing-shadowtls"
  11. "github.com/sagernet/sing/common"
  12. "github.com/sagernet/sing/common/auth"
  13. E "github.com/sagernet/sing/common/exceptions"
  14. N "github.com/sagernet/sing/common/network"
  15. )
  16. type ShadowTLS struct {
  17. myInboundAdapter
  18. service *shadowtls.Service
  19. }
  20. func NewShadowTLS(ctx context.Context, router adapter.Router, logger log.ContextLogger, tag string, options option.ShadowTLSInboundOptions) (*ShadowTLS, error) {
  21. inbound := &ShadowTLS{
  22. myInboundAdapter: myInboundAdapter{
  23. protocol: C.TypeShadowTLS,
  24. network: []string{N.NetworkTCP},
  25. ctx: ctx,
  26. router: router,
  27. logger: logger,
  28. tag: tag,
  29. listenOptions: options.ListenOptions,
  30. },
  31. }
  32. if options.Version == 0 {
  33. options.Version = 1
  34. }
  35. var handshakeForServerName map[string]shadowtls.HandshakeConfig
  36. if options.Version > 1 {
  37. handshakeForServerName = make(map[string]shadowtls.HandshakeConfig)
  38. for serverName, serverOptions := range options.HandshakeForServerName {
  39. handshakeDialer, err := dialer.New(router, serverOptions.DialerOptions)
  40. if err != nil {
  41. return nil, err
  42. }
  43. handshakeForServerName[serverName] = shadowtls.HandshakeConfig{
  44. Server: serverOptions.ServerOptions.Build(),
  45. Dialer: handshakeDialer,
  46. }
  47. }
  48. }
  49. handshakeDialer, err := dialer.New(router, options.Handshake.DialerOptions)
  50. if err != nil {
  51. return nil, err
  52. }
  53. service, err := shadowtls.NewService(shadowtls.ServiceConfig{
  54. Version: options.Version,
  55. Password: options.Password,
  56. Users: common.Map(options.Users, func(it option.ShadowTLSUser) shadowtls.User {
  57. return (shadowtls.User)(it)
  58. }),
  59. Handshake: shadowtls.HandshakeConfig{
  60. Server: options.Handshake.ServerOptions.Build(),
  61. Dialer: handshakeDialer,
  62. },
  63. HandshakeForServerName: handshakeForServerName,
  64. StrictMode: options.StrictMode,
  65. Handler: adapter.NewUpstreamContextHandler(inbound.newConnection, nil, inbound),
  66. Logger: logger,
  67. })
  68. if err != nil {
  69. return nil, err
  70. }
  71. inbound.service = service
  72. inbound.connHandler = inbound
  73. return inbound, nil
  74. }
  75. func (h *ShadowTLS) NewConnection(ctx context.Context, conn net.Conn, metadata adapter.InboundContext) error {
  76. return h.service.NewConnection(adapter.WithContext(log.ContextWithNewID(ctx), &metadata), conn, adapter.UpstreamMetadata(metadata))
  77. }
  78. func (h *ShadowTLS) newConnection(ctx context.Context, conn net.Conn, metadata adapter.InboundContext) error {
  79. if userName, _ := auth.UserFromContext[string](ctx); userName != "" {
  80. metadata.User = userName
  81. h.logger.InfoContext(ctx, "[", userName, "] inbound connection to ", metadata.Destination)
  82. } else {
  83. h.logger.InfoContext(ctx, "inbound connection to ", metadata.Destination)
  84. }
  85. return h.router.RouteConnection(ctx, conn, metadata)
  86. }
  87. func (h *ShadowTLS) NewConnectionEx(ctx context.Context, conn net.Conn, metadata adapter.InboundContext, onClose N.CloseHandlerFunc) {
  88. err := h.NewConnection(ctx, conn, metadata)
  89. N.CloseOnHandshakeFailure(conn, onClose, err)
  90. if err != nil {
  91. h.logger.ErrorContext(ctx, E.Cause(err, "process connection from ", metadata.Source))
  92. }
  93. }