add p2p option for tun handler
This commit is contained in:
parent
f2a5089c29
commit
332a3a1cd0
@ -12,7 +12,6 @@ import (
|
|||||||
"github.com/go-gost/core/handler"
|
"github.com/go-gost/core/handler"
|
||||||
"github.com/go-gost/core/hop"
|
"github.com/go-gost/core/hop"
|
||||||
md "github.com/go-gost/core/metadata"
|
md "github.com/go-gost/core/metadata"
|
||||||
"github.com/go-gost/core/router"
|
|
||||||
tun_util "github.com/go-gost/x/internal/util/tun"
|
tun_util "github.com/go-gost/x/internal/util/tun"
|
||||||
"github.com/go-gost/x/registry"
|
"github.com/go-gost/x/registry"
|
||||||
"github.com/songgao/water/waterutil"
|
"github.com/songgao/water/waterutil"
|
||||||
@ -109,23 +108,6 @@ func (h *tunHandler) Handle(ctx context.Context, conn net.Conn, opts ...handler.
|
|||||||
return h.handleServer(ctx, conn, config, log)
|
return h.handleServer(ctx, conn, config, log)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *tunHandler) findRouteFor(ctx context.Context, dst net.IP, router router.Router) net.Addr {
|
|
||||||
if v, ok := h.routes.Load(ipToTunRouteKey(dst)); ok {
|
|
||||||
return v.(net.Addr)
|
|
||||||
}
|
|
||||||
|
|
||||||
if router == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
if route := router.GetRoute(ctx, dst); route != nil && route.Gateway != nil {
|
|
||||||
if v, ok := h.routes.Load(ipToTunRouteKey(route.Gateway)); ok {
|
|
||||||
return v.(net.Addr)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
var mIPProts = map[waterutil.IPProtocol]string{
|
var mIPProts = map[waterutil.IPProtocol]string{
|
||||||
waterutil.HOPOPT: "HOPOPT",
|
waterutil.HOPOPT: "HOPOPT",
|
||||||
waterutil.ICMP: "ICMP",
|
waterutil.ICMP: "ICMP",
|
||||||
|
@ -16,28 +16,23 @@ type metadata struct {
|
|||||||
bufferSize int
|
bufferSize int
|
||||||
keepAlivePeriod time.Duration
|
keepAlivePeriod time.Duration
|
||||||
passphrase string
|
passphrase string
|
||||||
|
p2p bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *tunHandler) parseMetadata(md mdata.Metadata) (err error) {
|
func (h *tunHandler) parseMetadata(md mdata.Metadata) (err error) {
|
||||||
const (
|
h.md.bufferSize = mdutil.GetInt(md, "tun.bufsize", "bufsize", "buffersize")
|
||||||
bufferSize = "bufferSize"
|
|
||||||
keepAlive = "keepAlive"
|
|
||||||
keepAlivePeriod = "ttl"
|
|
||||||
passphrase = "passphrase"
|
|
||||||
)
|
|
||||||
|
|
||||||
h.md.bufferSize = mdutil.GetInt(md, bufferSize)
|
|
||||||
if h.md.bufferSize <= 0 {
|
if h.md.bufferSize <= 0 {
|
||||||
h.md.bufferSize = defaultBufferSize
|
h.md.bufferSize = defaultBufferSize
|
||||||
}
|
}
|
||||||
|
|
||||||
if mdutil.GetBool(md, keepAlive) {
|
if mdutil.GetBool(md, "tun.keepalive", "keepalive") {
|
||||||
h.md.keepAlivePeriod = mdutil.GetDuration(md, keepAlivePeriod)
|
h.md.keepAlivePeriod = mdutil.GetDuration(md, "tun.ttl", "ttl")
|
||||||
if h.md.keepAlivePeriod <= 0 {
|
if h.md.keepAlivePeriod <= 0 {
|
||||||
h.md.keepAlivePeriod = defaultKeepAlivePeriod
|
h.md.keepAlivePeriod = defaultKeepAlivePeriod
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
h.md.passphrase = mdutil.GetString(md, passphrase)
|
h.md.passphrase = mdutil.GetString(md, "tun.token", "token", "passphrase")
|
||||||
|
h.md.p2p = mdutil.GetBool(md, "tun.p2p", "p2p")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -10,6 +10,7 @@ import (
|
|||||||
|
|
||||||
"github.com/go-gost/core/common/bufpool"
|
"github.com/go-gost/core/common/bufpool"
|
||||||
"github.com/go-gost/core/logger"
|
"github.com/go-gost/core/logger"
|
||||||
|
"github.com/go-gost/core/router"
|
||||||
tun_util "github.com/go-gost/x/internal/util/tun"
|
tun_util "github.com/go-gost/x/internal/util/tun"
|
||||||
"github.com/songgao/water/waterutil"
|
"github.com/songgao/water/waterutil"
|
||||||
"golang.org/x/net/ipv4"
|
"golang.org/x/net/ipv4"
|
||||||
@ -203,12 +204,14 @@ func (h *tunHandler) transportServer(ctx context.Context, tun io.ReadWriter, con
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if !h.md.p2p {
|
||||||
if addr := h.findRouteFor(ctx, dst, config.Router); addr != nil {
|
if addr := h.findRouteFor(ctx, dst, config.Router); addr != nil {
|
||||||
log.Debugf("find route: %s -> %s", dst, addr)
|
log.Debugf("find route: %s -> %s", dst, addr)
|
||||||
|
|
||||||
_, err := conn.WriteTo(b[:n], addr)
|
_, err := conn.WriteTo(b[:n], addr)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if _, err := tun.Write(b[:n]); err != nil {
|
if _, err := tun.Write(b[:n]); err != nil {
|
||||||
return ErrTun
|
return ErrTun
|
||||||
@ -231,6 +234,9 @@ func (h *tunHandler) transportServer(ctx context.Context, tun io.ReadWriter, con
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (h *tunHandler) updateRoute(ip net.IP, addr net.Addr, log logger.Logger) {
|
func (h *tunHandler) updateRoute(ip net.IP, addr net.Addr, log logger.Logger) {
|
||||||
|
if h.md.p2p {
|
||||||
|
ip = net.IPv6zero
|
||||||
|
}
|
||||||
rkey := ipToTunRouteKey(ip)
|
rkey := ipToTunRouteKey(ip)
|
||||||
if actual, loaded := h.routes.LoadOrStore(rkey, addr); loaded {
|
if actual, loaded := h.routes.LoadOrStore(rkey, addr); loaded {
|
||||||
if actual.(net.Addr).String() != addr.String() {
|
if actual.(net.Addr).String() != addr.String() {
|
||||||
@ -242,3 +248,25 @@ func (h *tunHandler) updateRoute(ip net.IP, addr net.Addr, log logger.Logger) {
|
|||||||
log.Debugf("new route: %s -> %s", ip, addr)
|
log.Debugf("new route: %s -> %s", ip, addr)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (h *tunHandler) findRouteFor(ctx context.Context, dst net.IP, router router.Router) net.Addr {
|
||||||
|
if h.md.p2p {
|
||||||
|
dst = net.IPv6zero
|
||||||
|
router = nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if v, ok := h.routes.Load(ipToTunRouteKey(dst)); ok {
|
||||||
|
return v.(net.Addr)
|
||||||
|
}
|
||||||
|
|
||||||
|
if router == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if route := router.GetRoute(ctx, dst); route != nil && route.Gateway != nil {
|
||||||
|
if v, ok := h.routes.Load(ipToTunRouteKey(route.Gateway)); ok {
|
||||||
|
return v.(net.Addr)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user