frp p2p内网穿透,通过公网ssh直连家里的局域网服务器

最近家里弄了一台4090显卡的服务器炼丹,考虑到有时候在图书馆学习,会有在公网连接家里服务器的需求,然后做一下内网穿透。

首先,需要一台公网静态ip服务器A,和我们的局域网服务器B,和准备在公网连接服务器B的电脑C。

去frp github官网下载release包,选择amd64架构和arm64架构(m2 mac使用,也是上面的电脑C)下载。

下载好的tar.gz包,解压,然后把amd64架构的文件夹,上传到A和B服务器,然后进入文件目录,修改以下配置:

服务器A修改frps.ini:

[common]
bind_port = 2998

服务器B 修改frpc.ini

[common]
server_addr = your_server_ip_of_A
server_port = 2998

[p2p_ssh]
type = xtcp
sk = your_password
local_ip = 127.0.0.1
local_port = 22

然后修改电脑C的 frpc.ini 配置

[common]
server_addr = your_server_ip_of_A
server_port = 2998

[p2p_ssh]
type = xtcp
role = visitor
server_name = p2p_ssh
sk = your_password
bind_addr = 127.0.0.1
bind_port = 6000
# when automatic tunnel persistence is required, set it to true
keep_tunnel_open = false

最后再修改一下电脑C的~/.ssh/config

Host b
  HostName 127.0.0.1
  User your_user_of_server_b
  Port 6000

然后我们在server A启动frp服务端服务,通过 ./frps -c frps.ini 在server B启动frp 客户端服务,./frpc -c frpc.ini 在我们的电脑B 启动frp客户端服务,./frpc -c frpc.ini

上述服务,也可以通过nohup加入后台进程,当然比较好的方式是写入系统后台进程,比如systemctl后台进程,这里不再具体写这部分。

最后我们只需要 ssh b ,如果B电脑有C的ssh公钥,我们就直接连上了,否则可能还要密码。这时候就发现不需要通过A作为跳板,我们直接连上了服务器B,A在这个过程中只起了帮助连接的作用,后续不再需要A中转。所以速度很快,延迟也很低。

虽然使用总体很顺利,但最后记录一下踩到的一个坑:服务器A和B一般都不会更换网络环境,但是服务器C会。在C更换网络环境后,需要重启frpc服务,不然连接服务器B会失败。

发表于 2023.06.22