Skip to content

Commit 283b500

Browse files
author
Dragan Milic
committed
gvisor: match the transfer path based on the souce ip/port
1 parent 4484f11 commit 283b500

1 file changed

Lines changed: 86 additions & 1 deletion

File tree

connect/ip.go

Lines changed: 86 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"math"
99
mathrand "math/rand"
1010
"net"
11+
"net/netip"
1112
"slices"
1213
"strconv"
1314
"strings"
@@ -206,6 +207,12 @@ func (self *LocalUserNat) receive(source TransferPath, ipProtocol IpProtocol, pa
206207
}
207208
}
208209

210+
// comparable
211+
type SourceID struct {
212+
ip netip.Addr
213+
port uint16
214+
}
215+
209216
func (self *LocalUserNat) Run() {
210217
defer self.cancel()
211218

@@ -214,6 +221,9 @@ func (self *LocalUserNat) Run() {
214221
// tcp4Buffer := NewTcp4Buffer(self.ctx, self.receive, self.settings.TcpBufferSettings)
215222
// tcp6Buffer := NewTcp6Buffer(self.ctx, self.receive, self.settings.TcpBufferSettings)
216223

224+
sourceMap := map[SourceID]TransferPath{}
225+
sourceMapLock := sync.Mutex{}
226+
217227
dev, tnet, err := netstack.CreateNetTUN(nil, nil, 1500)
218228
if err != nil {
219229
glog.Infof("[lnr]error = %s\n", err)
@@ -228,7 +238,57 @@ func (self *LocalUserNat) Run() {
228238
glog.Infof("[lnr]read error = %s\n", err)
229239
return
230240
}
231-
self.receive(TransferPath{}, IpProtocolUnknown, buffer[0:n])
241+
242+
if n == 0 {
243+
return
244+
}
245+
246+
ipVersion := uint8(buffer[0]) >> 4
247+
248+
tp := TransferPath{}
249+
250+
switch ipVersion {
251+
case 4:
252+
ipv4 := layers.IPv4{}
253+
ipv4.DecodeFromBytes(buffer[0:n], gopacket.NilDecodeFeedback)
254+
switch ipv4.Protocol {
255+
case layers.IPProtocolTCP:
256+
tcp := layers.TCP{}
257+
tcp.DecodeFromBytes(ipv4.Payload, gopacket.NilDecodeFeedback)
258+
259+
sourceId := SourceID{
260+
ip: netip.AddrFrom4([4]byte(ipv4.DstIP)),
261+
port: uint16(tcp.DstPort),
262+
}
263+
264+
sourceMapLock.Lock()
265+
tp = sourceMap[sourceId]
266+
sourceMapLock.Unlock()
267+
268+
}
269+
270+
case 6:
271+
ipv6 := layers.IPv6{}
272+
ipv6.DecodeFromBytes(buffer[0:n], gopacket.NilDecodeFeedback)
273+
switch ipv6.NextHeader {
274+
case layers.IPProtocolTCP:
275+
tcp := layers.TCP{}
276+
tcp.DecodeFromBytes(ipv6.Payload, gopacket.NilDecodeFeedback)
277+
278+
sourceId := SourceID{
279+
ip: netip.AddrFrom16([16]byte(ipv6.DstIP)),
280+
port: uint16(tcp.DstPort),
281+
}
282+
283+
sourceMapLock.Lock()
284+
tp = sourceMap[sourceId]
285+
sourceMapLock.Unlock()
286+
287+
}
288+
289+
}
290+
291+
self.receive(tp, IpProtocolUnknown, buffer[0:n])
232292
}
233293
}()
234294

@@ -332,6 +392,19 @@ func (self *LocalUserNat) Run() {
332392
c()
333393
}
334394
case layers.IPProtocolTCP:
395+
396+
tcp := layers.TCP{}
397+
tcp.DecodeFromBytes(ipv4.Payload, gopacket.NilDecodeFeedback)
398+
399+
sourceId := SourceID{
400+
ip: netip.AddrFrom4([4]byte(ipv4.SrcIP)),
401+
port: uint16(tcp.SrcPort),
402+
}
403+
404+
sourceMapLock.Lock()
405+
sourceMap[sourceId] = sendPacket.source
406+
sourceMapLock.Unlock()
407+
335408
_, err = dev.Write(ipPacket)
336409
if err != nil {
337410
glog.Infof("[lnr]write error = %s\n", err)
@@ -366,6 +439,18 @@ func (self *LocalUserNat) Run() {
366439
c()
367440
}
368441
case layers.IPProtocolTCP:
442+
tcp := layers.TCP{}
443+
tcp.DecodeFromBytes(ipv6.Payload, gopacket.NilDecodeFeedback)
444+
445+
sourceId := SourceID{
446+
ip: netip.AddrFrom16([16]byte(ipv6.SrcIP)),
447+
port: uint16(tcp.SrcPort),
448+
}
449+
450+
sourceMapLock.Lock()
451+
sourceMap[sourceId] = sendPacket.source
452+
sourceMapLock.Unlock()
453+
369454
_, err = dev.Write(ipPacket)
370455
if err != nil {
371456
glog.Infof("[lnr]write error = %s\n", err)

0 commit comments

Comments
 (0)