(下面内容自己写完后拿AI整理了一下)
基于FRP+OpenResty实现双层防护的反向代理方案
一、方案概述
本方案通过FRP服务端安全配置结合OpenResty动态白名单机制,构建双重安全防护体系:
- 第一层防护:FRPS代理绑定地址隔离
- 第二层防护:动态IP白名单认证
优势:无需额外部署穿透软件,通过反向代理实现服务隐藏与访问控制
二、FRPS安全配置
1. 核心配置项说明
# frps.toml
bindPort = 57000
auth.token = "xxxxxxxxxxxxx" # FRPS-FRPC通信密钥
bindAddr = "0.0.0.0" # 服务监听地址
proxyBindAddr = "127.0.0.1" # 关键安全配置(默认同bindAddr)
2. 安全隔离原理
- 将
proxyBindAddr
设置为127.0.0.1后:- 禁止外部直接访问FRPC设置的remotePort
- 服务仅限本机进程访问
- 需配合反向代理实现外部访问
三、OpenResty反向代理层
1. 环境选型
选用OpenResty(基于Nginx的增强发行版):
- 完整兼容Nginx配置语法
- 支持Lua脚本扩展功能
- 可实现动态访问控制逻辑
2. 全局配置
# nginx.conf
http {
lua_shared_dict ip_whitelist 10m; # 创建共享内存区存储白名单
# ... 其他基础配置
}
3. 服务代理配置示例(以Emby服务为例)
server {
listen 50001;
# 认证接口:访问 http://your_ip:58096/auth?password=xxxxxx
location /auth {
content_by_lua_block {
ngx.header["Content-Type"] = "text/plain; charset=utf-8";
local args = ngx.req.get_uri_args()
local password = args.password
if password == "xxxxxx" then
local ip = ngx.var.remote_addr
ngx.shared.ip_whitelist:set(ip, true, 21600) -- 有效期6小时
ngx.say("Authorized IP: " .. ip)
else
ngx.status = 403
ngx.say("Forbidden: Incorrect password.")
end
}
}
# 代理 Emby 的所有请求
location / {
# ip验证
access_by_lua_block {
local ip = ngx.var.remote_addr
local allowed = ngx.shared.ip_whitelist:get(ip)
if not allowed then
ngx.status = 403
ngx.say("Forbidden: 403")
return ngx.exit(403)
end
}
proxy_pass http://127.0.0.1:8096;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_set_header Connection "";
# WebSocket support for Emby
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
四、安全机制说明
防护层级 | 实现方式 | 防护效果 |
---|---|---|
第一层 | FRPS proxyBindAddr隔离 | 阻止直接端口扫描和未授权访问 |
第二层 | OpenResty动态IP白名单 | 通过密码认证实现精准IP访问控制 |
增强特性 | 6小时有效期机制 | 平衡安全性与使用便捷性 |
五、方案优势
- 端口隐藏:服务不直接暴露在公网
- 双重验证:FRPS令牌+动态IP白名单
- 协议兼容:完整支持HTTP/WebSocket等协议代理
六、使用说明
- 首次访问:在浏览器中访问
http://your_server_ip:50001/auth?password=your_strong_password
- 授权成功:如果密码正确,您的当前 IP 地址将被添加到白名单中,有效期为 6 小时(可根据需求在 Lua 脚本中调整
21600
这个值)。 - 访问服务:之后,您可以直接通过
http://your_server_ip:50001
访问由 frp 代理的服务(例如 Emby)。 - 白名单失效:6 小时后,或当您的 IP 地址发生变化时,您需要重新通过
/auth
接口进行认证。