obfs.go 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. package sip003
  2. import (
  3. "context"
  4. "net"
  5. "github.com/sagernet/sing-box/adapter"
  6. "github.com/sagernet/sing-box/transport/simple-obfs"
  7. E "github.com/sagernet/sing/common/exceptions"
  8. F "github.com/sagernet/sing/common/format"
  9. M "github.com/sagernet/sing/common/metadata"
  10. N "github.com/sagernet/sing/common/network"
  11. )
  12. var _ Plugin = (*ObfsLocal)(nil)
  13. func init() {
  14. RegisterPlugin("obfs-local", newObfsLocal)
  15. }
  16. func newObfsLocal(ctx context.Context, pluginOpts Args, router adapter.Router, dialer N.Dialer, serverAddr M.Socksaddr) (Plugin, error) {
  17. plugin := &ObfsLocal{
  18. dialer: dialer,
  19. serverAddr: serverAddr,
  20. }
  21. mode := "http"
  22. if obfsMode, loaded := pluginOpts.Get("obfs"); loaded {
  23. mode = obfsMode
  24. }
  25. if obfsHost, loaded := pluginOpts.Get("obfs-host"); loaded {
  26. plugin.host = obfsHost
  27. }
  28. switch mode {
  29. case "http":
  30. case "tls":
  31. plugin.tls = true
  32. default:
  33. return nil, E.New("unknown obfs mode ", mode)
  34. }
  35. plugin.port = F.ToString(serverAddr.Port)
  36. return plugin, nil
  37. }
  38. type ObfsLocal struct {
  39. dialer N.Dialer
  40. serverAddr M.Socksaddr
  41. tls bool
  42. host string
  43. port string
  44. }
  45. func (o *ObfsLocal) DialContext(ctx context.Context) (net.Conn, error) {
  46. conn, err := o.dialer.DialContext(ctx, N.NetworkTCP, o.serverAddr)
  47. if err != nil {
  48. return nil, err
  49. }
  50. if !o.tls {
  51. return obfs.NewHTTPObfs(conn, o.host, o.port), nil
  52. } else {
  53. return obfs.NewTLSObfs(conn, o.host), nil
  54. }
  55. }