frp 初探

最近由于个人原因离校一段时间,但机房电脑数据太多懒得处理。遂花了半小时左右搭建了 frp 服务器。

准备工作

frp 就是 fast reverse proxy。(目前笔者用到的)功能就是借助一台有公网 ip 的服务器作为中转,把内外网的流量连接起来。

Github - fatedier/frp

先买了台小鸡来充当公网主机(服务端)。

确保机房的设备,也就是内网主机(客户端)网络畅通。

测试了内网主机能够直连公网主机

服务端搭建

先自行下载解压 frp。

1
2
3
4
5
mkdir -p /etc/frp/
cd /etc/frp/
wget "https://github.com/fatedier/frp/releases/download/vx.y.z/frp_x.y.z_linux_amd64.tar.gz"
tar xzvf frp_x.y.z_linux_amd64.tar.gz
mv frp_x.y.z_linux_amd64/* .

服务器端使用的是可执行文件是frps,配置文件是frps.ini

最简单的配置就是这样。

1
2
3
# frps.ini
[common]
bind_port = 7000

可以参考frps_full.ini,内附有注释。

下面假设我的服务器 ipv4 地址为114.51.41.9,可使用的端口为11450~11466。目前我自己写的配置如下:

1
2
3
4
5
6
7
[common]
bind_port = 11450
token = c9a4a645-dd52-44b6-9c63-551ef4412074
authentication_timeout = 5000
dashboard_port = 11451
dashboard_user = admin
dashboard_pwd = this-is-a-weak-password

bind_port 即用客户端连接到服务端的端口,需要保证其被服务端 firewall 放行。

dashboard 相关的几条,开启了一个 http://[server_addr]:11451 的 dashboard,可以查看客户端的连接状态。

直接./frps -c frps.ini启动 frp。

开机启动

作为把裤子都卖给 systemd 的壬,本人用 systemd 来启动 frps 服务。

v0.37.0 压缩包下附带一个 ./systemd/ 文件夹,内附有 frps.service

但是实际上不太能直接用,得自己改改。

1
2
3
4
vim ./systemd/frps.service
cp ./systemd/frps.service /etc/systemd/system/
killall frps
systemctl enable frps.service

客户端搭建

客户端使用的是可执行文件是frpc,配置文件是frpc.ini

1
2
3
4
5
6
7
8
9
10
11
12
13
[common]
server_addr = 114.51.41.9
server_port = 11450
token = c9a4a645-dd52-44b6-9c63-551ef4412074
user = pc-with-no-name

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 11455
use_encryption = true
use_compression = true

common中的token需要和服务端frps.inicommontoken一致。
user的设定是为避免多个客户端 proxy 重名导致的连接失败。

此时,我们就可以使用ssh -p 11455 user@114.51.41.9来使用ssh登录到客户端了。

注意,这里local_ip也可以为客户端内网中其他可访问 ip。

当然先要./frpc -c frpc.ini启动 frp。

开机启动

Windows 的开机启动很奇怪,我们直接用 winsw 注册一个系统服务实现开机自启。

下载 release 中的.exe文件,任意改名,下以startfrpc.exe为例。

放入和 frp 相同的目录中,在同一个目录里创建一个 utf8 编码的文本文件,改名为startfrpc.xml,填入以下内容:

1
2
3
4
5
6
7
8
9
10
11
<service>
<id>frpc</id>
<name>Frp Client</name>
<description>My Frp Client</description>

<executable>frpc.exe</executable>
<arguments>-c frpc.ini</arguments>
<!-- <onfailure action="restart" delay="60 sec"/> -->
<!-- <onfailure action="restart" delay="120 sec"/> -->
<!-- <logmode>reset</logmode> -->
</service>

namedescription字段分别是服务的名称与介绍。

以管理员权限执行命令:

1
2
startfrpc.exe install
startfrpc.exe start

如果要卸载该服务,则执行:

1
2
startfrpc.exe stop
startfrpc.exe uninstall