Browse Source

feat(udp): 添加 UDP转发代理功能

- 在 UDP 转发请求中增加 Proxy 字段,用于控制是否开启代理
- 在创建和修改 UDP转发时,根据请求中的 Proxy 设置来开启或关闭代理- 将 Proxy 服务注入到 UDP 转发服务中,以支持代理功能
fusu 4 weeks ago
parent
commit
d86175fe7b
3 changed files with 30 additions and 2 deletions
  1. 1 0
      api/v1/udpForwarding.go
  2. 2 2
      cmd/server/wire/wire_gen.go
  3. 27 0
      internal/service/udpforwarding.go

+ 1 - 0
api/v1/udpForwarding.go

@@ -6,6 +6,7 @@ type UdpForwardingDataRequest struct {
 	Port              string   `form:"port" json:"port" validate:"required,numeric,min=1,max=65535"`
 	BackendList       []string `form:"backendList" json:"backendList" validate:"required,dive,hostport"`
 	Comment           string   `form:"comment" json:"comment" validate:"max=50"`
+	Proxy             bool     `form:"proxy" json:"proxy" default:"false"`
 }
 type DeleteUdpForwardingRequest struct {
 	Ids   []int `form:"ids" json:"ids" validate:"required,min=1,dive,required"`

+ 2 - 2
cmd/server/wire/wire_gen.go

@@ -78,9 +78,9 @@ func NewWire(viperViper *viper.Viper, logger *log.Logger) (*app.App, func(), err
 	webLimitRepository := repository.NewWebLimitRepository(repositoryRepository)
 	webLimitService := service.NewWebLimitService(serviceService, webLimitRepository, requiredService, parserService, crawlerService, hostService)
 	webLimitHandler := handler.NewWebLimitHandler(handlerHandler, webLimitService)
-	tcpforwardingService := service.NewTcpforwardingService(serviceService, tcpforwardingRepository, parserService, requiredService, crawlerService, globalLimitRepository, hostRepository, wafFormatterService, cdnService)
+	tcpforwardingService := service.NewTcpforwardingService(serviceService, tcpforwardingRepository, parserService, requiredService, crawlerService, globalLimitRepository, hostRepository, wafFormatterService, cdnService, proxyService)
 	tcpforwardingHandler := handler.NewTcpforwardingHandler(handlerHandler, tcpforwardingService)
-	udpForWardingService := service.NewUdpForWardingService(serviceService, udpForWardingRepository, requiredService, parserService, crawlerService, globalLimitRepository, hostRepository, wafFormatterService, cdnService)
+	udpForWardingService := service.NewUdpForWardingService(serviceService, udpForWardingRepository, requiredService, parserService, crawlerService, globalLimitRepository, hostRepository, wafFormatterService, cdnService, proxyService)
 	udpForWardingHandler := handler.NewUdpForWardingHandler(handlerHandler, udpForWardingService)
 	tcpLimitRepository := repository.NewTcpLimitRepository(repositoryRepository)
 	tcpLimitService := service.NewTcpLimitService(serviceService, tcpLimitRepository, requiredService, parserService, crawlerService, hostService)

+ 27 - 0
internal/service/udpforwarding.go

@@ -31,6 +31,7 @@ func NewUdpForWardingService(
 	hostRep repository.HostRepository,
 	wafformatter WafFormatterService,
 	cdn CdnService,
+	proxy ProxyService,
 ) UdpForWardingService {
 	return &udpForWardingService{
 		Service:                 service,
@@ -42,6 +43,7 @@ func NewUdpForWardingService(
 		hostRep:                 hostRep,
 		wafformatter:            wafformatter,
 		cdn:                     cdn,
+		proxy:                   proxy,
 	}
 }
 
@@ -56,6 +58,7 @@ type udpForWardingService struct {
 	hostRep      repository.HostRepository
 	wafformatter WafFormatterService
 	cdn CdnService
+	proxy ProxyService
 }
 
 
@@ -197,6 +200,16 @@ func (s *udpForWardingService) AddUdpForwarding(ctx context.Context, req *v1.Udp
 	}
 
 
+	// 开启proxy
+	if req.UdpForwardingData.Proxy {
+		err = s.proxy.EditProxy(ctx,udpId, v1.ProxyProtocolJSON{
+			IsOn: true,
+			Version: 1,
+		})
+		if err != nil {
+			return err
+		}
+	}
 
 	udpModel := s.buildUdpForwardingModel(&req.UdpForwardingData, int(udpId), require)
 
@@ -259,6 +272,18 @@ func (s *udpForWardingService) EditUdpForwarding(ctx context.Context, req *v1.Ud
 		}
 	}
 
+
+	//修改Proxy
+	if oldData.Proxy != req.UdpForwardingData.Proxy {
+		err = s.proxy.EditProxy(ctx, int64(oldData.CdnWebId), v1.ProxyProtocolJSON{
+			IsOn:    req.UdpForwardingData.Proxy,
+			Version: 1,
+		})
+		if err != nil {
+			return err
+		}
+	}
+
 	// 异步任务:将IP添加到白名单
 	ipData, err := s.udpForWardingRepository.GetUdpForwardingIpsByID(ctx, req.UdpForwardingData.Id)
 	if err != nil {
@@ -324,6 +349,8 @@ func (s *udpForWardingService) EditUdpForwarding(ctx context.Context, req *v1.Ud
 	}
 
 
+
+
 	udpModel := s.buildUdpForwardingModel(&req.UdpForwardingData, oldData.CdnWebId, require)
 	udpModel.Id = req.UdpForwardingData.Id
 	if err = s.udpForWardingRepository.EditUdpForwarding(ctx, udpModel); err != nil {