go实现类似cloudflare的隐藏真实ip代理转发请求限速人机验证代码

代码语言:golang

所属分类:其他

代码描述:go实现类似cloudflare的隐藏真实ip代理转发请求限速人机验证代码,可设置url单位时间内最多访问多少次,超过就要进行验证码识别真人操作,后台真实服务器ip不对外暴露。

代码标签: go 类似 cloudflare 隐藏 真实 ip 代理 转发 请求 限速 人机 验证 代码

下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开

package main

import (
	"fmt"
	"log"
	"net/http"
	"net/http/httputil"
	"net/url"
	"sync"
	"time"

	"github.com/dchest/captcha"
	"golang.org/x/time/rate"
)

// =================================================================================================
// 配置项
// =================================================================================================

const (
	// 代理服务器监听的地址
	proxyListenAddr = ":8080"
	// 后端真实服务器的地址
	backendServerURL = "http://localhost:8081"
	// IP 在验证列表中的过期时间
	ipVerificationTimeout = 5 * time.Minute
	// 单个 URL 的访问频率: 5秒内1次
	urlRequestInterval = 5 * time.Second
)

// =================================================================================================
// IP 访问者管理
// =================================================================================================

// visitor 结构体用于存储每个 IP 对不同 URL 的速率限制器
type visitor struct {
	urlLimiters map[string]*rate.Limiter
	lastSeen    time.Time
}

// 全局变量,用于存储每个 IP 地址的访问信息
var visitors = make(map[string]*visitor)
var mu sync.Mutex

// 全局变量,用于存储需要进行人机验证的 IP 地址
var needsVerification = make(map[string]time.Time)
var verificationMutex sync.Mutex

// 获取或为特定 IP 和 URL 创建速率限制器
func getURLLimiter(ip, urlPath string) *rate.Limiter {
	mu.Lock()
	defer mu.Unlock()

	v, exists := visitors[ip]
	if !exists {
		v = &visitor{
			urlLimiters: make(map[string]*rate.Limiter),
		}
		visitors[ip] = v
	}
	v.lastSeen = time.Now()

	limiter, exists := v.urlLimiters[urlPath]
	if !exists {
		// 每 N 秒生成一个令牌,桶容量为 1
		limiter = rate.NewLimiter(rate.Every(urlRequestInterval), 1)
		v.urlLimiters[urlPath] = limiter
	}
	return limiter
}

// 定期清理不活跃的 visitor 以释放内存
func cleanupVisitors() {
	for {
		time.Sleep(1 * time.Minute)
		mu.Lock()
		for ip, v := range visitors {
	.........完整代码请登录后点击上方下载按钮下载查看

网友评论0