mirror of
https://github.com/fatedier/frp.git
synced 2026-01-11 22:23:12 +00:00
virtual-net: initial (#4751)
This commit is contained in:
@@ -44,6 +44,10 @@ func (sv *STCPVisitor) Run() (err error) {
|
||||
}
|
||||
|
||||
go sv.internalConnWorker()
|
||||
|
||||
if sv.plugin != nil {
|
||||
sv.plugin.Start()
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
@@ -20,9 +20,11 @@ import (
|
||||
"sync"
|
||||
|
||||
v1 "github.com/fatedier/frp/pkg/config/v1"
|
||||
plugin "github.com/fatedier/frp/pkg/plugin/visitor"
|
||||
"github.com/fatedier/frp/pkg/transport"
|
||||
netpkg "github.com/fatedier/frp/pkg/util/net"
|
||||
"github.com/fatedier/frp/pkg/util/xlog"
|
||||
"github.com/fatedier/frp/pkg/vnet"
|
||||
)
|
||||
|
||||
// Helper wraps some functions for visitor to use.
|
||||
@@ -34,6 +36,8 @@ type Helper interface {
|
||||
// MsgTransporter returns the message transporter that is used to send and receive messages
|
||||
// to the frp server through the controller.
|
||||
MsgTransporter() transport.MessageTransporter
|
||||
// VNetController returns the vnet controller that is used to manage the virtual network.
|
||||
VNetController() *vnet.Controller
|
||||
// RunID returns the run id of current controller.
|
||||
RunID() string
|
||||
}
|
||||
@@ -50,14 +54,34 @@ func NewVisitor(
|
||||
cfg v1.VisitorConfigurer,
|
||||
clientCfg *v1.ClientCommonConfig,
|
||||
helper Helper,
|
||||
) (visitor Visitor) {
|
||||
) (Visitor, error) {
|
||||
xl := xlog.FromContextSafe(ctx).Spawn().AppendPrefix(cfg.GetBaseConfig().Name)
|
||||
ctx = xlog.NewContext(ctx, xl)
|
||||
var visitor Visitor
|
||||
baseVisitor := BaseVisitor{
|
||||
clientCfg: clientCfg,
|
||||
helper: helper,
|
||||
ctx: xlog.NewContext(ctx, xl),
|
||||
ctx: ctx,
|
||||
internalLn: netpkg.NewInternalListener(),
|
||||
}
|
||||
if cfg.GetBaseConfig().Plugin.Type != "" {
|
||||
p, err := plugin.Create(
|
||||
cfg.GetBaseConfig().Plugin.Type,
|
||||
plugin.PluginContext{
|
||||
Name: cfg.GetBaseConfig().Name,
|
||||
Ctx: ctx,
|
||||
VnetController: helper.VNetController(),
|
||||
HandleConn: func(conn net.Conn) {
|
||||
_ = baseVisitor.AcceptConn(conn)
|
||||
},
|
||||
},
|
||||
cfg.GetBaseConfig().Plugin.VisitorPluginOptions,
|
||||
)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
baseVisitor.plugin = p
|
||||
}
|
||||
switch cfg := cfg.(type) {
|
||||
case *v1.STCPVisitorConfig:
|
||||
visitor = &STCPVisitor{
|
||||
@@ -77,7 +101,7 @@ func NewVisitor(
|
||||
checkCloseCh: make(chan struct{}),
|
||||
}
|
||||
}
|
||||
return
|
||||
return visitor, nil
|
||||
}
|
||||
|
||||
type BaseVisitor struct {
|
||||
@@ -85,6 +109,7 @@ type BaseVisitor struct {
|
||||
helper Helper
|
||||
l net.Listener
|
||||
internalLn *netpkg.InternalListener
|
||||
plugin plugin.Plugin
|
||||
|
||||
mu sync.RWMutex
|
||||
ctx context.Context
|
||||
@@ -101,4 +126,7 @@ func (v *BaseVisitor) Close() {
|
||||
if v.internalLn != nil {
|
||||
v.internalLn.Close()
|
||||
}
|
||||
if v.plugin != nil {
|
||||
v.plugin.Close()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -27,6 +27,7 @@ import (
|
||||
v1 "github.com/fatedier/frp/pkg/config/v1"
|
||||
"github.com/fatedier/frp/pkg/transport"
|
||||
"github.com/fatedier/frp/pkg/util/xlog"
|
||||
"github.com/fatedier/frp/pkg/vnet"
|
||||
)
|
||||
|
||||
type Manager struct {
|
||||
@@ -50,6 +51,7 @@ func NewManager(
|
||||
clientCfg *v1.ClientCommonConfig,
|
||||
connectServer func() (net.Conn, error),
|
||||
msgTransporter transport.MessageTransporter,
|
||||
vnetController *vnet.Controller,
|
||||
) *Manager {
|
||||
m := &Manager{
|
||||
clientCfg: clientCfg,
|
||||
@@ -62,6 +64,7 @@ func NewManager(
|
||||
m.helper = &visitorHelperImpl{
|
||||
connectServerFn: connectServer,
|
||||
msgTransporter: msgTransporter,
|
||||
vnetController: vnetController,
|
||||
transferConnFn: m.TransferConn,
|
||||
runID: runID,
|
||||
}
|
||||
@@ -112,7 +115,11 @@ func (vm *Manager) Close() {
|
||||
func (vm *Manager) startVisitor(cfg v1.VisitorConfigurer) (err error) {
|
||||
xl := xlog.FromContextSafe(vm.ctx)
|
||||
name := cfg.GetBaseConfig().Name
|
||||
visitor := NewVisitor(vm.ctx, cfg, vm.clientCfg, vm.helper)
|
||||
visitor, err := NewVisitor(vm.ctx, cfg, vm.clientCfg, vm.helper)
|
||||
if err != nil {
|
||||
xl.Warnf("new visitor error: %v", err)
|
||||
return
|
||||
}
|
||||
err = visitor.Run()
|
||||
if err != nil {
|
||||
xl.Warnf("start error: %v", err)
|
||||
@@ -187,6 +194,7 @@ func (vm *Manager) TransferConn(name string, conn net.Conn) error {
|
||||
type visitorHelperImpl struct {
|
||||
connectServerFn func() (net.Conn, error)
|
||||
msgTransporter transport.MessageTransporter
|
||||
vnetController *vnet.Controller
|
||||
transferConnFn func(name string, conn net.Conn) error
|
||||
runID string
|
||||
}
|
||||
@@ -203,6 +211,10 @@ func (v *visitorHelperImpl) MsgTransporter() transport.MessageTransporter {
|
||||
return v.msgTransporter
|
||||
}
|
||||
|
||||
func (v *visitorHelperImpl) VNetController() *vnet.Controller {
|
||||
return v.vnetController
|
||||
}
|
||||
|
||||
func (v *visitorHelperImpl) RunID() string {
|
||||
return v.runID
|
||||
}
|
||||
|
||||
@@ -73,6 +73,10 @@ func (sv *XTCPVisitor) Run() (err error) {
|
||||
sv.retryLimiter = rate.NewLimiter(rate.Every(time.Hour/time.Duration(sv.cfg.MaxRetriesAnHour)), sv.cfg.MaxRetriesAnHour)
|
||||
go sv.keepTunnelOpenWorker()
|
||||
}
|
||||
|
||||
if sv.plugin != nil {
|
||||
sv.plugin.Start()
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
@@ -157,9 +161,9 @@ func (sv *XTCPVisitor) keepTunnelOpenWorker() {
|
||||
|
||||
func (sv *XTCPVisitor) handleConn(userConn net.Conn) {
|
||||
xl := xlog.FromContextSafe(sv.ctx)
|
||||
isConnTrasfered := false
|
||||
isConnTransfered := false
|
||||
defer func() {
|
||||
if !isConnTrasfered {
|
||||
if !isConnTransfered {
|
||||
userConn.Close()
|
||||
}
|
||||
}()
|
||||
@@ -187,7 +191,7 @@ func (sv *XTCPVisitor) handleConn(userConn net.Conn) {
|
||||
xl.Errorf("transfer connection to visitor %s error: %v", sv.cfg.FallbackTo, err)
|
||||
return
|
||||
}
|
||||
isConnTrasfered = true
|
||||
isConnTransfered = true
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user