update tun/tap

This commit is contained in:
ginuerzh 2022-08-18 14:50:13 +08:00
parent c720ab351e
commit 4c1da3e4d4
6 changed files with 55 additions and 66 deletions

2
go.mod
View File

@ -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

4
go.sum
View File

@ -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=

View File

@ -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
}

View File

@ -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 {

View File

@ -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

View File

@ -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