这篇文章上次修改于 212 天前,可能其部分内容已经发生变化,如有疑问可询问作者。

最近有下载需求但下载机并不总是在身边, 所以就进行了一个简单的内网穿透方便随时随地进行下载任务.

项目地址: https://github.com/fatedier/frp

自己搭建主要是方便而且开源, 缺点就是带宽特别小, 拿来看内网 4K 视频或者听无损音乐不现实, 但暴露 RPC 下载接口是一点问题没有.

软件分为两个部分, frps & frpc, 单台机器只需要用到其中一个 (如果是一台有公网的服务器还需要被内网穿透吗?

安装

去项目地址下对应架构的就好了, 然后手动添加 systemctl 的 service 后台运行. https://gofrp.org/docs/setup/systemd/

特别的, 如果是 Arch 系那直接装就好了, 配置文件位置是 /etc/frp. 不过 Debian 是没有这些的, 老老实实下载解压手动配置.

至于 Windows 可以使用 scoop 之类的方便以后自动更新.

2023-09-27T07:04:52.png

配置

不管是用什么方式安装的, 在配置文件目录都有两份配置, 一个最小启动一个完整配置.

官方文档: https://gofrp.org/docs/examples/ssh/

服务端配置很简单, 只需要防火墙暴露两个端口就好了. 一个监听 frpc 的连接, 一个用于用户主动连接.

最小配置文件:

server

[common]
bind_port = 7000

client

[common]
server_addr = x.x.x.x
server_port = 7000

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000

然后记得打开防火墙, 再起服务端和客户端~

出于安全性考虑, 使用密钥对或者其他方案会更好, 文档也给出了其他使用方法的配置.
或者也可以选择不暴露端口, 通过登录服务器桥连.

p2p 模式下可以实现流量不经过服务器, 即带宽不受服务器限制. 但是缺点是需要 NAT 支持, 简单来说就是跑的了 PCDN 才可能有用.

连接

官方文档给出了连接命令 ssh -oPort=6000 test@x.x.x.x, 显然可得, 我们要连接的是服务器 IP + 内网机器的远程端口, 而服务器只需要暴露一个端口, 剩下一个是由内网机器的配置决定的.

2023-09-26T03:34:10.png

如图, 上为公网 Debian 服务器, 下为 EOS 内网软路由, 在公网终端成功连接到内网设备.

小问题

不知道为什么, 重启系统之后 frpc 服务总是会显示失败, 需要手动再重启 service 才行...

目测是和网络相关的那几个软件启动顺序有关, 添加了一个 Requires 但还没去验证是否有效. 我不至于为了看看这个又跑去重启一次只有更新内核才会主动重启的设备.