socks5: support protocol chain with unix socket(#291)

This commit is contained in:
nadoo 2022-01-19 23:25:58 +08:00
parent cf1a4e3817
commit 720f12aa0a
6 changed files with 25 additions and 20 deletions

View File

@ -66,6 +66,19 @@ archives:
- config/**/* - config/**/*
- 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
# https://goreleaser.com/customization/nfpm/ # https://goreleaser.com/customization/nfpm/
nfpms: nfpms:
- -
@ -104,16 +117,3 @@ nfpms:
triggers: triggers:
interest_noawait: interest_noawait:
- /lib/systemd/systemd - /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

View File

@ -1,9 +1,9 @@
forward=http://forwarder4:8080 forward=http://forwarder1:8080
# first connect forwarder1 then forwarder2 then internet # 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 # Round Robin mode: rr

View File

@ -1,9 +1,9 @@
forward=http://forwarder4:8080 forward=http://forwarder1:8080
# first connect forwarder1 then forwarder2 then internet # 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 # Round Robin mode: rr

View File

@ -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 _, err = c.Write([]byte{5, 0, 0, 1, 0, 0, 0, 0, 0, 0}) // SOCKS v5, reply succeeded
case socks.CmdUDPAssociate: case socks.CmdUDPAssociate:
listenAddr := socks.ParseAddr(c.LocalAddr().String()) 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 _, err = c.Write(append([]byte{5, 0, 0}, listenAddr...)) // SOCKS v5, reply succeeded
if err != nil { if err != nil {
return nil, socks.Errors[7] return nil, socks.Errors[7]

View File

@ -27,7 +27,7 @@ func (s *Unix) Addr() string {
// Dial connects to the address addr on the network net via the proxy. // Dial connects to the address addr on the network net via the proxy.
// NOTE: must be the first dialer in a chain // NOTE: must be the first dialer in a chain
func (s *Unix) Dial(network, addr string) (net.Conn, error) { 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. // DialUDP connects to the given address via the proxy.

View File

@ -52,7 +52,7 @@ func (s *Unix) ListenAndServeTCP() {
} }
defer l.Close() defer l.Close()
log.F("[unix] listening on %s", s.addr) log.F("[unix] Listen on %s", s.addr)
for { for {
c, err := l.Accept() c, err := l.Accept()
@ -108,7 +108,7 @@ func (s *Unix) ListenAndServeUDP() {
s.ServePacket(c) s.ServePacket(c)
} }
// ServePacket implementes proxy.PacketServer // ServePacket implementes proxy.PacketServer.
func (s *Unix) ServePacket(pc net.PacketConn) { func (s *Unix) ServePacket(pc net.PacketConn) {
if server, ok := s.server.(proxy.PacketServer); ok { if server, ok := s.server.(proxy.PacketServer); ok {
server.ServePacket(pc) server.ServePacket(pc)
@ -123,6 +123,8 @@ func (s *Unix) ServePacket(pc net.PacketConn) {
continue continue
} }
log.F("!!! unix ServePacker read from: %s", srcAddr)
var session *Session var session *Session
sessionKey := srcAddr.String() sessionKey := srcAddr.String()