From 4c1da3e4d43d4f74e82c7327f0bd2dda62c083f1 Mon Sep 17 00:00:00 2001 From: ginuerzh Date: Thu, 18 Aug 2022 14:50:13 +0800 Subject: [PATCH] update tun/tap --- go.mod | 2 -- go.sum | 4 --- handler/tap/handler.go | 2 +- handler/tun/handler.go | 4 +-- listener/tap/tap_linux.go | 55 ++++++++++++++++++--------------------- listener/tun/tun_linux.go | 54 ++++++++++++++++++-------------------- 6 files changed, 55 insertions(+), 66 deletions(-) diff --git a/go.mod b/go.mod index 9577f86..8439418 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,6 @@ go 1.18 require ( github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d - github.com/docker/libcontainer v2.2.1+incompatible github.com/gin-contrib/cors v1.3.1 github.com/gin-gonic/gin v1.7.7 github.com/go-gost/core v0.0.0-20220818022848-2cc1d6f52c41 @@ -18,7 +17,6 @@ require ( github.com/gorilla/websocket v1.5.0 github.com/lucas-clemente/quic-go v0.28.1 github.com/miekg/dns v1.1.47 - github.com/milosgajdos/tenus v0.0.3 github.com/prometheus/client_golang v1.12.1 github.com/rs/xid v1.3.0 github.com/shadowsocks/go-shadowsocks2 v0.1.5 diff --git a/go.sum b/go.sum index 08f1c22..b75edd2 100644 --- a/go.sum +++ b/go.sum @@ -91,8 +91,6 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= -github.com/docker/libcontainer v2.2.1+incompatible h1:++SbbkCw+X8vAd4j2gOCzZ2Nn7s2xFALTf7LZKmM1/0= -github.com/docker/libcontainer v2.2.1+incompatible/go.mod h1:osvj61pYsqhNCMLGX31xr7klUBhHb/ZBuXS0o1Fvwbw= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= @@ -304,8 +302,6 @@ github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5 github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4= github.com/miekg/dns v1.1.47 h1:J9bWiXbqMbnZPcY8Qi2E3EWIBsIm6MZzzJB9VRg5gL8= github.com/miekg/dns v1.1.47/go.mod h1:e3IlAVfNqAllflbibAZEWOXOQ+Ynzk/dDozDxY7XnME= -github.com/milosgajdos/tenus v0.0.3 h1:jmaJzwaY1DUyYVD0lM4U+uvP2kkEg1VahDqRFxIkVBE= -github.com/milosgajdos/tenus v0.0.3/go.mod h1:eIjx29vNeDOYWJuCnaHY2r4fq5egetV26ry3on7p8qY= github.com/mitchellh/mapstructure v1.4.3 h1:OVowDSCllw/YjdLkam3/sm7wEtOy59d8ndGgCcyj8cs= github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mmcloughlin/avo v0.0.0-20200803215136-443f81d77104 h1:ULR/QWMgcgRiZLUjSSJMU+fW+RDMstRdmnDWj9Q+AsA= diff --git a/handler/tap/handler.go b/handler/tap/handler.go index f76ea16..2a321eb 100644 --- a/handler/tap/handler.go +++ b/handler/tap/handler.go @@ -227,7 +227,7 @@ func (h *tapHandler) transport(tap net.Conn, conn net.PacketConn, raddr net.Addr addr = v.(net.Addr) } if addr == nil { - log.Warnf("no route for %s -> %s %s %d", src, dst, eType, n) + log.Debugf("no route for %s -> %s %s %d", src, dst, eType, n) return nil } diff --git a/handler/tun/handler.go b/handler/tun/handler.go index c953a0d..d9efe52 100644 --- a/handler/tun/handler.go +++ b/handler/tun/handler.go @@ -241,7 +241,7 @@ func (h *tunHandler) transport(tun net.Conn, conn net.PacketConn, raddr net.Addr addr := h.findRouteFor(dst, config.Routes...) if addr == nil { - log.Warnf("no route for %s -> %s", src, dst) + log.Debugf("no route for %s -> %s", src, dst) return nil } @@ -317,7 +317,7 @@ func (h *tunHandler) transport(tun net.Conn, conn net.PacketConn, raddr net.Addr h.routes.Store(rkey, addr) } } else { - log.Warnf("no route for %s -> %s", src, addr) + log.Debugf("no route for %s -> %s", src, addr) } if addr := h.findRouteFor(dst, config.Routes...); addr != nil { diff --git a/listener/tap/tap_linux.go b/listener/tap/tap_linux.go index dac7f10..c10055a 100644 --- a/listener/tap/tap_linux.go +++ b/listener/tap/tap_linux.go @@ -1,22 +1,15 @@ package tap import ( + "fmt" "net" + "os/exec" + "strings" - "github.com/docker/libcontainer/netlink" - "github.com/milosgajdos/tenus" "github.com/songgao/water" ) func (l *tapListener) createTap() (ifce *water.Interface, ip net.IP, err error) { - var ipNet *net.IPNet - if l.md.config.Net != "" { - ip, ipNet, err = net.ParseCIDR(l.md.config.Net) - if err != nil { - return - } - } - ifce, err = water.New(water.Config{ DeviceType: water.TAP, PlatformSpecificParams: water.PlatformSpecificParams{ @@ -27,28 +20,18 @@ func (l *tapListener) createTap() (ifce *water.Interface, ip net.IP, err error) return } - link, err := tenus.NewLinkFrom(ifce.Name()) - if err != nil { - return - } - - l.logger.Debugf("ip link set dev %s mtu %d", ifce.Name(), l.md.config.MTU) - - if err = link.SetLinkMTU(l.md.config.MTU); err != nil { - return + if err = l.exeCmd(fmt.Sprintf("ip link set dev %s mtu %d", ifce.Name(), l.md.config.MTU)); err != nil { + l.logger.Warn(err) } if l.md.config.Net != "" { - l.logger.Debugf("ip address add %s dev %s", l.md.config.Net, ifce.Name()) - - if err = link.SetLinkIp(ip, ipNet); err != nil { - return + if err = l.exeCmd(fmt.Sprintf("ip address add %s dev %s", l.md.config.Net, ifce.Name())); err != nil { + l.logger.Warn(err) } } - l.logger.Debugf("ip link set dev %s up", ifce.Name()) - if err = link.SetLinkUp(); err != nil { - return + if err = l.exeCmd(fmt.Sprintf("ip link set dev %s up", ifce.Name())); err != nil { + l.logger.Warn(err) } if err = l.addRoutes(ifce.Name(), l.md.config.Gateway, l.md.config.Routes...); err != nil { @@ -58,11 +41,25 @@ func (l *tapListener) createTap() (ifce *water.Interface, ip net.IP, err error) return } +func (l *tapListener) exeCmd(cmd string) error { + l.logger.Debug(cmd) + + args := strings.Split(cmd, " ") + if err := exec.Command(args[0], args[1:]...).Run(); err != nil { + return fmt.Errorf("%s: %v", cmd, err) + } + + return nil +} + func (l *tapListener) addRoutes(ifName string, gw string, routes ...string) error { for _, route := range routes { - l.logger.Debugf("ip route add %s via %s dev %s", route, gw, ifName) - if err := netlink.AddRoute(route, "", gw, ifName); err != nil { - return err + cmd := fmt.Sprintf("ip route add %s via %s dev %s", route, gw, ifName) + l.logger.Debug(cmd) + + args := strings.Split(cmd, " ") + if er := exec.Command(args[0], args[1:]...).Run(); er != nil { + l.logger.Warnf("%s: %v", cmd, er) } } return nil diff --git a/listener/tun/tun_linux.go b/listener/tun/tun_linux.go index 5dc546a..aac1543 100644 --- a/listener/tun/tun_linux.go +++ b/listener/tun/tun_linux.go @@ -1,22 +1,16 @@ package tun import ( - "errors" + "fmt" "net" - "syscall" + "os/exec" + "strings" - "github.com/docker/libcontainer/netlink" tun_util "github.com/go-gost/x/internal/util/tun" - "github.com/milosgajdos/tenus" "github.com/songgao/water" ) func (l *tunListener) createTun() (ifce *water.Interface, ip net.IP, err error) { - ip, ipNet, err := net.ParseCIDR(l.md.config.Net) - if err != nil { - return - } - ifce, err = water.New(water.Config{ DeviceType: water.TUN, PlatformSpecificParams: water.PlatformSpecificParams{ @@ -27,26 +21,16 @@ func (l *tunListener) createTun() (ifce *water.Interface, ip net.IP, err error) return } - link, err := tenus.NewLinkFrom(ifce.Name()) - if err != nil { - return + if err = l.exeCmd(fmt.Sprintf("ip link set dev %s mtu %d", ifce.Name(), l.md.config.MTU)); err != nil { + l.logger.Warn(err) } - l.logger.Debugf("ip link set dev %s mtu %d", ifce.Name(), l.md.config.MTU) - - if err = link.SetLinkMTU(l.md.config.MTU); err != nil { - return + if err = l.exeCmd(fmt.Sprintf("ip address add %s dev %s", l.md.config.Net, ifce.Name())); err != nil { + l.logger.Warn(err) } - l.logger.Debugf("ip address add %s dev %s", l.md.config.Net, ifce.Name()) - - if err = link.SetLinkIp(ip, ipNet); err != nil { - return - } - - l.logger.Debugf("ip link set dev %s up", ifce.Name()) - if err = link.SetLinkUp(); err != nil { - return + if err = l.exeCmd(fmt.Sprintf("ip link set dev %s up", ifce.Name())); err != nil { + l.logger.Warn(err) } if err = l.addRoutes(ifce.Name(), l.md.config.Routes...); err != nil { @@ -56,11 +40,25 @@ func (l *tunListener) createTun() (ifce *water.Interface, ip net.IP, err error) return } +func (l *tunListener) exeCmd(cmd string) error { + l.logger.Debug(cmd) + + args := strings.Split(cmd, " ") + if err := exec.Command(args[0], args[1:]...).Run(); err != nil { + return fmt.Errorf("%s: %v", cmd, err) + } + + return nil +} + func (l *tunListener) addRoutes(ifName string, routes ...tun_util.Route) error { for _, route := range routes { - l.logger.Debugf("ip route add %s dev %s", route.Net.String(), ifName) - if err := netlink.AddRoute(route.Net.String(), "", "", ifName); err != nil && !errors.Is(err, syscall.EEXIST) { - return err + cmd := fmt.Sprintf("ip route add %s dev %s", route.Net.String(), ifName) + l.logger.Debug(cmd) + + args := strings.Split(cmd, " ") + if er := exec.Command(args[0], args[1:]...).Run(); er != nil { + l.logger.Warnf("%s: %v", cmd, er) } } return nil