From cf1a4e3817b7c97eff7aa13ed73376214d6c77de Mon Sep 17 00:00:00 2001 From: nadoo <287492+nadoo@users.noreply.github.com> Date: Sun, 16 Jan 2022 23:15:18 +0800 Subject: [PATCH] proxy: added PackerServer interface --- .goreleaser.yml | 2 ++ go.mod | 6 +++--- go.sum | 12 ++++++------ proxy/server.go | 5 +++++ proxy/socks5/server.go | 7 ++++++- proxy/ss/server.go | 7 ++++++- proxy/trojan/client.go | 5 +++++ proxy/trojan/packet.go | 2 +- proxy/trojan/server.go | 5 +++++ proxy/trojan/trojan.go | 7 ------- proxy/unix/server.go | 16 +++++++++++++--- 11 files changed, 52 insertions(+), 22 deletions(-) diff --git a/.goreleaser.yml b/.goreleaser.yml index b70bd38..b98673f 100644 --- a/.goreleaser.yml +++ b/.goreleaser.yml @@ -66,12 +66,14 @@ archives: - config/**/* - systemd/* +# https://goreleaser.com/customization/nfpm/ nfpms: - id: glider package_name: glider vendor: nadoo homepage: https://github.com/nadoo/glider + maintainer: nadoo description: Glider is a forward proxy with multiple protocols support, and also a dns/dhcp server with ipset management features(like dnsmasq). license: GPL-3.0 License formats: diff --git a/go.mod b/go.mod index 2eaa996..794935b 100644 --- a/go.mod +++ b/go.mod @@ -11,8 +11,8 @@ require ( github.com/nadoo/conflag v0.2.3 github.com/nadoo/ipset v0.3.0 github.com/xtaci/kcp-go/v5 v5.6.1 - golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3 - golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e + golang.org/x/crypto v0.0.0-20220112180741-5e0467b6c7ce + golang.org/x/sys v0.0.0-20220114195835-da31bd327af9 ) require ( @@ -26,7 +26,7 @@ require ( github.com/templexxx/xorsimd v0.4.1 // indirect github.com/tjfoc/gmsm v1.4.1 // indirect github.com/u-root/uio v0.0.0-20210528151154-e40b768296a7 // indirect - golang.org/x/net v0.0.0-20220107192237-5cfca573fb4d // indirect + golang.org/x/net v0.0.0-20220114011407-0dd24b26b47d // indirect ) // Replace dependency modules with local developing copy diff --git a/go.sum b/go.sum index a21038d..da2c7f2 100644 --- a/go.sum +++ b/go.sum @@ -105,8 +105,8 @@ golang.org/x/crypto v0.0.0-20191219195013-becbf705a915/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201012173705-84dcc777aaee/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3 h1:0es+/5331RGQPcXlMfP+WrnIIS6dNnNRe0WB02W0F4M= -golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220112180741-5e0467b6c7ce h1:Roh6XWxHFKrPgC/EQhVubSAGQ6Ozk6IdxHSzt1mR0EI= +golang.org/x/crypto v0.0.0-20220112180741-5e0467b6c7ce/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= @@ -130,8 +130,8 @@ golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81R golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220107192237-5cfca573fb4d h1:62NvYBuaanGXR2ZOfwDFkhhl6X1DUgf8qg3GuQvxZsE= -golang.org/x/net v0.0.0-20220107192237-5cfca573fb4d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220114011407-0dd24b26b47d h1:1n1fc535VhN8SYtD4cDUyNlfpAF2ROMM9+11equK3hs= +golang.org/x/net v0.0.0-20220114011407-0dd24b26b47d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -157,8 +157,8 @@ golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210525143221-35b2ab0089ea/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e h1:fLOSk5Q00efkSvAm+4xcoXD+RRmLmmulPn5I3Y9F2EM= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220114195835-da31bd327af9 h1:XfKQ4OlFl8okEOr5UvAqFRVj8pY/4yfcXrddB8qAbU0= +golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= diff --git a/proxy/server.go b/proxy/server.go index 6e18a99..3271feb 100644 --- a/proxy/server.go +++ b/proxy/server.go @@ -15,6 +15,11 @@ type Server interface { Serve(c net.Conn) } +// PackketServer interface. +type PacketServer interface { + ServePacket(pc net.PacketConn) +} + // ServerCreator is a function to create proxy servers. type ServerCreator func(s string, proxy Proxy) (Server, error) diff --git a/proxy/socks5/server.go b/proxy/socks5/server.go index 6906022..e40ceb6 100644 --- a/proxy/socks5/server.go +++ b/proxy/socks5/server.go @@ -106,8 +106,13 @@ func (s *Socks5) ListenAndServeUDP() { log.F("[socks5] listening UDP on %s", s.addr) + s.ServePacket(lc) +} + +// ServePacket implementes proxy.PacketServer. +func (s *Socks5) ServePacket(pc net.PacketConn) { for { - c := NewPktConn(lc, nil, nil, true, nil) + c := NewPktConn(pc, nil, nil, true, nil) buf := pool.GetBuffer(proxy.UDPBufSize) n, srcAddr, err := c.ReadFrom(buf) diff --git a/proxy/ss/server.go b/proxy/ss/server.go index 5369912..0907108 100644 --- a/proxy/ss/server.go +++ b/proxy/ss/server.go @@ -96,7 +96,12 @@ func (s *SS) ListenAndServeUDP() { log.F("[ss] listening UDP on %s", s.addr) - lc = s.PacketConn(lc) + s.ServePacket(lc) +} + +// ServePacket implementes proxy.PacketServer. +func (s *SS) ServePacket(pc net.PacketConn) { + lc := s.PacketConn(pc) for { c := NewPktConn(lc, nil, nil, true) buf := pool.GetBuffer(proxy.UDPBufSize) diff --git a/proxy/trojan/client.go b/proxy/trojan/client.go index 8e22a6e..b28dd2e 100644 --- a/proxy/trojan/client.go +++ b/proxy/trojan/client.go @@ -13,6 +13,11 @@ import ( "github.com/nadoo/glider/proxy" ) +func init() { + proxy.RegisterDialer("trojan", NewTrojanDialer) + proxy.RegisterDialer("trojanc", NewClearTextDialer) // cleartext +} + // NewClearTextDialer returns a trojan cleartext proxy dialer. func NewClearTextDialer(s string, d proxy.Dialer) (proxy.Dialer, error) { t, err := NewTrojan(s, d, nil) diff --git a/proxy/trojan/packet.go b/proxy/trojan/packet.go index 39a2d2e..17ec09a 100644 --- a/proxy/trojan/packet.go +++ b/proxy/trojan/packet.go @@ -27,7 +27,7 @@ func NewPktConn(c net.Conn, tgtAddr socks.Addr) *PktConn { // ReadFrom implements the necessary function of net.PacketConn. // NOTE: the underlying connection is not udp, we returned the target address here, -// it's not the vless server's address, do not WriteTo it. +// it's not the server's address, do not WriteTo it. func (pc *PktConn) ReadFrom(b []byte) (int, net.Addr, error) { // ATYP, DST.ADDR, DST.PORT _, err := socks.ReadAddr(pc.Conn) diff --git a/proxy/trojan/server.go b/proxy/trojan/server.go index d195c7d..1122a22 100644 --- a/proxy/trojan/server.go +++ b/proxy/trojan/server.go @@ -16,6 +16,11 @@ import ( "github.com/nadoo/glider/proxy" ) +func init() { + proxy.RegisterServer("trojan", NewTrojanServer) + proxy.RegisterServer("trojanc", NewClearTextServer) // cleartext +} + // NewClearTextServer returns a trojan cleartext proxy server. func NewClearTextServer(s string, p proxy.Proxy) (proxy.Server, error) { t, err := NewTrojan(s, nil, p) diff --git a/proxy/trojan/trojan.go b/proxy/trojan/trojan.go index a3cca8b..6e065c6 100644 --- a/proxy/trojan/trojan.go +++ b/proxy/trojan/trojan.go @@ -31,13 +31,6 @@ type Trojan struct { fallback string } -func init() { - proxy.RegisterDialer("trojan", NewTrojanDialer) - proxy.RegisterServer("trojan", NewTrojanServer) - proxy.RegisterDialer("trojanc", NewClearTextDialer) // cleartext - proxy.RegisterServer("trojanc", NewClearTextServer) // cleartext -} - // NewTrojan returns a trojan proxy. func NewTrojan(s string, d proxy.Dialer, p proxy.Proxy) (*Trojan, error) { u, err := url.Parse(s) diff --git a/proxy/unix/server.go b/proxy/unix/server.go index d35ccf4..38aad26 100644 --- a/proxy/unix/server.go +++ b/proxy/unix/server.go @@ -105,9 +105,19 @@ func (s *Unix) ListenAndServeUDP() { log.F("[unix] ListenPacket on %s", s.addru) + s.ServePacket(c) +} + +// ServePacket implementes proxy.PacketServer +func (s *Unix) ServePacket(pc net.PacketConn) { + if server, ok := s.server.(proxy.PacketServer); ok { + server.ServePacket(pc) + return + } + for { buf := pool.GetBuffer(proxy.UDPBufSize) - n, srcAddr, err := c.ReadFrom(buf) + n, srcAddr, err := pc.ReadFrom(buf) if err != nil { log.F("[unix] read error: %v", err) continue @@ -118,7 +128,7 @@ func (s *Unix) ListenAndServeUDP() { v, ok := nm.Load(sessionKey) if !ok || v == nil { - session = newSession(sessionKey, srcAddr, c) + session = newSession(sessionKey, srcAddr, pc) nm.Store(sessionKey, session) go s.serveSession(session) } else { @@ -127,8 +137,8 @@ func (s *Unix) ListenAndServeUDP() { session.msgCh <- buf[:n] } - } + func (s *Unix) serveSession(session *Session) { dstPC, dialer, writeTo, err := s.proxy.DialUDP("udp", "") if err != nil {