diff --git a/docs/configuration/outbound/hysteria.md b/docs/configuration/outbound/hysteria.md
index 90190e05..b326e06d 100644
--- a/docs/configuration/outbound/hysteria.md
+++ b/docs/configuration/outbound/hysteria.md
@@ -1,3 +1,12 @@
+---
+icon: material/new-box
+---
+
+!!! quote "Changes in sing-box 1.12.0"
+
+    :material-plus: [server_ports](#server_ports)  
+    :material-plus: [hop_interval](#hop_interval)
+
 ### Structure
 
 ```json
@@ -7,6 +16,10 @@
   
   "server": "127.0.0.1",
   "server_port": 1080,
+  "server_ports": [
+    "2080:3000"
+  ],
+  "hop_interval": "",
   "up": "100 Mbps",
   "up_mbps": 100,
   "down": "100 Mbps",
@@ -38,6 +51,22 @@ The server address.
 
 The server port.
 
+#### server_ports
+
+!!! question "Since sing-box 1.12.0"
+
+Server port range list.
+
+Conflicts with `server_port`.
+
+#### hop_interval
+
+!!! question "Since sing-box 1.12.0"
+
+Port hopping interval.
+
+`30s` is used by default.
+
 #### up, down
 
 ==Required==
diff --git a/docs/configuration/outbound/hysteria.zh.md b/docs/configuration/outbound/hysteria.zh.md
index c6ee2313..4f4c00bb 100644
--- a/docs/configuration/outbound/hysteria.zh.md
+++ b/docs/configuration/outbound/hysteria.zh.md
@@ -1,3 +1,12 @@
+---
+icon: material/new-box
+---
+
+!!! quote "sing-box 1.12.0 中的更改"
+
+    :material-plus: [server_ports](#server_ports)  
+    :material-plus: [hop_interval](#hop_interval)
+
 ### 结构
 
 ```json
@@ -7,6 +16,10 @@
   
   "server": "127.0.0.1",
   "server_port": 1080,
+  "server_ports": [
+    "2080:3000"
+  ],
+  "hop_interval": "",
   "up": "100 Mbps",
   "up_mbps": 100,
   "down": "100 Mbps",
@@ -38,6 +51,22 @@
 
 服务器端口。
 
+#### server_ports
+
+!!! question "自 sing-box 1.12.0 起"
+
+服务器端口范围列表。
+
+与 `server_port` 冲突。
+
+#### hop_interval
+
+!!! question "自 sing-box 1.12.0 起"
+
+端口跳跃间隔。
+
+默认使用 `30s`。
+
 #### up, down
 
 ==必填==
diff --git a/go.mod b/go.mod
index c53e2be0..b182d5e4 100644
--- a/go.mod
+++ b/go.mod
@@ -30,7 +30,7 @@ require (
 	github.com/sagernet/reality v0.0.0-20230406110435-ee17307e7691
 	github.com/sagernet/sing v0.6.6-0.20250326051824-d39c2c2fddfa
 	github.com/sagernet/sing-mux v0.3.1
-	github.com/sagernet/sing-quic v0.4.0
+	github.com/sagernet/sing-quic v0.4.1-beta.1
 	github.com/sagernet/sing-shadowsocks v0.2.7
 	github.com/sagernet/sing-shadowsocks2 v0.2.0
 	github.com/sagernet/sing-shadowtls v0.2.0
diff --git a/go.sum b/go.sum
index dd00fd48..00ccd09f 100644
--- a/go.sum
+++ b/go.sum
@@ -186,8 +186,8 @@ github.com/sagernet/sing v0.6.6-0.20250326051824-d39c2c2fddfa h1:18mz8gmh0/EL3Bk
 github.com/sagernet/sing v0.6.6-0.20250326051824-d39c2c2fddfa/go.mod h1:ARkL0gM13/Iv5VCZmci/NuoOlePoIsW0m7BWfln/Hak=
 github.com/sagernet/sing-mux v0.3.1 h1:kvCc8HyGAskDHDQ0yQvoTi/7J4cZPB/VJMsAM3MmdQI=
 github.com/sagernet/sing-mux v0.3.1/go.mod h1:Mkdz8LnDstthz0HWuA/5foncnDIdcNN5KZ6AdJX+x78=
-github.com/sagernet/sing-quic v0.4.0 h1:E4geazHk/UrJTXMlT+CBCKmn8V86RhtNeczWtfeoEFc=
-github.com/sagernet/sing-quic v0.4.0/go.mod h1:c+CytOEyeN20KCTFIP8YQUkNDVFLSzjrEPqP7Hlnxys=
+github.com/sagernet/sing-quic v0.4.1-beta.1 h1:V2VfMckT3EQR3ZdfSzJgZZDsvfZZH42QAZpnOnHKa0s=
+github.com/sagernet/sing-quic v0.4.1-beta.1/go.mod h1:c+CytOEyeN20KCTFIP8YQUkNDVFLSzjrEPqP7Hlnxys=
 github.com/sagernet/sing-shadowsocks v0.2.7 h1:zaopR1tbHEw5Nk6FAkM05wCslV6ahVegEZaKMv9ipx8=
 github.com/sagernet/sing-shadowsocks v0.2.7/go.mod h1:0rIKJZBR65Qi0zwdKezt4s57y/Tl1ofkaq6NlkzVuyE=
 github.com/sagernet/sing-shadowsocks2 v0.2.0 h1:wpZNs6wKnR7mh1wV9OHwOyUr21VkS3wKFHi+8XwgADg=
diff --git a/option/hysteria.go b/option/hysteria.go
index beb3685e..c3dc78ef 100644
--- a/option/hysteria.go
+++ b/option/hysteria.go
@@ -1,5 +1,7 @@
 package option
 
+import "github.com/sagernet/sing/common/json/badoption"
+
 type HysteriaInboundOptions struct {
 	ListenOptions
 	Up                  string         `json:"up,omitempty"`
@@ -24,16 +26,18 @@ type HysteriaUser struct {
 type HysteriaOutboundOptions struct {
 	DialerOptions
 	ServerOptions
-	Up                  string      `json:"up,omitempty"`
-	UpMbps              int         `json:"up_mbps,omitempty"`
-	Down                string      `json:"down,omitempty"`
-	DownMbps            int         `json:"down_mbps,omitempty"`
-	Obfs                string      `json:"obfs,omitempty"`
-	Auth                []byte      `json:"auth,omitempty"`
-	AuthString          string      `json:"auth_str,omitempty"`
-	ReceiveWindowConn   uint64      `json:"recv_window_conn,omitempty"`
-	ReceiveWindow       uint64      `json:"recv_window,omitempty"`
-	DisableMTUDiscovery bool        `json:"disable_mtu_discovery,omitempty"`
-	Network             NetworkList `json:"network,omitempty"`
+	ServerPorts         badoption.Listable[string] `json:"server_ports,omitempty"`
+	HopInterval         badoption.Duration         `json:"hop_interval,omitempty"`
+	Up                  string                     `json:"up,omitempty"`
+	UpMbps              int                        `json:"up_mbps,omitempty"`
+	Down                string                     `json:"down,omitempty"`
+	DownMbps            int                        `json:"down_mbps,omitempty"`
+	Obfs                string                     `json:"obfs,omitempty"`
+	Auth                []byte                     `json:"auth,omitempty"`
+	AuthString          string                     `json:"auth_str,omitempty"`
+	ReceiveWindowConn   uint64                     `json:"recv_window_conn,omitempty"`
+	ReceiveWindow       uint64                     `json:"recv_window,omitempty"`
+	DisableMTUDiscovery bool                       `json:"disable_mtu_discovery,omitempty"`
+	Network             NetworkList                `json:"network,omitempty"`
 	OutboundTLSOptionsContainer
 }
diff --git a/protocol/hysteria/outbound.go b/protocol/hysteria/outbound.go
index 7746df13..d3035c71 100644
--- a/protocol/hysteria/outbound.go
+++ b/protocol/hysteria/outbound.go
@@ -4,6 +4,7 @@ import (
 	"context"
 	"net"
 	"os"
+	"time"
 
 	"github.com/sagernet/sing-box/adapter"
 	"github.com/sagernet/sing-box/adapter/outbound"
@@ -76,17 +77,18 @@ func NewOutbound(ctx context.Context, router adapter.Router, logger log.ContextL
 		receiveBps = uint64(options.DownMbps) * hysteria.MbpsToBps
 	}
 	client, err := hysteria.NewClient(hysteria.ClientOptions{
-		Context:       ctx,
-		Dialer:        outboundDialer,
-		Logger:        logger,
-		ServerAddress: options.ServerOptions.Build(),
-		SendBPS:       sendBps,
-		ReceiveBPS:    receiveBps,
-		XPlusPassword: options.Obfs,
-		Password:      password,
-		TLSConfig:     tlsConfig,
-		UDPDisabled:   !common.Contains(networkList, N.NetworkUDP),
-
+		Context:             ctx,
+		Dialer:              outboundDialer,
+		Logger:              logger,
+		ServerAddress:       options.ServerOptions.Build(),
+		ServerPorts:         options.ServerPorts,
+		HopInterval:         time.Duration(options.HopInterval),
+		SendBPS:             sendBps,
+		ReceiveBPS:          receiveBps,
+		XPlusPassword:       options.Obfs,
+		Password:            password,
+		TLSConfig:           tlsConfig,
+		UDPDisabled:         !common.Contains(networkList, N.NetworkUDP),
 		ConnReceiveWindow:   options.ReceiveWindowConn,
 		StreamReceiveWindow: options.ReceiveWindow,
 		DisableMTUDiscovery: options.DisableMTUDiscovery,