Просмотр исходного кода

Merge pull request #353 from 9seconds/domain-fronting-native

Use native dialer to communicate with fronting domain
tags/v2.2.0^2^2
Sergei Arkhipov 1 месяц назад
Родитель
Сommit
7762cf3a55
Аккаунт пользователя с таким Email не найден

+ 1
- 1
internal/cli/run_proxy.go Просмотреть файл

52
 		conf.Network.Timeout.Idle.Get(0),
52
 		conf.Network.Timeout.Idle.Get(0),
53
 	)
53
 	)
54
 
54
 
55
-	proxyDialers := make([]network.Network, len(conf.Network.Proxies))
55
+	proxyDialers := make([]mtglib.Network, len(conf.Network.Proxies))
56
 	for idx, v := range conf.Network.Proxies {
56
 	for idx, v := range conf.Network.Proxies {
57
 		value, err := network.NewProxyNetwork(base, v.Get(nil))
57
 		value, err := network.NewProxyNetwork(base, v.Get(nil))
58
 		if err != nil {
58
 		if err != nil {

+ 5
- 0
internal/testlib/mtglib_network_mock.go Просмотреть файл

2
 
2
 
3
 import (
3
 import (
4
 	"context"
4
 	"context"
5
+	"net"
5
 	"net/http"
6
 	"net/http"
6
 
7
 
7
 	"github.com/9seconds/mtg/v2/essentials"
8
 	"github.com/9seconds/mtg/v2/essentials"
24
 	return args.Get(0).(essentials.Conn), args.Error(1) //nolint: wrapcheck, forcetypeassert
25
 	return args.Get(0).(essentials.Conn), args.Error(1) //nolint: wrapcheck, forcetypeassert
25
 }
26
 }
26
 
27
 
28
+func (m *MtglibNetworkMock) NativeDialer() *net.Dialer {
29
+	return m.Called().Get(0).(*net.Dialer)
30
+}
31
+
27
 func (m *MtglibNetworkMock) MakeHTTPClient(dialFunc func(ctx context.Context,
32
 func (m *MtglibNetworkMock) MakeHTTPClient(dialFunc func(ctx context.Context,
28
 	network, address string) (essentials.Conn, error),
33
 	network, address string) (essentials.Conn, error),
29
 ) *http.Client {
34
 ) *http.Client {

+ 5
- 1
mtglib/init.go Просмотреть файл

124
 	// Dial establishes context-free TCP connections.
124
 	// Dial establishes context-free TCP connections.
125
 	Dial(network, address string) (essentials.Conn, error)
125
 	Dial(network, address string) (essentials.Conn, error)
126
 
126
 
127
-	// DialContext dials using a context. This is a preferrable way of
127
+	// DialContext dials using a context. This is a preferable way of
128
 	// establishing TCP connections.
128
 	// establishing TCP connections.
129
 	DialContext(ctx context.Context, network, address string) (essentials.Conn, error)
129
 	DialContext(ctx context.Context, network, address string) (essentials.Conn, error)
130
 
130
 
131
 	// MakeHTTPClient build an HTTP client with given dial function. If nothing is
131
 	// MakeHTTPClient build an HTTP client with given dial function. If nothing is
132
 	// provided, then DialContext of this interface is going to be used.
132
 	// provided, then DialContext of this interface is going to be used.
133
 	MakeHTTPClient(func(ctx context.Context, network, address string) (essentials.Conn, error)) *http.Client
133
 	MakeHTTPClient(func(ctx context.Context, network, address string) (essentials.Conn, error)) *http.Client
134
+
135
+	// NativeDialer returns a configured instance of native dialer that
136
+	// skips proxy connections or any other irrelevant settings.
137
+	NativeDialer() *net.Dialer
134
 }
138
 }
135
 
139
 
136
 // AntiReplayCache is an interface that is used to detect replay attacks based
140
 // AntiReplayCache is an interface that is used to detect replay attacks based

+ 4
- 1
mtglib/proxy.go Просмотреть файл

279
 	p.eventStream.Send(p.ctx, NewEventDomainFronting(ctx.streamID))
279
 	p.eventStream.Send(p.ctx, NewEventDomainFronting(ctx.streamID))
280
 	conn.Rewind()
280
 	conn.Rewind()
281
 
281
 
282
-	frontConn, err := p.network.DialContext(ctx, "tcp", p.DomainFrontingAddress())
282
+	nativeDialer := p.network.NativeDialer()
283
+	fConn, err := nativeDialer.DialContext(ctx, "tcp", p.DomainFrontingAddress())
283
 	if err != nil {
284
 	if err != nil {
284
 		p.logger.WarningError("cannot dial to the fronting domain", err)
285
 		p.logger.WarningError("cannot dial to the fronting domain", err)
285
 
286
 
286
 		return
287
 		return
287
 	}
288
 	}
288
 
289
 
290
+	frontConn := essentials.WrapNetConn(fConn)
291
+
289
 	if p.domainFrontingProxyProtocol {
292
 	if p.domainFrontingProxyProtocol {
290
 		frontConn = newConnProxyProtocol(ctx.clientConn, frontConn)
293
 		frontConn = newConnProxyProtocol(ctx.clientConn, frontConn)
291
 	}
294
 	}

+ 4
- 0
network/network.go Просмотреть файл

60
 	return nil, fmt.Errorf("cannot dial to %s:%s: %w", protocol, address, err)
60
 	return nil, fmt.Errorf("cannot dial to %s:%s: %w", protocol, address, err)
61
 }
61
 }
62
 
62
 
63
+func (n *network) NativeDialer() *net.Dialer {
64
+	return &net.Dialer{}
65
+}
66
+
63
 func (n *network) MakeHTTPClient(dialFunc func(ctx context.Context,
67
 func (n *network) MakeHTTPClient(dialFunc func(ctx context.Context,
64
 	network, address string) (essentials.Conn, error),
68
 	network, address string) (essentials.Conn, error),
65
 ) *http.Client {
69
 ) *http.Client {

+ 2
- 1
network/v2/base_network_test.go Просмотреть файл

4
 	"context"
4
 	"context"
5
 	"testing"
5
 	"testing"
6
 
6
 
7
+	"github.com/9seconds/mtg/v2/mtglib"
7
 	"github.com/9seconds/mtg/v2/network/v2"
8
 	"github.com/9seconds/mtg/v2/network/v2"
8
 	"github.com/stretchr/testify/assert"
9
 	"github.com/stretchr/testify/assert"
9
 	"github.com/stretchr/testify/suite"
10
 	"github.com/stretchr/testify/suite"
12
 type BaseNetworkTestSuite struct {
13
 type BaseNetworkTestSuite struct {
13
 	EchoServerTestSuite
14
 	EchoServerTestSuite
14
 
15
 
15
-	net network.Network
16
+	net mtglib.Network
16
 }
17
 }
17
 
18
 
18
 func (suite *BaseNetworkTestSuite) SetupSuite() {
19
 func (suite *BaseNetworkTestSuite) SetupSuite() {

+ 0
- 9
network/v2/init.go Просмотреть файл

11
 
11
 
12
 import (
12
 import (
13
 	"errors"
13
 	"errors"
14
-	"net"
15
 	"time"
14
 	"time"
16
-
17
-	"github.com/9seconds/mtg/v2/mtglib"
18
 )
15
 )
19
 
16
 
20
 const (
17
 const (
37
 )
34
 )
38
 
35
 
39
 var ErrCannotDial = errors.New("cannot dial to any address")
36
 var ErrCannotDial = errors.New("cannot dial to any address")
40
-
41
-type Network interface {
42
-	mtglib.Network
43
-
44
-	NativeDialer() *net.Dialer
45
-}

+ 4
- 3
network/v2/multi_network.go Просмотреть файл

8
 	"net/http"
8
 	"net/http"
9
 
9
 
10
 	"github.com/9seconds/mtg/v2/essentials"
10
 	"github.com/9seconds/mtg/v2/essentials"
11
+	"github.com/9seconds/mtg/v2/mtglib"
11
 )
12
 )
12
 
13
 
13
 type multiNetwork struct {
14
 type multiNetwork struct {
14
-	networks []Network
15
+	networks []mtglib.Network
15
 }
16
 }
16
 
17
 
17
 func (m multiNetwork) Dial(network, address string) (essentials.Conn, error) {
18
 func (m multiNetwork) Dial(network, address string) (essentials.Conn, error) {
22
 	networks := m.networks
23
 	networks := m.networks
23
 
24
 
24
 	if len(networks) > 1 {
25
 	if len(networks) > 1 {
25
-		networks = make([]Network, len(m.networks))
26
+		networks = make([]mtglib.Network, len(m.networks))
26
 		copy(networks, m.networks)
27
 		copy(networks, m.networks)
27
 
28
 
28
 		rand.Shuffle(len(m.networks), func(i, j int) {
29
 		rand.Shuffle(len(m.networks), func(i, j int) {
59
 	return m.networks[0].MakeHTTPClient(dialFunc)
60
 	return m.networks[0].MakeHTTPClient(dialFunc)
60
 }
61
 }
61
 
62
 
62
-func Join(networks ...Network) (Network, error) {
63
+func Join(networks ...mtglib.Network) (mtglib.Network, error) {
63
 	if len(networks) == 0 {
64
 	if len(networks) == 0 {
64
 		return nil, errors.New("cannot join no networks")
65
 		return nil, errors.New("cannot join no networks")
65
 	}
66
 	}

+ 2
- 1
network/v2/network.go Просмотреть файл

8
 	"time"
8
 	"time"
9
 
9
 
10
 	"github.com/9seconds/mtg/v2/essentials"
10
 	"github.com/9seconds/mtg/v2/essentials"
11
+	"github.com/9seconds/mtg/v2/mtglib"
11
 )
12
 )
12
 
13
 
13
 type network struct {
14
 type network struct {
70
 	tcpTimeout,
71
 	tcpTimeout,
71
 	httpTimeout,
72
 	httpTimeout,
72
 	idleTimeout time.Duration,
73
 	idleTimeout time.Duration,
73
-) Network {
74
+) mtglib.Network {
74
 	if dnsResolver == nil {
75
 	if dnsResolver == nil {
75
 		dnsResolver = net.DefaultResolver
76
 		dnsResolver = net.DefaultResolver
76
 	}
77
 	}

+ 3
- 2
network/v2/proxy_network.go Просмотреть файл

6
 	"net/url"
6
 	"net/url"
7
 
7
 
8
 	"github.com/9seconds/mtg/v2/essentials"
8
 	"github.com/9seconds/mtg/v2/essentials"
9
+	"github.com/9seconds/mtg/v2/mtglib"
9
 	"golang.org/x/net/proxy"
10
 	"golang.org/x/net/proxy"
10
 )
11
 )
11
 
12
 
12
 type proxyNetwork struct {
13
 type proxyNetwork struct {
13
-	Network
14
+	mtglib.Network
14
 	client proxy.ContextDialer
15
 	client proxy.ContextDialer
15
 }
16
 }
16
 
17
 
23
 	return essentials.WrapNetConn(conn), nil
24
 	return essentials.WrapNetConn(conn), nil
24
 }
25
 }
25
 
26
 
26
-func NewProxyNetwork(base Network, proxyURL *url.URL) (*proxyNetwork, error) {
27
+func NewProxyNetwork(base mtglib.Network, proxyURL *url.URL) (*proxyNetwork, error) {
27
 	socks, err := proxy.FromURL(proxyURL, base.NativeDialer())
28
 	socks, err := proxy.FromURL(proxyURL, base.NativeDialer())
28
 	if err != nil {
29
 	if err != nil {
29
 		return nil, fmt.Errorf("cannot build proxy dialer: %w", err)
30
 		return nil, fmt.Errorf("cannot build proxy dialer: %w", err)

+ 3
- 2
network/v2/socks_proxy_test.go Просмотреть файл

6
 	"sync"
6
 	"sync"
7
 	"testing"
7
 	"testing"
8
 
8
 
9
+	"github.com/9seconds/mtg/v2/mtglib"
9
 	"github.com/9seconds/mtg/v2/network/v2"
10
 	"github.com/9seconds/mtg/v2/network/v2"
10
 	"github.com/stretchr/testify/assert"
11
 	"github.com/stretchr/testify/assert"
11
 	"github.com/stretchr/testify/require"
12
 	"github.com/stretchr/testify/require"
17
 	EchoServerTestSuite
18
 	EchoServerTestSuite
18
 
19
 
19
 	wg          sync.WaitGroup
20
 	wg          sync.WaitGroup
20
-	baseNetwork network.Network
21
+	baseNetwork mtglib.Network
21
 
22
 
22
 	noAuthURL *url.URL
23
 	noAuthURL *url.URL
23
 	authURL   *url.URL
24
 	authURL   *url.URL
85
 
86
 
86
 	for name, proxies := range testData {
87
 	for name, proxies := range testData {
87
 		suite.T().Run(name, func(t *testing.T) {
88
 		suite.T().Run(name, func(t *testing.T) {
88
-			proxyNetworks := []network.Network{}
89
+			proxyNetworks := []mtglib.Network{}
89
 
90
 
90
 			for _, u := range proxies {
91
 			for _, u := range proxies {
91
 				value, err := network.NewProxyNetwork(suite.baseNetwork, u)
92
 				value, err := network.NewProxyNetwork(suite.baseNetwork, u)

Загрузка…
Отмена
Сохранить