update tun/tap
This commit is contained in:
parent
c720ab351e
commit
4c1da3e4d4
2
go.mod
2
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
|
||||
|
4
go.sum
4
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=
|
||||
|
@ -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
|
||||
}
|
||||
|
||||
|
@ -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 {
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user