mirror of
https://github.com/SagerNet/sing-box.git
synced 2025-06-11 21:04:13 +08:00
Compare commits
104 Commits
06393297ba
...
b03d912eb5
Author | SHA1 | Date | |
---|---|---|---|
![]() |
b03d912eb5 | ||
![]() |
bf0611fa0b | ||
![]() |
92c6119109 | ||
![]() |
f02de6ec00 | ||
![]() |
1499dac0e1 | ||
![]() |
cccd9622cc | ||
![]() |
eb9e6beade | ||
![]() |
183c09a53b | ||
![]() |
c09b96aedb | ||
![]() |
4a162455c7 | ||
![]() |
c4889e76ff | ||
![]() |
03fba739e4 | ||
![]() |
338bc709b4 | ||
![]() |
936220aa64 | ||
![]() |
9336bf802f | ||
![]() |
4ecea1ae2b | ||
![]() |
20e462b577 | ||
![]() |
46e97a5c7c | ||
![]() |
91a229b26e | ||
![]() |
68cdf2246f | ||
![]() |
168548c8cc | ||
![]() |
14619fb5bd | ||
![]() |
7760aa3e6c | ||
![]() |
af73e784f1 | ||
![]() |
c44e127064 | ||
![]() |
7345152a8a | ||
![]() |
979d8054a8 | ||
![]() |
86841c36b5 | ||
![]() |
d637de0043 | ||
![]() |
1a9138ae4a | ||
![]() |
67178bbd82 | ||
![]() |
c4b97029d2 | ||
![]() |
f7edfc5867 | ||
![]() |
a6ca8e64ea | ||
![]() |
34b45bcd6b | ||
![]() |
1aa3791ced | ||
![]() |
3313578a09 | ||
![]() |
a5b9cd9696 | ||
![]() |
c1167df04d | ||
![]() |
c60adfd4b8 | ||
![]() |
f9d4b00e78 | ||
![]() |
d262c8bff9 | ||
![]() |
0b7ee68187 | ||
![]() |
84a3a364d1 | ||
![]() |
186ecfcc61 | ||
![]() |
f92c3e9b54 | ||
![]() |
45f240f562 | ||
![]() |
7b2dad1073 | ||
![]() |
955edac785 | ||
![]() |
21dc56b47e | ||
![]() |
1d7a20a879 | ||
![]() |
710b26c95d | ||
![]() |
99154e8221 | ||
![]() |
0f0bdddc09 | ||
![]() |
b2003ff63c | ||
![]() |
666fcf3342 | ||
![]() |
b3257446a9 | ||
![]() |
6f0917af2c | ||
![]() |
c997cd5995 | ||
![]() |
51e1ea0ff2 | ||
![]() |
d2aa704bd6 | ||
![]() |
d24c2ff9ef | ||
![]() |
30bdf826cb | ||
![]() |
13f283554f | ||
![]() |
22b96aa95e | ||
![]() |
9cd361400c | ||
![]() |
9b34001232 | ||
![]() |
38f83819df | ||
![]() |
a79799bb08 | ||
![]() |
5f037b01f4 | ||
![]() |
09ca2d0d91 | ||
![]() |
61cbe8ed5d | ||
![]() |
9088fb312f | ||
![]() |
0c29d16733 | ||
![]() |
75e15c7ac6 | ||
![]() |
e63154f746 | ||
![]() |
b28721f08b | ||
![]() |
2eaa348762 | ||
![]() |
76d94b0674 | ||
![]() |
3bbfff6e8b | ||
![]() |
6d7d1e9ada | ||
![]() |
f709b1a265 | ||
![]() |
d35558a771 | ||
![]() |
f1fc578414 | ||
![]() |
c498c5e48f | ||
![]() |
e3aaa27d82 | ||
![]() |
d6949a4ea4 | ||
![]() |
19febe44cb | ||
![]() |
f7adac3847 | ||
![]() |
1c63ddc69e | ||
![]() |
c37d2627ee | ||
![]() |
e447da0f41 | ||
![]() |
ed35d7a44f | ||
![]() |
55254639d9 | ||
![]() |
f80e4ff91a | ||
![]() |
207a40fbb5 | ||
![]() |
2645466e48 | ||
![]() |
8ab0427199 | ||
![]() |
255068fd40 | ||
![]() |
098a00b025 | ||
![]() |
dba0b5276b | ||
![]() |
78ae935468 | ||
![]() |
3ea5f76470 | ||
![]() |
b4d294c05e |
@ -1 +1 @@
|
|||||||
Subproject commit c0885a2dc304797336756c8066c77bb4c193b009
|
Subproject commit 320170a1077ea5c93872b3e055b96b8836615ef0
|
@ -2,11 +2,18 @@
|
|||||||
icon: material/alert-decagram
|
icon: material/alert-decagram
|
||||||
---
|
---
|
||||||
|
|
||||||
#### 1.12.0-beta.20
|
#### 1.12.0-beta.21
|
||||||
|
|
||||||
|
* Fix missing `home` option for DERP service **1**
|
||||||
* Fixes and improvements
|
* Fixes and improvements
|
||||||
|
|
||||||
### 1.11.12
|
**1**:
|
||||||
|
|
||||||
|
You can now choose what the DERP home page shows, just like with derper's `-home` flag.
|
||||||
|
|
||||||
|
See [DERP](/configuration/service/derp/#home).
|
||||||
|
|
||||||
|
### 1.11.13
|
||||||
|
|
||||||
* Fixes and improvements
|
* Fixes and improvements
|
||||||
|
|
||||||
|
@ -398,11 +398,11 @@ UDP NAT 过期时间。
|
|||||||
|
|
||||||
TCP/IP 栈。
|
TCP/IP 栈。
|
||||||
|
|
||||||
| 栈 | 描述 |
|
| 栈 | 描述 |
|
||||||
|--------|------------------------------------------------------------------|
|
|----------|-------------------------------------------------------------------------------------------------------|
|
||||||
| system | 基于系统网络栈执行 L3 到 L4 转换 |
|
| `system` | 基于系统网络栈执行 L3 到 L4 转换 |
|
||||||
| gVisor | 基于 [gVisor](https://github.com/google/gvisor) 虚拟网络栈执行 L3 到 L4 转换 |
|
| `gvisor` | 基于 [gVisor](https://github.com/google/gvisor) 虚拟网络栈执行 L3 到 L4 转换 |
|
||||||
| mixed | 混合 `system` TCP 栈与 `gvisor` UDP 栈 |
|
| `mixed` | 混合 `system` TCP 栈与 `gvisor` UDP 栈 |
|
||||||
|
|
||||||
默认使用 `mixed` 栈如果 gVisor 构建标记已启用,否则默认使用 `system` 栈。
|
默认使用 `mixed` 栈如果 gVisor 构建标记已启用,否则默认使用 `system` 栈。
|
||||||
|
|
||||||
|
@ -20,6 +20,7 @@ DERP service is a Tailscale DERP server, similar to [derper](https://pkg.go.dev/
|
|||||||
"config_path": "",
|
"config_path": "",
|
||||||
"verify_client_endpoint": [],
|
"verify_client_endpoint": [],
|
||||||
"verify_client_url": [],
|
"verify_client_url": [],
|
||||||
|
"home": "",
|
||||||
"mesh_with": [],
|
"mesh_with": [],
|
||||||
"mesh_psk": "",
|
"mesh_psk": "",
|
||||||
"mesh_psk_file": "",
|
"mesh_psk_file": "",
|
||||||
@ -69,6 +70,10 @@ Setting Array value to a string `__URL__` is equivalent to configuring:
|
|||||||
{ "url": __URL__ }
|
{ "url": __URL__ }
|
||||||
```
|
```
|
||||||
|
|
||||||
|
#### home
|
||||||
|
|
||||||
|
What to serve at the root path. It may be left empty (the default, for a default homepage), `blank` for a blank page, or a URL to redirect to
|
||||||
|
|
||||||
#### mesh_with
|
#### mesh_with
|
||||||
|
|
||||||
Mesh with other DERP servers.
|
Mesh with other DERP servers.
|
||||||
|
@ -10,7 +10,7 @@ icon: material/new-box
|
|||||||
|
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"endpoints": [
|
"services": [
|
||||||
{
|
{
|
||||||
"type": "",
|
"type": "",
|
||||||
"tag": ""
|
"tag": ""
|
||||||
@ -25,6 +25,7 @@ icon: material/new-box
|
|||||||
|------------|------------------------|
|
|------------|------------------------|
|
||||||
| `derp` | [DERP](./derp) |
|
| `derp` | [DERP](./derp) |
|
||||||
| `resolved` | [Resolved](./resolved) |
|
| `resolved` | [Resolved](./resolved) |
|
||||||
|
| `ssm-api` | [SSM API](./ssm-api) |
|
||||||
|
|
||||||
#### tag
|
#### tag
|
||||||
|
|
||||||
|
2
go.mod
2
go.mod
@ -30,7 +30,7 @@ require (
|
|||||||
github.com/sagernet/quic-go v0.52.0-beta.1
|
github.com/sagernet/quic-go v0.52.0-beta.1
|
||||||
github.com/sagernet/sing v0.6.11-0.20250521033217-30d675ea099b
|
github.com/sagernet/sing v0.6.11-0.20250521033217-30d675ea099b
|
||||||
github.com/sagernet/sing-mux v0.3.2
|
github.com/sagernet/sing-mux v0.3.2
|
||||||
github.com/sagernet/sing-quic v0.5.0-beta.1
|
github.com/sagernet/sing-quic v0.5.0-beta.2
|
||||||
github.com/sagernet/sing-shadowsocks v0.2.8
|
github.com/sagernet/sing-shadowsocks v0.2.8
|
||||||
github.com/sagernet/sing-shadowsocks2 v0.2.1
|
github.com/sagernet/sing-shadowsocks2 v0.2.1
|
||||||
github.com/sagernet/sing-shadowtls v0.2.1-0.20250503051639-fcd445d33c11
|
github.com/sagernet/sing-shadowtls v0.2.1-0.20250503051639-fcd445d33c11
|
||||||
|
4
go.sum
4
go.sum
@ -172,8 +172,8 @@ github.com/sagernet/sing v0.6.11-0.20250521033217-30d675ea099b h1:ZjTCYPb5f7aHdf
|
|||||||
github.com/sagernet/sing v0.6.11-0.20250521033217-30d675ea099b/go.mod h1:ARkL0gM13/Iv5VCZmci/NuoOlePoIsW0m7BWfln/Hak=
|
github.com/sagernet/sing v0.6.11-0.20250521033217-30d675ea099b/go.mod h1:ARkL0gM13/Iv5VCZmci/NuoOlePoIsW0m7BWfln/Hak=
|
||||||
github.com/sagernet/sing-mux v0.3.2 h1:meZVFiiStvHThb/trcpAkCrmtJOuItG5Dzl1RRP5/NE=
|
github.com/sagernet/sing-mux v0.3.2 h1:meZVFiiStvHThb/trcpAkCrmtJOuItG5Dzl1RRP5/NE=
|
||||||
github.com/sagernet/sing-mux v0.3.2/go.mod h1:pht8iFY4c9Xltj7rhVd208npkNaeCxzyXCgulDPLUDA=
|
github.com/sagernet/sing-mux v0.3.2/go.mod h1:pht8iFY4c9Xltj7rhVd208npkNaeCxzyXCgulDPLUDA=
|
||||||
github.com/sagernet/sing-quic v0.5.0-beta.1 h1:nC0i/s8LhlZB8ev6laZCXF/uiwAE4kRdT4PcDdE4rI4=
|
github.com/sagernet/sing-quic v0.5.0-beta.2 h1:j7KAbBuGmsKwSxVAQL5soJ+wDqxim4/llK2kxB0hSKk=
|
||||||
github.com/sagernet/sing-quic v0.5.0-beta.1/go.mod h1:SAv/qdeDN+75msGG5U5ZIwG+3Ua50jVIKNrRSY8pkx0=
|
github.com/sagernet/sing-quic v0.5.0-beta.2/go.mod h1:SAv/qdeDN+75msGG5U5ZIwG+3Ua50jVIKNrRSY8pkx0=
|
||||||
github.com/sagernet/sing-shadowsocks v0.2.8 h1:PURj5PRoAkqeHh2ZW205RWzN9E9RtKCVCzByXruQWfE=
|
github.com/sagernet/sing-shadowsocks v0.2.8 h1:PURj5PRoAkqeHh2ZW205RWzN9E9RtKCVCzByXruQWfE=
|
||||||
github.com/sagernet/sing-shadowsocks v0.2.8/go.mod h1:lo7TWEMDcN5/h5B8S0ew+r78ZODn6SwVaFhvB6H+PTI=
|
github.com/sagernet/sing-shadowsocks v0.2.8/go.mod h1:lo7TWEMDcN5/h5B8S0ew+r78ZODn6SwVaFhvB6H+PTI=
|
||||||
github.com/sagernet/sing-shadowsocks2 v0.2.1 h1:dWV9OXCeFPuYGHb6IRqlSptVnSzOelnqqs2gQ2/Qioo=
|
github.com/sagernet/sing-shadowsocks2 v0.2.1 h1:dWV9OXCeFPuYGHb6IRqlSptVnSzOelnqqs2gQ2/Qioo=
|
||||||
|
@ -36,6 +36,7 @@ type DERPServiceOptions struct {
|
|||||||
ConfigPath string `json:"config_path,omitempty"`
|
ConfigPath string `json:"config_path,omitempty"`
|
||||||
VerifyClientEndpoint badoption.Listable[string] `json:"verify_client_endpoint,omitempty"`
|
VerifyClientEndpoint badoption.Listable[string] `json:"verify_client_endpoint,omitempty"`
|
||||||
VerifyClientURL badoption.Listable[*DERPVerifyClientURLOptions] `json:"verify_client_url,omitempty"`
|
VerifyClientURL badoption.Listable[*DERPVerifyClientURLOptions] `json:"verify_client_url,omitempty"`
|
||||||
|
Home string `json:"home,omitempty"`
|
||||||
MeshWith badoption.Listable[*DERPMeshOptions] `json:"mesh_with,omitempty"`
|
MeshWith badoption.Listable[*DERPMeshOptions] `json:"mesh_with,omitempty"`
|
||||||
MeshPSK string `json:"mesh_psk,omitempty"`
|
MeshPSK string `json:"mesh_psk,omitempty"`
|
||||||
MeshPSKFile string `json:"mesh_psk_file,omitempty"`
|
MeshPSKFile string `json:"mesh_psk_file,omitempty"`
|
||||||
|
@ -124,6 +124,7 @@ func NewService(ctx context.Context, logger log.ContextLogger, tag string, optio
|
|||||||
configPath: configPath,
|
configPath: configPath,
|
||||||
verifyClientEndpoint: options.VerifyClientEndpoint,
|
verifyClientEndpoint: options.VerifyClientEndpoint,
|
||||||
verifyClientURL: options.VerifyClientURL,
|
verifyClientURL: options.VerifyClientURL,
|
||||||
|
home: options.Home,
|
||||||
meshKey: options.MeshPSK,
|
meshKey: options.MeshPSK,
|
||||||
meshKeyPath: options.MeshPSKFile,
|
meshKeyPath: options.MeshPSKFile,
|
||||||
meshWith: options.MeshWith,
|
meshWith: options.MeshWith,
|
||||||
|
@ -47,6 +47,7 @@ func NewServer(ctx context.Context, logger logger.ContextLogger, options option.
|
|||||||
server := &Server{
|
server := &Server{
|
||||||
ctx: ctx,
|
ctx: ctx,
|
||||||
tlsConfig: tlsConfig,
|
tlsConfig: tlsConfig,
|
||||||
|
logger: logger,
|
||||||
handler: handler,
|
handler: handler,
|
||||||
h2Server: &http2.Server{
|
h2Server: &http2.Server{
|
||||||
IdleTimeout: time.Duration(options.IdleTimeout),
|
IdleTimeout: time.Duration(options.IdleTimeout),
|
||||||
|
@ -62,15 +62,16 @@ func (c *WebsocketConn) Close() error {
|
|||||||
func (c *WebsocketConn) Read(b []byte) (n int, err error) {
|
func (c *WebsocketConn) Read(b []byte) (n int, err error) {
|
||||||
var header ws.Header
|
var header ws.Header
|
||||||
for {
|
for {
|
||||||
n, err = wrapWsError0(c.reader.Read(b))
|
n, err = c.reader.Read(b)
|
||||||
if n > 0 {
|
if n > 0 {
|
||||||
err = nil
|
err = nil
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if !E.IsMulti(err, io.EOF, wsutil.ErrNoFrameAdvance) {
|
if !E.IsMulti(err, io.EOF, wsutil.ErrNoFrameAdvance) {
|
||||||
|
err = wrapWsError(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
header, err = c.reader.NextFrame()
|
header, err = wrapWsError0(c.reader.NextFrame())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -79,14 +80,14 @@ func (c *WebsocketConn) Read(b []byte) (n int, err error) {
|
|||||||
err = wsutil.ErrFrameTooLarge
|
err = wsutil.ErrFrameTooLarge
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
err = c.controlHandler(header, c.reader)
|
err = wrapWsError(c.controlHandler(header, c.reader))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if header.OpCode&ws.OpBinary == 0 {
|
if header.OpCode&ws.OpBinary == 0 {
|
||||||
err = c.reader.Discard()
|
err = wrapWsError(c.reader.Discard())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -178,12 +179,12 @@ func (c *EarlyWebsocketConn) writeRequest(content []byte) error {
|
|||||||
conn, err = c.dialContext(c.ctx, &c.requestURL, c.headers)
|
conn, err = c.dialContext(c.ctx, &c.requestURL, c.headers)
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return wrapWsError(err)
|
return err
|
||||||
}
|
}
|
||||||
if len(lateData) > 0 {
|
if len(lateData) > 0 {
|
||||||
_, err = conn.Write(lateData)
|
_, err = conn.Write(lateData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return wrapWsError(err)
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
c.conn = conn
|
c.conn = conn
|
||||||
@ -202,7 +203,7 @@ func (c *EarlyWebsocketConn) Write(b []byte) (n int, err error) {
|
|||||||
if c.conn != nil {
|
if c.conn != nil {
|
||||||
return wrapWsError0(c.conn.Write(b))
|
return wrapWsError0(c.conn.Write(b))
|
||||||
}
|
}
|
||||||
err = wrapWsError(c.writeRequest(b))
|
err = c.writeRequest(b)
|
||||||
c.err = err
|
c.err = err
|
||||||
close(c.create)
|
close(c.create)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -223,7 +224,7 @@ func (c *EarlyWebsocketConn) WriteBuffer(buffer *buf.Buffer) error {
|
|||||||
if c.err != nil {
|
if c.err != nil {
|
||||||
return c.err
|
return c.err
|
||||||
}
|
}
|
||||||
err := wrapWsError(c.writeRequest(buffer.Bytes()))
|
err := c.writeRequest(buffer.Bytes())
|
||||||
c.err = err
|
c.err = err
|
||||||
close(c.create)
|
close(c.create)
|
||||||
return err
|
return err
|
||||||
@ -278,7 +279,7 @@ func wrapWsError(err error) error {
|
|||||||
if err == nil {
|
if err == nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
var closedErr *wsutil.ClosedError
|
var closedErr wsutil.ClosedError
|
||||||
if errors.As(err, &closedErr) {
|
if errors.As(err, &closedErr) {
|
||||||
if closedErr.Code == ws.StatusNormalClosure {
|
if closedErr.Code == ws.StatusNormalClosure {
|
||||||
err = io.EOF
|
err = io.EOF
|
||||||
@ -291,5 +292,5 @@ func wrapWsError0[T any](value T, err error) (T, error) {
|
|||||||
if err == nil {
|
if err == nil {
|
||||||
return value, nil
|
return value, nil
|
||||||
}
|
}
|
||||||
return common.DefaultValue[T](), wrapWsError(err)
|
return value, wrapWsError(err)
|
||||||
}
|
}
|
||||||
|
@ -1,22 +0,0 @@
|
|||||||
package v2raywebsocket
|
|
||||||
|
|
||||||
import (
|
|
||||||
"net"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
type deadConn struct {
|
|
||||||
net.Conn
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *deadConn) SetDeadline(t time.Time) error {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *deadConn) SetReadDeadline(t time.Time) error {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *deadConn) SetWriteDeadline(t time.Time) error {
|
|
||||||
return nil
|
|
||||||
}
|
|
@ -66,7 +66,7 @@ func (w *Writer) WriteBuffer(buffer *buf.Buffer) error {
|
|||||||
ws.Cipher(data, *(*[4]byte)(header[1+payloadBitLength:]), 0)
|
ws.Cipher(data, *(*[4]byte)(header[1+payloadBitLength:]), 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
return w.writer.WriteBuffer(buffer)
|
return wrapWsError(w.writer.WriteBuffer(buffer))
|
||||||
}
|
}
|
||||||
|
|
||||||
func (w *Writer) FrontHeadroom() int {
|
func (w *Writer) FrontHeadroom() int {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user