summaryrefslogtreecommitdiff
path: root/client/client.go
diff options
context:
space:
mode:
Diffstat (limited to 'client/client.go')
-rw-r--r--client/client.go55
1 files changed, 55 insertions, 0 deletions
diff --git a/client/client.go b/client/client.go
new file mode 100644
index 0000000..c0a42e0
--- /dev/null
+++ b/client/client.go
@@ -0,0 +1,55 @@
+package client
+
+import (
+ "fmt"
+ "log"
+ "net"
+
+ "0xacab.org/leap/obfsvpn"
+
+ "github.com/kalikaneko/socks5"
+ "github.com/xtaci/kcp-go"
+)
+
+type Client struct {
+ kcp bool
+ socksAddr string
+ obfs4Cert string
+}
+
+func NewClient(kcp bool, socksAddr, obfs4Cert string) *Client {
+ return &Client{
+ kcp: kcp,
+ socksAddr: socksAddr,
+ obfs4Cert: obfs4Cert,
+ }
+}
+
+func (c *Client) Start() bool {
+ server := &socks5.Server{
+ Addr: c.socksAddr,
+ BindIP: "127.0.0.1",
+ }
+
+ dialer, err := obfsvpn.NewDialerFromCert(c.obfs4Cert)
+ if err != nil {
+ log.Printf("Error getting dialer: %v\n", err)
+ return false
+ }
+
+ if c.kcp {
+ dialer.DialFunc = func(network, address string) (net.Conn, error) {
+ log.Printf("Dialing kcp://%s\n", address)
+ return kcp.Dial(address)
+ }
+ }
+
+ server.Dial = dialer.Dial
+
+ fmt.Printf("[+] Starting socks5 proxy at %s\n", c.socksAddr)
+ if err := server.ListenAndServe(); err != nil {
+ log.Printf("error while listening: %v\n", err)
+ return false
+ }
+ return true
+}