Skip to content

Commit d74ca97

Browse files
committed
TUN-8785: include the icmp sources in the diag's tunnel state
Closes TUN-8785
1 parent 29f0cf3 commit d74ca97

File tree

5 files changed

+51
-14
lines changed

5 files changed

+51
-14
lines changed

cmd/cloudflared/tunnel/cmd.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -552,6 +552,13 @@ func StartServer(
552552
tracker := tunnelstate.NewConnTracker(log)
553553
observer.RegisterSink(tracker)
554554

555+
ipv4, ipv6, err := determineICMPSources(c, log)
556+
sources := make([]string, 0)
557+
if err == nil {
558+
sources = append(sources, ipv4.String())
559+
sources = append(sources, ipv6.String())
560+
}
561+
555562
readinessServer := metrics.NewReadyServer(clientID, tracker)
556563
diagnosticHandler := diagnostic.NewDiagnosticHandler(
557564
log,
@@ -562,6 +569,7 @@ func StartServer(
562569
tracker,
563570
c,
564571
nonSecretFlagsList,
572+
sources,
565573
)
566574
metricsConfig := metrics.Config{
567575
ReadyServer: readinessServer,

cmd/cloudflared/tunnel/configuration.go

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -352,27 +352,38 @@ func adjustIPVersionByBindAddress(ipVersion allregions.ConfigIPVersion, ip net.I
352352
}
353353

354354
func newICMPRouter(c *cli.Context, logger *zerolog.Logger) (ingress.ICMPRouterServer, error) {
355+
ipv4Src, ipv6Src, err := determineICMPSources(c, logger)
356+
if err != nil {
357+
return nil, err
358+
}
359+
360+
icmpRouter, err := ingress.NewICMPRouter(ipv4Src, ipv6Src, logger, icmpFunnelTimeout)
361+
if err != nil {
362+
return nil, err
363+
}
364+
return icmpRouter, nil
365+
}
366+
367+
func determineICMPSources(c *cli.Context, logger *zerolog.Logger) (netip.Addr, netip.Addr, error) {
355368
ipv4Src, err := determineICMPv4Src(c.String("icmpv4-src"), logger)
356369
if err != nil {
357-
return nil, errors.Wrap(err, "failed to determine IPv4 source address for ICMP proxy")
370+
return netip.Addr{}, netip.Addr{}, errors.Wrap(err, "failed to determine IPv4 source address for ICMP proxy")
358371
}
372+
359373
logger.Info().Msgf("ICMP proxy will use %s as source for IPv4", ipv4Src)
360374

361375
ipv6Src, zone, err := determineICMPv6Src(c.String("icmpv6-src"), logger, ipv4Src)
362376
if err != nil {
363-
return nil, errors.Wrap(err, "failed to determine IPv6 source address for ICMP proxy")
377+
return netip.Addr{}, netip.Addr{}, errors.Wrap(err, "failed to determine IPv6 source address for ICMP proxy")
364378
}
379+
365380
if zone != "" {
366381
logger.Info().Msgf("ICMP proxy will use %s in zone %s as source for IPv6", ipv6Src, zone)
367382
} else {
368383
logger.Info().Msgf("ICMP proxy will use %s as source for IPv6", ipv6Src)
369384
}
370385

371-
icmpRouter, err := ingress.NewICMPRouter(ipv4Src, ipv6Src, logger, icmpFunnelTimeout)
372-
if err != nil {
373-
return nil, err
374-
}
375-
return icmpRouter, nil
386+
return ipv4Src, ipv6Src, nil
376387
}
377388

378389
func determineICMPv4Src(userDefinedSrc string, logger *zerolog.Logger) (netip.Addr, error) {

diagnostic/diagnostic_utils_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ func helperCreateServer(t *testing.T, listeners *gracenet.Net, tunnelID uuid.UUI
2525
require.NoError(t, err)
2626
log := zerolog.Nop()
2727
tracker := tunnelstate.NewConnTracker(&log)
28-
handler := diagnostic.NewDiagnosticHandler(&log, 0, nil, tunnelID, connectorID, tracker, nil, []string{})
28+
handler := diagnostic.NewDiagnosticHandler(&log, 0, nil, tunnelID, connectorID, tracker, nil, []string{}, []string{})
2929
router := http.NewServeMux()
3030
router.HandleFunc("/diag/tunnel", handler.TunnelStateHandler)
3131
server := &http.Server{

diagnostic/handlers.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ type Handler struct {
2626
tracker *tunnelstate.ConnTracker
2727
cli *cli.Context
2828
flagInclusionList []string
29+
icmpSources []string
2930
}
3031

3132
func NewDiagnosticHandler(
@@ -37,6 +38,7 @@ func NewDiagnosticHandler(
3738
tracker *tunnelstate.ConnTracker,
3839
cli *cli.Context,
3940
flagInclusionList []string,
41+
icmpSources []string,
4042
) *Handler {
4143
logger := log.With().Logger()
4244
if timeout == 0 {
@@ -52,6 +54,7 @@ func NewDiagnosticHandler(
5254
tracker: tracker,
5355
cli: cli,
5456
flagInclusionList: flagInclusionList,
57+
icmpSources: icmpSources,
5558
}
5659
}
5760

@@ -105,6 +108,7 @@ type TunnelState struct {
105108
TunnelID uuid.UUID `json:"tunnelID,omitempty"`
106109
ConnectorID uuid.UUID `json:"connectorID,omitempty"`
107110
Connections []tunnelstate.IndexedConnectionInfo `json:"connections,omitempty"`
111+
ICMPSources []string `json:"icmp_sources,omitempty"`
108112
}
109113

110114
func (handler *Handler) TunnelStateHandler(writer http.ResponseWriter, _ *http.Request) {
@@ -117,6 +121,7 @@ func (handler *Handler) TunnelStateHandler(writer http.ResponseWriter, _ *http.R
117121
handler.tunnelID,
118122
handler.connectorID,
119123
handler.tracker.GetActiveConnections(),
124+
handler.icmpSources,
120125
}
121126
encoder := json.NewEncoder(writer)
122127

diagnostic/handlers_test.go

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ func TestSystemHandler(t *testing.T) {
123123
t.Run(tCase.name, func(t *testing.T) {
124124
t.Parallel()
125125

126-
handler := diagnostic.NewDiagnosticHandler(&log, 0, &SystemCollectorMock{}, uuid.New(), uuid.New(), nil, nil, nil)
126+
handler := diagnostic.NewDiagnosticHandler(&log, 0, &SystemCollectorMock{}, uuid.New(), uuid.New(), nil, nil, nil, nil)
127127
recorder := httptest.NewRecorder()
128128
ctx := setCtxValuesForSystemCollector(tCase.systemInfo, tCase.rawInfo, tCase.err)
129129
request, err := http.NewRequestWithContext(ctx, http.MethodGet, "/diag/syste,", nil)
@@ -156,16 +156,18 @@ func TestTunnelStateHandler(t *testing.T) {
156156
tunnelID uuid.UUID
157157
clientID uuid.UUID
158158
connections []tunnelstate.IndexedConnectionInfo
159+
icmpSources []string
159160
}{
160161
{
161162
name: "case1",
162163
tunnelID: uuid.New(),
163164
clientID: uuid.New(),
164165
},
165166
{
166-
name: "case2",
167-
tunnelID: uuid.New(),
168-
clientID: uuid.New(),
167+
name: "case2",
168+
tunnelID: uuid.New(),
169+
clientID: uuid.New(),
170+
icmpSources: []string{"172.17.0.3", "::1"},
169171
connections: []tunnelstate.IndexedConnectionInfo{{
170172
ConnectionInfo: tunnelstate.ConnectionInfo{
171173
IsConnected: true,
@@ -181,7 +183,17 @@ func TestTunnelStateHandler(t *testing.T) {
181183
t.Run(tCase.name, func(t *testing.T) {
182184
t.Parallel()
183185
tracker := newTrackerFromConns(t, tCase.connections)
184-
handler := diagnostic.NewDiagnosticHandler(&log, 0, nil, tCase.tunnelID, tCase.clientID, tracker, nil, nil)
186+
handler := diagnostic.NewDiagnosticHandler(
187+
&log,
188+
0,
189+
nil,
190+
tCase.tunnelID,
191+
tCase.clientID,
192+
tracker,
193+
nil,
194+
nil,
195+
tCase.icmpSources,
196+
)
185197
recorder := httptest.NewRecorder()
186198
handler.TunnelStateHandler(recorder, nil)
187199
decoder := json.NewDecoder(recorder.Body)
@@ -193,6 +205,7 @@ func TestTunnelStateHandler(t *testing.T) {
193205
assert.Equal(t, tCase.tunnelID, response.TunnelID)
194206
assert.Equal(t, tCase.clientID, response.ConnectorID)
195207
assert.Equal(t, tCase.connections, response.Connections)
208+
assert.Equal(t, tCase.icmpSources, response.ICMPSources)
196209
})
197210
}
198211
}
@@ -237,7 +250,7 @@ func TestConfigurationHandler(t *testing.T) {
237250

238251
t.Parallel()
239252
ctx := buildCliContext(t, tCase.flags)
240-
handler := diagnostic.NewDiagnosticHandler(&log, 0, nil, uuid.New(), uuid.New(), nil, ctx, []string{"b", "c", "d"})
253+
handler := diagnostic.NewDiagnosticHandler(&log, 0, nil, uuid.New(), uuid.New(), nil, ctx, []string{"b", "c", "d"}, nil)
241254
recorder := httptest.NewRecorder()
242255
handler.ConfigurationHandler(recorder, nil)
243256
decoder := json.NewDecoder(recorder.Body)

0 commit comments

Comments
 (0)