From 63112a1509ac6dfc5504dbbe2550df9cb071329b Mon Sep 17 00:00:00 2001 From: nadoo <287492+nadoo@users.noreply.github.com> Date: Mon, 30 Nov 2020 20:28:09 +0800 Subject: [PATCH] kcp: support set mode (#197) --- README.md | 2 +- config.go | 2 +- config/glider.conf.example | 4 ++-- go.mod | 4 ++-- go.sum | 8 +++---- proxy/kcp/kcp.go | 45 ++++++++++++++++++++++++++------------ proxy/socks5/packet.go | 3 ++- 7 files changed, 43 insertions(+), 25 deletions(-) diff --git a/README.md b/README.md index e45df51..35233a0 100644 --- a/README.md +++ b/README.md @@ -233,7 +233,7 @@ Unix domain socket scheme: unix://path KCP scheme: - kcp://CRYPT:KEY@host:port[?dataShards=NUM&parityShards=NUM] + kcp://CRYPT:KEY@host:port[?dataShards=NUM&parityShards=NUM&mode=MODE] Available crypt types for KCP: none, sm4, tea, xor, aes, aes-128, aes-192, blowfish, twofish, cast5, 3des, xtea, salsa20 diff --git a/config.go b/config.go index 54275ce..262fb11 100644 --- a/config.go +++ b/config.go @@ -232,7 +232,7 @@ func usage() { fmt.Fprintf(w, "\n") fmt.Fprintf(w, "KCP scheme:\n") - fmt.Fprintf(w, " kcp://CRYPT:KEY@host:port[?dataShards=NUM&parityShards=NUM]\n") + fmt.Fprintf(w, " kcp://CRYPT:KEY@host:port[?dataShards=NUM&parityShards=NUM&mode=MODE]\n") fmt.Fprintf(w, "\n") fmt.Fprintf(w, "Available crypt types for KCP:\n") diff --git a/config/glider.conf.example b/config/glider.conf.example index cf77ef1..a260e7f 100644 --- a/config/glider.conf.example +++ b/config/glider.conf.example @@ -61,7 +61,7 @@ listen=socks5://:1080 # listen=unix:///tmp/glider.socket,socks5:// # socks5 over kcp -# listen=kcp://aes:key@127.0.0.1:8444?dataShards=10&parityShards=3,socks5:// +# listen=kcp://aes:key@127.0.0.1:8444?dataShards=10&parityShards=3&mode=fast,socks5:// # vless server # listen=vless://UUID@:1234 @@ -142,7 +142,7 @@ listen=socks5://:1080 # forward=tls://server.com:443,ss://AEAD_CHACHA20_POLY1305:pass@ # ss over kcp -# forward=kcp://aes:key@127.0.0.1:8444?dataShards=10&parityShards=3,ss://AEAD_CHACHA20_POLY1305:pass@ +# forward=kcp://aes:key@127.0.0.1:8444?dataShards=10&parityShards=3&mode=fast,ss://AEAD_CHACHA20_POLY1305:pass@ # ss with simple-obfs # forward=simple-obfs://1.1.1.1:443?type=tls&host=apple.com,ss://AEAD_CHACHA20_POLY1305:pass@ diff --git a/go.mod b/go.mod index 84aff94..07a14fe 100644 --- a/go.mod +++ b/go.mod @@ -9,13 +9,13 @@ require ( github.com/dgryski/go-rc2 v0.0.0-20150621095337-8a9021637152 github.com/ebfe/rc2 v0.0.0-20131011165748-24b9757f5521 // indirect github.com/insomniacslk/dhcp v0.0.0-20201112113307-4de412bc85d8 - github.com/mmcloughlin/avo v0.0.0-20201105074841-5d2f697d268f // indirect + github.com/mmcloughlin/avo v0.0.0-20201130012700-45c8ae10fd12 // indirect github.com/nadoo/conflag v0.2.3 github.com/nadoo/ipset v0.3.0 github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect github.com/xtaci/kcp-go/v5 v5.6.1 golang.org/x/crypto v0.0.0-20201124201722-c8d3bf9c5392 - golang.org/x/sys v0.0.0-20201126233918-771906719818 // indirect + golang.org/x/sys v0.0.0-20201130072748-111129e158e2 // indirect golang.org/x/tools v0.0.0-20201125231158-b5590deeca9b // indirect gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b // indirect ) diff --git a/go.sum b/go.sum index 3e5f153..9e7ddb2 100644 --- a/go.sum +++ b/go.sum @@ -47,8 +47,8 @@ github.com/mdlayher/raw v0.0.0-20191009151244-50f2db8cc065 h1:aFkJ6lx4FPip+S+Uw4 github.com/mdlayher/raw v0.0.0-20191009151244-50f2db8cc065/go.mod h1:7EpbotpCmVZcu+KCX4g9WaRNuu11uyhiW7+Le1dKawg= github.com/mmcloughlin/avo v0.0.0-20200803215136-443f81d77104 h1:ULR/QWMgcgRiZLUjSSJMU+fW+RDMstRdmnDWj9Q+AsA= github.com/mmcloughlin/avo v0.0.0-20200803215136-443f81d77104/go.mod h1:wqKykBG2QzQDJEzvRkcS8x6MiSJkF52hXZsXcjaB3ls= -github.com/mmcloughlin/avo v0.0.0-20201105074841-5d2f697d268f h1:D4I34fbgczGrhrN4DzBCZXT3u/nMWJnGmviIjSzzXSw= -github.com/mmcloughlin/avo v0.0.0-20201105074841-5d2f697d268f/go.mod h1:6aKT4zZIrpGqB3RpFU14ByCSSyKY6LfJz4J/JJChHfI= +github.com/mmcloughlin/avo v0.0.0-20201130012700-45c8ae10fd12 h1:JJvkIBIdkzz71+2UD6CHfjDC2O3fCZJ98KUaB70gr00= +github.com/mmcloughlin/avo v0.0.0-20201130012700-45c8ae10fd12/go.mod h1:6aKT4zZIrpGqB3RpFU14ByCSSyKY6LfJz4J/JJChHfI= github.com/nadoo/conflag v0.2.3 h1:/+rTaN0bHTIiQbPl1WZK78JRoqjlNqJ9Zf05ep0o5jI= github.com/nadoo/conflag v0.2.3/go.mod h1:dzFfDUpXdr2uS2oV+udpy5N2vfNOu/bFzjhX1WI52co= github.com/nadoo/ipset v0.3.0 h1:TgULgp4s2PI3ItoCykDzMp8R49fRhMUNoUUEahERr5o= @@ -128,8 +128,8 @@ golang.org/x/sys v0.0.0-20201009025420-dfb3f7c4e634/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201101102859-da207088b7d1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201112073958-5cba982894dd h1:5CtCZbICpIOFdgO940moixOPjc0178IU44m4EjOO5IY= golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201126233918-771906719818 h1:f1CIuDlJhwANEC2MM87MBEVMr3jl5bifgsfj90XAF9c= -golang.org/x/sys v0.0.0-20201126233918-771906719818/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201130072748-111129e158e2 h1:zXpk15uCEAaaJcTxBqQacweHUQ0HDhDOzupNGFs4imE= +golang.org/x/sys v0.0.0-20201130072748-111129e158e2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221 h1:/ZHdbVpdR/jk3g30/d4yUL0JU9kksj8+F/bnQUVLGDM= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= diff --git a/proxy/kcp/kcp.go b/proxy/kcp/kcp.go index 3cd1215..6627035 100644 --- a/proxy/kcp/kcp.go +++ b/proxy/kcp/kcp.go @@ -24,6 +24,7 @@ type KCP struct { key string crypt string + mode string block kcp.BlockCrypt dataShards int @@ -81,6 +82,7 @@ func NewKCP(s string, d proxy.Dialer, p proxy.Proxy) (*KCP, error) { addr: addr, key: key, crypt: crypt, + mode: query.Get("mode"), dataShards: int(dataShards), parityShards: int(parityShards), } @@ -92,6 +94,10 @@ func NewKCP(s string, d proxy.Dialer, p proxy.Proxy) (*KCP, error) { } } + if k.mode == "" { + k.mode = "fast" + } + return k, nil } @@ -172,13 +178,7 @@ func (s *KCP) ListenAndServe() { continue } - // TODO: change them to customizable later? - c.SetStreamMode(true) - c.SetWriteDelay(false) - c.SetNoDelay(0, 30, 2, 1) - c.SetWindowSize(1024, 1024) - c.SetMtu(1350) - c.SetACKNoDelay(true) + s.setParams(c) go s.Serve(c) } @@ -230,13 +230,7 @@ func (s *KCP) Dial(network, addr string) (net.Conn, error) { return nil, err } - // TODO: change them to customizable later? - c.SetStreamMode(true) - c.SetWriteDelay(false) - c.SetNoDelay(0, 30, 2, 1) - c.SetWindowSize(1024, 1024) - c.SetMtu(1350) - c.SetACKNoDelay(true) + s.setParams(c) c.SetDSCP(0) c.SetReadBuffer(4194304) @@ -249,3 +243,26 @@ func (s *KCP) Dial(network, addr string) (net.Conn, error) { func (s *KCP) DialUDP(network, addr string) (net.PacketConn, net.Addr, error) { return nil, nil, errors.New("kcp client does not support udp now") } + +func (s *KCP) setParams(c *kcp.UDPSession) { + // TODO: change them to customizable later? + c.SetStreamMode(true) + c.SetWriteDelay(false) + + switch s.mode { + case "normal": + c.SetNoDelay(0, 40, 2, 1) + case "fast": + c.SetNoDelay(0, 30, 2, 1) + case "fast2": + c.SetNoDelay(1, 20, 2, 1) + case "fast3": + c.SetNoDelay(1, 10, 2, 1) + default: // default use fast + c.SetNoDelay(0, 30, 2, 1) + } + + c.SetWindowSize(1024, 1024) + c.SetMtu(1350) + c.SetACKNoDelay(true) +} diff --git a/proxy/socks5/packet.go b/proxy/socks5/packet.go index 8fc2be2..231fb21 100644 --- a/proxy/socks5/packet.go +++ b/proxy/socks5/packet.go @@ -85,7 +85,8 @@ func (pc *PktConn) ReadFrom(b []byte) (int, net.Addr, error) { } if pc.tgtAddr == nil { - pc.tgtAddr = tgtAddr + pc.tgtAddr = make([]byte, len(tgtAddr)) + copy(pc.tgtAddr, tgtAddr) } return n, raddr, err