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