之前用 frp,主要是为了把 NAS 上的服务映射到公网。
最近又多了一个需求:公司内网有一台测试数据库,平时系统工程师升级调试、自己做功能验证时都会用到。
如果直接把数据库端口映射到公网,风险太高,所以改用 frp 的 stcp 模式。
stcp 是什么
stcp 全称 Secret TCP,可以理解成一种“需要双方都持有密钥才能建立”的内网隧道。
和普通 tcp 代理不同的是:
普通 tcp 代理会在 frps 上监听一个端口,任何人知道地址和端口都可能尝试连接;
stcp 不会在 frps 上直接暴露业务端口;
只有配置了相同 secretKey 的访问端,才能通过 frps 与被控端建立连接。
简单说,就是 frps 只做中转,不直接对外开放数据库端口。
基本思路
整体链路可以理解为:
本地访问端 → frps → 内网被控端 → 本地数据库
内网防火墙侧只需要允许被控主机访问 VPS 上的 frps 端口,其他端口保持关闭。
这样即使 VPS IP 被知道,也不会直接暴露数据库服务。
frps 配置
frps 端保持正常配置即可,重点注意几点:
不要使用默认端口;
auth.token 要使用足够复杂的字符串;
如果开启 Dashboard,需要限制访问来源并设置强密码;
建议开启 TLS,避免连接过程被窃听。
在被控主机上部署 frpc,配置文件大致如下:
serverAddr = "<frps服务器地址>"
serverPort = <frps端口>
auth.token = "<与frps一致的token>"
[transport]
tls.enable = true
tcpMux = true
tls.trustedCaFile = "./ca.crt"
[[proxies]]
name = "internal-db"
type = "stcp"
secretKey = "<独立生成的复杂密钥>"
localIP = "127.0.0.1"
localPort = <数据库端口>注意:
secretKey 不要和 auth.token 相同;
localIP 如果被控端需要代理其他主机,可以改成被控端能访问到的内网 IP;
localPort 根据实际数据库端口修改;
如果 frps 使用了自签证书,需要在被控端配置 tls.trustedCaFile。
启动命令:frpc.exe -c ./frpc.toml
本地访问端配置
访问端同样需要部署 frpc,但节点类型要使用 visitors:
serverAddr = "<frps服务器地址>"
serverPort = <frps端口>
auth.token = "<与frps一致的token>"
[transport]
tls.enable = true
tcpMux = true
tls.trustedCaFile = "./ca.crt"
[[visitors]]
name = "visit-db"
type = "stcp"
serverName = "internal-db"
secretKey = "<与被控端一致的密钥>"
bindPort = <本地空闲端口>启动后,本地访问 127.0.0.1:<本地空闲端口>就可以连接到内网数据库。
给同事使用时要注意什么
如果工程师也需要访问,不建议直接把 frpc.toml 文件通过聊天工具、邮件或网盘发送。因为配置文件里包含 auth.token 和 secretKey,一旦泄露,别人就可能通过你的 frps 建立隧道。
更稳妥的做法是:
只发送非敏感字段;
secretKey 通过单独渠道告知;
或者使用加密压缩包分发;
不同访问端使用不同的 name,避免同时在线被踢下线。
安全性说明
这套组合:
frps 不直接暴露数据库端口;
使用 token 认证;
使用 TLS 加密;
stcp 需要双方持有相同密钥;
相比直接把数据库端口映射到公网,安全性明显更高。
但它并不是绝对安全。如果 token、secretKey、证书或配置文件保管不当,仍然存在被利用的可能。所以关键还是要把敏感配置当作密钥来管理,不要明文外发。
ps.这是AI脱敏后的文章内容,AI果然失去了温度啊。

评论区(2条评论)
脱敏了就没有温度啦