mirror of
https://github.com/nadoo/glider.git
synced 2025-02-23 17:35:40 +08:00
trojan: add new scheme trojanc (trojan cleartext)
This commit is contained in:
parent
175ef16a5c
commit
40ddd1be3a
@ -53,6 +53,7 @@ we can set up local listeners as proxy servers, and forward requests to internet
|
|||||||
|ssr | | |√| |client only
|
|ssr | | |√| |client only
|
||||||
|ssh | | |√| |client only
|
|ssh | | |√| |client only
|
||||||
|trojan |√|√|√|√|client & server
|
|trojan |√|√|√|√|client & server
|
||||||
|
|trojanc |√|√|√|√|trojan cleartext(without tls)
|
||||||
|vless |√|√|√|√|client & server
|
|vless |√|√|√|√|client & server
|
||||||
|vmess | | |√| |client only
|
|vmess | | |√| |client only
|
||||||
|redir |√| | | |linux only
|
|redir |√| | | |linux only
|
||||||
@ -141,8 +142,8 @@ glider -h
|
|||||||
verbose mode
|
verbose mode
|
||||||
|
|
||||||
Available schemes:
|
Available schemes:
|
||||||
listen: mixed ss socks5 http vless trojan redir redir6 tcptun udptun uottun tls unix kcp
|
listen: mixed ss socks5 http vless trojan trojanc redir redir6 tcptun udptun uottun tls unix kcp
|
||||||
forward: reject ss socks4 socks5 http ssr ssh vless vmess trojan tls ws unix kcp simple-obfs
|
forward: reject ss socks4 socks5 http ssr ssh vless vmess trojan trojanc tls ws unix kcp simple-obfs
|
||||||
|
|
||||||
Socks5 scheme:
|
Socks5 scheme:
|
||||||
socks://[user:pass@]host:port
|
socks://[user:pass@]host:port
|
||||||
@ -173,9 +174,11 @@ VLESS scheme:
|
|||||||
|
|
||||||
Trojan client scheme:
|
Trojan client scheme:
|
||||||
trojan://pass@host:port[?serverName=SERVERNAME][&skipVerify=true]
|
trojan://pass@host:port[?serverName=SERVERNAME][&skipVerify=true]
|
||||||
|
trojanc://pass@host:port (cleartext, without TLS)
|
||||||
|
|
||||||
Trojan server scheme:
|
Trojan server scheme:
|
||||||
trojan://pass@host:port?cert=PATH&key=PATH
|
trojan://pass@host:port?cert=PATH&key=PATH
|
||||||
|
trojanc://pass@host:port (cleartext, without TLS)
|
||||||
|
|
||||||
Available securities for vmess:
|
Available securities for vmess:
|
||||||
none, aes-128-gcm, chacha20-poly1305
|
none, aes-128-gcm, chacha20-poly1305
|
||||||
|
@ -130,8 +130,8 @@ func usage() {
|
|||||||
fmt.Fprintf(w, "\n")
|
fmt.Fprintf(w, "\n")
|
||||||
|
|
||||||
fmt.Fprintf(w, "Available schemes:\n")
|
fmt.Fprintf(w, "Available schemes:\n")
|
||||||
fmt.Fprintf(w, " listen: mixed ss socks5 http vless trojan redir redir6 tcptun udptun uottun tls unix kcp\n")
|
fmt.Fprintf(w, " listen: mixed ss socks5 http vless trojan trojanc redir redir6 tcptun udptun uottun tls unix kcp\n")
|
||||||
fmt.Fprintf(w, " forward: reject ss socks4 socks5 http ssr ssh vless vmess trojan tls ws unix kcp simple-obfs\n")
|
fmt.Fprintf(w, " forward: reject ss socks4 socks5 http ssr ssh vless vmess trojan trojanc tls ws unix kcp simple-obfs\n")
|
||||||
fmt.Fprintf(w, "\n")
|
fmt.Fprintf(w, "\n")
|
||||||
|
|
||||||
fmt.Fprintf(w, "Socks5 scheme:\n")
|
fmt.Fprintf(w, "Socks5 scheme:\n")
|
||||||
@ -170,10 +170,12 @@ func usage() {
|
|||||||
|
|
||||||
fmt.Fprintf(w, "Trojan client scheme:\n")
|
fmt.Fprintf(w, "Trojan client scheme:\n")
|
||||||
fmt.Fprintf(w, " trojan://pass@host:port[?serverName=SERVERNAME][&skipVerify=true]\n")
|
fmt.Fprintf(w, " trojan://pass@host:port[?serverName=SERVERNAME][&skipVerify=true]\n")
|
||||||
|
fmt.Fprintf(w, " trojanc://pass@host:port (cleartext, without TLS)\n")
|
||||||
fmt.Fprintf(w, "\n")
|
fmt.Fprintf(w, "\n")
|
||||||
|
|
||||||
fmt.Fprintf(w, "Trojan server scheme:\n")
|
fmt.Fprintf(w, "Trojan server scheme:\n")
|
||||||
fmt.Fprintf(w, " trojan://pass@host:port?cert=PATH&key=PATH\n")
|
fmt.Fprintf(w, " trojan://pass@host:port?cert=PATH&key=PATH\n")
|
||||||
|
fmt.Fprintf(w, " trojanc://pass@host:port (cleartext, without TLS)\n")
|
||||||
fmt.Fprintf(w, "\n")
|
fmt.Fprintf(w, "\n")
|
||||||
|
|
||||||
fmt.Fprintf(w, "Available securities for vmess:\n")
|
fmt.Fprintf(w, "Available securities for vmess:\n")
|
||||||
|
@ -79,7 +79,7 @@ listen=socks5://:1080
|
|||||||
# listen=tls://:1234?cert=/path/to/cert&key=/path/to/key,vless://UUID@?fallback=127.0.0.1:80
|
# listen=tls://:1234?cert=/path/to/cert&key=/path/to/key,vless://UUID@?fallback=127.0.0.1:80
|
||||||
|
|
||||||
# trojan server
|
# trojan server
|
||||||
#listen=trojan://PASSWORD:1234?cert=/path/to/cert&key=/path/to/key
|
# listen=trojan://PASSWORD:1234?cert=/path/to/cert&key=/path/to/key
|
||||||
|
|
||||||
# FORWARDERS
|
# FORWARDERS
|
||||||
# ----------
|
# ----------
|
||||||
|
2
go.mod
2
go.mod
@ -13,7 +13,7 @@ require (
|
|||||||
golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0
|
golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0
|
||||||
golang.org/x/net v0.0.0-20201009032441-dbdefad45b89 // indirect
|
golang.org/x/net v0.0.0-20201009032441-dbdefad45b89 // indirect
|
||||||
golang.org/x/sys v0.0.0-20201009025420-dfb3f7c4e634 // indirect
|
golang.org/x/sys v0.0.0-20201009025420-dfb3f7c4e634 // indirect
|
||||||
golang.org/x/tools v0.0.0-20201009162240-fcf82128ed91 // indirect
|
golang.org/x/tools v0.0.0-20201010145503-6e5c6d77ddcc // indirect
|
||||||
gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b // indirect
|
gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b // indirect
|
||||||
)
|
)
|
||||||
|
|
||||||
|
4
go.sum
4
go.sum
@ -177,8 +177,8 @@ golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtn
|
|||||||
golang.org/x/tools v0.0.0-20200425043458-8463f397d07c h1:iHhCR0b26amDCiiO+kBguKZom9aMF+NrFxh9zeKR/XU=
|
golang.org/x/tools v0.0.0-20200425043458-8463f397d07c h1:iHhCR0b26amDCiiO+kBguKZom9aMF+NrFxh9zeKR/XU=
|
||||||
golang.org/x/tools v0.0.0-20200425043458-8463f397d07c/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
golang.org/x/tools v0.0.0-20200425043458-8463f397d07c/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
||||||
golang.org/x/tools v0.0.0-20200808161706-5bf02b21f123/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
|
golang.org/x/tools v0.0.0-20200808161706-5bf02b21f123/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
|
||||||
golang.org/x/tools v0.0.0-20201009162240-fcf82128ed91 h1:UNUk0ao5UA0V4v2wikQWc4U+yG5UGoWku8MHs27mMqs=
|
golang.org/x/tools v0.0.0-20201010145503-6e5c6d77ddcc h1:NJuVOHii6+cOLWV2ofkVwU7frODgrUFHcjHCxyQ4DqI=
|
||||||
golang.org/x/tools v0.0.0-20201009162240-fcf82128ed91/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU=
|
golang.org/x/tools v0.0.0-20201010145503-6e5c6d77ddcc/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU=
|
||||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
|
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
|
||||||
|
@ -10,6 +10,18 @@ import (
|
|||||||
"github.com/nadoo/glider/proxy/socks"
|
"github.com/nadoo/glider/proxy/socks"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// NewClearTextDialer returns a trojan cleartext proxy dialer.
|
||||||
|
func NewClearTextDialer(s string, d proxy.Dialer) (proxy.Dialer, error) {
|
||||||
|
t, err := NewTrojan(s, d, nil)
|
||||||
|
if err != nil {
|
||||||
|
log.F("[trojan] create instance error: %s", err)
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
t.clearText = true
|
||||||
|
return t, err
|
||||||
|
}
|
||||||
|
|
||||||
// NewTrojanDialer returns a trojan proxy dialer.
|
// NewTrojanDialer returns a trojan proxy dialer.
|
||||||
func NewTrojanDialer(s string, d proxy.Dialer) (proxy.Dialer, error) {
|
func NewTrojanDialer(s string, d proxy.Dialer) (proxy.Dialer, error) {
|
||||||
t, err := NewTrojan(s, d, nil)
|
t, err := NewTrojan(s, d, nil)
|
||||||
@ -49,9 +61,12 @@ func (s *Trojan) dial(network, addr string) (net.Conn, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
tlsConn := tls.Client(rc, s.tlsConfig)
|
if !s.clearText {
|
||||||
if err := tlsConn.Handshake(); err != nil {
|
tlsConn := tls.Client(rc, s.tlsConfig)
|
||||||
return nil, err
|
if err := tlsConn.Handshake(); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
rc = tlsConn
|
||||||
}
|
}
|
||||||
|
|
||||||
buf := pool.GetWriteBuffer()
|
buf := pool.GetWriteBuffer()
|
||||||
@ -68,9 +83,9 @@ func (s *Trojan) dial(network, addr string) (net.Conn, error) {
|
|||||||
|
|
||||||
buf.Write(socks.ParseAddr(addr))
|
buf.Write(socks.ParseAddr(addr))
|
||||||
buf.WriteString("\r\n")
|
buf.WriteString("\r\n")
|
||||||
_, err = tlsConn.Write(buf.Bytes())
|
_, err = rc.Write(buf.Bytes())
|
||||||
|
|
||||||
return tlsConn, err
|
return rc, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// DialUDP connects to the given address via the proxy.
|
// DialUDP connects to the given address via the proxy.
|
||||||
|
@ -15,6 +15,18 @@ import (
|
|||||||
"github.com/nadoo/glider/proxy/socks"
|
"github.com/nadoo/glider/proxy/socks"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// NewClearTextServer returns a trojan cleartext proxy server.
|
||||||
|
func NewClearTextServer(s string, p proxy.Proxy) (proxy.Server, error) {
|
||||||
|
t, err := NewTrojan(s, nil, p)
|
||||||
|
if err != nil {
|
||||||
|
log.F("[trojan] create instance error: %s", err)
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
t.clearText = true
|
||||||
|
return t, nil
|
||||||
|
}
|
||||||
|
|
||||||
// NewTrojanServer returns a trojan proxy server.
|
// NewTrojanServer returns a trojan proxy server.
|
||||||
func NewTrojanServer(s string, p proxy.Proxy) (proxy.Server, error) {
|
func NewTrojanServer(s string, p proxy.Proxy) (proxy.Server, error) {
|
||||||
t, err := NewTrojan(s, nil, p)
|
t, err := NewTrojan(s, nil, p)
|
||||||
@ -60,18 +72,21 @@ func (s *Trojan) ListenAndServe() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Serve serves a connection.
|
// Serve serves a connection.
|
||||||
func (s *Trojan) Serve(cc net.Conn) {
|
func (s *Trojan) Serve(c net.Conn) {
|
||||||
defer cc.Close()
|
defer c.Close()
|
||||||
|
|
||||||
if cc, ok := cc.(*net.TCPConn); ok {
|
if c, ok := c.(*net.TCPConn); ok {
|
||||||
cc.SetKeepAlive(true)
|
c.SetKeepAlive(true)
|
||||||
}
|
}
|
||||||
|
|
||||||
c := tls.Server(cc, s.tlsConfig)
|
if !s.clearText {
|
||||||
err := c.Handshake()
|
tlsConn := tls.Server(c, s.tlsConfig)
|
||||||
if err != nil {
|
err := tlsConn.Handshake()
|
||||||
log.F("[trojan] error in tls handshake: %s", err)
|
if err != nil {
|
||||||
return
|
log.F("[trojan] error in tls handshake: %s", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
c = tlsConn
|
||||||
}
|
}
|
||||||
|
|
||||||
cmd, target, err := s.readHeader(c)
|
cmd, target, err := s.readHeader(c)
|
||||||
|
@ -18,20 +18,27 @@ import (
|
|||||||
|
|
||||||
// Trojan is a base trojan struct.
|
// Trojan is a base trojan struct.
|
||||||
type Trojan struct {
|
type Trojan struct {
|
||||||
dialer proxy.Dialer
|
dialer proxy.Dialer
|
||||||
proxy proxy.Proxy
|
proxy proxy.Proxy
|
||||||
addr string
|
addr string
|
||||||
pass [56]byte
|
pass [56]byte
|
||||||
|
|
||||||
|
clearText bool
|
||||||
|
|
||||||
|
tlsConfig *tls.Config
|
||||||
|
|
||||||
serverName string
|
serverName string
|
||||||
skipVerify bool
|
skipVerify bool
|
||||||
tlsConfig *tls.Config
|
|
||||||
certFile string
|
certFile string
|
||||||
keyFile string
|
keyFile string
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
proxy.RegisterDialer("trojan", NewTrojanDialer)
|
proxy.RegisterDialer("trojan", NewTrojanDialer)
|
||||||
proxy.RegisterServer("trojan", NewTrojanServer)
|
proxy.RegisterServer("trojan", NewTrojanServer)
|
||||||
|
proxy.RegisterDialer("trojanc", NewClearTextDialer) // cleartext
|
||||||
|
proxy.RegisterServer("trojanc", NewClearTextServer) // cleartext
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewTrojan returns a trojan proxy.
|
// NewTrojan returns a trojan proxy.
|
||||||
|
Loading…
Reference in New Issue
Block a user