Skip to content

Commit

Permalink
add http/https/socks5 proxy support
Browse files Browse the repository at this point in the history
  • Loading branch information
SwimmingTiger committed Nov 29, 2021
1 parent 015dbaf commit 66e60ea
Show file tree
Hide file tree
Showing 7 changed files with 186 additions and 23 deletions.
11 changes: 9 additions & 2 deletions Config.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,12 +54,12 @@ type Config struct {
DisconnectWhenLostAsicboost bool `json:"disconnect_when_lost_asicboost"`
UseIpAsWorkerName bool `json:"use_ip_as_worker_name"`
IpWorkerNameFormat string `json:"ip_worker_name_format"`
FixedWorkerName string `json:"fixed_worker_name"`
SubmitResponseFromServer bool `json:"submit_response_from_server"`
AgentListenIp string `json:"agent_listen_ip"`
AgentListenPort uint16 `json:"agent_listen_port"`
Proxy string `json:"proxy"`
PoolUseTls bool `json:"pool_use_tls"`
UseIocp bool `json:"use_iocp"`
FixedWorkerName string `json:"fixed_worker_name"`
Pools []PoolInfo `json:"pools"`
HTTPDebug struct {
Enable bool `json:"enable"`
Expand Down Expand Up @@ -133,6 +133,13 @@ func (conf *Config) Init() {
glog.Info("[OPTION] Fixed worker name enabled, all worker name will be replaced to ", conf.FixedWorkerName, " on the server.")
}

if conf.Proxy == "system" {
conf.Proxy = GetProxyURLFromEnv()
}
if len(conf.Proxy) > 0 {
glog.Info("[OPTION] Connect to pool server with proxy [", conf.Proxy, "]")
}

for i := range conf.Pools {
pool := &conf.Pools[i]
if conf.MultiUserMode {
Expand Down
104 changes: 104 additions & 0 deletions Proxy.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
package main

import (
"fmt"
"net"
"net/url"
"os"
"strings"
"time"

"github.com/btccom/connectproxy"
"golang.org/x/net/proxy"
)

type Dialer interface {
// Dial connects to the given address.
Dial(network, addr string) (net.Conn, error)
}

func GetProxyURLFromEnv() (url string) {
url = os.Getenv("ALL_PROXY")
if len(url) < 1 {
url = os.Getenv("all_proxy")
}
if len(url) < 1 {
url = os.Getenv("HTTPS_PROXY")
}
if len(url) < 1 {
url = os.Getenv("https_proxy")
}
if len(url) < 1 {
url = os.Getenv("HTTP_PROXY")
}
if len(url) < 1 {
url = os.Getenv("http_proxy")
}
return
}

func RegularProxyURL(url string) string {
if len(url) < 1 {
return url
}
url = strings.TrimSpace(url)
pos := strings.Index(url, "://")

var protocol, address string
if pos < 0 {
protocol = "http"
address = url
} else {
protocol = strings.ToLower(url[:pos])
address = url[pos+3:]
}

switch protocol {
case "":
protocol = "http"
case "socks4":
fallthrough
case "socks4a":
fallthrough
case "socks5":
protocol = "socks"
}
return fmt.Sprintf("%s://%s", protocol, address)
}

func GetProxyDialer(proxyURL string, timeout time.Duration, insecureSkipVerify bool) (dailer Dialer, err error) {
proxyURL = RegularProxyURL(proxyURL)
u, err := url.Parse(proxyURL)
if err != nil {
return
}

if u.Scheme == "socks" {
var auth proxy.Auth
auth.User = u.User.Username()
auth.Password, _ = u.User.Password()
dailer, err = proxy.SOCKS5("tcp", u.Host, &auth, &net.Dialer{
Timeout: timeout,
})
return
}

if u.Scheme == "http" || u.Scheme == "https" {
dailer, err = connectproxy.NewWithConfig(
u,
&net.Dialer{
Timeout: timeout,
},
&connectproxy.Config{
InsecureSkipVerify: insecureSkipVerify,
DialTimeout: timeout,
},
)
return
}

if len(proxyURL) > 0 {
err = fmt.Errorf("unknown proxy scheme '%s'", u.Scheme)
}
return
}
25 changes: 25 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,3 +26,28 @@ mkdir log
./btcagent -c agent_conf.json -l log -alsologtostderr
```

## Use proxy

In [agent_conf.json](agent_conf.default.json):

* socks5 proxy
```
"proxy": "socks5://127.0.0.1:1089",
```
* http proxy
```
"proxy": "http://127.0.0.1:8089",
```
* https proxy (http proxy with SSL/TLS)
```
"proxy": "http://127.0.0.1:4433",
```
* find proxy from system environment variables
```
"proxy": "system",
```
* disable proxy
```
"proxy": "",
```
55 changes: 35 additions & 20 deletions UpSession.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"bufio"
"crypto/tls"
"encoding/binary"
"errors"
"fmt"
"io"
"net"
Expand Down Expand Up @@ -76,34 +77,48 @@ func NewUpSession(manager *UpSessionManager, config *Config, subAccount string,

func (up *UpSession) connect() (err error) {
pool := up.config.Pools[up.poolIndex]

url := fmt.Sprintf("%s:%d", pool.Host, pool.Port)

if up.config.PoolUseTls {
up.id = fmt.Sprintf("pool#%d <%s> [tls://%s] ", up.slot, up.subAccount, url)
glog.Info(up.id, "connect to pool server...")

up.serverConn, err = tls.DialWithDialer(
&net.Dialer{
Timeout: up.config.Advanced.PoolConnectionDialTimeoutSeconds.Get(),
},
"tcp",
url,
&tls.Config{
InsecureSkipVerify: up.config.Advanced.TLSSkipCertificateVerify,
},
)
} else {
up.id = fmt.Sprintf("pool#%d <%s> [%s] ", up.slot, up.subAccount, url)
glog.Info(up.id, "connect to pool server...")
}

up.serverConn, err = net.DialTimeout(
"tcp",
url,
up.config.Advanced.PoolConnectionDialTimeoutSeconds.Get(),
)
timeout := up.config.Advanced.PoolConnectionDialTimeoutSeconds.Get()
insecureSkipVerify := up.config.Advanced.TLSSkipCertificateVerify
dialer, err := GetProxyDialer(up.config.Proxy, timeout, insecureSkipVerify)
if dialer != nil && err == nil {
glog.Info(up.id, "connect to pool server with proxy [", up.config.Proxy, "]...")
select {
case <-time.After(timeout):
err = errors.New("connection timeout")
default:
up.serverConn, err = dialer.Dial("tcp", url)
}
}
if err != nil {
return
glog.Warning(up.id, "ignore proxy [", up.config.Proxy, "]: ", err.Error())
up.serverConn = nil
}
if up.serverConn == nil {
glog.Info(up.id, "connect to pool server...")
select {
case <-time.After(timeout):
err = errors.New("connection timeout")
default:
up.serverConn, err = net.DialTimeout("tcp", url, timeout)
}
if err != nil {
return
}
}

if up.config.PoolUseTls {
up.serverConn = tls.Client(up.serverConn, &tls.Config{
ServerName: pool.Host,
InsecureSkipVerify: insecureSkipVerify,
})
}

up.id += fmt.Sprintf("(%s) ", up.serverConn.RemoteAddr().String())
Expand Down
3 changes: 2 additions & 1 deletion agent_conf.default.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,12 @@
"disconnect_when_lost_asicboost": true,
"use_ip_as_worker_name": false,
"ip_worker_name_format": "{1}x{2}x{3}x{4}",
"fixed_worker_name": "",
"submit_response_from_server": false,
"agent_listen_ip": "0.0.0.0",
"agent_listen_port": 3333,
"proxy": "",
"pool_use_tls": false,
"fixed_worker_name": "",
"pools": [
["cn.ss.btc.com", 1800, "testpool"],
["cn.ss.btc.com", 443, "testpool"],
Expand Down
2 changes: 2 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,7 @@ go 1.17

require (
github.com/bits-and-blooms/bitset v1.2.1
github.com/btccom/connectproxy v0.0.0-20200725203833-3582e84f0c9b
github.com/golang/glog v1.0.0
golang.org/x/net v0.0.0-20211123203042-d83791d6bcd9
)
9 changes: 9 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
@@ -1,4 +1,13 @@
github.com/bits-and-blooms/bitset v1.2.1 h1:M+/hrU9xlMp7t4TyTDQW97d3tRPVuKFC6zBEK16QnXY=
github.com/bits-and-blooms/bitset v1.2.1/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA=
github.com/btccom/connectproxy v0.0.0-20200725203833-3582e84f0c9b h1:ADw0dUto49/UxuLGZ+TyD8luQoKO2NUWFP6Y41htmRM=
github.com/btccom/connectproxy v0.0.0-20200725203833-3582e84f0c9b/go.mod h1:KqKyCk7zguFVUJUad6BqC+zE6L8Yqd0tzr1uK9TAFlU=
github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ=
github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4=
golang.org/x/net v0.0.0-20211123203042-d83791d6bcd9 h1:0qxwC5n+ttVOINCBeRHO0nq9X7uy8SDsPoi5OaCdIEI=
golang.org/x/net v0.0.0-20211123203042-d83791d6bcd9/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=

0 comments on commit 66e60ea

Please sign in to comment.