commit
670e278e5b
@ -0,0 +1,4 @@
|
||||
# RegelaSocks5-proxyserver
|
||||
## proxy with variable output iface
|
||||
|
||||
###
|
||||
@ -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
|
||||
@ -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
|
||||
@ -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
|
||||
@ -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)
|
||||
}
|
||||
}
|
||||
@ -0,0 +1 @@
|
||||
examlpeuser:lsdflerfereCieT3t
|
||||
Loading…
Reference in new issue