vtun/common/osutil/osutil.go
2021-04-20 00:41:37 +08:00

45 lines
1.2 KiB
Go

package osutil
import (
"log"
"net"
"os"
"os/exec"
"runtime"
"github.com/songgao/water"
)
func ConfigTun(cidr string, iface *water.Interface) {
os := runtime.GOOS
ip, ipNet, err := net.ParseCIDR(cidr)
if err != nil {
log.Panicf("error cidr %v", cidr)
}
if os == "linux" {
execCmd("/sbin/ip", "link", "set", "dev", iface.Name(), "mtu", "1300")
execCmd("/sbin/ip", "addr", "add", cidr, "dev", iface.Name())
execCmd("/sbin/ip", "link", "set", "dev", iface.Name(), "up")
} else if os == "darwin" {
minIp := ipNet.IP.To4()
minIp[3]++
execCmd("ifconfig", iface.Name(), ip.String(), minIp.String(), "up")
} else if os == "windows" {
log.Printf("please install openvpn client,see this link:%v", "https://github.com/OpenVPN/openvpn")
log.Printf("open new cmd and enter:netsh interface ip set address name=\"%v\" source=static addr=%v mask=%v gateway=none", iface.Name(), ip.String(), ipNet.Mask.String())
} else {
log.Printf("not support os:%v", os)
}
}
func execCmd(c string, args ...string) {
cmd := exec.Command(c, args...)
cmd.Stderr = os.Stderr
cmd.Stdout = os.Stdout
cmd.Stdin = os.Stdin
err := cmd.Run()
if err != nil {
log.Fatalln("failed to exec /sbin/ip error:", err)
}
}