|
@@ -58,6 +58,9 @@ type Service struct {
|
|
|
|
|
|
// Manage all vistor listeners.
|
|
|
vistorManager *VistorManager
|
|
|
+
|
|
|
+ // Controller for nat hole connections.
|
|
|
+ natHoleController *NatHoleController
|
|
|
}
|
|
|
|
|
|
func NewService() (svr *Service, err error) {
|
|
@@ -66,36 +69,37 @@ func NewService() (svr *Service, err error) {
|
|
|
pxyManager: NewProxyManager(),
|
|
|
vistorManager: NewVistorManager(),
|
|
|
}
|
|
|
+ cfg := config.ServerCommonCfg
|
|
|
|
|
|
// Init assets.
|
|
|
- err = assets.Load(config.ServerCommonCfg.AssetsDir)
|
|
|
+ err = assets.Load(cfg.AssetsDir)
|
|
|
if err != nil {
|
|
|
err = fmt.Errorf("Load assets error: %v", err)
|
|
|
return
|
|
|
}
|
|
|
|
|
|
// Listen for accepting connections from client.
|
|
|
- svr.listener, err = frpNet.ListenTcp(config.ServerCommonCfg.BindAddr, config.ServerCommonCfg.BindPort)
|
|
|
+ svr.listener, err = frpNet.ListenTcp(cfg.BindAddr, cfg.BindPort)
|
|
|
if err != nil {
|
|
|
err = fmt.Errorf("Create server listener error, %v", err)
|
|
|
return
|
|
|
}
|
|
|
- log.Info("frps tcp listen on %s:%d", config.ServerCommonCfg.BindAddr, config.ServerCommonCfg.BindPort)
|
|
|
+ log.Info("frps tcp listen on %s:%d", cfg.BindAddr, cfg.BindPort)
|
|
|
|
|
|
// Listen for accepting connections from client using kcp protocol.
|
|
|
- if config.ServerCommonCfg.KcpBindPort > 0 {
|
|
|
- svr.kcpListener, err = frpNet.ListenKcp(config.ServerCommonCfg.BindAddr, config.ServerCommonCfg.KcpBindPort)
|
|
|
+ if cfg.KcpBindPort > 0 {
|
|
|
+ svr.kcpListener, err = frpNet.ListenKcp(cfg.BindAddr, cfg.KcpBindPort)
|
|
|
if err != nil {
|
|
|
- err = fmt.Errorf("Listen on kcp address udp [%s:%d] error: %v", config.ServerCommonCfg.BindAddr, config.ServerCommonCfg.KcpBindPort, err)
|
|
|
+ err = fmt.Errorf("Listen on kcp address udp [%s:%d] error: %v", cfg.BindAddr, cfg.KcpBindPort, err)
|
|
|
return
|
|
|
}
|
|
|
- log.Info("frps kcp listen on udp %s:%d", config.ServerCommonCfg.BindAddr, config.ServerCommonCfg.BindPort)
|
|
|
+ log.Info("frps kcp listen on udp %s:%d", cfg.BindAddr, cfg.BindPort)
|
|
|
}
|
|
|
|
|
|
// Create http vhost muxer.
|
|
|
- if config.ServerCommonCfg.VhostHttpPort > 0 {
|
|
|
+ if cfg.VhostHttpPort > 0 {
|
|
|
var l frpNet.Listener
|
|
|
- l, err = frpNet.ListenTcp(config.ServerCommonCfg.ProxyBindAddr, config.ServerCommonCfg.VhostHttpPort)
|
|
|
+ l, err = frpNet.ListenTcp(cfg.ProxyBindAddr, cfg.VhostHttpPort)
|
|
|
if err != nil {
|
|
|
err = fmt.Errorf("Create vhost http listener error, %v", err)
|
|
|
return
|
|
@@ -105,13 +109,13 @@ func NewService() (svr *Service, err error) {
|
|
|
err = fmt.Errorf("Create vhost httpMuxer error, %v", err)
|
|
|
return
|
|
|
}
|
|
|
- log.Info("http service listen on %s:%d", config.ServerCommonCfg.ProxyBindAddr, config.ServerCommonCfg.VhostHttpPort)
|
|
|
+ log.Info("http service listen on %s:%d", cfg.ProxyBindAddr, cfg.VhostHttpPort)
|
|
|
}
|
|
|
|
|
|
// Create https vhost muxer.
|
|
|
- if config.ServerCommonCfg.VhostHttpsPort > 0 {
|
|
|
+ if cfg.VhostHttpsPort > 0 {
|
|
|
var l frpNet.Listener
|
|
|
- l, err = frpNet.ListenTcp(config.ServerCommonCfg.ProxyBindAddr, config.ServerCommonCfg.VhostHttpsPort)
|
|
|
+ l, err = frpNet.ListenTcp(cfg.ProxyBindAddr, cfg.VhostHttpsPort)
|
|
|
if err != nil {
|
|
|
err = fmt.Errorf("Create vhost https listener error, %v", err)
|
|
|
return
|
|
@@ -121,22 +125,38 @@ func NewService() (svr *Service, err error) {
|
|
|
err = fmt.Errorf("Create vhost httpsMuxer error, %v", err)
|
|
|
return
|
|
|
}
|
|
|
- log.Info("https service listen on %s:%d", config.ServerCommonCfg.ProxyBindAddr, config.ServerCommonCfg.VhostHttpsPort)
|
|
|
+ log.Info("https service listen on %s:%d", cfg.ProxyBindAddr, cfg.VhostHttpsPort)
|
|
|
+ }
|
|
|
+
|
|
|
+ // Create nat hole controller.
|
|
|
+ if cfg.BindUdpPort > 0 {
|
|
|
+ var nc *NatHoleController
|
|
|
+ addr := fmt.Sprintf("%s:%d", cfg.BindAddr, cfg.BindUdpPort)
|
|
|
+ nc, err = NewNatHoleController(addr)
|
|
|
+ if err != nil {
|
|
|
+ err = fmt.Errorf("Create nat hole controller error, %v", err)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ svr.natHoleController = nc
|
|
|
+ log.Info("nat hole udp service listen on %s:%d", cfg.BindAddr, cfg.BindUdpPort)
|
|
|
}
|
|
|
|
|
|
// Create dashboard web server.
|
|
|
- if config.ServerCommonCfg.DashboardPort > 0 {
|
|
|
- err = RunDashboardServer(config.ServerCommonCfg.BindAddr, config.ServerCommonCfg.DashboardPort)
|
|
|
+ if cfg.DashboardPort > 0 {
|
|
|
+ err = RunDashboardServer(cfg.BindAddr, cfg.DashboardPort)
|
|
|
if err != nil {
|
|
|
err = fmt.Errorf("Create dashboard web server error, %v", err)
|
|
|
return
|
|
|
}
|
|
|
- log.Info("Dashboard listen on %s:%d", config.ServerCommonCfg.BindAddr, config.ServerCommonCfg.DashboardPort)
|
|
|
+ log.Info("Dashboard listen on %s:%d", cfg.BindAddr, cfg.DashboardPort)
|
|
|
}
|
|
|
return
|
|
|
}
|
|
|
|
|
|
func (svr *Service) Run() {
|
|
|
+ if svr.natHoleController != nil {
|
|
|
+ go svr.natHoleController.Run()
|
|
|
+ }
|
|
|
if config.ServerCommonCfg.KcpBindPort > 0 {
|
|
|
go svr.HandleListener(svr.kcpListener)
|
|
|
}
|