Parcourir la source

:gear: Add ipv6 support

Ettore Di Giacinto il y a 3 ans
Parent
commit
c34484c54c
2 fichiers modifiés avec 18 ajouts et 7 suppressions
  1. 1 1
      go.mod
  2. 17 6
      pkg/vpn/vpn.go

+ 1 - 1
go.mod

@@ -9,6 +9,7 @@ require (
 	github.com/cenkalti/backoff/v4 v4.1.3
 	github.com/cenkalti/backoff/v4 v4.1.3
 	github.com/cpuguy83/go-md2man/v2 v2.0.1 // indirect
 	github.com/cpuguy83/go-md2man/v2 v2.0.1 // indirect
 	github.com/google/btree v1.0.1 // indirect
 	github.com/google/btree v1.0.1 // indirect
+	github.com/google/gopacket v1.1.19
 	github.com/gookit/color v1.5.0 // indirect
 	github.com/gookit/color v1.5.0 // indirect
 	github.com/hashicorp/errwrap v1.1.0 // indirect
 	github.com/hashicorp/errwrap v1.1.0 // indirect
 	github.com/hashicorp/golang-lru v0.5.4
 	github.com/hashicorp/golang-lru v0.5.4
@@ -41,7 +42,6 @@ require (
 	github.com/vishvananda/netlink v1.1.0
 	github.com/vishvananda/netlink v1.1.0
 	github.com/vishvananda/netns v0.0.0-20211101163701-50045581ed74 // indirect
 	github.com/vishvananda/netns v0.0.0-20211101163701-50045581ed74 // indirect
 	github.com/xlzd/gotp v0.0.0-20220110052318-fab697c03c2c
 	github.com/xlzd/gotp v0.0.0-20220110052318-fab697c03c2c
-	golang.org/x/net v0.0.0-20220418201149-a630d4f3e7a2
 	gopkg.in/yaml.v2 v2.4.0
 	gopkg.in/yaml.v2 v2.4.0
 )
 )
 
 

+ 17 - 6
pkg/vpn/vpn.go

@@ -29,6 +29,8 @@ import (
 	"github.com/libp2p/go-libp2p-core/network"
 	"github.com/libp2p/go-libp2p-core/network"
 	"github.com/libp2p/go-libp2p-core/peer"
 	"github.com/libp2p/go-libp2p-core/peer"
 
 
+	"github.com/google/gopacket"
+	"github.com/google/gopacket/layers"
 	"github.com/mudler/edgevpn/internal"
 	"github.com/mudler/edgevpn/internal"
 	"github.com/mudler/edgevpn/pkg/blockchain"
 	"github.com/mudler/edgevpn/pkg/blockchain"
 	"github.com/mudler/edgevpn/pkg/logger"
 	"github.com/mudler/edgevpn/pkg/logger"
@@ -40,7 +42,6 @@ import (
 	"github.com/pkg/errors"
 	"github.com/pkg/errors"
 	"github.com/songgao/packets/ethernet"
 	"github.com/songgao/packets/ethernet"
 	"github.com/songgao/water"
 	"github.com/songgao/water"
-	"golang.org/x/net/ipv4"
 )
 )
 
 
 type streamManager interface {
 type streamManager interface {
@@ -179,13 +180,23 @@ func handleFrame(mgr streamManager, frame ethernet.Frame, c *Config, n *node.Nod
 	ctx, cancel := context.WithTimeout(context.Background(), c.Timeout)
 	ctx, cancel := context.WithTimeout(context.Background(), c.Timeout)
 	defer cancel()
 	defer cancel()
 
 
-	header, err := ipv4.ParseHeader(frame)
-	if err != nil {
-		return errors.Wrap(err, "could not parse ipv4 header from frame")
+	var dstIP, srcIP net.IP
+	var packet layers.IPv4
+	if err := packet.DecodeFromBytes(frame, gopacket.NilDecodeFeedback); err != nil {
+		var packet layers.IPv6
+		if err := packet.DecodeFromBytes(frame, gopacket.NilDecodeFeedback); err != nil {
+			return errors.Wrap(err, "could not parse header from frame")
+		} else {
+			dstIP = packet.DstIP
+			srcIP = packet.SrcIP
+		}
+	} else {
+		dstIP = packet.DstIP
+		srcIP = packet.SrcIP
 	}
 	}
 
 
-	dst := header.Dst.String()
-	if c.RouterAddress != "" && header.Src.Equal(ip) {
+	dst := dstIP.String()
+	if c.RouterAddress != "" && srcIP.Equal(ip) {
 		dst = c.RouterAddress
 		dst = c.RouterAddress
 	}
 	}