shadowtls.go 3.0 KB

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