From 670e278e5b0e95f348c2de4a1129f67a8d329297 Mon Sep 17 00:00:00 2001 From: vaninpetr <> Date: Fri, 6 Jan 2023 22:00:08 +0300 Subject: [PATCH] initial commit --- README.md | 4 + go_RegelaSocks5.sh | 10 ++ proxy-server-config.sh | 30 ++++++ proxy-server.sh | 9 ++ src/server.go | 234 +++++++++++++++++++++++++++++++++++++++++ users.list | 1 + 6 files changed, 288 insertions(+) create mode 100644 README.md create mode 100644 go_RegelaSocks5.sh create mode 100755 proxy-server-config.sh create mode 100755 proxy-server.sh create mode 100644 src/server.go create mode 100644 users.list diff --git a/README.md b/README.md new file mode 100644 index 0000000..6e1408b --- /dev/null +++ b/README.md @@ -0,0 +1,4 @@ +# RegelaSocks5-proxyserver +## proxy with variable output iface + +### \ No newline at end of file diff --git a/go_RegelaSocks5.sh b/go_RegelaSocks5.sh new file mode 100644 index 0000000..2e8b108 --- /dev/null +++ b/go_RegelaSocks5.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +export GO111MODULE=off +export GOPATH="." +export GOROOT="/usr/lib/golang/" + + cd "$GOPATH"/src/ + go build + cd ../../ + mv src/RegelaSocks5-proxyserver/RegelaSocks5-proxyserver bin/RegelaSocks5-proxyserver0 diff --git a/proxy-server-config.sh b/proxy-server-config.sh new file mode 100755 index 0000000..60d69ab --- /dev/null +++ b/proxy-server-config.sh @@ -0,0 +1,30 @@ +#!/bin/bash +# ver_2; in /usr/local/bin/proxy-server +# users credentials script automatics + +userfile=users.list +usr=$(echo $2 | tr '[:upper:]' '[:lower:]') + +if [[ $1 = '' ]]; then +exit 1 +elif [[ $2 = '' ]]; then +exit 1 +fi + +func1(){ +pwgen -B -N 2 | tr -d '[:space:]' +} +passw=$(func1) + +if [[ $1 = 'unvoke' ]]; then + sed -i "/$usr:/d" $userfile + echo "user $usr unvoked" + echo "users in list: $(cat $userfile | wc -l)" +elif [[ $1 = 'regen' ]]; then + sed -i "/$usr:/d" $userfile + echo "$usr:$passw" >> $userfile + echo "new $usr password: $passw" + echo "users in list: $(cat $userfile | wc -l)" +fi + unset passw + sudo systemctl restart proxy-server diff --git a/proxy-server.sh b/proxy-server.sh new file mode 100755 index 0000000..8b5bcbd --- /dev/null +++ b/proxy-server.sh @@ -0,0 +1,9 @@ +#!/bin/bash +# in /usr/local/bin/proxy-server.sh + +# cd /vz/hostdata/proxy + +userfile=users.list +logfile=logs/proxy-server_$(date "+%F_%s").log +# cd /usr/local/bin/ +/vz/hostdata/go/bin/RegelaSocks5-proxyserver -port "$1" -users $userfile -iface "$2" # &>> $logfile diff --git a/src/server.go b/src/server.go new file mode 100644 index 0000000..9a06d5e --- /dev/null +++ b/src/server.go @@ -0,0 +1,234 @@ +package main + +import ( + "bufio" + "flag" + "fmt" + "github.com/armon/go-socks5" + "golang.org/x/net/context" + "log" + "net" + "os" + "regexp" + "strconv" + "strings" + "time" +) + +// GetFdFromConn get net.Conn's file descriptor. +//func GetFdFromConn(l net.Conn) int { +// v := reflect.ValueOf(l) +// netFD := reflect.Indirect(reflect.Indirect(v).FieldByName("fd")) +// fd := int(netFD.FieldByName("sysfd").Int()) +// return fd +//} +// +//func GetFdFromConn(l net.Conn) int { +// v := reflect.ValueOf(l) +// netFD := reflect.Indirect(reflect.Indirect(v).FieldByName("fd")) +// pfd := reflect.Indirect(netFD.FieldByName("pfd")) +// fd := int(pfd.FieldByName("Sysfd").Int()) +// return fd +//} + +// Dialer . +type Dialer struct { + ifname string + laddrIP string + err error + dialer *net.Dialer +} + +// DialFromInterface . +func DialFromInterface(ifaceName string) *Dialer { + d := &Dialer{ifname: ifaceName} + + // Lookup rquested interface. + iface, err := net.InterfaceByName(ifaceName) + if err != nil { + d.err = err + return d + } + + // Pull the addresses. + addres, err := iface.Addrs() + if err != nil { + d.err = err + return d + } + + // Look for the first usable address. + var targetIP string + for _, addr := range addres { + ip, _, err := net.ParseCIDR(addr.String()) + if err != nil { + d.err = err + return d + } + if ip.IsUnspecified() { + continue + } + if ip.To4().Equal(ip) { + targetIP = ip.String() + break + } else { + targetIP = "[" + ip.String() + "]" + } + } + if targetIP == "" { + d.err = fmt.Errorf("no ipv4 found for interface") + return d + } + d.laddrIP = targetIP + return d +} + +func (d *Dialer) lookupAddr(network, addr string) (net.Addr, error) { + if d.err != nil { + return nil, d.err + } + // If no custom dialer specified, use default one. + if d.dialer == nil { + d.dialer = &net.Dialer{} + } + + // Resolve the address. + switch network { + case "tcp", "tcp4", "tcp6": + addr, err := net.ResolveTCPAddr(network, d.laddrIP+":0") + return addr, err + case "udp", "udp4", "udp6": + addr, err := net.ResolveUDPAddr(network, d.laddrIP+":0") + return addr, err + default: + return nil, fmt.Errorf("unkown network") + } +} + +// Dial . +func (d *Dialer) Dial(network, addr string) (net.Conn, error) { + laddr, err := d.lookupAddr(network, addr) + if err != nil { + return nil, err + } + d.dialer.LocalAddr = laddr + conn, err := d.dialer.Dial(network, addr) + //syscall.BindToDevice(GetFdFromConn(conn), d.ifname) + return conn, err +} + +// DialTimeout . +func (d *Dialer) DialTimeout(network, addr string, timeout time.Duration) (net.Conn, error) { + laddr, err := d.lookupAddr(network, addr) + if err != nil { + return nil, err + } + d.dialer.Timeout = timeout + d.dialer.LocalAddr = laddr + return d.dialer.Dial(network, addr) +} + +// WithDialer . +func (d *Dialer) WithDialer(dialer net.Dialer) *Dialer { + d.dialer = &dialer + return d +} + +var dialer *Dialer + +func dial(ctx context.Context, network, addr string) (net.Conn, error) { + conn, err := dialer.Dial(network, addr) + return conn, err +} + +func main() { + + var ( + proxyPort uint + proxyUser string + proxyPassword string + proxyUsersFile string + interfaceName string + ) + + flag.UintVar(&proxyPort, "port", 1080, "custom port") + flag.StringVar(&proxyUser, "login", "q", "login name, needs if you are too lazy to creat a file which contains user data") + flag.StringVar(&proxyPassword, "password", "q", "password, please read about login name") + flag.StringVar(&proxyUsersFile, "users", "", "a file which include a list of users, in which has set one user per line, every line include USERNAME:PASSWORD separated by colons") + flag.StringVar(&interfaceName, "iface", "", "run at specific interface") + + flag.Parse() + + //Initialize socks5 config + socsk5conf := &socks5.Config{ + Logger: log.New(os.Stdout, "", log.LstdFlags), + } + + if interfaceName != "" { + dialer = DialFromInterface(interfaceName) + socsk5conf.Dial = dial + } + + //creds := socks5.StaticCredentials{ + // proxyUser: proxyPassword, + // "dsa": "dsa", + //} + //var creds socks5.CredentialStore + + userData := make(map[string]string) + + if (proxyUser != "") != (proxyPassword != "") { + log.Fatal("Specify password and login name just together a time") + } + if proxyUser != "" && proxyPassword != "" { + userData[proxyUser] = proxyPassword + } + + // reads users from file + if proxyUsersFile != "" { + file, err := os.Open(proxyUsersFile) + if err != nil { + log.Print(err) + log.Print("I cannot read the file, I ignore it.") + } + + r := bufio.NewReader(file) + for { + line, _, err := r.ReadLine() + if err != nil { + break + } + data := strings.Split(string(line), ":") + if len(data) != 2 { + log.Print("line \"" + string(line) + "\" is invalid") + break + } + correct, err := regexp.MatchString("[A-z0-9_]+", data[0]) + if !correct || err != nil { + log.Print("error at parsing line: " + string(line)) + break + } + correct, err = regexp.MatchString("[A-z0-9_]+", data[1]) + if !correct || err != nil { + log.Print("error at parsing line: " + string(line)) + break + } + + // all right + userData[data[0]] = data[1] + } + } + + cator := socks5.UserPassAuthenticator{Credentials: socks5.StaticCredentials(userData)} + socsk5conf.AuthMethods = []socks5.Authenticator{cator} + + server, err := socks5.New(socsk5conf) + if err != nil { + log.Fatal(err) + } + + log.Printf("Start listening proxy service on port %d\n", proxyPort) + if err := server.ListenAndServe("tcp", ":"+strconv.Itoa(int(proxyPort))); err != nil { + log.Fatal(err) + } +} diff --git a/users.list b/users.list new file mode 100644 index 0000000..0d7971c --- /dev/null +++ b/users.list @@ -0,0 +1 @@ +examlpeuser:lsdflerfereCieT3t