Skip to content

Commit abe6c3b

Browse files
committed
feat: support kcptun plugin for ss client/server
1 parent e28c8e6 commit abe6c3b

File tree

16 files changed

+752
-7
lines changed

16 files changed

+752
-7
lines changed

adapter/outbound/shadowsocks.go

Lines changed: 91 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
C "github.com/metacubex/mihomo/constant"
1414
"github.com/metacubex/mihomo/ntp"
1515
gost "github.com/metacubex/mihomo/transport/gost-plugin"
16+
"github.com/metacubex/mihomo/transport/kcptun"
1617
"github.com/metacubex/mihomo/transport/restls"
1718
obfs "github.com/metacubex/mihomo/transport/simple-obfs"
1819
shadowtls "github.com/metacubex/mihomo/transport/sing-shadowtls"
@@ -36,6 +37,7 @@ type ShadowSocks struct {
3637
gostOption *gost.Option
3738
shadowTLSOption *shadowtls.ShadowTLSOption
3839
restlsConfig *restls.Config
40+
kcptunClient *kcptun.Client
3941
}
4042

4143
type ShadowSocksOption struct {
@@ -106,6 +108,32 @@ type restlsOption struct {
106108
RestlsScript string `obfs:"restls-script,omitempty"`
107109
}
108110

111+
type kcpTunOption struct {
112+
Key string `obfs:"key,omitempty"`
113+
Crypt string `obfs:"crypt,omitempty"`
114+
Mode string `obfs:"mode,omitempty"`
115+
Conn int `obfs:"conn,omitempty"`
116+
AutoExpire int `obfs:"autoexpire,omitempty"`
117+
ScavengeTTL int `obfs:"scavengettl,omitempty"`
118+
MTU int `obfs:"mtu,omitempty"`
119+
SndWnd int `obfs:"sndwnd,omitempty"`
120+
RcvWnd int `obfs:"rcvwnd,omitempty"`
121+
DataShard int `obfs:"datashard,omitempty"`
122+
ParityShard int `obfs:"parityshard,omitempty"`
123+
DSCP int `obfs:"dscp,omitempty"`
124+
NoComp bool `obfs:"nocomp,omitempty"`
125+
AckNodelay bool `obfs:"acknodelay,omitempty"`
126+
NoDelay int `obfs:"nodelay,omitempty"`
127+
Interval int `obfs:"interval,omitempty"`
128+
Resend int `obfs:"resend,omitempty"`
129+
NoCongestion int `obfs:"nc,omitempty"`
130+
SockBuf int `obfs:"sockbuf,omitempty"`
131+
SmuxVer int `obfs:"smuxver,omitempty"`
132+
SmuxBuf int `obfs:"smuxbuf,omitempty"`
133+
StreamBuf int `obfs:"streambuf,omitempty"`
134+
KeepAlive int `obfs:"keepalive,omitempty"`
135+
}
136+
109137
// StreamConnContext implements C.ProxyAdapter
110138
func (ss *ShadowSocks) StreamConnContext(ctx context.Context, c net.Conn, metadata *C.Metadata) (_ net.Conn, err error) {
111139
useEarly := false
@@ -174,7 +202,27 @@ func (ss *ShadowSocks) DialContextWithDialer(ctx context.Context, dialer C.Diale
174202
return nil, err
175203
}
176204
}
177-
c, err := dialer.DialContext(ctx, "tcp", ss.addr)
205+
var c net.Conn
206+
if ss.kcptunClient != nil {
207+
c, err = ss.kcptunClient.OpenStream(ctx, func(ctx context.Context) (net.PacketConn, net.Addr, error) {
208+
if err = ss.ResolveUDP(ctx, metadata); err != nil {
209+
return nil, nil, err
210+
}
211+
addr, err := resolveUDPAddr(ctx, "udp", ss.addr, ss.prefer)
212+
if err != nil {
213+
return nil, nil, err
214+
}
215+
216+
pc, err := dialer.ListenPacket(ctx, "udp", "", addr.AddrPort())
217+
if err != nil {
218+
return nil, nil, err
219+
}
220+
221+
return pc, addr, nil
222+
})
223+
} else {
224+
c, err = dialer.DialContext(ctx, "tcp", ss.addr)
225+
}
178226
if err != nil {
179227
return nil, fmt.Errorf("%s connect error: %w", ss.addr, err)
180228
}
@@ -256,6 +304,13 @@ func (ss *ShadowSocks) SupportUOT() bool {
256304
return ss.option.UDPOverTCP
257305
}
258306

307+
func (ss *ShadowSocks) Close() error {
308+
if ss.kcptunClient != nil {
309+
return ss.kcptunClient.Close()
310+
}
311+
return nil
312+
}
313+
259314
func NewShadowSocks(option ShadowSocksOption) (*ShadowSocks, error) {
260315
addr := net.JoinHostPort(option.Server, strconv.Itoa(option.Port))
261316
method, err := shadowsocks.CreateMethod(option.Cipher, shadowsocks.MethodOptions{
@@ -271,6 +326,7 @@ func NewShadowSocks(option ShadowSocksOption) (*ShadowSocks, error) {
271326
var obfsOption *simpleObfsOption
272327
var shadowTLSOpt *shadowtls.ShadowTLSOption
273328
var restlsConfig *restls.Config
329+
var kcptunClient *kcptun.Client
274330
obfsMode := ""
275331

276332
decoder := structure.NewDecoder(structure.Option{TagName: "obfs", WeaklyTypedInput: true})
@@ -384,6 +440,39 @@ func NewShadowSocks(option ShadowSocksOption) (*ShadowSocks, error) {
384440
return nil, fmt.Errorf("ss %s initialize restls-plugin error: %w", addr, err)
385441
}
386442

443+
} else if option.Plugin == kcptun.Mode {
444+
obfsMode = kcptun.Mode
445+
kcptunOpt := &kcpTunOption{}
446+
if err := decoder.Decode(option.PluginOpts, kcptunOpt); err != nil {
447+
return nil, fmt.Errorf("ss %s initialize kcptun-plugin error: %w", addr, err)
448+
}
449+
450+
kcptunClient = kcptun.NewClient(kcptun.Config{
451+
Key: kcptunOpt.Key,
452+
Crypt: kcptunOpt.Crypt,
453+
Mode: kcptunOpt.Mode,
454+
Conn: kcptunOpt.Conn,
455+
AutoExpire: kcptunOpt.AutoExpire,
456+
ScavengeTTL: kcptunOpt.ScavengeTTL,
457+
MTU: kcptunOpt.MTU,
458+
SndWnd: kcptunOpt.SndWnd,
459+
RcvWnd: kcptunOpt.RcvWnd,
460+
DataShard: kcptunOpt.DataShard,
461+
ParityShard: kcptunOpt.ParityShard,
462+
DSCP: kcptunOpt.DSCP,
463+
NoComp: kcptunOpt.NoComp,
464+
AckNodelay: kcptunOpt.AckNodelay,
465+
NoDelay: kcptunOpt.NoDelay,
466+
Interval: kcptunOpt.Interval,
467+
Resend: kcptunOpt.Resend,
468+
NoCongestion: kcptunOpt.NoCongestion,
469+
SockBuf: kcptunOpt.SockBuf,
470+
SmuxVer: kcptunOpt.SmuxVer,
471+
SmuxBuf: kcptunOpt.SmuxBuf,
472+
StreamBuf: kcptunOpt.StreamBuf,
473+
KeepAlive: kcptunOpt.KeepAlive,
474+
})
475+
option.UDPOverTCP = true // must open uot
387476
}
388477
switch option.UDPOverTCPVersion {
389478
case uot.Version, uot.LegacyVersion:
@@ -414,5 +503,6 @@ func NewShadowSocks(option ShadowSocksOption) (*ShadowSocks, error) {
414503
obfsOption: obfsOption,
415504
shadowTLSOption: shadowTLSOpt,
416505
restlsConfig: restlsConfig,
506+
kcptunClient: kcptunClient,
417507
}, nil
418508
}

docs/config.yaml

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -534,6 +534,37 @@ proxies: # socks5
534534
version-hint: "tls12"
535535
restls-script: "1000?100<1,500~100,350~100,600~100,400~200"
536536

537+
- name: "ss-kcptun"
538+
type: ss
539+
server: [YOUR_SERVER_IP]
540+
port: 443
541+
cipher: chacha20-ietf-poly1305
542+
password: [YOUR_SS_PASSWORD]
543+
plugin: kcptun
544+
plugin-opts:
545+
key: it's a secrect # pre-shared secret between client and server
546+
crypt: aes # aes, aes-128, aes-192, salsa20, blowfish, twofish, cast5, 3des, tea, xtea, xor, sm4, none, null
547+
mode: fast # profiles: fast3, fast2, fast, normal, manual
548+
conn: 1 # set num of UDP connections to server
549+
autoexpire: 0 # set auto expiration time(in seconds) for a single UDP connection, 0 to disable
550+
scavengettl: 600 # set how long an expired connection can live (in seconds)
551+
mtu: 1350 # set maximum transmission unit for UDP packets
552+
sndwnd: 128 # set send window size(num of packets)
553+
rcvwnd: 512 # set receive window size(num of packets)
554+
datashard: 10 # set reed-solomon erasure coding - datashard
555+
parityshard: 3 # set reed-solomon erasure coding - parityshard
556+
dscp: 0 # set DSCP(6bit)
557+
nocomp: false # disable compression
558+
acknodelay: false # flush ack immediately when a packet is received
559+
nodelay: 0
560+
interval: 50
561+
resend: false
562+
sockbuf: 4194304 # per-socket buffer in bytes
563+
smuxver: 1 # specify smux version, available 1,2
564+
smuxbuf: 4194304 # the overall de-mux buffer in bytes
565+
streambuf: 2097152 # per stream receive buffer in bytes, smux v2+
566+
keepalive: 10 # seconds between heartbeats
567+
537568
# vmess
538569
# cipher 支持 auto/aes-128-gcm/chacha20-poly1305/none
539570
- name: "vmess"
@@ -1336,6 +1367,30 @@ listeners:
13361367
# password: password
13371368
# handshake:
13381369
# dest: test.com:443
1370+
# kcp-tun:
1371+
# enable: false
1372+
# key: it's a secrect # pre-shared secret between client and server
1373+
# crypt: aes # aes, aes-128, aes-192, salsa20, blowfish, twofish, cast5, 3des, tea, xtea, xor, sm4, none, null
1374+
# mode: fast # profiles: fast3, fast2, fast, normal, manual
1375+
# conn: 1 # set num of UDP connections to server
1376+
# autoexpire: 0 # set auto expiration time(in seconds) for a single UDP connection, 0 to disable
1377+
# scavengettl: 600 # set how long an expired connection can live (in seconds)
1378+
# mtu: 1350 # set maximum transmission unit for UDP packets
1379+
# sndwnd: 128 # set send window size(num of packets)
1380+
# rcvwnd: 512 # set receive window size(num of packets)
1381+
# datashard: 10 # set reed-solomon erasure coding - datashard
1382+
# parityshard: 3 # set reed-solomon erasure coding - parityshard
1383+
# dscp: 0 # set DSCP(6bit)
1384+
# nocomp: false # disable compression
1385+
# acknodelay: false # flush ack immediately when a packet is received
1386+
# nodelay: 0
1387+
# interval: 50
1388+
# resend: false
1389+
# sockbuf: 4194304 # per-socket buffer in bytes
1390+
# smuxver: 1 # specify smux version, available 1,2
1391+
# smuxbuf: 4194304 # the overall de-mux buffer in bytes
1392+
# streambuf: 2097152 # per stream receive buffer in bytes, smux v2+
1393+
# keepalive: 10 # seconds between heartbeats
13391394

13401395
- name: vmess-in-1
13411396
type: vmess

go.mod

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ require (
1111
github.com/go-chi/render v1.0.3
1212
github.com/gobwas/ws v1.4.0
1313
github.com/gofrs/uuid/v5 v5.3.2
14+
github.com/golang/snappy v1.0.0
1415
github.com/insomniacslk/dhcp v0.0.0-20250109001534-8abf58130905
1516
github.com/klauspost/compress v1.17.9 // lastest version compatible with golang1.20
1617
github.com/mdlayher/netlink v1.7.2
@@ -21,6 +22,7 @@ require (
2122
github.com/metacubex/chacha v0.1.5
2223
github.com/metacubex/fswatch v0.1.1
2324
github.com/metacubex/gopacket v1.1.20-0.20230608035415-7e2f98a3e759
25+
github.com/metacubex/kcp-go v0.0.0-20250922034656-df9a2b90cdf7
2426
github.com/metacubex/quic-go v0.54.1-0.20250730114134-a1ae705fe295
2527
github.com/metacubex/randv2 v0.2.0
2628
github.com/metacubex/restls-client-go v0.1.7
@@ -83,6 +85,8 @@ require (
8385
github.com/google/go-cmp v0.6.0 // indirect
8486
github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 // indirect
8587
github.com/josharian/native v1.1.0 // indirect
88+
github.com/klauspost/cpuid/v2 v2.2.6 // indirect
89+
github.com/klauspost/reedsolomon v1.12.3 // indirect
8690
github.com/kr/text v0.2.0 // indirect
8791
github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect
8892
github.com/mailru/easyjson v0.7.7 // indirect

go.sum

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ github.com/gofrs/uuid/v5 v5.3.2 h1:2jfO8j3XgSwlz/wHqemAEugfnTlikAYHhnqQ8Xh4fE0=
6060
github.com/gofrs/uuid/v5 v5.3.2/go.mod h1:CDOjlDMVAtN56jqyRUZh58JT31Tiw7/oQyEXZV+9bD8=
6161
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
6262
github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
63+
github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs=
64+
github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
6365
github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg=
6466
github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4=
6567
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
@@ -77,6 +79,10 @@ github.com/josharian/native v1.1.0 h1:uuaP0hAbW7Y4l0ZRQ6C9zfb7Mg1mbFKry/xzDAfmtL
7779
github.com/josharian/native v1.1.0/go.mod h1:7X/raswPFr05uY3HiLlYeyQntB6OO7E/d2Cu7qoaN2w=
7880
github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA=
7981
github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw=
82+
github.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc=
83+
github.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
84+
github.com/klauspost/reedsolomon v1.12.3 h1:tzUznbfc3OFwJaTebv/QdhnFf2Xvb7gZ24XaHLBPmdc=
85+
github.com/klauspost/reedsolomon v1.12.3/go.mod h1:3K5rXwABAvzGeR01r6pWZieUALXO/Tq7bFKGIb4m4WI=
8086
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
8187
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
8288
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
@@ -106,6 +112,8 @@ github.com/metacubex/gopacket v1.1.20-0.20230608035415-7e2f98a3e759 h1:cjd4biTvO
106112
github.com/metacubex/gopacket v1.1.20-0.20230608035415-7e2f98a3e759/go.mod h1:UHOv2xu+RIgLwpXca7TLrXleEd4oR3sPatW6IF8wU88=
107113
github.com/metacubex/gvisor v0.0.0-20250919004547-6122b699a301 h1:N5GExQJqYAH3gOCshpp2u/J3CtNYzMctmlb0xK9wtbQ=
108114
github.com/metacubex/gvisor v0.0.0-20250919004547-6122b699a301/go.mod h1:8LpS0IJW1VmWzUm3ylb0e2SK5QDm5lO/2qwWLZgRpBU=
115+
github.com/metacubex/kcp-go v0.0.0-20250922034656-df9a2b90cdf7 h1:vGsrjQxlepSfkMALzJuvDzd+wp6NvKXpoyPuPb4SYCE=
116+
github.com/metacubex/kcp-go v0.0.0-20250922034656-df9a2b90cdf7/go.mod h1:HIJZW4QMhbBqXuqC1ly6Hn0TEYT2SzRw58ns1yGhXTs=
109117
github.com/metacubex/nftables v0.0.0-20250503052935-30a69ab87793 h1:1Qpuy+sU3DmyX9HwI+CrBT/oLNJngvBorR2RbajJcqo=
110118
github.com/metacubex/nftables v0.0.0-20250503052935-30a69ab87793/go.mod h1:RjRNb4G52yAgfR+Oe/kp9G4PJJ97Fnj89eY1BFO3YyA=
111119
github.com/metacubex/quic-go v0.54.1-0.20250730114134-a1ae705fe295 h1:8JVlYuE8uSJAvmyCd4TjvDxs57xjb0WxEoaWafK5+qs=
@@ -216,6 +224,7 @@ github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAh
216224
github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds=
217225
github.com/wk8/go-ordered-map/v2 v2.1.8 h1:5h/BUHu93oj4gIdvHHHGsScSTMijfx5PeYkE/fJgbpc=
218226
github.com/wk8/go-ordered-map/v2 v2.1.8/go.mod h1:5nJHM5DyteebpVlHnWMV0rPz6Zp7+xBAnxjb1X5vnTw=
227+
github.com/xtaci/lossyconn v0.0.0-20190602105132-8df528c0c9ae h1:J0GxkO96kL4WF+AIT3M4mfUVinOCPgf2uUWYFUzN0sM=
219228
github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0=
220229
github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
221230
gitlab.com/go-extension/aes-ccm v0.0.0-20230221065045-e58665ef23c7 h1:UNrDfkQqiEYzdMlNsVvBYOAJWZjdktqFE9tQh5BT2+4=
@@ -256,6 +265,7 @@ golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7w
256265
golang.org/x/sys v0.0.0-20220622161953-175b2fd9d664/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
257266
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
258267
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
268+
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
259269
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
260270
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
261271
golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=

listener/config/kcptun.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package config
2+
3+
import "github.com/metacubex/mihomo/transport/kcptun"
4+
5+
type KcpTun struct {
6+
Enable bool `json:"enable"`
7+
kcptun.Config `json:",inline"`
8+
}

listener/config/shadowsocks.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ type ShadowsocksServer struct {
1414
Udp bool
1515
MuxOption sing.MuxOption `yaml:"mux-option" json:"mux-option,omitempty"`
1616
ShadowTLS ShadowTLS `yaml:"shadow-tls" json:"shadow-tls,omitempty"`
17+
KcpTun KcpTun `yaml:"kcp-tun" json:"kcp-tun,omitempty"`
1718
}
1819

1920
func (t ShadowsocksServer) String() string {

listener/inbound/kcptun.go

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package inbound
2+
3+
import (
4+
LC "github.com/metacubex/mihomo/listener/config"
5+
"github.com/metacubex/mihomo/transport/kcptun"
6+
)
7+
8+
type KcpTun struct {
9+
Enable bool `inbound:"enable"`
10+
Key string `inbound:"key,omitempty"`
11+
Crypt string `inbound:"crypt,omitempty"`
12+
Mode string `inbound:"mode,omitempty"`
13+
Conn int `inbound:"conn,omitempty"`
14+
AutoExpire int `inbound:"autoexpire,omitempty"`
15+
ScavengeTTL int `inbound:"scavengettl,omitempty"`
16+
MTU int `inbound:"mtu,omitempty"`
17+
SndWnd int `inbound:"sndwnd,omitempty"`
18+
RcvWnd int `inbound:"rcvwnd,omitempty"`
19+
DataShard int `inbound:"datashard,omitempty"`
20+
ParityShard int `inbound:"parityshard,omitempty"`
21+
DSCP int `inbound:"dscp,omitempty"`
22+
NoComp bool `inbound:"nocomp,omitempty"`
23+
AckNodelay bool `inbound:"acknodelay,omitempty"`
24+
NoDelay int `inbound:"nodelay,omitempty"`
25+
Interval int `inbound:"interval,omitempty"`
26+
Resend int `inbound:"resend,omitempty"`
27+
NoCongestion int `inbound:"nc,omitempty"`
28+
SockBuf int `inbound:"sockbuf,omitempty"`
29+
SmuxVer int `inbound:"smuxver,omitempty"`
30+
SmuxBuf int `inbound:"smuxbuf,omitempty"`
31+
StreamBuf int `inbound:"streambuf,omitempty"`
32+
KeepAlive int `inbound:"keepalive,omitempty"`
33+
}
34+
35+
func (c KcpTun) Build() LC.KcpTun {
36+
return LC.KcpTun{
37+
Enable: c.Enable,
38+
Config: kcptun.Config{
39+
Key: c.Key,
40+
Crypt: c.Crypt,
41+
Mode: c.Mode,
42+
Conn: c.Conn,
43+
AutoExpire: c.AutoExpire,
44+
ScavengeTTL: c.ScavengeTTL,
45+
MTU: c.MTU,
46+
SndWnd: c.SndWnd,
47+
RcvWnd: c.RcvWnd,
48+
DataShard: c.DataShard,
49+
ParityShard: c.ParityShard,
50+
DSCP: c.DSCP,
51+
NoComp: c.NoComp,
52+
AckNodelay: c.AckNodelay,
53+
NoDelay: c.NoDelay,
54+
Interval: c.Interval,
55+
Resend: c.Resend,
56+
NoCongestion: c.NoCongestion,
57+
SockBuf: c.SockBuf,
58+
SmuxVer: c.SmuxVer,
59+
SmuxBuf: c.SmuxBuf,
60+
StreamBuf: c.StreamBuf,
61+
KeepAlive: c.KeepAlive,
62+
},
63+
}
64+
}

listener/inbound/shadowsocks.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ type ShadowSocksOption struct {
1616
UDP bool `inbound:"udp,omitempty"`
1717
MuxOption MuxOption `inbound:"mux-option,omitempty"`
1818
ShadowTLS ShadowTLS `inbound:"shadow-tls,omitempty"`
19+
KcpTun KcpTun `inbound:"kcp-tun,omitempty"`
1920
}
2021

2122
func (o ShadowSocksOption) Equal(config C.InboundConfig) bool {
@@ -45,6 +46,7 @@ func NewShadowSocks(options *ShadowSocksOption) (*ShadowSocks, error) {
4546
Udp: options.UDP,
4647
MuxOption: options.MuxOption.Build(),
4748
ShadowTLS: options.ShadowTLS.Build(),
49+
KcpTun: options.KcpTun.Build(),
4850
},
4951
}, nil
5052
}

0 commit comments

Comments
 (0)