//go:build linux || darwin package main import ( "os" "os/exec" "runtime" "github.com/songgao/water" ) var iface *water.Interface func isAdmin() bool { return os.Geteuid() == 0 } func setupInterface() { config := water.Config{DeviceType: water.TUN} if runtime.GOOS == "linux" { config.Name = "baalvpn" } var err error iface, err = water.New(config) if err != nil { panic(err) } if runtime.GOOS == "linux" { if err := exec.Command("ip", "addr", "add", internalIP.String()+"/32", "dev", "baalvpn").Run(); err != nil { panic(err) } if err := exec.Command("ip", "link", "set", "dev", "baalvpn", "up").Run(); err != nil { panic(err) } } else { if err := exec.Command("ifconfig", iface.Name(), "inet6", internalIP.String(), internalIP.String(), "prefixlen", "128", "up").Run(); err != nil { panic(err) } if err := exec.Command("route", "-n", "add", "-inet6", "fd00:baa1::/32", "-interface", iface.Name()).Run(); err != nil { panic(err) } } } func writePkt(pkt []byte) error { _, err := iface.Write(pkt) return err } func readPkt() ([]byte, error) { pkt := make([]byte, 2000) n, err := iface.Read(pkt) if err != nil { return nil, err } return pkt[:n], nil } func releasePkt(pkt []byte) {}