Skip to content

Commit 1f40c93

Browse files
committed
Upgrade gvisor netstack
1 parent 00ca672 commit 1f40c93

File tree

7 files changed

+151
-164
lines changed

7 files changed

+151
-164
lines changed

client/firewall/uspfilter/forwarder/endpoint.go

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package forwarder
22

33
import (
44
"fmt"
5+
"sync/atomic"
56

67
wgdevice "golang.zx2c4.com/wireguard/device"
78
"gvisor.dev/gvisor/pkg/tcpip"
@@ -16,7 +17,7 @@ type endpoint struct {
1617
logger *nblog.Logger
1718
dispatcher stack.NetworkDispatcher
1819
device *wgdevice.Device
19-
mtu uint32
20+
mtu atomic.Uint32
2021
}
2122

2223
func (e *endpoint) Attach(dispatcher stack.NetworkDispatcher) {
@@ -28,7 +29,7 @@ func (e *endpoint) IsAttached() bool {
2829
}
2930

3031
func (e *endpoint) MTU() uint32 {
31-
return e.mtu
32+
return e.mtu.Load()
3233
}
3334

3435
func (e *endpoint) Capabilities() stack.LinkEndpointCapabilities {
@@ -82,6 +83,22 @@ func (e *endpoint) ParseHeader(*stack.PacketBuffer) bool {
8283
return true
8384
}
8485

86+
func (e *endpoint) Close() {
87+
// Endpoint cleanup - nothing to do as device is managed externally
88+
}
89+
90+
func (e *endpoint) SetLinkAddress(tcpip.LinkAddress) {
91+
// Link address is not used for this endpoint type
92+
}
93+
94+
func (e *endpoint) SetMTU(mtu uint32) {
95+
e.mtu.Store(mtu)
96+
}
97+
98+
func (e *endpoint) SetOnCloseAction(func()) {
99+
// No action needed on close
100+
}
101+
85102
type epID stack.TransportEndpointID
86103

87104
func (i epID) String() string {

client/firewall/uspfilter/forwarder/forwarder.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,8 @@ func New(iface common.IFaceMapper, logger *nblog.Logger, flowLogger nftypes.Flow
6363
endpoint := &endpoint{
6464
logger: logger,
6565
device: iface.GetWGDevice(),
66-
mtu: uint32(mtu),
6766
}
67+
endpoint.mtu.Store(uint32(mtu))
6868

6969
if err := s.CreateNIC(nicID, endpoint); err != nil {
7070
return nil, fmt.Errorf("create NIC: %v", err)

client/firewall/uspfilter/forwarder/icmp.go

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import (
1717
)
1818

1919
// handleICMP handles ICMP packets from the network stack
20-
func (f *Forwarder) handleICMP(id stack.TransportEndpointID, pkt stack.PacketBufferPtr) bool {
20+
func (f *Forwarder) handleICMP(id stack.TransportEndpointID, pkt *stack.PacketBuffer) bool {
2121
icmpHdr := header.ICMPv4(pkt.TransportHeader().View().AsSlice())
2222

2323
flowID := uuid.New()
@@ -35,7 +35,7 @@ func (f *Forwarder) handleICMP(id stack.TransportEndpointID, pkt stack.PacketBuf
3535
}
3636

3737
icmpData := stack.PayloadSince(pkt.TransportHeader()).AsSlice()
38-
conn, err := f.forwardICMPPacket(id, icmpData, icmpHdr)
38+
conn, err := f.forwardICMPPacket(id, icmpData, icmpHdr, 100*time.Millisecond)
3939
if err != nil {
4040
f.logger.Error2("forwarder: Failed to forward ICMP packet for %v: %v", epID(id), err)
4141
return true
@@ -50,7 +50,7 @@ func (f *Forwarder) handleICMP(id stack.TransportEndpointID, pkt stack.PacketBuf
5050
}
5151

5252
// handleICMPEcho handles ICMP echo requests asynchronously with rate limiting.
53-
func (f *Forwarder) handleICMPEcho(flowID uuid.UUID, id stack.TransportEndpointID, pkt stack.PacketBufferPtr, icmpHdr header.ICMPv4) bool {
53+
func (f *Forwarder) handleICMPEcho(flowID uuid.UUID, id stack.TransportEndpointID, pkt *stack.PacketBuffer, icmpHdr header.ICMPv4) bool {
5454
select {
5555
case f.pingSemaphore <- struct{}{}:
5656
icmpData := stack.PayloadSince(pkt.TransportHeader()).ToSlice()
@@ -74,8 +74,8 @@ func (f *Forwarder) handleICMPEcho(flowID uuid.UUID, id stack.TransportEndpointI
7474

7575
// forwardICMPPacket creates a raw ICMP socket and sends the packet, returning the connection.
7676
// The caller is responsible for closing the returned connection.
77-
func (f *Forwarder) forwardICMPPacket(id stack.TransportEndpointID, payload []byte, icmpHdr header.ICMPv4) (net.PacketConn, error) {
78-
ctx, cancel := context.WithTimeout(f.ctx, 5*time.Second)
77+
func (f *Forwarder) forwardICMPPacket(id stack.TransportEndpointID, payload []byte, icmpHdr header.ICMPv4, timeout time.Duration) (net.PacketConn, error) {
78+
ctx, cancel := context.WithTimeout(f.ctx, timeout)
7979
defer cancel()
8080

8181
lc := net.ListenConfig{}
@@ -104,7 +104,7 @@ func (f *Forwarder) forwardICMPPacket(id stack.TransportEndpointID, payload []by
104104
func (f *Forwarder) handleICMPViaSocket(flowID uuid.UUID, id stack.TransportEndpointID, icmpHdr header.ICMPv4, payload []byte, rxBytes int) {
105105
sendTime := time.Now()
106106

107-
conn, err := f.forwardICMPPacket(id, payload, icmpHdr)
107+
conn, err := f.forwardICMPPacket(id, payload, icmpHdr, 5*time.Second)
108108
if err != nil {
109109
f.logger.Error2("forwarder: Failed to send ICMP packet for %v: %v", epID(id), err)
110110
return
@@ -120,6 +120,10 @@ func (f *Forwarder) handleICMPViaSocket(flowID uuid.UUID, id stack.TransportEndp
120120

121121
f.logger.Trace2("forwarder: Forwarded ICMP echo reply for %v (rtt=%v, raw socket)",
122122
epID(id), rtt)
123+
124+
f.logger.Trace3("forwarder: Forwarded ICMP echo reply %v type %v code %v",
125+
epID(id), icmpHdr.Type(), icmpHdr.Code())
126+
123127
f.sendICMPEvent(nftypes.TypeEnd, flowID, id, uint8(icmpHdr.Type()), uint8(icmpHdr.Code()), uint64(rxBytes), uint64(txBytes))
124128
}
125129

@@ -129,7 +133,7 @@ func (f *Forwarder) handleEchoResponse(conn net.PacketConn, id stack.TransportEn
129133
return 0
130134
}
131135

132-
response := make([]byte, f.endpoint.mtu)
136+
response := make([]byte, f.endpoint.mtu.Load())
133137
n, _, err := conn.ReadFrom(response)
134138
if err != nil {
135139
if !isTimeout(err) {
@@ -203,6 +207,10 @@ func (f *Forwarder) handleICMPViaPing(flowID uuid.UUID, id stack.TransportEndpoi
203207

204208
f.logger.Trace2("forwarder: Forwarded ICMP echo reply for %v (rtt=%v, ping binary)",
205209
epID(id), rtt)
210+
211+
f.logger.Trace3("forwarder: Forwarded ICMP echo reply %v type %v code %v",
212+
epID(id), icmpHdr.Type(), icmpHdr.Code())
213+
206214
f.sendICMPEvent(nftypes.TypeEnd, flowID, id, uint8(icmpHdr.Type()), uint8(icmpHdr.Code()), uint64(rxBytes), uint64(txBytes))
207215
}
208216

client/firewall/uspfilter/forwarder/udp.go

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -131,10 +131,10 @@ func (f *udpForwarder) cleanup() {
131131
}
132132

133133
// handleUDP is called by the UDP forwarder for new packets
134-
func (f *Forwarder) handleUDP(r *udp.ForwarderRequest) {
134+
func (f *Forwarder) handleUDP(r *udp.ForwarderRequest) bool {
135135
if f.ctx.Err() != nil {
136136
f.logger.Trace("forwarder: context done, dropping UDP packet")
137-
return
137+
return false
138138
}
139139

140140
id := r.ID()
@@ -144,7 +144,7 @@ func (f *Forwarder) handleUDP(r *udp.ForwarderRequest) {
144144
f.udpForwarder.RUnlock()
145145
if exists {
146146
f.logger.Trace1("forwarder: existing UDP connection for %v", epID(id))
147-
return
147+
return true
148148
}
149149

150150
flowID := uuid.New()
@@ -162,7 +162,7 @@ func (f *Forwarder) handleUDP(r *udp.ForwarderRequest) {
162162
if err != nil {
163163
f.logger.Debug2("forwarder: UDP dial error for %v: %v", epID(id), err)
164164
// TODO: Send ICMP error message
165-
return
165+
return false
166166
}
167167

168168
// Create wait queue for blocking syscalls
@@ -173,10 +173,10 @@ func (f *Forwarder) handleUDP(r *udp.ForwarderRequest) {
173173
if err := outConn.Close(); err != nil {
174174
f.logger.Debug2("forwarder: UDP outConn close error for %v: %v", epID(id), err)
175175
}
176-
return
176+
return false
177177
}
178178

179-
inConn := gonet.NewUDPConn(f.stack, &wq, ep)
179+
inConn := gonet.NewUDPConn(&wq, ep)
180180
connCtx, connCancel := context.WithCancel(f.ctx)
181181

182182
pConn := &udpPacketConn{
@@ -199,7 +199,7 @@ func (f *Forwarder) handleUDP(r *udp.ForwarderRequest) {
199199
if err := outConn.Close(); err != nil {
200200
f.logger.Debug2("forwarder: UDP outConn close error for %v: %v", epID(id), err)
201201
}
202-
return
202+
return true
203203
}
204204
f.udpForwarder.conns[id] = pConn
205205
f.udpForwarder.Unlock()
@@ -208,6 +208,7 @@ func (f *Forwarder) handleUDP(r *udp.ForwarderRequest) {
208208
f.logger.Trace1("forwarder: established UDP connection %v", epID(id))
209209

210210
go f.proxyUDP(connCtx, pConn, id, ep)
211+
return true
211212
}
212213

213214
func (f *Forwarder) proxyUDP(ctx context.Context, pConn *udpPacketConn, id stack.TransportEndpointID, ep tcpip.Endpoint) {

client/iface/bind/ice_bind.go

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,21 @@ type receiverCreator struct {
2727
iceBind *ICEBind
2828
}
2929

30-
func (rc receiverCreator) CreateIPv4ReceiverFn(pc *ipv4.PacketConn, conn *net.UDPConn, rxOffload bool, msgPool *sync.Pool) wgConn.ReceiveFunc {
31-
return rc.iceBind.createIPv4ReceiverFn(pc, conn, rxOffload, msgPool)
30+
func (rc receiverCreator) CreateReceiverFn(pc wgConn.BatchReader, conn *net.UDPConn, rxOffload bool, msgPool *sync.Pool) wgConn.ReceiveFunc {
31+
if ipv4PC, ok := pc.(*ipv4.PacketConn); ok {
32+
return rc.iceBind.createIPv4ReceiverFn(ipv4PC, conn, rxOffload, msgPool)
33+
}
34+
return func(bufs [][]byte, sizes []int, eps []wgConn.Endpoint) (n int, err error) {
35+
buf := bufs[0]
36+
size, ep, err := conn.ReadFromUDPAddrPort(buf)
37+
if err != nil {
38+
return 0, err
39+
}
40+
sizes[0] = size
41+
stdEp := &wgConn.StdNetEndpoint{AddrPort: ep}
42+
eps[0] = stdEp
43+
return 1, nil
44+
}
3245
}
3346

3447
// ICEBind is a bind implementation with two main features:

go.mod

Lines changed: 31 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
module github.com/netbirdio/netbird
22

3-
go 1.23.0
3+
go 1.24.1
4+
5+
toolchain go1.24.4
46

57
require (
68
cunicu.li/go-rosenpass v0.4.0
@@ -17,12 +19,12 @@ require (
1719
github.com/spf13/cobra v1.7.0
1820
github.com/spf13/pflag v1.0.5
1921
github.com/vishvananda/netlink v1.3.1
20-
golang.org/x/crypto v0.40.0
21-
golang.org/x/sys v0.34.0
22+
golang.org/x/crypto v0.42.0
23+
golang.org/x/sys v0.36.0
2224
golang.zx2c4.com/wireguard v0.0.0-20230704135630-469159ecf7d1
2325
golang.zx2c4.com/wireguard/wgctrl v0.0.0-20230429144221-925a1e7659e6
2426
golang.zx2c4.com/wireguard/windows v0.5.3
25-
google.golang.org/grpc v1.73.0
27+
google.golang.org/grpc v1.75.1
2628
google.golang.org/protobuf v1.36.8
2729
gopkg.in/natefinch/lumberjack.v2 v2.0.0
2830
)
@@ -39,7 +41,7 @@ require (
3941
github.com/cilium/ebpf v0.15.0
4042
github.com/coder/websocket v1.8.13
4143
github.com/coreos/go-iptables v0.7.0
42-
github.com/creack/pty v1.1.18
44+
github.com/creack/pty v1.1.24
4345
github.com/eko/gocache/lib/v4 v4.2.0
4446
github.com/eko/gocache/store/go_cache/v4 v4.2.2
4547
github.com/eko/gocache/store/redis/v4 v4.2.2
@@ -94,35 +96,35 @@ require (
9496
github.com/vmihailenco/msgpack/v5 v5.4.1
9597
github.com/yusufpapurcu/wmi v1.2.4
9698
github.com/zcalusic/sysinfo v1.1.3
97-
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0
98-
go.opentelemetry.io/otel v1.35.0
99+
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0
100+
go.opentelemetry.io/otel v1.37.0
99101
go.opentelemetry.io/otel/exporters/prometheus v0.48.0
100-
go.opentelemetry.io/otel/metric v1.35.0
101-
go.opentelemetry.io/otel/sdk/metric v1.35.0
102+
go.opentelemetry.io/otel/metric v1.37.0
103+
go.opentelemetry.io/otel/sdk/metric v1.37.0
102104
go.uber.org/mock v0.5.0
103105
go.uber.org/zap v1.27.0
104106
goauthentik.io/api/v3 v3.2023051.3
105107
golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842
106108
golang.org/x/mobile v0.0.0-20231127183840-76ac6878050a
107-
golang.org/x/mod v0.26.0
108-
golang.org/x/net v0.42.0
109+
golang.org/x/mod v0.28.0
110+
golang.org/x/net v0.44.0
109111
golang.org/x/oauth2 v0.30.0
110-
golang.org/x/sync v0.16.0
111-
golang.org/x/term v0.33.0
112+
golang.org/x/sync v0.17.0
113+
golang.org/x/term v0.35.0
112114
golang.org/x/time v0.12.0
113-
google.golang.org/api v0.177.0
115+
google.golang.org/api v0.249.0
114116
gopkg.in/yaml.v3 v3.0.1
115117
gorm.io/driver/mysql v1.5.7
116118
gorm.io/driver/postgres v1.5.7
117119
gorm.io/driver/sqlite v1.5.7
118120
gorm.io/gorm v1.25.12
119-
gvisor.dev/gvisor v0.0.0-20231020174304-b8a429915ff1
121+
gvisor.dev/gvisor v0.0.0-20251031020517-ecfcdd2f171c
120122
)
121123

122124
require (
123-
cloud.google.com/go/auth v0.3.0 // indirect
124-
cloud.google.com/go/auth/oauth2adapt v0.2.2 // indirect
125-
cloud.google.com/go/compute/metadata v0.6.0 // indirect
125+
cloud.google.com/go/auth v0.16.5 // indirect
126+
cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect
127+
cloud.google.com/go/compute/metadata v0.8.0 // indirect
126128
dario.cat/mergo v1.0.0 // indirect
127129
filippo.io/edwards25519 v1.1.0 // indirect
128130
github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect
@@ -167,20 +169,19 @@ require (
167169
github.com/fyne-io/oksvg v0.2.0 // indirect
168170
github.com/go-gl/gl v0.0.0-20231021071112-07e5d0ea2e71 // indirect
169171
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20240506104042-037f3cc74f2a // indirect
170-
github.com/go-logr/logr v1.4.2 // indirect
172+
github.com/go-logr/logr v1.4.3 // indirect
171173
github.com/go-logr/stdr v1.2.2 // indirect
172174
github.com/go-ole/go-ole v1.3.0 // indirect
173175
github.com/go-sql-driver/mysql v1.8.1 // indirect
174176
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect
175177
github.com/go-text/render v0.2.0 // indirect
176178
github.com/go-text/typesetting v0.2.1 // indirect
177179
github.com/gogo/protobuf v1.3.2 // indirect
178-
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
179180
github.com/google/btree v1.1.2 // indirect
180181
github.com/google/pprof v0.0.0-20211214055906-6f57359322fd // indirect
181-
github.com/google/s2a-go v0.1.7 // indirect
182-
github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect
183-
github.com/googleapis/gax-go/v2 v2.12.3 // indirect
182+
github.com/google/s2a-go v0.1.9 // indirect
183+
github.com/googleapis/enterprise-certificate-proxy v0.3.6 // indirect
184+
github.com/googleapis/gax-go/v2 v2.15.0 // indirect
184185
github.com/hack-pad/go-indexeddb v0.3.2 // indirect
185186
github.com/hack-pad/safejs v0.1.0 // indirect
186187
github.com/hashicorp/errwrap v1.1.0 // indirect
@@ -241,17 +242,16 @@ require (
241242
github.com/wlynxg/anet v0.0.3 // indirect
242243
github.com/yuin/goldmark v1.7.8 // indirect
243244
github.com/zeebo/blake3 v0.2.3 // indirect
244-
go.opencensus.io v0.24.0 // indirect
245245
go.opentelemetry.io/auto/sdk v1.1.0 // indirect
246-
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.51.0 // indirect
247-
go.opentelemetry.io/otel/sdk v1.35.0 // indirect
248-
go.opentelemetry.io/otel/trace v1.35.0 // indirect
246+
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 // indirect
247+
go.opentelemetry.io/otel/sdk v1.37.0 // indirect
248+
go.opentelemetry.io/otel/trace v1.37.0 // indirect
249249
go.uber.org/multierr v1.11.0 // indirect
250250
golang.org/x/image v0.24.0 // indirect
251-
golang.org/x/text v0.27.0 // indirect
252-
golang.org/x/tools v0.34.0 // indirect
251+
golang.org/x/text v0.29.0 // indirect
252+
golang.org/x/tools v0.37.0 // indirect
253253
golang.zx2c4.com/wintun v0.0.0-20230126152724-0fa3db229ce2 // indirect
254-
google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect
254+
google.golang.org/genproto/googleapis/rpc v0.0.0-20250818200422-3122310a409c // indirect
255255
gopkg.in/square/go-jose.v2 v2.6.0 // indirect
256256
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect
257257
)
@@ -260,7 +260,7 @@ replace github.com/kardianos/service => github.com/netbirdio/service v0.0.0-2024
260260

261261
replace github.com/getlantern/systray => github.com/netbirdio/systray v0.0.0-20231030152038-ef1ed2a27949
262262

263-
replace golang.zx2c4.com/wireguard => github.com/netbirdio/wireguard-go v0.0.0-20241230120307-6a676aebaaf6
263+
replace golang.zx2c4.com/wireguard => github.com/netbirdio/wireguard-go v0.0.0-20251115110821-938e8b40e2f3
264264

265265
replace github.com/cloudflare/circl => github.com/cunicu/circl v0.0.0-20230801113412-fec58fc7b5f6
266266

0 commit comments

Comments
 (0)