Update hysteria2 realm

This commit is contained in:
世界
2026-05-11 16:24:34 +08:00
parent 1ab58918df
commit fdab3c1b95
9 changed files with 106 additions and 40 deletions
+32 -3
View File
@@ -5,6 +5,7 @@ import (
"net"
"net/http"
"net/http/httputil"
"net/netip"
"net/url"
"time"
@@ -18,11 +19,13 @@ import (
qtls "github.com/sagernet/sing-quic"
"github.com/sagernet/sing-quic/hysteria"
"github.com/sagernet/sing-quic/hysteria2"
"github.com/sagernet/sing-quic/hysteria2/realm"
"github.com/sagernet/sing/common"
"github.com/sagernet/sing/common/auth"
E "github.com/sagernet/sing/common/exceptions"
M "github.com/sagernet/sing/common/metadata"
N "github.com/sagernet/sing/common/network"
"github.com/sagernet/sing/service"
)
func RegisterInbound(registry *inbound.Registry) {
@@ -114,9 +117,35 @@ func NewInbound(ctx context.Context, router adapter.Router, logger log.ContextLo
} else {
udpTimeout = C.UDPTimeout
}
realmOptions, err := buildRealmOptions(ctx, logger, options.Realm)
if err != nil {
return nil, err
var realmOptions *realm.Options
if options.Realm != nil {
queryOptions, err := adapter.DNSQueryOptionsFrom(ctx, options.Realm.STUNDomainResolver)
if err != nil {
return nil, err
}
httpClientTransport, err := service.FromContext[adapter.HTTPClientManager](ctx).ResolveTransport(ctx, logger, common.PtrValueOrDefault(options.Realm.HTTPClient))
if err != nil {
return nil, E.Cause(err, "create realm http client")
}
dnsRouter := service.FromContext[adapter.DNSRouter](ctx)
realmOptions = &realm.Options{
ServerURL: options.Realm.ServerURL,
Token: options.Realm.Token,
RealmID: options.Realm.RealmID,
STUNServers: options.Realm.STUNServers,
HTTPClient: &http.Client{Transport: httpClientTransport},
Resolver: func(ctx context.Context, host string, ipv4, ipv6 bool) ([]netip.Addr, error) {
dnsOptions := queryOptions
switch {
case ipv4 && !ipv6:
dnsOptions.Strategy = C.DomainStrategyIPv4Only
case !ipv4 && ipv6:
dnsOptions.Strategy = C.DomainStrategyIPv6Only
}
return dnsRouter.Lookup(ctx, host, dnsOptions)
},
Logger: logger,
}
}
hysteriaService, err := hysteria2.NewService[int](hysteria2.ServiceOptions{
Context: ctx,
+38 -4
View File
@@ -3,6 +3,8 @@ package hysteria2
import (
"context"
"net"
"net/http"
"net/netip"
"net/url"
"os"
"time"
@@ -18,12 +20,14 @@ import (
qtls "github.com/sagernet/sing-quic"
"github.com/sagernet/sing-quic/hysteria"
"github.com/sagernet/sing-quic/hysteria2"
"github.com/sagernet/sing-quic/hysteria2/realm"
"github.com/sagernet/sing/common"
"github.com/sagernet/sing/common/bufio"
E "github.com/sagernet/sing/common/exceptions"
"github.com/sagernet/sing/common/logger"
M "github.com/sagernet/sing/common/metadata"
N "github.com/sagernet/sing/common/network"
"github.com/sagernet/sing/service"
)
func RegisterOutbound(registry *outbound.Registry) {
@@ -66,13 +70,43 @@ func NewOutbound(ctx context.Context, router adapter.Router, logger log.ContextL
return nil, E.New("unknown obfs type: ", options.Obfs.Type)
}
}
outboundDialer, err := dialer.New(ctx, options.DialerOptions, options.ServerIsDomain())
outboundDialer, err := dialer.NewWithOptions(dialer.Options{
Context: ctx,
Options: options.DialerOptions,
RemoteIsDomain: options.ServerIsDomain(),
})
if err != nil {
return nil, err
}
realmOptions, err := buildRealmOptions(ctx, logger, options.Realm)
if err != nil {
return nil, err
var realmOptions *realm.Options
if options.Realm != nil {
queryOptions, err := adapter.DNSQueryOptionsFrom(ctx, options.DialerOptions.DomainResolver)
if err != nil {
return nil, err
}
httpClientTransport, err := service.FromContext[adapter.HTTPClientManager](ctx).ResolveTransport(ctx, logger, common.PtrValueOrDefault(options.Realm.HTTPClient))
if err != nil {
return nil, E.Cause(err, "create realm http client")
}
dnsRouter := service.FromContext[adapter.DNSRouter](ctx)
realmOptions = &realm.Options{
ServerURL: options.Realm.ServerURL,
Token: options.Realm.Token,
RealmID: options.Realm.RealmID,
STUNServers: options.Realm.STUNServers,
HTTPClient: &http.Client{Transport: httpClientTransport},
Resolver: func(ctx context.Context, host string, ipv4, ipv6 bool) ([]netip.Addr, error) {
dnsOptions := queryOptions
switch {
case ipv4 && !ipv6:
dnsOptions.Strategy = C.DomainStrategyIPv4Only
case !ipv4 && ipv6:
dnsOptions.Strategy = C.DomainStrategyIPv6Only
}
return dnsRouter.Lookup(ctx, host, dnsOptions)
},
Logger: logger,
}
}
networkList := options.Network.Build()
client, err := hysteria2.NewClient(hysteria2.ClientOptions{
-20
View File
@@ -13,13 +13,11 @@ import (
C "github.com/sagernet/sing-box/constant"
"github.com/sagernet/sing-box/log"
"github.com/sagernet/sing-box/option"
"github.com/sagernet/sing-quic/hysteria2/realm"
"github.com/sagernet/sing/common"
E "github.com/sagernet/sing/common/exceptions"
N "github.com/sagernet/sing/common/network"
aTLS "github.com/sagernet/sing/common/tls"
sHTTP "github.com/sagernet/sing/protocol/http"
"github.com/sagernet/sing/service"
"github.com/go-chi/chi/v5"
"github.com/go-chi/chi/v5/middleware"
@@ -31,24 +29,6 @@ func RegisterRealmService(registry *boxService.Registry) {
boxService.Register[option.HysteriaRealmServiceOptions](registry, C.TypeHysteriaRealm, NewRealmService)
}
func buildRealmOptions(ctx context.Context, logger log.ContextLogger, options *option.Hysteria2Realm) (*realm.Options, error) {
if options == nil {
return nil, nil
}
transport, err := service.FromContext[adapter.HTTPClientManager](ctx).ResolveTransport(ctx, logger, common.PtrValueOrDefault(options.HTTPClient))
if err != nil {
return nil, E.Cause(err, "create realm http client")
}
return &realm.Options{
ServerURL: options.ServerURL,
Token: options.Token,
RealmID: options.RealmID,
STUNServers: options.STUNServers,
HTTPClient: &http.Client{Transport: transport},
Logger: logger,
}, nil
}
type RealmService struct {
boxService.Adapter
ctx context.Context