Skip to content

Commit ff5b713

Browse files
author
uoosef
committed
add tls padding, doh fragmentation, hosts feature
1 parent 0b427e8 commit ff5b713

File tree

13 files changed

+465
-118
lines changed

13 files changed

+465
-118
lines changed

bepass/cmd/core/core.go

Lines changed: 44 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@ package core
22

33
import (
44
"bepass/cache"
5+
"bepass/dialer"
56
"bepass/doh"
67
"bepass/logger"
8+
"bepass/resolve"
79
"bepass/server"
810
"bepass/socks5"
911
"fmt"
@@ -16,21 +18,26 @@ import (
1618
)
1719

1820
type Config struct {
19-
TLSHeaderLength int `mapstructure:"TLSHeaderLength"`
20-
DnsCacheTTL int `mapstructure:"DnsCacheTTL"`
21-
WorkerAddress string `mapstructure:"WorkerAddress"`
22-
WorkerIPPortAddress string `mapstructure:"WorkerIPPortAddress"`
23-
WorkerEnabled bool `mapstructure:"WorkerEnabled"`
24-
WorkerDNSOnly bool `mapstructure:"WorkerDNSOnly"`
25-
EnableLowLevelSockets bool `mapstructure:"EnableLowLevelSockets"`
26-
RemoteDNSAddr string `mapstructure:"RemoteDNSAddr"`
27-
BindAddress string `mapstructure:"BindAddress"`
28-
ChunksLengthBeforeSni [2]int `mapstructure:"ChunksLengthBeforeSni"`
29-
SniChunksLength [2]int `mapstructure:"SniChunksLength"`
30-
ChunksLengthAfterSni [2]int `mapstructure:"ChunksLengthAfterSni"`
31-
DelayBetweenChunks [2]int `mapstructure:"DelayBetweenChunks"`
32-
ResolveSystem string `mapstructure:"-"`
33-
DoHClient *doh.Client `mapstructure:"-"`
21+
TLSHeaderLength int `mapstructure:"TLSHeaderLength"`
22+
TLSPaddingEnabled bool `mapstructure:"TLSPaddingEnabled"`
23+
TLSPaddingSize [2]int `mapstructure:"TLSPaddingSize"`
24+
DnsCacheTTL int `mapstructure:"DnsCacheTTL"`
25+
DnsRequestTimeout int `mapstructure:"DnsRequestTimeout"`
26+
WorkerAddress string `mapstructure:"WorkerAddress"`
27+
WorkerIPPortAddress string `mapstructure:"WorkerIPPortAddress"`
28+
WorkerEnabled bool `mapstructure:"WorkerEnabled"`
29+
WorkerDNSOnly bool `mapstructure:"WorkerDNSOnly"`
30+
EnableLowLevelSockets bool `mapstructure:"EnableLowLevelSockets"`
31+
EnableDNSFragmentation bool `mapstructure:"EnableDNSFragmentation"`
32+
RemoteDNSAddr string `mapstructure:"RemoteDNSAddr"`
33+
BindAddress string `mapstructure:"BindAddress"`
34+
ChunksLengthBeforeSni [2]int `mapstructure:"ChunksLengthBeforeSni"`
35+
SniChunksLength [2]int `mapstructure:"SniChunksLength"`
36+
ChunksLengthAfterSni [2]int `mapstructure:"ChunksLengthAfterSni"`
37+
DelayBetweenChunks [2]int `mapstructure:"DelayBetweenChunks"`
38+
Hosts []resolve.Hosts `mapstructure:"Hosts"`
39+
ResolveSystem string `mapstructure:"-"`
40+
DoHClient *doh.Client `mapstructure:"-"`
3441
}
3542

3643
var s5 *socks5.Server
@@ -41,18 +48,33 @@ func RunServer(config *Config, captureCTRLC bool) error {
4148
var resolveSystem string
4249
var dohClient *doh.Client
4350

51+
stdLogger := log.New(os.Stderr, "", log.Ldate|log.Ltime)
52+
appLogger := logger.NewLogger(stdLogger)
53+
54+
localResolver := &resolve.LocalResolver{
55+
Logger: appLogger,
56+
Hosts: config.Hosts,
57+
}
58+
59+
dialer_ := &dialer.Dialer{
60+
Logger: appLogger,
61+
EnableLowLevelSockets: config.EnableLowLevelSockets,
62+
TLSPaddingEnabled: config.TLSPaddingEnabled,
63+
TLSPaddingSize: config.TLSPaddingSize,
64+
ProxyAddress: fmt.Sprintf("socks5://%s", config.BindAddress),
65+
}
66+
4467
if strings.HasPrefix(config.RemoteDNSAddr, "https://") {
4568
resolveSystem = "doh"
4669
dohClient = doh.NewClient(
47-
doh.WithTimeout(10*time.Second),
48-
doh.WithSocks5(fmt.Sprintf("socks5://%s", config.BindAddress)),
70+
doh.WithDNSFragmentation((config.WorkerEnabled && config.WorkerDNSOnly) || config.EnableDNSFragmentation),
71+
doh.WithDialer(dialer_),
72+
doh.WithLocalResolver(localResolver),
4973
)
5074
} else {
5175
resolveSystem = "DNSCrypt"
5276
}
5377

54-
stdLogger := log.New(os.Stderr, "", log.Ldate|log.Ltime)
55-
appLogger := logger.NewLogger(stdLogger)
5678
chunkConfig := server.ChunkConfig{
5779
BeforeSniLength: config.SniChunksLength,
5880
AfterSniLength: config.ChunksLengthAfterSni,
@@ -77,6 +99,8 @@ func RunServer(config *Config, captureCTRLC bool) error {
7799
WorkerConfig: workerConfig,
78100
BindAddress: config.BindAddress,
79101
EnableLowLevelSockets: config.EnableLowLevelSockets,
102+
Dialer: dialer_,
103+
LocalResolver: localResolver,
80104
}
81105

82106
if captureCTRLC {
@@ -93,7 +117,7 @@ func RunServer(config *Config, captureCTRLC bool) error {
93117
socks5.WithConnectHandle(serverHandler.Handle),
94118
)
95119

96-
fmt.Println("Starting socks server:", config.BindAddress)
120+
fmt.Println("Starting socks, http server:", config.BindAddress)
97121
if err := s5.ListenAndServe("tcp", config.BindAddress); err != nil {
98122
return err
99123
}

bepass/config.json

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
{
22
"TLSHeaderLength": 5,
3+
"TLSPaddingEnabled": false,
4+
"TLSPaddingSize": [10, 50],
35
"RemoteDNSAddr": "https://yarp.lefolgoc.net/dns-query",
6+
"EnableDNSFragmentation": true,
47
"DnsCacheTTL": 30,
8+
"DnsRequestTimeout": 10,
59
"BindAddress": "0.0.0.0:8085",
610
"ChunksLengthBeforeSni": [1, 5],
711
"SniChunksLength": [1, 5],
@@ -11,5 +15,11 @@
1115
"WorkerIPPortAddress": "104.31.16.104:443",
1216
"WorkerEnabled": true,
1317
"WorkerDNSOnly": false,
14-
"EnableLowLevelSockets": false
18+
"EnableLowLevelSockets": false,
19+
"Hosts": [
20+
{
21+
"Domain": "yarp.lefolgoc.net",
22+
"IP": "5.39.88.20"
23+
}
24+
]
1525
}

bepass/dialer/dialer.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package dialer
2+
3+
import (
4+
"bepass/logger"
5+
"net"
6+
)
7+
8+
type PlainTCPDial func(network, addr, hostPort string) (net.Conn, error)
9+
10+
type Dialer struct {
11+
Logger *logger.Std
12+
EnableLowLevelSockets bool
13+
TLSPaddingEnabled bool
14+
TLSPaddingSize [2]int
15+
ProxyAddress string
16+
}

bepass/dialer/http.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package dialer
2+
3+
import (
4+
"context"
5+
"net"
6+
"net/http"
7+
"net/url"
8+
)
9+
10+
func (d *Dialer) MakeHTTPClient(hostPort string, enableProxy bool) *http.Client {
11+
transport := &http.Transport{
12+
ForceAttemptHTTP2: false,
13+
DialContext: func(ctx context.Context, network, addr string) (net.Conn, error) {
14+
return d.TCPDial(network, addr, hostPort)
15+
},
16+
DialTLSContext: func(ctx context.Context, network, addr string) (net.Conn, error) {
17+
return d.TLSDial(func(network, addr, hostPort string) (net.Conn, error) {
18+
return d.TCPDial(network, addr, hostPort)
19+
}, network, addr, hostPort)
20+
},
21+
}
22+
if enableProxy {
23+
proxyUrl, _ := url.Parse(d.ProxyAddress)
24+
25+
// Create dialer
26+
transport.Proxy = http.ProxyURL(proxyUrl)
27+
}
28+
return &http.Client{Transport: transport}
29+
}

bepass/dialer/tcp.go

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package dialer
2+
3+
import (
4+
"bepass/protect"
5+
"net"
6+
"runtime"
7+
"strconv"
8+
)
9+
10+
// TCPDial connects to the destination address.
11+
func (d *Dialer) TCPDial(network, addr, hostPort string) (*net.TCPConn, error) {
12+
var (
13+
tcpAddr *net.TCPAddr
14+
err error
15+
)
16+
if hostPort != "" {
17+
tcpAddr, err = net.ResolveTCPAddr(network, hostPort)
18+
} else {
19+
tcpAddr, err = net.ResolveTCPAddr(network, addr)
20+
}
21+
if err != nil {
22+
return nil, err
23+
}
24+
if d.EnableLowLevelSockets && (runtime.GOOS == "android" || runtime.GOOS == "linux") {
25+
dialer := protect.NewClientDialer()
26+
conn, err := dialer.Dial("tcp", net.JoinHostPort(tcpAddr.IP.String(), strconv.Itoa(tcpAddr.Port)))
27+
if err != nil {
28+
return nil, err
29+
}
30+
return conn.(*net.TCPConn), nil
31+
}
32+
conn, err := net.DialTCP("tcp", nil, tcpAddr)
33+
if err != nil {
34+
d.Logger.Errorf("failed to connect to %v: %v", tcpAddr, err)
35+
return nil, err
36+
}
37+
return conn, nil
38+
}

0 commit comments

Comments
 (0)