From 720f12aa0a130035399049d5bbedcd1a09c87bd6 Mon Sep 17 00:00:00 2001 From: nadoo <287492+nadoo@users.noreply.github.com> Date: Wed, 19 Jan 2022 23:25:58 +0800 Subject: [PATCH] socks5: support protocol chain with unix socket(#291) --- .goreleaser.yml | 26 +++++++++---------- .../rules.d/home.rule | 4 +-- .../rules.d/home.rule | 4 +-- proxy/socks5/server.go | 3 +++ proxy/unix/client.go | 2 +- proxy/unix/server.go | 6 +++-- 6 files changed, 25 insertions(+), 20 deletions(-) diff --git a/.goreleaser.yml b/.goreleaser.yml index b98673f..d5c1c5e 100644 --- a/.goreleaser.yml +++ b/.goreleaser.yml @@ -66,6 +66,19 @@ archives: - config/**/* - systemd/* +# https://goreleaser.com/customization/snapshots/ +snapshot: + name_template: '{{ incpatch .Version }}-dev' + +# https://goreleaser.com/customization/checksum/ +checksum: + name_template: "{{ .ProjectName }}_{{ .Version }}_checksums.txt" + +# https://goreleaser.com/customization/release/ +release: + prerelease: true + draft: true + # https://goreleaser.com/customization/nfpm/ nfpms: - @@ -104,16 +117,3 @@ nfpms: triggers: interest_noawait: - /lib/systemd/systemd - -# https://goreleaser.com/customization/snapshots/ -snapshot: - name_template: '{{ incpatch .Version }}-dev' - -# https://goreleaser.com/customization/checksum/ -checksum: - name_template: "{{ .ProjectName }}_{{ .Version }}_checksums.txt" - -# https://goreleaser.com/customization/release/ -release: - prerelease: true - draft: true diff --git a/config/examples/7.rule_multiple_rule_files/rules.d/home.rule b/config/examples/7.rule_multiple_rule_files/rules.d/home.rule index 61baf79..a6f6b48 100644 --- a/config/examples/7.rule_multiple_rule_files/rules.d/home.rule +++ b/config/examples/7.rule_multiple_rule_files/rules.d/home.rule @@ -1,9 +1,9 @@ -forward=http://forwarder4:8080 +forward=http://forwarder1:8080 # first connect forwarder1 then forwarder2 then internet -forward=http://forwarder5:8080,socks6://forwarder3:1080 +forward=http://forwarder1:8080,socks5://forwarder2:1080 # Round Robin mode: rr diff --git a/config/examples/9.transparent_proxy_without_dnsmasq/rules.d/home.rule b/config/examples/9.transparent_proxy_without_dnsmasq/rules.d/home.rule index ccf11f0..ca82f35 100644 --- a/config/examples/9.transparent_proxy_without_dnsmasq/rules.d/home.rule +++ b/config/examples/9.transparent_proxy_without_dnsmasq/rules.d/home.rule @@ -1,9 +1,9 @@ -forward=http://forwarder4:8080 +forward=http://forwarder1:8080 # first connect forwarder1 then forwarder2 then internet -forward=http://forwarder5:8080,socks5://forwarder3:1080 +forward=http://forwarder1:8080,socks5://forwarder2:1080 # Round Robin mode: rr diff --git a/proxy/socks5/server.go b/proxy/socks5/server.go index e40ceb6..7daa2a5 100644 --- a/proxy/socks5/server.go +++ b/proxy/socks5/server.go @@ -271,6 +271,9 @@ func (s *Socks5) handshake(c net.Conn) (socks.Addr, error) { _, err = c.Write([]byte{5, 0, 0, 1, 0, 0, 0, 0, 0, 0}) // SOCKS v5, reply succeeded case socks.CmdUDPAssociate: listenAddr := socks.ParseAddr(c.LocalAddr().String()) + if listenAddr == nil { // maybe it's unix socket + listenAddr = socks.ParseAddr("127.0.0.1:0") + } _, err = c.Write(append([]byte{5, 0, 0}, listenAddr...)) // SOCKS v5, reply succeeded if err != nil { return nil, socks.Errors[7] diff --git a/proxy/unix/client.go b/proxy/unix/client.go index 2ab2a19..7743dba 100644 --- a/proxy/unix/client.go +++ b/proxy/unix/client.go @@ -27,7 +27,7 @@ func (s *Unix) Addr() string { // Dial connects to the address addr on the network net via the proxy. // NOTE: must be the first dialer in a chain func (s *Unix) Dial(network, addr string) (net.Conn, error) { - return net.Dial("unix", s.addr) + return s.dialer.Dial("unix", s.addr) } // DialUDP connects to the given address via the proxy. diff --git a/proxy/unix/server.go b/proxy/unix/server.go index 38aad26..f2330bb 100644 --- a/proxy/unix/server.go +++ b/proxy/unix/server.go @@ -52,7 +52,7 @@ func (s *Unix) ListenAndServeTCP() { } defer l.Close() - log.F("[unix] listening on %s", s.addr) + log.F("[unix] Listen on %s", s.addr) for { c, err := l.Accept() @@ -108,7 +108,7 @@ func (s *Unix) ListenAndServeUDP() { s.ServePacket(c) } -// ServePacket implementes proxy.PacketServer +// ServePacket implementes proxy.PacketServer. func (s *Unix) ServePacket(pc net.PacketConn) { if server, ok := s.server.(proxy.PacketServer); ok { server.ServePacket(pc) @@ -123,6 +123,8 @@ func (s *Unix) ServePacket(pc net.PacketConn) { continue } + log.F("!!! unix ServePacker read from: %s", srcAddr) + var session *Session sessionKey := srcAddr.String()