hub.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. package hysteria2
  2. import (
  3. "context"
  4. hyServer "github.com/apernet/hysteria/core/v2/server"
  5. "github.com/apernet/quic-go"
  6. "github.com/apernet/quic-go/http3"
  7. "github.com/v2fly/v2ray-core/v5/common"
  8. "github.com/v2fly/v2ray-core/v5/common/net"
  9. "github.com/v2fly/v2ray-core/v5/transport/internet"
  10. "github.com/v2fly/v2ray-core/v5/transport/internet/tls"
  11. )
  12. // Listener is an internet.Listener that listens for TCP connections.
  13. type Listener struct {
  14. hyServer hyServer.Server
  15. rawConn net.PacketConn
  16. addConn internet.ConnHandler
  17. }
  18. // Addr implements internet.Listener.Addr.
  19. func (l *Listener) Addr() net.Addr {
  20. return l.rawConn.LocalAddr()
  21. }
  22. // Close implements internet.Listener.Close.
  23. func (l *Listener) Close() error {
  24. return l.hyServer.Close()
  25. }
  26. func (l *Listener) StreamHijacker(ft http3.FrameType, conn quic.Connection, stream quic.Stream, err error) (bool, error) {
  27. // err always == nil
  28. tcpConn := &HyConn{
  29. stream: stream,
  30. local: conn.LocalAddr(),
  31. remote: conn.RemoteAddr(),
  32. }
  33. l.addConn(tcpConn)
  34. return true, nil
  35. }
  36. func (l *Listener) UdpHijacker(entry *hyServer.UdpSessionEntry, originalAddr string) {
  37. addr, err := net.ResolveUDPAddr("udp", originalAddr)
  38. if err != nil {
  39. return
  40. }
  41. udpConn := &HyConn{
  42. IsUDPExtension: true,
  43. IsServer: true,
  44. ServerUDPSession: entry,
  45. remote: addr,
  46. local: l.rawConn.LocalAddr(),
  47. }
  48. l.addConn(udpConn)
  49. }
  50. // Listen creates a new Listener based on configurations.
  51. func Listen(ctx context.Context, address net.Address, port net.Port, streamSettings *internet.MemoryStreamConfig, handler internet.ConnHandler) (internet.Listener, error) {
  52. tlsConfig, err := GetServerTLSConfig(streamSettings)
  53. if err != nil {
  54. return nil, err
  55. }
  56. if address.Family().IsDomain() {
  57. return nil, nil
  58. }
  59. config := streamSettings.ProtocolSettings.(*Config)
  60. rawConn, err := internet.ListenSystemPacket(context.Background(),
  61. &net.UDPAddr{
  62. IP: address.IP(),
  63. Port: int(port),
  64. }, streamSettings.SocketSettings)
  65. if err != nil {
  66. return nil, err
  67. }
  68. listener := &Listener{
  69. rawConn: rawConn,
  70. addConn: handler,
  71. }
  72. hyServer, err := hyServer.NewServer(&hyServer.Config{
  73. Conn: rawConn,
  74. TLSConfig: *tlsConfig,
  75. DisableUDP: !config.GetUseUdpExtension(),
  76. Authenticator: &Authenticator{Password: config.GetPassword()},
  77. StreamHijacker: listener.StreamHijacker, // acceptStreams
  78. BandwidthConfig: hyServer.BandwidthConfig{MaxTx: config.Congestion.GetUpMbps() * MBps, MaxRx: config.GetCongestion().GetDownMbps() * MBps},
  79. UdpSessionHijacker: listener.UdpHijacker, // acceptUDPSession
  80. IgnoreClientBandwidth: config.GetIgnoreClientBandwidth(),
  81. })
  82. if err != nil {
  83. return nil, err
  84. }
  85. listener.hyServer = hyServer
  86. go hyServer.Serve()
  87. return listener, nil
  88. }
  89. func GetServerTLSConfig(streamSettings *internet.MemoryStreamConfig) (*hyServer.TLSConfig, error) {
  90. config := tls.ConfigFromStreamSettings(streamSettings)
  91. if config == nil {
  92. return nil, newError(Hy2MustNeedTLS)
  93. }
  94. tlsConfig := config.GetTLSConfig()
  95. return &hyServer.TLSConfig{Certificates: tlsConfig.Certificates, GetCertificate: tlsConfig.GetCertificate}, nil
  96. }
  97. type Authenticator struct {
  98. Password string
  99. }
  100. func (a *Authenticator) Authenticate(addr net.Addr, auth string, tx uint64) (ok bool, id string) {
  101. if auth == a.Password || a.Password == "" {
  102. return true, "user"
  103. }
  104. return false, ""
  105. }
  106. func init() {
  107. common.Must(internet.RegisterTransportListener(protocolName, Listen))
  108. }