go-tunnel/client_config.go

114 lines
2.7 KiB
Go
Raw Permalink Normal View History

2020-10-21 18:00:15 +02:00
package tunnel
import (
"crypto/sha1"
2020-10-26 19:42:07 +01:00
"time"
2020-10-21 18:00:15 +02:00
"github.com/pkg/errors"
"github.com/xtaci/kcp-go/v5"
2020-10-26 19:42:07 +01:00
"github.com/xtaci/smux"
2020-10-21 18:00:15 +02:00
"golang.org/x/crypto/pbkdf2"
)
type ClientConfig struct {
2020-10-26 19:42:07 +01:00
ServerAddress string
BlockCrypt kcp.BlockCrypt
DataShards int
ParityShards int
Credentials interface{}
ConfigureConn ConfigureConnFunc
AuthenticationTimeout time.Duration
ProxyRequestTimeout time.Duration
SmuxConfig *smux.Config
2020-10-21 18:00:15 +02:00
}
2020-10-26 19:42:07 +01:00
// nolint: go-mnd
2020-10-21 18:00:15 +02:00
func DefaultClientConfig() *ClientConfig {
unencryptedBlock, err := kcp.NewNoneBlockCrypt(nil)
if err != nil { // should never happen
panic(errors.WithStack(err))
}
2020-10-26 19:42:07 +01:00
smuxConfig := smux.DefaultConfig()
smuxConfig.Version = 2
smuxConfig.KeepAliveInterval = 10 * time.Second
smuxConfig.MaxReceiveBuffer = 4194304
smuxConfig.MaxStreamBuffer = 2097152
2020-10-21 18:00:15 +02:00
return &ClientConfig{
2020-10-26 19:42:07 +01:00
ServerAddress: "127.0.0.1:36543",
BlockCrypt: unencryptedBlock,
DataShards: 3,
ParityShards: 10,
Credentials: nil,
ConfigureConn: DefaultClientConfigureConn,
AuthenticationTimeout: 30 * time.Second,
ProxyRequestTimeout: 5 * time.Second,
SmuxConfig: smuxConfig,
2020-10-21 18:00:15 +02:00
}
}
2020-10-23 18:26:50 +02:00
type ClientConfigFunc func(c *ClientConfig)
func WithClientServerAddress(addr string) ClientConfigFunc {
return func(conf *ClientConfig) {
conf.ServerAddress = addr
}
}
2020-10-21 18:00:15 +02:00
func WithClientCredentials(credentials interface{}) ClientConfigFunc {
return func(conf *ClientConfig) {
conf.Credentials = credentials
}
}
2020-10-23 18:26:50 +02:00
func WithClientBlockCrypt(alg string, pass, salt string, iterations, keyLen int) ClientConfigFunc {
2020-10-21 18:00:15 +02:00
return func(conf *ClientConfig) {
2020-10-23 18:26:50 +02:00
key := pbkdf2.Key([]byte(pass), []byte(salt), iterations, keyLen, sha1.New)
2020-10-21 18:00:15 +02:00
2020-10-23 18:26:50 +02:00
block, err := createBlockCrypt(alg, key)
2020-10-21 18:00:15 +02:00
if err != nil {
2020-10-23 18:26:50 +02:00
panic(errors.Wrap(err, "could not create block crypt"))
2020-10-21 18:00:15 +02:00
}
conf.BlockCrypt = block
}
}
2020-10-23 18:26:50 +02:00
func WithClientConfigureConn(fn ConfigureConnFunc) ClientConfigFunc {
return func(conf *ClientConfig) {
conf.ConfigureConn = fn
}
}
2020-10-26 19:42:07 +01:00
func WithClientSmuxConfig(c *smux.Config) ClientConfigFunc {
return func(conf *ClientConfig) {
conf.SmuxConfig = c
}
}
// nolint: go-mnd
func DefaultClientConfigureConn(conn *kcp.UDPSession) error {
// Based on kcptun default configuration, mode 'fast3'
conn.SetStreamMode(true)
conn.SetWriteDelay(false)
conn.SetNoDelay(1, 10, 2, 1)
conn.SetWindowSize(128, 512)
conn.SetMtu(1400)
conn.SetACKNoDelay(true)
if err := conn.SetReadBuffer(16777217); err != nil {
return errors.WithStack(err)
}
if err := conn.SetWriteBuffer(16777217); err != nil {
return errors.WithStack(err)
}
if err := conn.SetDSCP(46); err != nil {
return errors.WithStack(err)
}
return nil
}