server.go 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. package tls
  2. import (
  3. "context"
  4. "net"
  5. "os"
  6. "github.com/sagernet/sing-box/common/badtls"
  7. C "github.com/sagernet/sing-box/constant"
  8. "github.com/sagernet/sing-box/log"
  9. "github.com/sagernet/sing-box/option"
  10. aTLS "github.com/sagernet/sing/common/tls"
  11. )
  12. type ServerOptions struct {
  13. Context context.Context
  14. Logger log.ContextLogger
  15. Options option.InboundTLSOptions
  16. KTLSCompatible bool
  17. }
  18. func NewServer(ctx context.Context, logger log.ContextLogger, options option.InboundTLSOptions) (ServerConfig, error) {
  19. return NewServerWithOptions(ServerOptions{
  20. Context: ctx,
  21. Logger: logger,
  22. Options: options,
  23. })
  24. }
  25. func NewServerWithOptions(options ServerOptions) (ServerConfig, error) {
  26. if !options.Options.Enabled {
  27. return nil, nil
  28. }
  29. if !options.KTLSCompatible {
  30. if options.Options.KernelTx {
  31. options.Logger.Warn("enabling kTLS TX in current scenarios will definitely reduce performance, please checkout https://sing-box.sagernet.org/configuration/shared/tls/#kernel_tx")
  32. }
  33. }
  34. if options.Options.KernelRx {
  35. options.Logger.Warn("enabling kTLS RX will definitely reduce performance, please checkout https://sing-box.sagernet.org/configuration/shared/tls/#kernel_rx")
  36. }
  37. if options.Options.Reality != nil && options.Options.Reality.Enabled {
  38. return NewRealityServer(options.Context, options.Logger, options.Options)
  39. }
  40. return NewSTDServer(options.Context, options.Logger, options.Options)
  41. }
  42. func ServerHandshake(ctx context.Context, conn net.Conn, config ServerConfig) (Conn, error) {
  43. ctx, cancel := context.WithTimeout(ctx, C.TCPTimeout)
  44. defer cancel()
  45. tlsConn, err := aTLS.ServerHandshake(ctx, conn, config)
  46. if err != nil {
  47. return nil, err
  48. }
  49. readWaitConn, err := badtls.NewReadWaitConn(tlsConn)
  50. if err == nil {
  51. return readWaitConn, nil
  52. } else if err != os.ErrInvalid {
  53. return nil, err
  54. }
  55. return tlsConn, nil
  56. }