分享下个人frp和nginx的简单安全方案

(下面内容自己写完后拿AI整理了一下)


基于FRP+OpenResty实现双层防护的反向代理方案

一、方案概述

本方案通过FRP服务端安全配置结合OpenResty动态白名单机制,构建双重安全防护体系:

  1. 第一层防护:FRPS代理绑定地址隔离
  2. 第二层防护:动态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小时有效期机制 平衡安全性与使用便捷性

五、方案优势

  1. 端口隐藏:服务不直接暴露在公网
  2. 双重验证:FRPS令牌+动态IP白名单
  3. 协议兼容:完整支持HTTP/WebSocket等协议代理

六、使用说明

  1. 首次访问:在浏览器中访问 http://your_server_ip:50001/auth?password=your_strong_password
  2. 授权成功:如果密码正确,您的当前 IP 地址将被添加到白名单中,有效期为 6 小时(可根据需求在 Lua 脚本中调整 21600 这个值)。
  3. 访问服务:之后,您可以直接通过 http://your_server_ip:50001 访问由 frp 代理的服务(例如 Emby)。
  4. 白名单失效:6 小时后,或当您的 IP 地址发生变化时,您需要重新通过 /auth 接口进行认证。
19 Likes

大佬强,学习一下

1 Like

ssh 有啥安全点的方案吗?

1 Like

stcp

ssh改用秘钥登录, 使用stream 反带, 再加上我这个方案的验证呗, 感觉差不多了

太强了,大佬

不是大佬, 跟佬友交流交流

frp的https我都还没玩明白呢:tieba_009:

通过openVPN+自签名密钥证书文件+账号密码,然后ssh服务器开发openVPN的ip白名单方式访问,安全性够吗?

可以试试 我的frp加反代 安全内网穿透 互相学习

# FRP服务端
bash <(curl -sL kejilion.sh) frps
# FRP客户端
bash <(curl -sL kejilion.sh) frpc

服务端和客户端 看看是否够安全

厉害的,但是看不懂

感谢佬友分享

此话题已在最后回复的 30 天后被自动关闭。不再允许新回复。