Feature: add simple-obfs support for ss

This commit is contained in:
xjasonlyu
2021-02-06 13:41:44 +08:00
parent 44e47cc86c
commit e0956ce58c
5 changed files with 357 additions and 10 deletions
+17 -3
View File
@@ -8,6 +8,7 @@ import (
"github.com/xjasonlyu/tun2socks/common/adapter"
"github.com/xjasonlyu/tun2socks/component/dialer"
obfs "github.com/xjasonlyu/tun2socks/component/simple-obfs"
"github.com/xjasonlyu/tun2socks/component/socks5"
"github.com/Dreamacro/go-shadowsocks2/core"
@@ -17,17 +18,22 @@ type ShadowSocks struct {
*Base
cipher core.Cipher
// simple-obfs plugin
obfsMode, obfsHost string
}
func NewShadowSocks(addr, method, password string) (*ShadowSocks, error) {
func NewShadowSocks(addr, method, password, obfsMode, obfsHost string) (*ShadowSocks, error) {
cipher, err := core.PickCipher(method, nil, password)
if err != nil {
return nil, fmt.Errorf("ss initialize: %w", err)
}
return &ShadowSocks{
Base: NewBase(addr),
cipher: cipher,
Base: NewBase(addr),
cipher: cipher,
obfsMode: obfsMode,
obfsHost: obfsHost,
}, nil
}
@@ -44,6 +50,14 @@ func (ss *ShadowSocks) DialContext(ctx context.Context, metadata *adapter.Metada
}
}()
switch ss.obfsMode {
case "tls":
c = obfs.NewTLSObfs(c, ss.obfsHost)
case "http":
_, port, _ := net.SplitHostPort(ss.addr)
c = obfs.NewHTTPObfs(c, ss.obfsHost, port)
}
c = ss.cipher.StreamConn(c)
_, err = c.Write(metadata.SerializesSocksAddr())
return