Table of contents
Open Table of contents
1. 为什么选 frp
tailscale 的问题有三个。第一,实验室网络常处于对称型 NAT 后面,tailscale 打洞成功率低,流量被迫走中继(DERP)。第二,官方 DERP 节点都在境外,延迟动辄两三百毫秒,终端操作卡顿明显;自建 DERP 又要额外搞一台带公网的服务器,配置不比 frp 简单。第三,tailscale 的多机管理偏个人向,多台实验机要逐台加网络、逐台授权,没有统一的 Web 面板。
frp 走的是「公网服务器中转」模型,延迟只取决于实验机到服务器的链路,国内服务器之间通常 30ms 以内。配合 frp-panel 这个 Web 管理面板,可以在一个界面里管理多台 client、多台 server,凭据自动下发,不用手动维护 frpc.ini。实验机有多台时,加一台 client 就是在面板里点一下的事。
- frp-panel 项目地址:https://github.com/VaalaCat/frp-panel
- frp-panel 官方文档:https://vaala.cat/frp-panel/en/
2. 服务器端:Docker 安装与 frp-panel 部署
前置条件:你已经有一台带公网 IP 的服务器。时间短的话可以用腾讯云的免费试用一个月,配置 2 核 4G 足够跑 frp-panel。
2.1 在 Ubuntu 上安装 Docker(大陆源)
官方使用的源在国内可能比较慢,这里用了清华源。
sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
把 GPG 密钥下载下来转成二进制格式存到 /etc/apt/keyrings/,apt 在安装 docker 包时会用它校验签名。
添加 apt 清华源,这个命令行会自动识别 CPU 架构和 Ubuntu 版本代号(比如 24.04 是 noble,22.04 是 jammy),写入 docker 的 apt 源文件。
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu $(. /etc/os-release && echo $VERSION_CODENAME) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
安装 Docker:
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
验证安装:看到 “Hello from Docker!” 就说明装好了。
sudo docker run hello-world
2.2 部署 frp-panel 的 master
master,server,client的部署可以参考frp-panel官方文档
frp-panel 推荐用 Docker 部署 master,并且用 host 网络模式(容器直接用宿主机网络,省去端口映射的麻烦)。
创建工作目录和 docker-compose 文件:
mkdir -p ~/frpp && cd ~/frpp
把下面的内容存为 docker-compose.yaml,把 1.2.3.4 换成你服务器的公网 IP,APP_GLOBAL_SECRET 换成一串随机字符(别泄露):
services:
frpp-master:
image: vaalacat/frp-panel:latest
network_mode: host
environment:
APP_GLOBAL_SECRET: your_secret_here
MASTER_RPC_HOST: 1.2.3.4
MASTER_RPC_PORT: 9001
MASTER_API_HOST: 1.2.3.4
MASTER_API_PORT: 9000
CLIENT_RPC_URL: grpc://1.2.3.4:9001
CLIENT_API_URL: http://1.2.3.4:9000
volumes:
- ./data:/data
restart: unless-stopped
command: master
几个关键参数解释:APP_GLOBAL_SECRET 是全局密钥,client 和 server 的凭据都由它派生,别用默认值;MASTER_RPC_HOST 和 MASTER_API_HOST 填服务器公网 IP,client 要通过这两个地址连回来;CLIENT_RPC_URL 和 CLIENT_API_URL 是 client 实际连接用的地址,和上面两个 HOST 保持一致即可。
# 启动
sudo docker compose up -d
启动后访问 http://服务器IP:9000,第一个注册的用户自动成为管理员。默认只允许注册第一个用户,想开放多用户注册的话在 environment 里加一行 APP_ENABLE_REGISTER=true。
2.3 关于 server
master 启动时会自动带一个名为 default 的 server(对应 frps),client 默认连这个 default server。所以单服务器场景下,不需要单独部署 server,master 这一步就够了。
如果你要加额外的 server 节点(比如另一台服务器做流量入口),在 master 的 Web UI 里新建 server,会生成对应的 docker 启动命令,照着跑就行。
2.4 关于 GitHub 加速
frp-panel 的 Docker 镜像在 Docker Hub 上,国内拉取一般没问题。但如果你的服务器拉 Docker Hub 也慢,可以配一个镜像加速器。
vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://docker.m.daocloud.io"]
}
sudo systemctl restart docker
如果后续要在服务器上直接下载 frp-panel 的二进制(比如部署 server 时不用 Docker),GitHub 下载可以用 ghfast.top 代理,用法是在原始 GitHub URL 前面加 https://ghfast.top/。这个在下一节会用到。
3. 实验机:client 部署与 SSH 开放
这一节的目标:在实验机上跑起 frp-panel 的 client,把 SSH 端口暴露到服务器上,开发机就能直连了。
3.1 在 master 里新建 client
登录 master 的 Web UI,左侧栏点 Client,新建,填一个 Client ID(比如 lab1),保存。保存后会看到这个 client 的安装命令和 secret,记下来。
3.2 下载 client 二进制(不用 systemd)
实验机是 Ubuntu 18.04,没有 systemd。直接下载二进制,不依赖 install.sh(install.sh 默认走 systemd)。
下载二进制(用 ghfast.top 加速 GitHub):
mkdir -p ~/frpp && cd ~/frpp
curl -fSL https://ghfast.top/https://github.com/VaalaCat/frp-panel/releases/latest/download/frp-panel-linux-amd64 -o frp-panel
chmod +x frp-panel
这里下载的是完整版二进制(不是 client-only 版),官方文档推荐用完整版。curl 的 -f 参数在 HTTP 错误时返回非零退出码,-S 显示错误信息,-L 跟随重定向。
验证一下能跑:
./frp-panel version
看到版本号输出就说明下载完整、架构匹配。
3.3 启动 client
在 master 的 Web UI 里,点你新建的 client 的「显示启动命令」,会看到类似这样的命令。直接用二进制跑:
./frp-panel client -s 你的secret -i user.c.lab1 \
--api-url http://服务器IP:9000 \
--rpc-url grpc://服务器IP:9001
参数含义:-s 是 client secret(在 Web UI 里生成),-i 是 client id,—api-url 是 master 的 API 地址,—rpc-url 是 master 的 RPC 地址。这两个 URL 要和你在 master 的 docker-compose 里配的 CLIENT_API_URL / CLIENT_RPC_URL 一致。
跑起来后终端会持续输出日志。先别关终端,去 master 的 Web UI 看这个 client 是否变成在线状态。在线了说明连通了。
3.4 配置 SSH 穿透
client 跑起来只是建立了到 master 的隧道,还要告诉 frp 把实验机的 22 端口转发出去。在 master 的 Web UI 里,进入这个 client 的配置,新建一个代理(proxy):
-
类型:TCP
-
本地地址:127.0.0.1
-
本地端口:22
-
远程端口:7000(这个端口在服务器上开放,你 SSH 连服务器 IP:7000 就等于连实验机 22 端口)
保存后 client 会自动拉取新配置,不用重启。前提是服务器的安全组 / 防火墙放行了 7000 端口。
3.5 开放实验机的 SSH
sudo apt update && sudo apt install -y openssh-server
不知道实验机密码,配置公钥登录。在开发机上生成密钥对:
ssh-keygen -t ed25519 -C "your_email@example.com"
一路回车即可,也可以输入完整路径改名字,默认生成 ~/.ssh/id_ed25519(私钥)和 ~/.ssh/id_ed25519.pub(公钥)。ed25519 比 RSA 短且快,现在都推荐用它。
把公钥传到实验机。在希冀上直接把公钥内容追加到实验机的 ~/.ssh/authorized_keys:
mkdir -p ~/.ssh && chmod 700 ~/.ssh
echo "这里粘贴公钥内容" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
注意权限:.ssh 目录 700,authorized_keys 文件 600,权限不对 sshd 会拒绝公钥登录。最后输入这个后台运行,出现进程号并后续有done而不是exit就ok。
/usr/sbin/sshd &
3.6 SSH 调试
使用这个确定一些设置已经开启
sed -i 's/^#\?PubkeyAuthentication.*/PubkeyAuthentication yes/' /etc/ssh/sshd_config
sed -i 's/^#\?PermitRootLogin.*/PermitRootLogin yes/' /etc/ssh/sshd_config
sed -i 's/^#\?AuthorizedKeysFile.*/AuthorizedKeysFile .ssh\/authorized_keys/' /etc/ssh/sshd_config
sed -i 's/^#\?UsePAM.*/UsePAM no/' /etc/ssh/sshd_config
如果连不通,先开 sshd 调试模式看日志。在实验机上:
sudo /usr/sbin/sshd -d -p 2222
-d 是 debug 模式,-p 2222 在 2222 端口起一个临时 sshd。这样不会影响系统原来的 sshd,而且日志会直接打到终端,能看到认证失败的具体原因(公钥格式错、权限不对、文件属主不对等都会显示)。
在开发机上用 verbose 模式连:
ssh -v -p 7000 lab@服务器IP
-v 输出详细握手过程,能看到公钥是否被接受、在哪个阶段失败。-vv 更详细,-vvv 最详细。
3.7 client 保活(可选)
实验机久不用会关机,建议不需要保活,每次使用时先上去开启client和sshd。用完之后也关闭进程。这样应该也安全一点。
3.8 开发机配置 SSH config
# 开发机上修改~/.ssh/config
Host lab1
HostName 服务器IP
Port 7000
User lab
IdentityFile ~/.ssh/id_ed25519
# 连接
ssh lab1
4. 开发机:VSCode 便携版与 Agent 开发
4.1 VSCode 便携版
VS Code 1.86 起,Remote-SSH 的 Server 端要求远端 glibc ≥ 2.28 / GLIBCXX ≥ 3.4.25,对应 Debian 10 / Ubuntu 20.04 / RHEL 8 及更新。学校实验机是极简老容器,glibc 不够,于是报:
The remote host does not meet the prerequisites for running VS Code Server.
1.85.2 是最后一个支持 glibc 2.17 的版本,且 Remote-SSH 扩展必须配套 0.107.1(0.108.0 起要求 VS Code ^1.86.0)。
mkdir -p ~/vscode-185 && cd ~/vscode-185
wget https://update.code.visualstudio.com/1.85.2/linux-x64/stable -O code-1.85.2.tar.gz
tar -xzf code-1.85.2.tar.gz
cd VSCode-linux-x64
# 启用便携模式的关键:创建 data 目录
mkdir data
# Linux 必需的沙盒权限修复
sudo chown root chrome-sandbox
sudo chmod 4755 chrome-sandbox
# 启动
./code
curl -fSL "https://code.visualstudio.com/sha/download?build=stable&os=linux-x64" -o vscode.tar.gz
mkdir -p ~/vscode && tar -xzf vscode.tar.gz -C ~/vscode --strip-components=1
~/vscode/bin/code
—strip-components=1 是因为 tar 包里有一层顶层目录,去掉它直接解压到 vscode 目录。
为什么用便携版而不是 apt 装的 VSCode?apt 装的 VSCode 会自动更新,新版 VSCode 的远程 SSH 服务端会要求实验机上有较新版本的 glibc,Ubuntu 18.04 的 glibc 2.27 满足不了,连不上。便携版可以锁版本,找一个还能连 18.04 的旧版本。
只降级插件不知道行不行
4.2 SSH 插件
VSCode 里装 “Remote - SSH” 扩展(扩展 ID:ms-vscode-remote.remote-ssh)。装好后按 F1 输入 Remote-SSH: Connect to Host,选你在 3.8 里配的 lab1,输入密码或自动用密钥,就连上了。
4.3 Agent 开发:codex musl 版
github上打开最新版本codex-cli的release,下载codex-x86_64-unknown-linux-musl.tar.gz和codex-code-mode-host-x86_64-unknown-linux-musl.tar.gz
curl -L https://ghfast.top/https://github.com/openai/codex/releases/download/rust-v0.154.0/codex-x86_64-unknown-linux-musl.tar.gz
tar -xzf codex-x86_64-unknown-linux-musl.tar.gz
mv codex-x86_64-unknown-linux-musl codex
chmod +x codex
sudo mv codex /usr/local/bin/
curl -L https://ghfast.top/https://github.com/openai/codex/releases/download/rust-v0.154.0/codex-code-mode-host-x86_64-unknown-linux-musl.tar.gz
tar -xzf codex-code-mode-host-x86_64-unknown-linux-musl.tar.gz
mv codex-code-mode-host-x86_64-unknown-linux-musl codex-code-mode-host
chmod +x codex-code-mode-host
mv codex-code-mode-host /usr/local/bin
cd /root/.codex将配置文件写一下,然后就可以愉快运行了。
5. 总结
后续怎么使用?建议可以保存client的运行命令和ssh开放命令,每次需要的时候上实验机开一下。比如这样:
cd /opt/frpp
./frp-panel client \
-s aaa -i aaa \
--api-url http://aaa \
--rpc-url grpc://aaa &
/usr/sbin/sshd &
整个过程的核心收获其实不是 frp 本身的配置,而是顺带攒下来的一些可复用的小知识:
-
GitHub 加速:ghfast.top 代理,在原始 GitHub URL 前面加 https://ghfast.top/ 即可,下载 release 二进制、raw 文件都管用。
-
Docker 大陆源:把 download.docker.com 换成 mirrors.tuna.tsinghua.edu.cn/docker-ce,GPG 密钥和 apt 源结构完全一致,USTC、阿里云的镜像同理。
-
SSH 调试:sshd -d -p 端口 起临时调试实例,ssh -v 看客户端握手,两端一起看基本能定位所有连接问题。
这套搭完之后,多加一台实验机只需要在 frp-panel 里新建 client、下载二进制、跑一条命令,三分钟搞定。
本博客由AI生成+人工大幅度修改,写这个博客的提示词
目录:
1.为什么选frp:tailscale因为NAT,延迟高,需要自部署DERP(好像叫这个),而且选用frp可以支持更方便的多用户(实验机可能是多台);
实操过程:
本教程环境:实验机ubuntu18.04,服务器ubuntu24.04,开发机ubuntu24.04;开发机用windows也可以,只是一点点小差距,可以自己灵活处理。
2.详细:docker在ubuntu上的安装(大陆源),frp-panel的docker方式部署master/server(涉及github要用github加速);提一嘴:省略的前置条件是购买好了服务器,时间短的话可以使用腾讯云的免费试用一个月
3.详细:无systemd实验机的client部署和ssh开放(小提醒:root用户登录进去,但authorized_keys文件夹在headless下;ssh不通可以开启调试模式)。实验机不重启会一直开着,所以client保活脚本部署是可选。ssh需要包含将pub弄好的教程。(提一嘴:本机配置~/.ssh/config可以方便地直连)
4.开发机的vscode便携版下载和ssh插件下载。(提一嘴:为什么不能直接新版VSCode连接)
顺带说说:使用Agent开发的方式,codex musl版,提一嘴用这个的原因:ubuntu18.04和glic。需要自己codex musl和codex-code-mode-host。
5.最后总结:收获:除了配置frp之外,收获到一些可以留用的知识:github加速,
约束:docker安装,frp-panel安装都需要给出原始参考链接,下载vscode和opencode也需要链接,命令行尽可能写成代码块,对命令行的中文解释放在代码块外面&后面。不需要整体架构说明。文中不要使用**的markdown语法来加粗。语言尽可能简洁字少。
我感觉AI时代重要的不是大量的信息,而是经过筛选的少量信息。所以我在这篇博客中尽可能删除了我认为不必要的AI语言。