mirror of
https://github.com/netbirdio/netbird.git
synced 2026-05-01 22:56:41 +00:00
Add ec2 test
This commit is contained in:
70
relay/testec2/tun/proxy.go
Normal file
70
relay/testec2/tun/proxy.go
Normal file
@@ -0,0 +1,70 @@
|
||||
package tun
|
||||
|
||||
import (
|
||||
"net"
|
||||
"sync/atomic"
|
||||
|
||||
log "github.com/sirupsen/logrus"
|
||||
)
|
||||
|
||||
type Proxy struct {
|
||||
Device *Device
|
||||
PConn net.PacketConn
|
||||
DstAddr net.Addr
|
||||
shutdownFlag atomic.Bool
|
||||
}
|
||||
|
||||
func (p *Proxy) Start() {
|
||||
go p.readFromDevice()
|
||||
go p.readFromConn()
|
||||
}
|
||||
|
||||
func (p *Proxy) Close() {
|
||||
p.shutdownFlag.Store(true)
|
||||
}
|
||||
|
||||
func (p *Proxy) readFromDevice() {
|
||||
buf := make([]byte, 1500)
|
||||
for {
|
||||
n, err := p.Device.Read(buf)
|
||||
if err != nil {
|
||||
if p.shutdownFlag.Load() {
|
||||
return
|
||||
}
|
||||
log.Errorf("failed to read from device: %s", err)
|
||||
return
|
||||
}
|
||||
|
||||
_, err = p.PConn.WriteTo(buf[:n], p.DstAddr)
|
||||
if err != nil {
|
||||
if p.shutdownFlag.Load() {
|
||||
return
|
||||
}
|
||||
log.Errorf("failed to write to conn: %s", err)
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (p *Proxy) readFromConn() {
|
||||
buf := make([]byte, 1500)
|
||||
for {
|
||||
n, _, err := p.PConn.ReadFrom(buf)
|
||||
if err != nil {
|
||||
if p.shutdownFlag.Load() {
|
||||
return
|
||||
}
|
||||
log.Errorf("failed to read from conn: %s", err)
|
||||
return
|
||||
}
|
||||
|
||||
_, err = p.Device.Write(buf[:n])
|
||||
if err != nil {
|
||||
if p.shutdownFlag.Load() {
|
||||
return
|
||||
}
|
||||
log.Errorf("failed to write to device: %s", err)
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
108
relay/testec2/tun/tun.go
Normal file
108
relay/testec2/tun/tun.go
Normal file
@@ -0,0 +1,108 @@
|
||||
package tun
|
||||
|
||||
import (
|
||||
"net"
|
||||
|
||||
log "github.com/sirupsen/logrus"
|
||||
"github.com/songgao/water"
|
||||
"github.com/vishvananda/netlink"
|
||||
)
|
||||
|
||||
type Device struct {
|
||||
Name string
|
||||
IP string
|
||||
PConn net.PacketConn
|
||||
DstAddr net.Addr
|
||||
|
||||
iFace *water.Interface
|
||||
proxy *Proxy
|
||||
}
|
||||
|
||||
func (d *Device) Up() error {
|
||||
cfg := water.Config{
|
||||
DeviceType: water.TUN,
|
||||
PlatformSpecificParams: water.PlatformSpecificParams{
|
||||
Name: d.Name,
|
||||
},
|
||||
}
|
||||
iFace, err := water.New(cfg)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
d.iFace = iFace
|
||||
|
||||
err = d.assignIP()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
err = d.bringUp()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
d.proxy = &Proxy{
|
||||
Device: d,
|
||||
PConn: d.PConn,
|
||||
DstAddr: d.DstAddr,
|
||||
}
|
||||
d.proxy.Start()
|
||||
return nil
|
||||
}
|
||||
|
||||
func (d *Device) Close() error {
|
||||
if d.proxy != nil {
|
||||
d.proxy.Close()
|
||||
}
|
||||
if d.iFace != nil {
|
||||
return d.iFace.Close()
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (d *Device) Read(b []byte) (int, error) {
|
||||
return d.iFace.Read(b)
|
||||
}
|
||||
|
||||
func (d *Device) Write(b []byte) (int, error) {
|
||||
return d.iFace.Write(b)
|
||||
}
|
||||
|
||||
func (d *Device) assignIP() error {
|
||||
iface, err := netlink.LinkByName(d.Name)
|
||||
if err != nil {
|
||||
log.Errorf("failed to get TUN device: %v", err)
|
||||
return err
|
||||
}
|
||||
|
||||
ip := net.IPNet{
|
||||
IP: net.ParseIP(d.IP),
|
||||
Mask: net.CIDRMask(24, 32),
|
||||
}
|
||||
|
||||
addr := &netlink.Addr{
|
||||
IPNet: &ip,
|
||||
}
|
||||
err = netlink.AddrAdd(iface, addr)
|
||||
if err != nil {
|
||||
log.Errorf("failed to add IP address: %v", err)
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (d *Device) bringUp() error {
|
||||
iface, err := netlink.LinkByName(d.Name)
|
||||
if err != nil {
|
||||
log.Errorf("failed to get device: %v", err)
|
||||
return err
|
||||
}
|
||||
|
||||
// Bring the interface up
|
||||
err = netlink.LinkSetUp(iface)
|
||||
if err != nil {
|
||||
log.Errorf("failed to set device up: %v", err)
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
16
relay/testec2/tun/tun_test.go
Normal file
16
relay/testec2/tun/tun_test.go
Normal file
@@ -0,0 +1,16 @@
|
||||
package tun
|
||||
|
||||
import "testing"
|
||||
|
||||
func TestDevice_assignIP(t *testing.T) {
|
||||
d := Device{
|
||||
Name: "mytun0",
|
||||
IP: "10.0.0.1",
|
||||
}
|
||||
err := d.Up()
|
||||
if err != nil {
|
||||
t.Fatalf("failed to bring up device: %v", err)
|
||||
}
|
||||
defer d.Close()
|
||||
select {}
|
||||
}
|
||||
Reference in New Issue
Block a user