From 7f85f664e37e7cac6e68418342825d6503a5bd33 Mon Sep 17 00:00:00 2001 From: nadoo <287492+nadoo@users.noreply.github.com> Date: Fri, 2 Jul 2021 01:06:11 +0800 Subject: [PATCH] general: fixed a bug which leads to panic when the specified interface not exists --- README.md | 2 +- config.go | 2 +- go.mod | 4 ++-- go.sum | 28 ++++------------------------ proxy/dialer.go | 1 + proxy/direct.go | 3 +++ proxy/protocol/smux/stream.go | 8 +++----- proxy/smux/server.go | 1 + rule/forward.go | 6 +++--- rule/group.go | 8 ++++++-- rule/proxy.go | 3 ++- 11 files changed, 27 insertions(+), 39 deletions(-) diff --git a/README.md b/README.md index 35ebb94..1215bec 100644 --- a/README.md +++ b/README.md @@ -175,7 +175,7 @@ glider -verbose -listen :8443 -forward SCHEME://HOST:PORT ```bash Available schemes: listen: mixed ss socks5 http vless trojan trojanc redir redir6 tcp udp tls ws unix smux kcp - forward: reject ss socks4 socks5 http ssr ssh vless vmess trojan trojanc tcp udp tls ws unix smux kcp simple-obfs + forward: direct reject ss socks4 socks5 http ssr ssh vless vmess trojan trojanc tcp udp tls ws unix smux kcp simple-obfs Socks5 scheme: socks://[user:pass@]host:port diff --git a/config.go b/config.go index 5f293c6..41c74f1 100644 --- a/config.go +++ b/config.go @@ -133,7 +133,7 @@ func usage() { fmt.Fprintf(w, "Available schemes:\n") fmt.Fprintf(w, " listen: mixed ss socks5 http vless trojan trojanc redir redir6 tcp udp tls ws unix smux kcp\n") - fmt.Fprintf(w, " forward: reject ss socks4 socks5 http ssr ssh vless vmess trojan trojanc tcp udp tls ws unix smux kcp simple-obfs\n") + fmt.Fprintf(w, " forward: direct reject ss socks4 socks5 http ssr ssh vless vmess trojan trojanc tcp udp tls ws unix smux kcp simple-obfs\n") fmt.Fprintf(w, "\n") fmt.Fprintf(w, "Socks5 scheme:\n") diff --git a/go.mod b/go.mod index d4b04c3..b199a7e 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/dgryski/go-rc2 v0.0.0-20150621095337-8a9021637152 github.com/ebfe/rc2 v0.0.0-20131011165748-24b9757f5521 // indirect github.com/insomniacslk/dhcp v0.0.0-20210621130208-1cac67f12b1e - github.com/klauspost/cpuid/v2 v2.0.6 // indirect + github.com/klauspost/cpuid/v2 v2.0.7 // indirect github.com/klauspost/reedsolomon v1.9.12 // indirect github.com/mdlayher/raw v0.0.0-20210412142147-51b895745faf // indirect github.com/nadoo/conflag v0.2.3 @@ -19,7 +19,7 @@ require ( github.com/xtaci/kcp-go/v5 v5.6.1 golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e golang.org/x/net v0.0.0-20210614182718-04defd469f4e // indirect - golang.org/x/sys v0.0.0-20210616094352-59db8d763f22 // indirect + golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c // indirect ) // Replace dependency modules with local developing copy diff --git a/go.sum b/go.sum index 61ac1a0..eae6ad6 100644 --- a/go.sum +++ b/go.sum @@ -39,10 +39,6 @@ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/hugelgupf/socketpair v0.0.0-20190730060125-05d35a94e714 h1:/jC7qQFrv8CrSJVmaolDVOxTfS9kc36uB6H40kdbQq8= github.com/hugelgupf/socketpair v0.0.0-20190730060125-05d35a94e714/go.mod h1:2Goc3h8EklBH5mspfHFxBnEoURQCGzQQH1ga9Myjvis= -github.com/insomniacslk/dhcp v0.0.0-20210528123148-fb4eaaa00ad2 h1:WDOgJoE6rb7G6A7i1/Yyh5FJeydXeUrXHMRYJo7iFak= -github.com/insomniacslk/dhcp v0.0.0-20210528123148-fb4eaaa00ad2/go.mod h1:h+MxyHxRg9NH3terB1nfRIUaQEcI0XOVkdR9LNBlp8E= -github.com/insomniacslk/dhcp v0.0.0-20210608085346-465dd6c35f6c h1:L3EHIOG1DrTVG4aBnY+Vu0s2t/KkgrV0AYkO7BSwu3M= -github.com/insomniacslk/dhcp v0.0.0-20210608085346-465dd6c35f6c/go.mod h1:h+MxyHxRg9NH3terB1nfRIUaQEcI0XOVkdR9LNBlp8E= github.com/insomniacslk/dhcp v0.0.0-20210621130208-1cac67f12b1e h1:sgh63o+pm5kcdrgyYaCIoeD7mccyL6MscVmy+DvY6C4= github.com/insomniacslk/dhcp v0.0.0-20210621130208-1cac67f12b1e/go.mod h1:h+MxyHxRg9NH3terB1nfRIUaQEcI0XOVkdR9LNBlp8E= github.com/jsimonetti/rtnetlink v0.0.0-20190606172950-9527aa82566a/go.mod h1:Oz+70psSo5OFh8DBl0Zv2ACw7Esh6pPUphlvZG9x7uw= @@ -54,8 +50,8 @@ github.com/klauspost/cpuid v1.2.4/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgo github.com/klauspost/cpuid v1.3.1 h1:5JNjFYYQrZeKRJ0734q51WCEEn2huer72Dc7K+R/b6s= github.com/klauspost/cpuid v1.3.1/go.mod h1:bYW4mA6ZgKPob1/Dlai2LviZJO7KGI3uoWLd42rAQw4= github.com/klauspost/cpuid/v2 v2.0.2/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.0.6 h1:dQ5ueTiftKxp0gyjKSx5+8BtPWkyQbd95m8Gys/RarI= -github.com/klauspost/cpuid/v2 v2.0.6/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.0.7 h1:U89pAFid7wpIWvTFJnMKgU+Sabb7DLEgHI7Xt8apo3Y= +github.com/klauspost/cpuid/v2 v2.0.7/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/reedsolomon v1.9.9/go.mod h1:O7yFFHiQwDR6b2t63KPUpccPtNdp5ADgh1gg4fd12wo= github.com/klauspost/reedsolomon v1.9.12 h1:EyOucRmcrLH+2hqKGdoA5SM8pwPKR6BJsf3r6zpYOA0= github.com/klauspost/reedsolomon v1.9.12/go.mod h1:nLvuzNvy1ZDNQW30IuMc2ZWCbiqrJgdLoUS2X8HAUVg= @@ -108,8 +104,6 @@ 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-20210513164829-c07d793c2f9a h1:kr2P4QFmQr29mSLA43kwrOcgcReGTfbE9N577tCTuBc= -golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e h1:gsTQYXdTw2Gq7RBsWvlQ91b+aEQ6bXFUngBGuR8sPpI= golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -135,10 +129,6 @@ 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-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5 h1:wjuX4b5yYQnEQHzd+CBcrcC6OVR2J1CN6mUy0oSxIPo= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210610132358-84b48f89b13b h1:k+E048sYJHyVnsr1GDrRZWQ32D2C7lWs9JRc0bel53A= -golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210614182718-04defd469f4e h1:XpT3nA5TvE525Ne3hInMh6+GETgn27Zfm9dxsThnX2Q= golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -165,19 +155,9 @@ golang.org/x/sys v0.0.0-20201101102859-da207088b7d1/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/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-20210601080250-7ecdf8ef093b h1:qh4f65QIVFjq9eBURLEYWqaEXmOyqdUyiBSgaXWccWk= -golang.org/x/sys v0.0.0-20210601080250-7ecdf8ef093b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603125802-9665404d3644 h1:CA1DEQ4NdKphKeL70tvsWNdT5oFh1lOjihRcEDROi0I= -golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210608053332-aa57babbf139 h1:C+AwYEtBp/VQwoLntUmQ/yx3MS9vmZaKNdw5eOpoQe8= -golang.org/x/sys v0.0.0-20210608053332-aa57babbf139/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210611083646-a4fc73990273 h1:faDu4veV+8pcThn4fewv6TVlNCezafGoC1gM/mxQLbQ= -golang.org/x/sys v0.0.0-20210611083646-a4fc73990273/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-20210616045830-e2b7044e8c71 h1:X/2sJAybVknnUnV7AD2HdT6rm2p5BP6eH2j+igduWgk= -golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22 h1:RqytpXGR1iVNX7psjB3ff8y7sNFinVFvkx1c8SjBkio= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c h1:F1jZWGFhYfh0Ci55sIpILtKKK8p3i2/krTr0H1rg74I= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/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/dialer.go b/proxy/dialer.go index 57f1ac2..5df7174 100644 --- a/proxy/dialer.go +++ b/proxy/dialer.go @@ -7,6 +7,7 @@ import ( ) var ( + // ErrNotSupported indicates that the operation is not supported ErrNotSupported = errors.New("not supported") ) diff --git a/proxy/direct.go b/proxy/direct.go index 3c3aeb0..245302e 100644 --- a/proxy/direct.go +++ b/proxy/direct.go @@ -36,6 +36,9 @@ func NewDirect(intface string, dialTimeout, relayTimeout time.Duration) (*Direct return nil, errors.New(err.Error() + ": " + intface) } d.iface = iface + if ips := d.IFaceIPs(); len(ips) > 0 { + d.ip = ips[0] + } } } diff --git a/proxy/protocol/smux/stream.go b/proxy/protocol/smux/stream.go index f0ce104..4bb15e7 100644 --- a/proxy/protocol/smux/stream.go +++ b/proxy/protocol/smux/stream.go @@ -139,7 +139,7 @@ func (s *Stream) tryReadv2(b []byte) (n int, err error) { // in an ideal environment: // if more than half of buffer has consumed, send read ack to peer - // based on round-trip time of ACK, continous flowing data + // based on round-trip time of ACK, continuous flowing data // won't slow down because of waiting for ACK, as long as the // consumer keeps on reading data // s.numRead == n also notify window at the first read @@ -156,9 +156,8 @@ func (s *Stream) tryReadv2(b []byte) (n int, err error) { if notifyConsumed > 0 { err := s.sendWindowUpdate(notifyConsumed) return n, err - } else { - return n, nil } + return n, nil } select { @@ -433,9 +432,8 @@ func (s *Stream) Close() error { _, err = s.sess.writeFrame(newFrame(byte(s.sess.config.Version), cmdFIN, s.id)) s.sess.streamClosed(s.id) return err - } else { - return io.ErrClosedPipe } + return io.ErrClosedPipe } // GetDieCh returns a readonly chan which can be readable diff --git a/proxy/smux/server.go b/proxy/smux/server.go index 651e198..1bdeba2 100644 --- a/proxy/smux/server.go +++ b/proxy/smux/server.go @@ -94,6 +94,7 @@ func (s *SmuxServer) Serve(c net.Conn) { } } +// ServeStream serves a smux stream. func (s *SmuxServer) ServeStream(c *smux.Stream) { if s.server != nil { s.server.Serve(c) diff --git a/rule/forward.go b/rule/forward.go index b76d1f4..39d1e75 100644 --- a/rule/forward.go +++ b/rule/forward.go @@ -75,12 +75,12 @@ func ForwarderFromURL(s, intface string, dialTimeout, relayTimeout time.Duration } // DirectForwarder returns a direct forwarder. -func DirectForwarder(intface string, dialTimeout, relayTimeout time.Duration) *Forwarder { +func DirectForwarder(intface string, dialTimeout, relayTimeout time.Duration) (*Forwarder, error) { d, err := proxy.NewDirect(intface, dialTimeout, relayTimeout) if err != nil { - return nil + return nil, err } - return &Forwarder{Dialer: d, addr: d.Addr()} + return &Forwarder{Dialer: d, addr: d.Addr()}, nil } func (f *Forwarder) parseOption(option string) error { diff --git a/rule/group.go b/rule/group.go index cb51266..439cf79 100644 --- a/rule/group.go +++ b/rule/group.go @@ -48,8 +48,12 @@ func NewFwdrGroup(name string, s []string, c *Strategy) *FwdrGroup { if len(fwdrs) == 0 { // direct forwarder - fwdrs = append(fwdrs, DirectForwarder(c.IntFace, - time.Duration(c.DialTimeout)*time.Second, time.Duration(c.RelayTimeout)*time.Second)) + direct, err := DirectForwarder(c.IntFace, + time.Duration(c.DialTimeout)*time.Second, time.Duration(c.RelayTimeout)*time.Second) + if err != nil { + log.Fatal(err) + } + fwdrs = append(fwdrs, direct) c.Strategy = "rr" } diff --git a/rule/proxy.go b/rule/proxy.go index 3ec5293..83c71f3 100644 --- a/rule/proxy.go +++ b/rule/proxy.go @@ -44,7 +44,8 @@ func NewProxy(mainForwarders []string, mainStrategy *Strategy, rules []*Config) if len(mainForwarders) > 0 { direct := NewFwdrGroup("", nil, mainStrategy) for _, f := range rd.main.fwdrs { - host, _, _ := net.SplitHostPort(f.addr) + addr := strings.Split(f.addr, ",")[0] + host, _, _ := net.SplitHostPort(addr) if ip := net.ParseIP(host); ip == nil { rd.domainMap.Store(strings.ToLower(host), direct) }