Skip to content

Commit

Permalink
Add permute proxy
Browse files Browse the repository at this point in the history
  • Loading branch information
wzshiming committed Oct 6, 2023
1 parent b956c16 commit c5989ec
Show file tree
Hide file tree
Showing 8 changed files with 173 additions and 91 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/go-cross-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ jobs:
- name: Set up Go
uses: actions/setup-go@v2
with:
go-version: 1.18
go-version: 1.21
- name: Build Cross Platform
uses: wzshiming/action-go-build-cross-plantform@v1
- name: Upload Release Assets
Expand Down
67 changes: 47 additions & 20 deletions bridge_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,17 @@ import (
"net/http"
"net/http/httptest"
"net/url"
"strings"
"testing"
"time"

_ "github.com/wzshiming/bridge/protocols/command"
_ "github.com/wzshiming/bridge/protocols/connect"
_ "github.com/wzshiming/bridge/protocols/emux"
_ "github.com/wzshiming/bridge/protocols/netcat"
_ "github.com/wzshiming/bridge/protocols/permuteproxy"
_ "github.com/wzshiming/bridge/protocols/shadowsocks"
_ "github.com/wzshiming/bridge/protocols/snappy"
_ "github.com/wzshiming/bridge/protocols/socks4"
_ "github.com/wzshiming/bridge/protocols/socks5"
_ "github.com/wzshiming/bridge/protocols/ssh"
Expand All @@ -27,6 +31,8 @@ import (
_ "github.com/wzshiming/anyproxy/proxies/sshproxy"

"github.com/wzshiming/anyproxy"
"github.com/wzshiming/permuteproxy"

"github.com/wzshiming/bridge/chain"
"github.com/wzshiming/bridge/logger"
)
Expand All @@ -51,30 +57,48 @@ func newProxy(addr string) (uri string, err error) {
if err != nil {
return "", err
}
proxy, err := anyproxy.NewAnyProxy(ctx, []string{addr}, &anyproxy.Config{
Dialer: &net.Dialer{},
ListenConfig: &net.ListenConfig{},
})
if err != nil {
return "", err
}
host := proxy.Match(u.Host)
listener, err := net.Listen("tcp", u.Host)
if err != nil {
return "", err
}
u.Host = listener.Addr().String()
go func() {
for {
conn, err := listener.Accept()
if strings.Contains(u.Scheme, "+") {
l := &permuteproxy.Proxy{
ListenConfig: &net.ListenConfig{},
}
dc, err := l.NewRunner(addr)
if err != nil {
return "", err
}
go func() {
err = dc.Run(ctx)
if err != nil {
logger.Std.Error(err, "accept")
logger.Std.Error(err, "run")
return
}
go host.ServeConn(conn)
}()
return addr, nil
} else {
proxy, err := anyproxy.NewAnyProxy(ctx, []string{addr}, &anyproxy.Config{
Dialer: &net.Dialer{},
ListenConfig: &net.ListenConfig{},
})
if err != nil {
return "", err
}
}()
return u.String(), nil
host := proxy.Match(u.Host)
listener, err := net.Listen("tcp", u.Host)
if err != nil {
return "", err
}
u.Host = listener.Addr().String()
go func() {
for {
conn, err := listener.Accept()
if err != nil {
logger.Std.Error(err, "accept")
return
}
go host.ServeConn(conn)
}
}()
return u.String(), nil
}
}

var ProxyServer = []string{
Expand All @@ -86,6 +110,9 @@ var ProxyServer = []string{
"socks4://[email protected]:0",
"socks5://s5:[email protected]:0",
"ssh://s:[email protected]:0",
"http+snappy://127.0.0.1:45670",
"socks4+snappy://127.0.0.1:45671",
"socks5+snappy://127.0.0.1:45672",
}

func init() {
Expand Down
15 changes: 12 additions & 3 deletions chain/chain.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,9 @@ import (

// BridgeChain is a bridger that supports multiple crossing of bridger.
type BridgeChain struct {
DialerFunc func(dialer bridge.Dialer) bridge.Dialer
proto map[string]bridge.Bridger
DialerFunc func(dialer bridge.Dialer) bridge.Dialer
proto map[string]bridge.Bridger
defaultProto bridge.Bridger
}

// NewBridgeChain create a new BridgeChain.
Expand Down Expand Up @@ -114,7 +115,10 @@ func (b *BridgeChain) dialOne(dialer bridge.Dialer, address string) (bridge.Dial
}
bridger, ok := b.proto[sch]
if !ok {
return nil, fmt.Errorf("unsupported protocol %q", sch)
if b.defaultProto == nil {
return nil, fmt.Errorf("unsupported protocol %q", sch)
}
bridger = b.defaultProto
}
return bridger.Bridge(dialer, address)
}
Expand All @@ -124,3 +128,8 @@ func (b *BridgeChain) Register(name string, bridger bridge.Bridger) error {
b.proto[name] = bridger
return nil
}

// RegisterDefault is register a default bridger for BridgeChain.
func (b *BridgeChain) RegisterDefault(bridger bridge.Bridger) {
b.defaultProto = bridger
}
1 change: 1 addition & 0 deletions cmd/bridge/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import (
_ "github.com/wzshiming/bridge/protocols/connect"
_ "github.com/wzshiming/bridge/protocols/emux"
_ "github.com/wzshiming/bridge/protocols/netcat"
_ "github.com/wzshiming/bridge/protocols/permuteproxy"
_ "github.com/wzshiming/bridge/protocols/shadowsocks"
_ "github.com/wzshiming/bridge/protocols/snappy"
_ "github.com/wzshiming/bridge/protocols/socks4"
Expand Down
37 changes: 20 additions & 17 deletions go.mod
Original file line number Diff line number Diff line change
@@ -1,37 +1,40 @@
module github.com/wzshiming/bridge

go 1.18
go 1.21

require (
github.com/Microsoft/go-winio v0.5.2
github.com/go-logr/logr v1.2.2
github.com/go-logr/zapr v1.2.2
github.com/Microsoft/go-winio v0.6.1
github.com/go-logr/logr v1.2.4
github.com/go-logr/zapr v1.2.4
github.com/golang/snappy v0.0.4
github.com/spf13/pflag v1.0.5
github.com/wzshiming/anyproxy v0.7.11
github.com/wzshiming/cmux v0.3.1
github.com/wzshiming/anyproxy v0.7.12
github.com/wzshiming/cmux v0.3.2
github.com/wzshiming/commandproxy v0.2.0
github.com/wzshiming/emux v0.2.1
github.com/wzshiming/hostmatcher v0.0.1
github.com/wzshiming/httpproxy v0.5.3
github.com/wzshiming/httpproxy v0.5.4
github.com/wzshiming/notify v0.1.1
github.com/wzshiming/permuteproxy v0.0.2
github.com/wzshiming/schedialer v0.2.1
github.com/wzshiming/shadowsocks v0.3.2
github.com/wzshiming/shadowsocks v0.4.0
github.com/wzshiming/socks4 v0.3.2
github.com/wzshiming/socks5 v0.4.2
github.com/wzshiming/sshproxy v0.4.2
go.uber.org/zap v1.20.0
github.com/wzshiming/sshproxy v0.4.3
go.uber.org/zap v1.26.0
)

require (
github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da // indirect
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect
github.com/wzshiming/sshd v0.2.2 // indirect
github.com/wzshiming/trie v0.1.0 // indirect
go.uber.org/atomic v1.7.0 // indirect
go.uber.org/multierr v1.6.0 // indirect
golang.org/x/crypto v0.3.0 // indirect
golang.org/x/net v0.7.0 // indirect
github.com/wzshiming/trie v0.1.1 // indirect
go.uber.org/multierr v1.10.0 // indirect
golang.org/x/crypto v0.14.0 // indirect
golang.org/x/mod v0.8.0 // indirect
golang.org/x/net v0.10.0 // indirect
golang.org/x/sync v0.1.0 // indirect
golang.org/x/sys v0.5.0 // indirect
golang.org/x/text v0.7.0 // indirect
golang.org/x/sys v0.13.0 // indirect
golang.org/x/text v0.13.0 // indirect
golang.org/x/tools v0.6.0 // indirect
)
Loading

0 comments on commit c5989ec

Please sign in to comment.