63 lines
1.2 KiB
Go
63 lines
1.2 KiB
Go
//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) {}
|