Skip to content

Commit b383124

Browse files
authored
Prefix Transport debugging fixes (#183)
* enusre that relevant transport params are logged and prefix regs ingested properly * Randomizing prefixes, destination port randomization and config for client iface * making prefix transport instantiation easier * prefix transport default value mistake
1 parent aa88c44 commit b383124

File tree

15 files changed

+468
-117
lines changed

15 files changed

+468
-117
lines changed

application/lib/proxies.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,11 @@ func Proxy(reg *DecoyRegistration, clientConn net.Conn, logger *log.Logger) {
223223
Gen: uint(reg.DecoyListVersion),
224224
}
225225

226+
paramStrs := (*reg.TransportPtr).ParamStrings(reg.TransportParams)
227+
if paramStrs != nil {
228+
tunStats.TransportOpts = paramStrs
229+
}
230+
226231
covertConn, err := net.Dial("tcp", reg.Covert)
227232
if e := generalizeErr(err); e != nil {
228233
tunStats.CovertDialErr = e.Error()

application/lib/registration.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -272,6 +272,7 @@ type DecoyRegistration struct {
272272
Covert, Mask string
273273
Flags *pb.RegistrationFlags
274274
Transport pb.TransportType
275+
TransportPtr *Transport
275276
TransportParams any
276277
RegistrationTime time.Time
277278
RegistrationSource *pb.RegistrationSource

application/lib/registration_ingest.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -348,6 +348,11 @@ func (rm *RegistrationManager) NewRegistration(c2s *pb.ClientToStation, conjureK
348348
err)
349349
}
350350

351+
var transport, ok = rm.registeredDecoys.transports[c2s.GetTransport()]
352+
if !ok {
353+
return nil, fmt.Errorf("unknown transport")
354+
}
355+
351356
transportParams, err := rm.getTransportParams(c2s.GetTransport(), c2s.GetTransportParams(), clientLibVer)
352357
if err != nil {
353358
return nil, fmt.Errorf("error handling transport params: %s", err)
@@ -368,6 +373,7 @@ func (rm *RegistrationManager) NewRegistration(c2s *pb.ClientToStation, conjureK
368373
Keys: conjureKeys,
369374
Covert: c2s.GetCovertAddress(),
370375
Transport: c2s.GetTransport(),
376+
TransportPtr: &transport,
371377
TransportParams: transportParams,
372378
Flags: c2s.Flags,
373379

application/lib/transports.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,10 @@ type Transport interface {
3838
// provided by the client during registration. The libVersion is provided incase of version
3939
// dependent changes in the transport params or param parsing.
4040
ParseParams(libVersion uint, data *anypb.Any) (any, error)
41+
42+
// ParamStrings returns an array of tag string that will be added to tunStats when a proxy
43+
// session is closed.
44+
ParamStrings(p any) []string
4145
}
4246

4347
// WrappingTransport describes any transport that is able to passively

application/lib/transports_mock.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,12 @@ func (*mockTransport) ParseParams(libVersion uint, data *anypb.Any) (any, error)
5656
return m, err
5757
}
5858

59+
// ParamStrings returns an array of tag string that will be added to tunStats when a proxy
60+
// session is closed. For now, no params of interest.
61+
func (m *mockTransport) ParamStrings(p any) []string {
62+
return nil
63+
}
64+
5965
// GetDstPort Given the library version, a seed, and a generic object
6066
// containing parameters the transport should be able to return the
6167
// destination port that a clients phantom connection will attempt to reach

application/transports/wrapping/internal/tests/tests.go

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ import (
99
dd "github.com/refraction-networking/conjure/application/lib"
1010
pb "github.com/refraction-networking/gotapdance/protobuf"
1111
"google.golang.org/grpc/test/bufconn"
12+
"google.golang.org/protobuf/reflect/protoreflect"
13+
"google.golang.org/protobuf/types/known/anypb"
1214
)
1315

1416
type Transport struct {
@@ -20,13 +22,14 @@ var SharedSecret = []byte(`6a328b8ec2024dd92dd64332164cc0425ddbde40cb7b81e055bf7
2022

2123
// SetupPhantomConnections registers one session with the provided transport and
2224
// registration manager using a pre-determined kay and phantom subnet file.
23-
func SetupPhantomConnections(manager *dd.RegistrationManager, transport pb.TransportType, libver uint) (clientToPhantom net.Conn, serverFromPhantom net.Conn, reg *dd.DecoyRegistration) {
25+
func SetupPhantomConnections(manager *dd.RegistrationManager, transport pb.TransportType, params protoreflect.ProtoMessage, libver uint) (clientToPhantom net.Conn, serverFromPhantom net.Conn, reg *dd.DecoyRegistration) {
2426
cwd, _ := os.Getwd()
2527
testSubnetPath := cwd + "/../internal/tests/phantom_subnets.toml"
26-
return SetupPhantomConnectionsSecret(manager, transport, SharedSecret, libver, testSubnetPath)
28+
29+
return SetupPhantomConnectionsSecret(manager, transport, params, SharedSecret, libver, testSubnetPath)
2730
}
2831

29-
func SetupPhantomConnectionsSecret(manager *dd.RegistrationManager, transport pb.TransportType, sharedSecret []byte, libver uint, testSubnetPath string) (clientToPhantom net.Conn, serverFromPhantom net.Conn, reg *dd.DecoyRegistration) {
32+
func SetupPhantomConnectionsSecret(manager *dd.RegistrationManager, transport pb.TransportType, params protoreflect.ProtoMessage, sharedSecret []byte, libver uint, testSubnetPath string) (clientToPhantom net.Conn, serverFromPhantom net.Conn, reg *dd.DecoyRegistration) {
3033
os.Setenv("PHANTOM_SUBNET_LOCATION", testSubnetPath)
3134

3235
phantom := bufconn.Listen(65535)
@@ -66,6 +69,14 @@ func SetupPhantomConnectionsSecret(manager *dd.RegistrationManager, transport pb
6669
CovertAddress: &covert,
6770
DecoyListGeneration: &gen,
6871
}
72+
if params != nil {
73+
p, err := anypb.New(params)
74+
if err != nil {
75+
log.Fatalln("failed to make params", err)
76+
}
77+
c2s.TransportParams = p
78+
}
79+
6980
reg, err = manager.NewRegistration(c2s, &keys, false, &regType)
7081
if err != nil {
7182
log.Fatalln("failed to create new Registration:", err)

application/transports/wrapping/min/client.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@ func (*ClientTransport) ID() pb.TransportType {
3939

4040
// GetParams returns a generic protobuf with any parameters from both the registration and the
4141
// transport.
42-
func (t *ClientTransport) GetParams() proto.Message {
43-
return t.Parameters
42+
func (t *ClientTransport) GetParams() (proto.Message, error) {
43+
return t.Parameters, nil
4444
}
4545

4646
// SetParams allows the caller to set parameters associated with the transport, returning an
@@ -56,7 +56,7 @@ func (t *ClientTransport) SetParams(p any) error {
5656
}
5757

5858
// GetDstPort returns the destination port that the client should open the phantom connection to
59-
func (t *ClientTransport) GetDstPort(seed []byte, params any) (uint16, error) {
59+
func (t *ClientTransport) GetDstPort(seed []byte) (uint16, error) {
6060
if t.Parameters == nil || !t.Parameters.GetRandomizeDstPort() {
6161
return 443, nil
6262
}

application/transports/wrapping/min/min.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,12 @@ func (Transport) ParseParams(libVersion uint, data *anypb.Any) (any, error) {
6969
return m, err
7070
}
7171

72+
// ParamStrings returns an array of tag string that will be added to tunStats when a proxy
73+
// session is closed. For now, no params of interest.
74+
func (t Transport) ParamStrings(p any) []string {
75+
return nil
76+
}
77+
7278
// WrapConnection attempts to wrap the given connection in the transport. It
7379
// takes the information gathered so far on the connection in data, attempts to
7480
// identify itself, and if it positively identifies itself wraps the connection

application/transports/wrapping/min/min_test.go

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ func TestSuccessfulWrap(t *testing.T) {
2424

2525
var transport Transport
2626
manager := tests.SetupRegistrationManager(tests.Transport{Index: pb.TransportType_Min, Transport: transport})
27-
c2p, sfp, reg := tests.SetupPhantomConnections(manager, pb.TransportType_Min, 0)
27+
c2p, sfp, reg := tests.SetupPhantomConnections(manager, pb.TransportType_Min, nil, 0)
2828
defer c2p.Close()
2929
defer sfp.Close()
3030
require.NotNil(t, reg)
@@ -52,7 +52,7 @@ func TestSuccessfulWrap(t *testing.T) {
5252
func TestUnsuccessfulWrap(t *testing.T) {
5353
var transport Transport
5454
manager := tests.SetupRegistrationManager(tests.Transport{Index: pb.TransportType_Min, Transport: transport})
55-
c2p, sfp, reg := tests.SetupPhantomConnections(manager, pb.TransportType_Min, 0)
55+
c2p, sfp, reg := tests.SetupPhantomConnections(manager, pb.TransportType_Min, nil, 0)
5656
defer c2p.Close()
5757
defer sfp.Close()
5858

@@ -76,7 +76,7 @@ func TestTryAgain(t *testing.T) {
7676
var transport Transport
7777
var err error
7878
manager := tests.SetupRegistrationManager(tests.Transport{Index: pb.TransportType_Min, Transport: transport})
79-
c2p, sfp, reg := tests.SetupPhantomConnections(manager, pb.TransportType_Min, 0)
79+
c2p, sfp, reg := tests.SetupPhantomConnections(manager, pb.TransportType_Min, nil, 0)
8080
defer c2p.Close()
8181
defer sfp.Close()
8282

@@ -119,13 +119,15 @@ func TestTryParamsToDstPort(t *testing.T) {
119119
ct := ClientTransport{Parameters: &pb.GenericTransportParams{RandomizeDstPort: &testCase.r}}
120120
var transport Transport
121121

122-
rawParams, err := anypb.New(ct.GetParams())
122+
params, err := ct.GetParams()
123+
require.Nil(t, err)
124+
rawParams, err := anypb.New(params)
123125
require.Nil(t, err)
124126

125-
params, err := transport.ParseParams(clv, rawParams)
127+
newParams, err := transport.ParseParams(clv, rawParams)
126128
require.Nil(t, err)
127129

128-
port, err := transport.GetDstPort(clv, seed, params)
130+
port, err := transport.GetDstPort(clv, seed, newParams)
129131
require.Nil(t, err)
130132
require.Equal(t, testCase.p, port)
131133
}

application/transports/wrapping/obfs4/client.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@ func (*ClientTransport) ID() pb.TransportType {
3939

4040
// GetParams returns a generic protobuf with any parameters from both the registration and the
4141
// transport.
42-
func (t *ClientTransport) GetParams() proto.Message {
43-
return t.Parameters
42+
func (t *ClientTransport) GetParams() (proto.Message, error) {
43+
return t.Parameters, nil
4444
}
4545

4646
// SetParams allows the caller to set parameters associated with the transport, returning an
@@ -56,7 +56,7 @@ func (t *ClientTransport) SetParams(p any) error {
5656
}
5757

5858
// GetDstPort returns the destination port that the client should open the phantom connection to
59-
func (t *ClientTransport) GetDstPort(seed []byte, params any) (uint16, error) {
59+
func (t *ClientTransport) GetDstPort(seed []byte) (uint16, error) {
6060
if t.Parameters == nil || !t.Parameters.GetRandomizeDstPort() {
6161
return 443, nil
6262
}

0 commit comments

Comments
 (0)