Skip to content

Commit eacc8c6

Browse files
committed
TUN-6812: Drop IP packets if ICMP proxy is not initialized
1 parent 5b30925 commit eacc8c6

File tree

3 files changed

+24
-31
lines changed

3 files changed

+24
-31
lines changed

connection/quic.go

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ type QUICConnection struct {
5050
// sessionManager tracks active sessions. It receives datagrams from quic connection via datagramMuxer
5151
sessionManager datagramsession.Manager
5252
// datagramMuxer mux/demux datagrams from quic connection
53-
datagramMuxer quicpogs.BaseDatagramMuxer
53+
datagramMuxer *quicpogs.DatagramMuxerV2
5454
packetRouter *packet.Router
5555
controlStreamHandler ControlStreamHandler
5656
connOptions *tunnelpogs.ConnectionOptions
@@ -75,19 +75,15 @@ func NewQUICConnection(
7575
sessionDemuxChan := make(chan *packet.Session, demuxChanCapacity)
7676
datagramMuxer := quicpogs.NewDatagramMuxerV2(session, logger, sessionDemuxChan)
7777
sessionManager := datagramsession.NewManager(logger, datagramMuxer.SendToSession, sessionDemuxChan)
78-
79-
var pr *packet.Router
80-
if packetRouterConfig != nil {
81-
pr = packet.NewRouter(packetRouterConfig, datagramMuxer, &returnPipe{muxer: datagramMuxer}, logger)
82-
}
78+
packetRouter := packet.NewRouter(packetRouterConfig, datagramMuxer, &returnPipe{muxer: datagramMuxer}, logger)
8379

8480
return &QUICConnection{
8581
session: session,
8682
orchestrator: orchestrator,
8783
logger: logger,
8884
sessionManager: sessionManager,
8985
datagramMuxer: datagramMuxer,
90-
packetRouter: pr,
86+
packetRouter: packetRouter,
9187
controlStreamHandler: controlStreamHandler,
9288
connOptions: connOptions,
9389
}, nil
@@ -123,17 +119,14 @@ func (q *QUICConnection) Serve(ctx context.Context) error {
123119
defer cancel()
124120
return q.sessionManager.Serve(ctx)
125121
})
126-
127122
errGroup.Go(func() error {
128123
defer cancel()
129124
return q.datagramMuxer.ServeReceive(ctx)
130125
})
131-
if q.packetRouter != nil {
132-
errGroup.Go(func() error {
133-
defer cancel()
134-
return q.packetRouter.Serve(ctx)
135-
})
136-
}
126+
errGroup.Go(func() error {
127+
defer cancel()
128+
return q.packetRouter.Serve(ctx)
129+
})
137130

138131
return errGroup.Wait()
139132
}

packet/router.go

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,10 @@ type Upstream interface {
2323

2424
// Router routes packets between Upstream and ICMPRouter. Currently it rejects all other type of ICMP packets
2525
type Router struct {
26-
upstream Upstream
27-
returnPipe FunnelUniPipe
28-
icmpRouter ICMPRouter
29-
ipv4Src netip.Addr
30-
ipv6Src netip.Addr
31-
logger *zerolog.Logger
26+
upstream Upstream
27+
returnPipe FunnelUniPipe
28+
globalConfig *GlobalRouterConfig
29+
logger *zerolog.Logger
3230
}
3331

3432
// GlobalRouterConfig is the configuration shared by all instance of Router.
@@ -41,12 +39,10 @@ type GlobalRouterConfig struct {
4139

4240
func NewRouter(globalConfig *GlobalRouterConfig, upstream Upstream, returnPipe FunnelUniPipe, logger *zerolog.Logger) *Router {
4341
return &Router{
44-
upstream: upstream,
45-
returnPipe: returnPipe,
46-
icmpRouter: globalConfig.ICMPRouter,
47-
ipv4Src: globalConfig.IPv4Src,
48-
ipv6Src: globalConfig.IPv6Src,
49-
logger: logger,
42+
upstream: upstream,
43+
returnPipe: returnPipe,
44+
globalConfig: globalConfig,
45+
logger: logger,
5046
}
5147
}
5248

@@ -58,6 +54,10 @@ func (r *Router) Serve(ctx context.Context) error {
5854
if err != nil {
5955
return err
6056
}
57+
// Drop packets if ICMPRouter wasn't created
58+
if r.globalConfig == nil {
59+
continue
60+
}
6161
icmpPacket, err := icmpDecoder.Decode(rawPacket)
6262
if err != nil {
6363
r.logger.Err(err).Msg("Failed to decode ICMP packet from quic datagram")
@@ -72,7 +72,7 @@ func (r *Router) Serve(ctx context.Context) error {
7272
}
7373
icmpPacket.TTL--
7474

75-
if err := r.icmpRouter.Request(icmpPacket, r.returnPipe); err != nil {
75+
if err := r.globalConfig.ICMPRouter.Request(icmpPacket, r.returnPipe); err != nil {
7676
r.logger.Err(err).
7777
Str("src", icmpPacket.Src.String()).
7878
Str("dst", icmpPacket.Dst.String()).
@@ -86,9 +86,9 @@ func (r *Router) Serve(ctx context.Context) error {
8686
func (r *Router) sendTTLExceedMsg(pk *ICMP, rawPacket RawPacket, encoder *Encoder) error {
8787
var srcIP netip.Addr
8888
if pk.Dst.Is4() {
89-
srcIP = r.ipv4Src
89+
srcIP = r.globalConfig.IPv4Src
9090
} else {
91-
srcIP = r.ipv6Src
91+
srcIP = r.globalConfig.IPv6Src
9292
}
9393
ttlExceedPacket := NewICMPTTLExceedPacket(pk.IP, rawPacket, srcIP)
9494

packet/router_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ func TestRouterReturnTTLExceed(t *testing.T) {
5656
},
5757
},
5858
}
59-
assertTTLExceed(t, &pk, router.ipv4Src, upstream, returnPipe)
59+
assertTTLExceed(t, &pk, router.globalConfig.IPv4Src, upstream, returnPipe)
6060
pk = ICMP{
6161
IP: &IP{
6262
Src: netip.MustParseAddr("fd51:2391:523:f4ee::1"),
@@ -74,7 +74,7 @@ func TestRouterReturnTTLExceed(t *testing.T) {
7474
},
7575
},
7676
}
77-
assertTTLExceed(t, &pk, router.ipv6Src, upstream, returnPipe)
77+
assertTTLExceed(t, &pk, router.globalConfig.IPv6Src, upstream, returnPipe)
7878

7979
cancel()
8080
<-routerStopped

0 commit comments

Comments
 (0)