mirror of
https://github.com/fatedier/frp.git
synced 2025-07-06 16:30:55 +07:00
update doc and fix vistor -> visitor
This commit is contained in:
@ -64,7 +64,7 @@ func (svr *Service) apiReload(w http.ResponseWriter, r *http.Request, _ httprout
|
||||
return
|
||||
}
|
||||
|
||||
pxyCfgs, vistorCfgs, err := config.LoadProxyConfFromFile(config.ClientCommonCfg.User, conf, newCommonCfg.Start)
|
||||
pxyCfgs, visitorCfgs, err := config.LoadProxyConfFromFile(config.ClientCommonCfg.User, conf, newCommonCfg.Start)
|
||||
if err != nil {
|
||||
res.Code = 3
|
||||
res.Msg = err.Error()
|
||||
@ -72,7 +72,7 @@ func (svr *Service) apiReload(w http.ResponseWriter, r *http.Request, _ httprout
|
||||
return
|
||||
}
|
||||
|
||||
svr.ctl.reloadConf(pxyCfgs, vistorCfgs)
|
||||
svr.ctl.reloadConf(pxyCfgs, visitorCfgs)
|
||||
log.Info("success reload conf")
|
||||
return
|
||||
}
|
||||
|
@ -49,11 +49,11 @@ type Control struct {
|
||||
// proxies
|
||||
proxies map[string]Proxy
|
||||
|
||||
// vistor configures
|
||||
vistorCfgs map[string]config.ProxyConf
|
||||
// visitor configures
|
||||
visitorCfgs map[string]config.ProxyConf
|
||||
|
||||
// vistors
|
||||
vistors map[string]Vistor
|
||||
// visitors
|
||||
visitors map[string]Visitor
|
||||
|
||||
// control connection
|
||||
conn frpNet.Conn
|
||||
@ -84,7 +84,7 @@ type Control struct {
|
||||
log.Logger
|
||||
}
|
||||
|
||||
func NewControl(svr *Service, pxyCfgs map[string]config.ProxyConf, vistorCfgs map[string]config.ProxyConf) *Control {
|
||||
func NewControl(svr *Service, pxyCfgs map[string]config.ProxyConf, visitorCfgs map[string]config.ProxyConf) *Control {
|
||||
loginMsg := &msg.Login{
|
||||
Arch: runtime.GOARCH,
|
||||
Os: runtime.GOOS,
|
||||
@ -93,16 +93,16 @@ func NewControl(svr *Service, pxyCfgs map[string]config.ProxyConf, vistorCfgs ma
|
||||
Version: version.Full(),
|
||||
}
|
||||
return &Control{
|
||||
svr: svr,
|
||||
loginMsg: loginMsg,
|
||||
pxyCfgs: pxyCfgs,
|
||||
vistorCfgs: vistorCfgs,
|
||||
proxies: make(map[string]Proxy),
|
||||
vistors: make(map[string]Vistor),
|
||||
sendCh: make(chan msg.Message, 10),
|
||||
readCh: make(chan msg.Message, 10),
|
||||
closedCh: make(chan int),
|
||||
Logger: log.NewPrefixLogger(""),
|
||||
svr: svr,
|
||||
loginMsg: loginMsg,
|
||||
pxyCfgs: pxyCfgs,
|
||||
visitorCfgs: visitorCfgs,
|
||||
proxies: make(map[string]Proxy),
|
||||
visitors: make(map[string]Visitor),
|
||||
sendCh: make(chan msg.Message, 10),
|
||||
readCh: make(chan msg.Message, 10),
|
||||
closedCh: make(chan int),
|
||||
Logger: log.NewPrefixLogger(""),
|
||||
}
|
||||
}
|
||||
|
||||
@ -137,16 +137,16 @@ func (ctl *Control) Run() (err error) {
|
||||
go ctl.writer()
|
||||
go ctl.reader()
|
||||
|
||||
// start all local vistors
|
||||
for _, cfg := range ctl.vistorCfgs {
|
||||
vistor := NewVistor(ctl, cfg)
|
||||
err = vistor.Run()
|
||||
// start all local visitors
|
||||
for _, cfg := range ctl.visitorCfgs {
|
||||
visitor := NewVisitor(ctl, cfg)
|
||||
err = visitor.Run()
|
||||
if err != nil {
|
||||
vistor.Warn("start error: %v", err)
|
||||
visitor.Warn("start error: %v", err)
|
||||
continue
|
||||
}
|
||||
ctl.vistors[cfg.GetName()] = vistor
|
||||
vistor.Info("start vistor success")
|
||||
ctl.visitors[cfg.GetName()] = visitor
|
||||
visitor.Info("start visitor success")
|
||||
}
|
||||
|
||||
// send NewProxy message for all configured proxies
|
||||
@ -441,17 +441,17 @@ func (ctl *Control) controler() {
|
||||
}
|
||||
}
|
||||
|
||||
for _, cfg := range ctl.vistorCfgs {
|
||||
if _, exist := ctl.vistors[cfg.GetName()]; !exist {
|
||||
ctl.Info("try to start vistor [%s]", cfg.GetName())
|
||||
vistor := NewVistor(ctl, cfg)
|
||||
err = vistor.Run()
|
||||
for _, cfg := range ctl.visitorCfgs {
|
||||
if _, exist := ctl.visitors[cfg.GetName()]; !exist {
|
||||
ctl.Info("try to start visitor [%s]", cfg.GetName())
|
||||
visitor := NewVisitor(ctl, cfg)
|
||||
err = visitor.Run()
|
||||
if err != nil {
|
||||
vistor.Warn("start error: %v", err)
|
||||
visitor.Warn("start error: %v", err)
|
||||
continue
|
||||
}
|
||||
ctl.vistors[cfg.GetName()] = vistor
|
||||
vistor.Info("start vistor success")
|
||||
ctl.visitors[cfg.GetName()] = visitor
|
||||
visitor.Info("start visitor success")
|
||||
}
|
||||
}
|
||||
ctl.mu.RUnlock()
|
||||
@ -549,7 +549,7 @@ func (ctl *Control) getProxyConf(name string) (conf config.ProxyConf, ok bool) {
|
||||
return
|
||||
}
|
||||
|
||||
func (ctl *Control) reloadConf(pxyCfgs map[string]config.ProxyConf, vistorCfgs map[string]config.ProxyConf) {
|
||||
func (ctl *Control) reloadConf(pxyCfgs map[string]config.ProxyConf, visitorCfgs map[string]config.ProxyConf) {
|
||||
ctl.mu.Lock()
|
||||
defer ctl.mu.Unlock()
|
||||
|
||||
@ -588,35 +588,35 @@ func (ctl *Control) reloadConf(pxyCfgs map[string]config.ProxyConf, vistorCfgs m
|
||||
}
|
||||
ctl.Info("proxy added: %v", addedPxyNames)
|
||||
|
||||
removedVistorName := make([]string, 0)
|
||||
for name, oldVistorCfg := range ctl.vistorCfgs {
|
||||
removedVisitorName := make([]string, 0)
|
||||
for name, oldVisitorCfg := range ctl.visitorCfgs {
|
||||
del := false
|
||||
cfg, ok := vistorCfgs[name]
|
||||
cfg, ok := visitorCfgs[name]
|
||||
if !ok {
|
||||
del = true
|
||||
} else {
|
||||
if !oldVistorCfg.Compare(cfg) {
|
||||
if !oldVisitorCfg.Compare(cfg) {
|
||||
del = true
|
||||
}
|
||||
}
|
||||
|
||||
if del {
|
||||
removedVistorName = append(removedVistorName, name)
|
||||
delete(ctl.vistorCfgs, name)
|
||||
if vistor, ok := ctl.vistors[name]; ok {
|
||||
vistor.Close()
|
||||
removedVisitorName = append(removedVisitorName, name)
|
||||
delete(ctl.visitorCfgs, name)
|
||||
if visitor, ok := ctl.visitors[name]; ok {
|
||||
visitor.Close()
|
||||
}
|
||||
delete(ctl.vistors, name)
|
||||
delete(ctl.visitors, name)
|
||||
}
|
||||
}
|
||||
ctl.Info("vistor removed: %v", removedVistorName)
|
||||
ctl.Info("visitor removed: %v", removedVisitorName)
|
||||
|
||||
addedVistorName := make([]string, 0)
|
||||
for name, vistorCfg := range vistorCfgs {
|
||||
if _, ok := ctl.vistorCfgs[name]; !ok {
|
||||
ctl.vistorCfgs[name] = vistorCfg
|
||||
addedVistorName = append(addedVistorName, name)
|
||||
addedVisitorName := make([]string, 0)
|
||||
for name, visitorCfg := range visitorCfgs {
|
||||
if _, ok := ctl.visitorCfgs[name]; !ok {
|
||||
ctl.visitorCfgs[name] = visitorCfg
|
||||
addedVisitorName = append(addedVisitorName, name)
|
||||
}
|
||||
}
|
||||
ctl.Info("vistor added: %v", addedVistorName)
|
||||
ctl.Info("visitor added: %v", addedVisitorName)
|
||||
}
|
||||
|
@ -273,23 +273,23 @@ func (pxy *XtcpProxy) InWorkConn(conn frpNet.Conn) {
|
||||
clientConn.Close()
|
||||
pxy.Trace("get natHoleRespMsg, sid [%s], client address [%s]", natHoleRespMsg.Sid, natHoleRespMsg.ClientAddr)
|
||||
|
||||
// Send sid to vistor udp address.
|
||||
// Send sid to visitor udp address.
|
||||
time.Sleep(time.Second)
|
||||
laddr, _ := net.ResolveUDPAddr("udp", clientConn.LocalAddr().String())
|
||||
daddr, err := net.ResolveUDPAddr("udp", natHoleRespMsg.VistorAddr)
|
||||
daddr, err := net.ResolveUDPAddr("udp", natHoleRespMsg.VisitorAddr)
|
||||
if err != nil {
|
||||
pxy.Error("resolve vistor udp address error: %v", err)
|
||||
pxy.Error("resolve visitor udp address error: %v", err)
|
||||
return
|
||||
}
|
||||
|
||||
lConn, err := net.DialUDP("udp", laddr, daddr)
|
||||
if err != nil {
|
||||
pxy.Error("dial vistor udp address error: %v", err)
|
||||
pxy.Error("dial visitor udp address error: %v", err)
|
||||
return
|
||||
}
|
||||
lConn.Write([]byte(natHoleRespMsg.Sid))
|
||||
|
||||
kcpConn, err := frpNet.NewKcpConnFromUdp(lConn, true, natHoleRespMsg.VistorAddr)
|
||||
kcpConn, err := frpNet.NewKcpConnFromUdp(lConn, true, natHoleRespMsg.VisitorAddr)
|
||||
if err != nil {
|
||||
pxy.Error("create kcp connection from udp connection error: %v", err)
|
||||
return
|
||||
|
@ -26,11 +26,11 @@ type Service struct {
|
||||
closedCh chan int
|
||||
}
|
||||
|
||||
func NewService(pxyCfgs map[string]config.ProxyConf, vistorCfgs map[string]config.ProxyConf) (svr *Service) {
|
||||
func NewService(pxyCfgs map[string]config.ProxyConf, visitorCfgs map[string]config.ProxyConf) (svr *Service) {
|
||||
svr = &Service{
|
||||
closedCh: make(chan int),
|
||||
}
|
||||
ctl := NewControl(svr, pxyCfgs, vistorCfgs)
|
||||
ctl := NewControl(svr, pxyCfgs, visitorCfgs)
|
||||
svr.ctl = ctl
|
||||
return
|
||||
}
|
||||
|
@ -35,34 +35,34 @@ import (
|
||||
"github.com/fatedier/frp/utils/util"
|
||||
)
|
||||
|
||||
// Vistor is used for forward traffics from local port tot remote service.
|
||||
type Vistor interface {
|
||||
// Visitor is used for forward traffics from local port tot remote service.
|
||||
type Visitor interface {
|
||||
Run() error
|
||||
Close()
|
||||
log.Logger
|
||||
}
|
||||
|
||||
func NewVistor(ctl *Control, pxyConf config.ProxyConf) (vistor Vistor) {
|
||||
baseVistor := BaseVistor{
|
||||
func NewVisitor(ctl *Control, pxyConf config.ProxyConf) (visitor Visitor) {
|
||||
baseVisitor := BaseVisitor{
|
||||
ctl: ctl,
|
||||
Logger: log.NewPrefixLogger(pxyConf.GetName()),
|
||||
}
|
||||
switch cfg := pxyConf.(type) {
|
||||
case *config.StcpProxyConf:
|
||||
vistor = &StcpVistor{
|
||||
BaseVistor: baseVistor,
|
||||
cfg: cfg,
|
||||
visitor = &StcpVisitor{
|
||||
BaseVisitor: baseVisitor,
|
||||
cfg: cfg,
|
||||
}
|
||||
case *config.XtcpProxyConf:
|
||||
vistor = &XtcpVistor{
|
||||
BaseVistor: baseVistor,
|
||||
cfg: cfg,
|
||||
visitor = &XtcpVisitor{
|
||||
BaseVisitor: baseVisitor,
|
||||
cfg: cfg,
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
type BaseVistor struct {
|
||||
type BaseVisitor struct {
|
||||
ctl *Control
|
||||
l frpNet.Listener
|
||||
closed bool
|
||||
@ -70,13 +70,13 @@ type BaseVistor struct {
|
||||
log.Logger
|
||||
}
|
||||
|
||||
type StcpVistor struct {
|
||||
BaseVistor
|
||||
type StcpVisitor struct {
|
||||
BaseVisitor
|
||||
|
||||
cfg *config.StcpProxyConf
|
||||
}
|
||||
|
||||
func (sv *StcpVistor) Run() (err error) {
|
||||
func (sv *StcpVisitor) Run() (err error) {
|
||||
sv.l, err = frpNet.ListenTcp(sv.cfg.BindAddr, int64(sv.cfg.BindPort))
|
||||
if err != nil {
|
||||
return
|
||||
@ -86,11 +86,11 @@ func (sv *StcpVistor) Run() (err error) {
|
||||
return
|
||||
}
|
||||
|
||||
func (sv *StcpVistor) Close() {
|
||||
func (sv *StcpVisitor) Close() {
|
||||
sv.l.Close()
|
||||
}
|
||||
|
||||
func (sv *StcpVistor) worker() {
|
||||
func (sv *StcpVisitor) worker() {
|
||||
for {
|
||||
conn, err := sv.l.Accept()
|
||||
if err != nil {
|
||||
@ -102,46 +102,46 @@ func (sv *StcpVistor) worker() {
|
||||
}
|
||||
}
|
||||
|
||||
func (sv *StcpVistor) handleConn(userConn frpNet.Conn) {
|
||||
func (sv *StcpVisitor) handleConn(userConn frpNet.Conn) {
|
||||
defer userConn.Close()
|
||||
|
||||
sv.Debug("get a new stcp user connection")
|
||||
vistorConn, err := sv.ctl.connectServer()
|
||||
visitorConn, err := sv.ctl.connectServer()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
defer vistorConn.Close()
|
||||
defer visitorConn.Close()
|
||||
|
||||
now := time.Now().Unix()
|
||||
newVistorConnMsg := &msg.NewVistorConn{
|
||||
newVisitorConnMsg := &msg.NewVisitorConn{
|
||||
ProxyName: sv.cfg.ServerName,
|
||||
SignKey: util.GetAuthKey(sv.cfg.Sk, now),
|
||||
Timestamp: now,
|
||||
UseEncryption: sv.cfg.UseEncryption,
|
||||
UseCompression: sv.cfg.UseCompression,
|
||||
}
|
||||
err = msg.WriteMsg(vistorConn, newVistorConnMsg)
|
||||
err = msg.WriteMsg(visitorConn, newVisitorConnMsg)
|
||||
if err != nil {
|
||||
sv.Warn("send newVistorConnMsg to server error: %v", err)
|
||||
sv.Warn("send newVisitorConnMsg to server error: %v", err)
|
||||
return
|
||||
}
|
||||
|
||||
var newVistorConnRespMsg msg.NewVistorConnResp
|
||||
vistorConn.SetReadDeadline(time.Now().Add(10 * time.Second))
|
||||
err = msg.ReadMsgInto(vistorConn, &newVistorConnRespMsg)
|
||||
var newVisitorConnRespMsg msg.NewVisitorConnResp
|
||||
visitorConn.SetReadDeadline(time.Now().Add(10 * time.Second))
|
||||
err = msg.ReadMsgInto(visitorConn, &newVisitorConnRespMsg)
|
||||
if err != nil {
|
||||
sv.Warn("get newVistorConnRespMsg error: %v", err)
|
||||
sv.Warn("get newVisitorConnRespMsg error: %v", err)
|
||||
return
|
||||
}
|
||||
vistorConn.SetReadDeadline(time.Time{})
|
||||
visitorConn.SetReadDeadline(time.Time{})
|
||||
|
||||
if newVistorConnRespMsg.Error != "" {
|
||||
sv.Warn("start new vistor connection error: %s", newVistorConnRespMsg.Error)
|
||||
if newVisitorConnRespMsg.Error != "" {
|
||||
sv.Warn("start new visitor connection error: %s", newVisitorConnRespMsg.Error)
|
||||
return
|
||||
}
|
||||
|
||||
var remote io.ReadWriteCloser
|
||||
remote = vistorConn
|
||||
remote = visitorConn
|
||||
if sv.cfg.UseEncryption {
|
||||
remote, err = frpIo.WithEncryption(remote, []byte(sv.cfg.Sk))
|
||||
if err != nil {
|
||||
@ -157,13 +157,13 @@ func (sv *StcpVistor) handleConn(userConn frpNet.Conn) {
|
||||
frpIo.Join(userConn, remote)
|
||||
}
|
||||
|
||||
type XtcpVistor struct {
|
||||
BaseVistor
|
||||
type XtcpVisitor struct {
|
||||
BaseVisitor
|
||||
|
||||
cfg *config.XtcpProxyConf
|
||||
}
|
||||
|
||||
func (sv *XtcpVistor) Run() (err error) {
|
||||
func (sv *XtcpVisitor) Run() (err error) {
|
||||
sv.l, err = frpNet.ListenTcp(sv.cfg.BindAddr, int64(sv.cfg.BindPort))
|
||||
if err != nil {
|
||||
return
|
||||
@ -173,11 +173,11 @@ func (sv *XtcpVistor) Run() (err error) {
|
||||
return
|
||||
}
|
||||
|
||||
func (sv *XtcpVistor) Close() {
|
||||
func (sv *XtcpVisitor) Close() {
|
||||
sv.l.Close()
|
||||
}
|
||||
|
||||
func (sv *XtcpVistor) worker() {
|
||||
func (sv *XtcpVisitor) worker() {
|
||||
for {
|
||||
conn, err := sv.l.Accept()
|
||||
if err != nil {
|
||||
@ -189,7 +189,7 @@ func (sv *XtcpVistor) worker() {
|
||||
}
|
||||
}
|
||||
|
||||
func (sv *XtcpVistor) handleConn(userConn frpNet.Conn) {
|
||||
func (sv *XtcpVisitor) handleConn(userConn frpNet.Conn) {
|
||||
defer userConn.Close()
|
||||
|
||||
sv.Debug("get a new xtcp user connection")
|
||||
@ -200,26 +200,26 @@ func (sv *XtcpVistor) handleConn(userConn frpNet.Conn) {
|
||||
|
||||
raddr, err := net.ResolveUDPAddr("udp",
|
||||
fmt.Sprintf("%s:%d", config.ClientCommonCfg.ServerAddr, config.ClientCommonCfg.ServerUdpPort))
|
||||
vistorConn, err := net.DialUDP("udp", nil, raddr)
|
||||
defer vistorConn.Close()
|
||||
visitorConn, err := net.DialUDP("udp", nil, raddr)
|
||||
defer visitorConn.Close()
|
||||
|
||||
now := time.Now().Unix()
|
||||
natHoleVistorMsg := &msg.NatHoleVistor{
|
||||
natHoleVisitorMsg := &msg.NatHoleVisitor{
|
||||
ProxyName: sv.cfg.ServerName,
|
||||
SignKey: util.GetAuthKey(sv.cfg.Sk, now),
|
||||
Timestamp: now,
|
||||
}
|
||||
err = msg.WriteMsg(vistorConn, natHoleVistorMsg)
|
||||
err = msg.WriteMsg(visitorConn, natHoleVisitorMsg)
|
||||
if err != nil {
|
||||
sv.Warn("send natHoleVistorMsg to server error: %v", err)
|
||||
sv.Warn("send natHoleVisitorMsg to server error: %v", err)
|
||||
return
|
||||
}
|
||||
|
||||
// Wait for client address at most 10 seconds.
|
||||
var natHoleRespMsg msg.NatHoleResp
|
||||
vistorConn.SetReadDeadline(time.Now().Add(10 * time.Second))
|
||||
visitorConn.SetReadDeadline(time.Now().Add(10 * time.Second))
|
||||
buf := pool.GetBuf(1024)
|
||||
n, err := vistorConn.Read(buf)
|
||||
n, err := visitorConn.Read(buf)
|
||||
if err != nil {
|
||||
sv.Warn("get natHoleRespMsg error: %v", err)
|
||||
return
|
||||
@ -230,13 +230,13 @@ func (sv *XtcpVistor) handleConn(userConn frpNet.Conn) {
|
||||
sv.Warn("get natHoleRespMsg error: %v", err)
|
||||
return
|
||||
}
|
||||
vistorConn.SetReadDeadline(time.Time{})
|
||||
visitorConn.SetReadDeadline(time.Time{})
|
||||
pool.PutBuf(buf)
|
||||
|
||||
sv.Trace("get natHoleRespMsg, sid [%s], client address [%s]", natHoleRespMsg.Sid, natHoleRespMsg.ClientAddr)
|
||||
|
||||
// Close vistorConn, so we can use it's local address.
|
||||
vistorConn.Close()
|
||||
// Close visitorConn, so we can use it's local address.
|
||||
visitorConn.Close()
|
||||
|
||||
// Send detect message.
|
||||
array := strings.Split(natHoleRespMsg.ClientAddr, ":")
|
||||
@ -244,7 +244,7 @@ func (sv *XtcpVistor) handleConn(userConn frpNet.Conn) {
|
||||
sv.Error("get natHoleResp client address error: %s", natHoleRespMsg.ClientAddr)
|
||||
return
|
||||
}
|
||||
laddr, _ := net.ResolveUDPAddr("udp", vistorConn.LocalAddr().String())
|
||||
laddr, _ := net.ResolveUDPAddr("udp", visitorConn.LocalAddr().String())
|
||||
/*
|
||||
for i := 1000; i < 65000; i++ {
|
||||
sv.sendDetectMsg(array[0], int64(i), laddr, "a")
|
||||
@ -258,7 +258,7 @@ func (sv *XtcpVistor) handleConn(userConn frpNet.Conn) {
|
||||
sv.sendDetectMsg(array[0], int64(port), laddr, []byte(natHoleRespMsg.Sid))
|
||||
sv.Trace("send all detect msg done")
|
||||
|
||||
// Listen for vistorConn's address and wait for client connection.
|
||||
// Listen for visitorConn's address and wait for client connection.
|
||||
lConn, _ := net.ListenUDP("udp", laddr)
|
||||
lConn.SetReadDeadline(time.Now().Add(5 * time.Second))
|
||||
sidBuf := pool.GetBuf(1024)
|
||||
@ -298,7 +298,7 @@ func (sv *XtcpVistor) handleConn(userConn frpNet.Conn) {
|
||||
sv.Debug("join connections closed")
|
||||
}
|
||||
|
||||
func (sv *XtcpVistor) sendDetectMsg(addr string, port int64, laddr *net.UDPAddr, content []byte) (err error) {
|
||||
func (sv *XtcpVisitor) sendDetectMsg(addr string, port int64, laddr *net.UDPAddr, content []byte) (err error) {
|
||||
daddr, err := net.ResolveUDPAddr("udp", fmt.Sprintf("%s:%d", addr, port))
|
||||
if err != nil {
|
||||
return err
|
Reference in New Issue
Block a user