summaryrefslogtreecommitdiff
path: root/client/main.go
diff options
context:
space:
mode:
Diffstat (limited to 'client/main.go')
-rw-r--r--client/main.go66
1 files changed, 66 insertions, 0 deletions
diff --git a/client/main.go b/client/main.go
new file mode 100644
index 0000000..0c7edcc
--- /dev/null
+++ b/client/main.go
@@ -0,0 +1,66 @@
+package main
+
+import (
+ "flag"
+ "fmt"
+ "io"
+ "log"
+ "net"
+ "os"
+
+ "0xacab.org/leap/obfsvpn"
+ socks5 "github.com/armon/go-socks5"
+)
+
+func main() {
+ // Setup logging.
+ logger := log.New(os.Stderr, "", log.LstdFlags)
+ debug := log.New(io.Discard, "DEBUG ", log.LstdFlags)
+
+ // setup command line flags.
+ var (
+ verbose bool
+ obfs4Cert string
+ obfs4Remote string
+ socksPort string
+ socksHost string
+ )
+
+ socksPort = "8080"
+ socksHost = "127.0.0.1"
+
+ flags := flag.NewFlagSet(os.Args[0], flag.ContinueOnError)
+ flags.BoolVar(&verbose, "v", verbose, "Enable verbose logging")
+ flags.StringVar(&obfs4Cert, "c", obfs4Cert, "The remote obfs4 certificate")
+ flags.StringVar(&obfs4Remote, "r", obfs4Remote, "The remote obfs4 endpoint (ip:port)")
+ flags.StringVar(&socksPort, "p", socksPort, "The port for the local socks5 proxy (default: 8080)")
+ flags.StringVar(&socksHost, "i", socksHost, "The host for the local socks5 proxy (default: localhost)")
+ err := flags.Parse(os.Args[1:])
+ if err != nil {
+ logger.Fatalf("error parsing flags: %v", err)
+ }
+ // Configure logging.
+ if verbose {
+ debug.SetOutput(os.Stderr)
+ }
+
+ dialer, err := obfsvpn.NewDialerFromCert(obfs4Cert)
+ if err != nil {
+ logger.Fatalf("cannot get dialer: %v", err)
+ }
+
+ socksConf := &socks5.Config{
+ Dial: dialer.Dial,
+ }
+
+ server, err := socks5.New(socksConf)
+ if err != nil {
+ panic(err)
+ }
+
+ addr := net.JoinHostPort(socksHost, socksPort)
+ fmt.Printf("[+] Started socks5 proxy at %s\n", addr)
+ if err := server.ListenAndServe("tcp", addr); err != nil {
+ panic(err)
+ }
+}