Files
openlan/pkg/proxy/socks.go
2025-03-20 20:21:37 +08:00

68 lines
1.4 KiB
Go
Executable File

package proxy
import (
"time"
"github.com/luscis/openlan/pkg/config"
"github.com/luscis/openlan/pkg/libol"
"github.com/luscis/openlan/pkg/socks5"
)
type SocksProxy struct {
server *socks5.Server
out *libol.SubLogger
cfg *config.SocksProxy
}
func NewSocksProxy(cfg *config.SocksProxy) *SocksProxy {
s := &SocksProxy{
cfg: cfg,
out: libol.NewSubLogger(cfg.Listen),
}
// Create a SOCKS5 server
auth := cfg.Auth
authMethods := make([]socks5.Authenticator, 0, 2)
if auth != nil && len(auth.Username) > 0 {
author := socks5.UserPassAuthenticator{
Credentials: socks5.StaticCredentials{
auth.Username: auth.Password,
},
}
authMethods = append(authMethods, author)
}
conf := &socks5.Config{
Backends: cfg.Backends,
AuthMethods: authMethods,
Logger: s.out,
}
server, err := socks5.New(conf)
if err != nil {
s.out.Error("NewSocksProxy %s", err)
return nil
}
s.server = server
return s
}
func (s *SocksProxy) Start() {
if s.server == nil || s.cfg == nil {
return
}
addr := s.cfg.Listen
s.out.Info("SocksProxy.Start: socks5://%s", s.cfg.Listen)
promise := &libol.Promise{
First: time.Second * 2,
MaxInt: time.Minute,
MinInt: time.Second * 10,
}
promise.Go(func() error {
if err := s.server.ListenAndServe("tcp", addr); err != nil {
s.out.Warn("SocksProxy.Start %s", err)
return err
}
return nil
})
}