mirror of
https://github.com/nadoo/glider.git
synced 2025-02-23 17:35:40 +08:00
proxy: added PackerServer interface
This commit is contained in:
parent
253e5008c4
commit
cf1a4e3817
@ -66,12 +66,14 @@ archives:
|
|||||||
- config/**/*
|
- config/**/*
|
||||||
- systemd/*
|
- systemd/*
|
||||||
|
|
||||||
|
# https://goreleaser.com/customization/nfpm/
|
||||||
nfpms:
|
nfpms:
|
||||||
-
|
-
|
||||||
id: glider
|
id: glider
|
||||||
package_name: glider
|
package_name: glider
|
||||||
vendor: nadoo
|
vendor: nadoo
|
||||||
homepage: https://github.com/nadoo/glider
|
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).
|
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
|
license: GPL-3.0 License
|
||||||
formats:
|
formats:
|
||||||
|
6
go.mod
6
go.mod
@ -11,8 +11,8 @@ require (
|
|||||||
github.com/nadoo/conflag v0.2.3
|
github.com/nadoo/conflag v0.2.3
|
||||||
github.com/nadoo/ipset v0.3.0
|
github.com/nadoo/ipset v0.3.0
|
||||||
github.com/xtaci/kcp-go/v5 v5.6.1
|
github.com/xtaci/kcp-go/v5 v5.6.1
|
||||||
golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3
|
golang.org/x/crypto v0.0.0-20220112180741-5e0467b6c7ce
|
||||||
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e
|
golang.org/x/sys v0.0.0-20220114195835-da31bd327af9
|
||||||
)
|
)
|
||||||
|
|
||||||
require (
|
require (
|
||||||
@ -26,7 +26,7 @@ require (
|
|||||||
github.com/templexxx/xorsimd v0.4.1 // indirect
|
github.com/templexxx/xorsimd v0.4.1 // indirect
|
||||||
github.com/tjfoc/gmsm v1.4.1 // indirect
|
github.com/tjfoc/gmsm v1.4.1 // indirect
|
||||||
github.com/u-root/uio v0.0.0-20210528151154-e40b768296a7 // 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
|
// Replace dependency modules with local developing copy
|
||||||
|
12
go.sum
12
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-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-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-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-20220112180741-5e0467b6c7ce h1:Roh6XWxHFKrPgC/EQhVubSAGQ6Ozk6IdxHSzt1mR0EI=
|
||||||
golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
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/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-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||||
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
|
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-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-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-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||||
golang.org/x/net v0.0.0-20220107192237-5cfca573fb4d h1:62NvYBuaanGXR2ZOfwDFkhhl6X1DUgf8qg3GuQvxZsE=
|
golang.org/x/net v0.0.0-20220114011407-0dd24b26b47d h1:1n1fc535VhN8SYtD4cDUyNlfpAF2ROMM9+11equK3hs=
|
||||||
golang.org/x/net v0.0.0-20220107192237-5cfca573fb4d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
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/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-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/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-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-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-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-20220114195835-da31bd327af9 h1:XfKQ4OlFl8okEOr5UvAqFRVj8pY/4yfcXrddB8qAbU0=
|
||||||
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
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 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E=
|
||||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
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=
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
|
@ -15,6 +15,11 @@ type Server interface {
|
|||||||
Serve(c net.Conn)
|
Serve(c net.Conn)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// PackketServer interface.
|
||||||
|
type PacketServer interface {
|
||||||
|
ServePacket(pc net.PacketConn)
|
||||||
|
}
|
||||||
|
|
||||||
// ServerCreator is a function to create proxy servers.
|
// ServerCreator is a function to create proxy servers.
|
||||||
type ServerCreator func(s string, proxy Proxy) (Server, error)
|
type ServerCreator func(s string, proxy Proxy) (Server, error)
|
||||||
|
|
||||||
|
@ -106,8 +106,13 @@ func (s *Socks5) ListenAndServeUDP() {
|
|||||||
|
|
||||||
log.F("[socks5] listening UDP on %s", s.addr)
|
log.F("[socks5] listening UDP on %s", s.addr)
|
||||||
|
|
||||||
|
s.ServePacket(lc)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ServePacket implementes proxy.PacketServer.
|
||||||
|
func (s *Socks5) ServePacket(pc net.PacketConn) {
|
||||||
for {
|
for {
|
||||||
c := NewPktConn(lc, nil, nil, true, nil)
|
c := NewPktConn(pc, nil, nil, true, nil)
|
||||||
buf := pool.GetBuffer(proxy.UDPBufSize)
|
buf := pool.GetBuffer(proxy.UDPBufSize)
|
||||||
|
|
||||||
n, srcAddr, err := c.ReadFrom(buf)
|
n, srcAddr, err := c.ReadFrom(buf)
|
||||||
|
@ -96,7 +96,12 @@ func (s *SS) ListenAndServeUDP() {
|
|||||||
|
|
||||||
log.F("[ss] listening UDP on %s", s.addr)
|
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 {
|
for {
|
||||||
c := NewPktConn(lc, nil, nil, true)
|
c := NewPktConn(lc, nil, nil, true)
|
||||||
buf := pool.GetBuffer(proxy.UDPBufSize)
|
buf := pool.GetBuffer(proxy.UDPBufSize)
|
||||||
|
@ -13,6 +13,11 @@ import (
|
|||||||
"github.com/nadoo/glider/proxy"
|
"github.com/nadoo/glider/proxy"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
proxy.RegisterDialer("trojan", NewTrojanDialer)
|
||||||
|
proxy.RegisterDialer("trojanc", NewClearTextDialer) // cleartext
|
||||||
|
}
|
||||||
|
|
||||||
// NewClearTextDialer returns a trojan cleartext proxy dialer.
|
// NewClearTextDialer returns a trojan cleartext proxy dialer.
|
||||||
func NewClearTextDialer(s string, d proxy.Dialer) (proxy.Dialer, error) {
|
func NewClearTextDialer(s string, d proxy.Dialer) (proxy.Dialer, error) {
|
||||||
t, err := NewTrojan(s, d, nil)
|
t, err := NewTrojan(s, d, nil)
|
||||||
|
@ -27,7 +27,7 @@ func NewPktConn(c net.Conn, tgtAddr socks.Addr) *PktConn {
|
|||||||
|
|
||||||
// ReadFrom implements the necessary function of net.PacketConn.
|
// ReadFrom implements the necessary function of net.PacketConn.
|
||||||
// NOTE: the underlying connection is not udp, we returned the target address here,
|
// 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) {
|
func (pc *PktConn) ReadFrom(b []byte) (int, net.Addr, error) {
|
||||||
// ATYP, DST.ADDR, DST.PORT
|
// ATYP, DST.ADDR, DST.PORT
|
||||||
_, err := socks.ReadAddr(pc.Conn)
|
_, err := socks.ReadAddr(pc.Conn)
|
||||||
|
@ -16,6 +16,11 @@ import (
|
|||||||
"github.com/nadoo/glider/proxy"
|
"github.com/nadoo/glider/proxy"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
proxy.RegisterServer("trojan", NewTrojanServer)
|
||||||
|
proxy.RegisterServer("trojanc", NewClearTextServer) // cleartext
|
||||||
|
}
|
||||||
|
|
||||||
// NewClearTextServer returns a trojan cleartext proxy server.
|
// NewClearTextServer returns a trojan cleartext proxy server.
|
||||||
func NewClearTextServer(s string, p proxy.Proxy) (proxy.Server, error) {
|
func NewClearTextServer(s string, p proxy.Proxy) (proxy.Server, error) {
|
||||||
t, err := NewTrojan(s, nil, p)
|
t, err := NewTrojan(s, nil, p)
|
||||||
|
@ -31,13 +31,6 @@ type Trojan struct {
|
|||||||
fallback string
|
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.
|
// NewTrojan returns a trojan proxy.
|
||||||
func NewTrojan(s string, d proxy.Dialer, p proxy.Proxy) (*Trojan, error) {
|
func NewTrojan(s string, d proxy.Dialer, p proxy.Proxy) (*Trojan, error) {
|
||||||
u, err := url.Parse(s)
|
u, err := url.Parse(s)
|
||||||
|
@ -105,9 +105,19 @@ func (s *Unix) ListenAndServeUDP() {
|
|||||||
|
|
||||||
log.F("[unix] ListenPacket on %s", s.addru)
|
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 {
|
for {
|
||||||
buf := pool.GetBuffer(proxy.UDPBufSize)
|
buf := pool.GetBuffer(proxy.UDPBufSize)
|
||||||
n, srcAddr, err := c.ReadFrom(buf)
|
n, srcAddr, err := pc.ReadFrom(buf)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.F("[unix] read error: %v", err)
|
log.F("[unix] read error: %v", err)
|
||||||
continue
|
continue
|
||||||
@ -118,7 +128,7 @@ func (s *Unix) ListenAndServeUDP() {
|
|||||||
|
|
||||||
v, ok := nm.Load(sessionKey)
|
v, ok := nm.Load(sessionKey)
|
||||||
if !ok || v == nil {
|
if !ok || v == nil {
|
||||||
session = newSession(sessionKey, srcAddr, c)
|
session = newSession(sessionKey, srcAddr, pc)
|
||||||
nm.Store(sessionKey, session)
|
nm.Store(sessionKey, session)
|
||||||
go s.serveSession(session)
|
go s.serveSession(session)
|
||||||
} else {
|
} else {
|
||||||
@ -127,8 +137,8 @@ func (s *Unix) ListenAndServeUDP() {
|
|||||||
|
|
||||||
session.msgCh <- buf[:n]
|
session.msgCh <- buf[:n]
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Unix) serveSession(session *Session) {
|
func (s *Unix) serveSession(session *Session) {
|
||||||
dstPC, dialer, writeTo, err := s.proxy.DialUDP("udp", "")
|
dstPC, dialer, writeTo, err := s.proxy.DialUDP("udp", "")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
Loading…
Reference in New Issue
Block a user