From fd13582ded267d8f05fa8bfeeccdc43f4e643ead Mon Sep 17 00:00:00 2001 From: ginuerzh Date: Fri, 27 Dec 2019 22:17:09 +0800 Subject: [PATCH] tun: add routes setup support for windows --- tun_unix.go | 15 +++++---------- tun_windows.go | 32 ++++++++++++++++++++++++++++---- 2 files changed, 33 insertions(+), 14 deletions(-) diff --git a/tun_unix.go b/tun_unix.go index e3d00df..45e3706 100644 --- a/tun_unix.go +++ b/tun_unix.go @@ -6,7 +6,7 @@ import ( "fmt" "net" "os/exec" - "strconv" + "strings" "github.com/go-log/log" "github.com/songgao/water" @@ -32,11 +32,8 @@ func createTun(cfg TunConfig) (conn net.Conn, ipNet *net.IPNet, err error) { cmd := fmt.Sprintf("ifconfig %s inet %s mtu %d up", ifce.Name(), cfg.Addr, mtu) log.Log("[tun]", cmd) - if er := exec.Command( - "ifconfig", ifce.Name(), - "inet", cfg.Addr, - "mtu", strconv.Itoa(mtu), - "up").Run(); er != nil { + args := strings.Split(cmd, " ") + if er := exec.Command(args[0], args[1:]...).Run(); er != nil { err = fmt.Errorf("%s: %v", cmd, er) return } @@ -59,10 +56,8 @@ func addRoutes(ifName string, routes ...string) error { } cmd := fmt.Sprintf("route add -net %s -interface %s", route, ifName) log.Log("[tun]", cmd) - if er := exec.Command( - "route", "add", - "-net", route, - "-interface", ifName).Run(); er != nil { + args := strings.Split(cmd, " ") + if er := exec.Command(args[0], args[1:]...).Run(); er != nil { return fmt.Errorf("%s: %v", cmd, er) } } diff --git a/tun_windows.go b/tun_windows.go index 9e0680b..aa68aa2 100644 --- a/tun_windows.go +++ b/tun_windows.go @@ -4,6 +4,7 @@ import ( "fmt" "net" "os/exec" + "strings" "github.com/go-log/log" "github.com/songgao/water" @@ -31,14 +32,16 @@ func createTun(cfg TunConfig) (conn net.Conn, ipNet *net.IPNet, err error) { "source=static addr=%s mask=%s gateway=none", ifce.Name(), ip.String(), ipMask(ipNet.Mask)) log.Log("[tun]", cmd) - if er := exec.Command("netsh", - "interface", "ip", "set", "address", - "name="+ifce.Name(), "source=static", - "addr="+ip.String(), "mask="+ipMask(ipNet.Mask), "gateway=none").Run(); er != nil { + args := strings.Split(cmd, " ") + if er := exec.Command(args[0], args[1:]...).Run(); er != nil { err = fmt.Errorf("%s: %v", cmd, er) return } + if err = addRoutes(ip.String(), cfg.Routes...); err != nil { + return + } + conn = &tunConn{ ifce: ifce, addr: &net.IPAddr{IP: ip}, @@ -46,6 +49,27 @@ func createTun(cfg TunConfig) (conn net.Conn, ipNet *net.IPNet, err error) { return } +func addRoutes(ifIP string, routes ...string) error { + for _, route := range routes { + if route == "" { + continue + } + _, inet, err := net.ParseCIDR(route) + if err != nil { + return err + } + + cmd := fmt.Sprintf("route ADD %s MASK %s %s", + inet.IP, ipMask(inet.Mask), ifIP) + log.Log("[tun]", cmd) + args := strings.Split(cmd, " ") + if er := exec.Command(args[0], args[1:]...).Run(); er != nil { + return fmt.Errorf("%s: %v", cmd, er) + } + } + return nil +} + func ipMask(mask net.IPMask) string { return fmt.Sprintf("%d.%d.%d.%d", mask[0], mask[1], mask[2], mask[3]) }