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+
209216func (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