frp 算是我常用的工具,1024 趁着活动,又入了台腾讯的 VPS,国内的,也不想备案,所以拿来做FRP服务器用吧。

之前用的都是简洁配置,没太考虑安全性,这次新布置,干脆把其他几台 VPS 也升级一下,加强一下安全性吧。


首先是去 Github 下载了最新的版本,然后在宝塔里上传、解压;

然后去宝塔的终端里先把当前运行的 frp 服务停止,因为用的是 systemd

停止 frps:
systemctl stop frps

然后回到宝塔的文件管理里,把 frps 覆盖到原 frps 所在的位置。

接下来才是这次改造的重点,官方的文档有点难懂,甚至豆包都没能给出正确答案,最后还是靠千问。

frps.toml 配置

bindPort = 服务器上开放的监听端口,别忘记防火墙
auth.method = "token"
auth.token = "建议用随机密码生成器生成一组超过64位的强字符串"

transport.tls.force = true
transport.tls.certFile = "/opt/frp/certs/server.crt"
transport.tls.keyFile = "/opt/frp/certs/server.key"

# 日志
log.to = "/opt/frp/frps.log"
log.level = "info"
log.maxDays = 7

然后用脚本生成自签证书,注意一下 frps 所在的目录,以及服务器的 IP 地址

cd ~ && cat > gen_frp_cert.sh << 'EOF'
#!/bin/bash
mkdir -p /opt/frp/certs
cd /opt/frp/certs

# 1. CA 根证书
openssl genrsa -out ca.key 4096
openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 -out ca.crt -subj "/CN=frp-ca"

# 2. 服务器私钥和包含 IP SAN 的 CSR 和 CRT
openssl genrsa -out server.key 2048
openssl req -new -key server.key -out server.csr \
  -subj "/CN=frp-server" \
  -addext "subjectAltName=IP:你服务器的IP地址"

openssl x509 -req -in server.csr \
  -CA ca.crt -CAkey ca.key -CAcreateserial \
  -out server.crt -days 1825 -sha256 \
  -extfile <(printf "subjectAltName=IP:%s" "你服务器的IP地址")

chmod 600 *.key
echo "========================================="
echo "证书生成成功!位置:/opt/frp/certs/"
echo "========================================="
EOF

chmod +x gen_frp_cert.sh && bash gen_frp_cert.sh

在终端里运行上面的脚本,获取到证书后,启动 frps 服务

启动 frps:
systemctl start frps

重启 frps:
systemctl restart frps

运行后查看一下状态,看看有没有报错

查看 frps 状态:
systemctl status frps

没问题就进入下一步,先在宝塔里把 certs 目录下,刚才脚本生成的证书里的 ca.crt 下载到本本地

然后上传到 NAS 里,比如位置放在 docker/frp/certs/ca.crt

然后就是 frpc.toml 的配置

# 1. 基础连接配置(全局放在最顶部,不要加任何段头)
serverAddr = "frps服务器的IP地址"
serverPort = 之前服务器上开放的监听端口

# 登录失败是否直接退出(设为false,方便你调试连接问题)
loginFailExit = false

# 2. 传输与心跳配置(所有 transport 配置合并在这里)
[transport]
protocol = "tcp"
tcpMux = true
tcpMuxKeepaliveInterval = 30
heartbeatTimeout = 90
heartbeatInterval = 30

# TLS 安全配置(合并进上面的 transport 段)
tls.enable = true
tls.trustedCaFile = "/certs/ca.crt"
#之前就是这一步卡了好久

# 3. 身份认证配置
[auth]
method = "token"
token = "从服务器上 frps.toml 里复制过来"

# 4. 端口映射配置(注意是双中括号 [[proxies]])

[[proxies]]
name = "起个不重的名字"
type = "tcp"
localIP = "你内网服务器的IP,如果是NAS本机就用 127.0.0.1"
localPort = NAS上应用的端口
remotePort = 映射到 VPS 上的端口,别忘记 VPS 的防火墙要开放对应的端口号

[[proxies]]
name = "起个不重的名字"
type = "tcp"
localIP = "你内网服务器的IP,如果是NAS本机就用 127.0.0.1"
localPort = NAS上应用的端口
remotePort = 映射到 VPS 上的端口,别忘记 VPS 的防火墙要开放对应的端口号

运行 Docker ,网络选择 Host 模式,要留意的是挂载路径,有二个

本地 frpc.toml 所在的地址,比如 docker/frp/frpc.toml : /ect/frp/frpc.toml
本地 ca 证书所在的地址,比如 docker/frp/carts/ca.crt : /certs/ca.crt

到了这儿,基本上就成功了;
之前只用了 Token 认证,现在开了 TLS 加了认证证书,应该要比之前安全些吧。