How-to-use-frp

title: How to use frp
date: 2021-01-30 21:27:10
tags:

Frp是一款高性能反向代理应用,如果想用自己内网的电脑作为服务器,但是没有ISP给的公网ip,同时租的云服务器性能又太弱,那么就可以使用frp进行内网穿透。
也就是说,无论在其他什么地方,都可以通过云服务器的公网ip地址访问到你存在于内网中的服务器(比如你的个人电脑)上运行的服务。

提供frp服务的,具有公网ip的云服务器在这里被称为server,服务端。

使用frp服务的,也就是从外网真正要访问的这里呗称为client,客户端

在Linux服务器上下载安装

https://github.com/fatedier/frp/releases

image-20210131202743655

无论是客户端还是服务端都需要下载frp,需要选择对应框架的压缩包。如果不知道自己当前服务器的框架,可以用uname -a查看。比如这里的x86_64,对应的是其中的amd64版本。

➜ ~ uname -a
Linux tom1 4.4.0-109-generic #132-Ubuntu SMP Tue Jan 9 19:52:39 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

下载好后,使用tar -zxvf {filename}命令对刚刚下好的后缀名为tar.gz的文件进行解压,解压后的文件目录结构如下:

➜ ~ tree frp_0.35.1_linux_amd64
frp_0.35.1_linux_amd64
├── frpc
├── frpc_full.ini
├── frpc.ini
├── frps
├── frps_full.ini
├── frps.ini
├── LICENSE
└── systemd
├── frpc.service
├── frpc@.service
├── frps.service
└── frps@.service

其中,frp服务端目前只需要关注frps和frps.ini这两个文件,frp客户端则只需要关注frpc和frpc.ini这两个文件,没有扩展名的是可执行文件,有扩展名的为配置文件。

image-20210201094616702

如何写配置文件

frps.ini

1
2
3
4
5
6
7
8
[common]
bind_port = 7000
token = 2077
vhost_http_port = 10080 #提供http服务
vhost_https_port = 10443 #提供http服务
dashboard_port = 7500
dashboard_user = admin
dashboard_pwd = admin

其中,bind_port是绑定的端口,与frpc.ini中务必保持一致。

token是自定义的,也需要保持一致,可以防范其他不知道token的人。

dashboard相关的是启动一个frp的后台,比如将dashboard_port设置为7500,可以通过{公网ip}:7500访问frp服务的dashboard,可以测试frp服务是否正常,也可以用于监控。

frpc.ini

1
2
3
4
5
6
7
8
9
[common]
server_addr = 192.210.215.26 # 服务端的ip
server_port = 7000 # 与服务端保持一致
token = 2077 # 与服务端保持一致

[web] # 需要内网穿透的服务,不只有这种,名字可以随意起
type = http
local_port = 5000 # 应用程序的端口
custom_domains = 192.210.215.26 # 有域名的话用域名,没有的话用服务端的ip

以上这些端口注意不要被防火墙给拦了,可以用sudo ufw status确认自己防火墙的状态。

➜ frp_0.35.1_linux_amd64 sudo ufw status
Status: active

To Action From


22 ALLOW Anywhere
80/tcp ALLOW Anywhere
6000 ALLOW Anywhere
7500 ALLOW Anywhere
10080 ALLOW Anywhere
7000 ALLOW Anywhere
22 (v6) ALLOW Anywhere (v6)
80/tcp (v6) ALLOW Anywhere (v6)
6000 (v6) ALLOW Anywhere (v6)
7500 (v6) ALLOW Anywhere (v6)
10080 (v6) ALLOW Anywhere (v6)
7000 (v6) ALLOW Anywhere (v6)

运行

配置好之后就可以直接运行了,首先运行客户端的frps

➜ frp_0.35.1_linux_amd64 ./frps -c ./frps.ini
2021/01/31 21:07:02 [I] [root.go:108] frps uses config file: ./frps.ini
2021/01/31 21:07:02 [I] [service.go:190] frps tcp listen on 0.0.0.0:7000
2021/01/31 21:07:02 [I] [service.go:232] http service listen on 0.0.0.0:10080
2021/01/31 21:07:02 [I] [service.go:253] https service listen on 0.0.0.0:10443
2021/01/31 21:07:02 [I] [service.go:289] Dashboard listen on 0.0.0.0:7500
2021/01/31 21:07:02 [I] [root.go:217] frps started successfully

之后在浏览器里输入服务器的{公网ip}:{dashbroad_port(这个例子里是7500)},就可以看到后台界面了

image-20210131211049946

之后再在客户端启动frpc

➜ frp_0.35.1_linux_arm ./frpc -c frpc.ini
2021/01/31 21:11:23 [I] [service.go:290] [3ba3670488a71f62] login to server success, get run id [3ba3670488a71f62], server udp port [0]
2021/01/31 21:11:23 [I] [proxy_manager.go:144] [3ba3670488a71f62] proxy added: [web]
2021/01/31 21:11:23 [I] [control.go:180] [3ba3670488a71f62] [web] start proxy success

看到这个之后就说明内网穿透成功了,之后再运行一个5000端口的程序,比如最简单的Python自带的httpserver

(base) ➜ PiCamera git:(master) ✗ python -m http.server 5000
Serving HTTP on 0.0.0.0 port 5000 (http://0.0.0.0:5000/) …
127.0.0.1 - - [31/Jan/2021 21:15:57] “GET / HTTP/1.1” 200 -

然后我们在浏览器里输入{服务端公网ip: vhost_http_port}

image-20210131211807354

可以看到虽然我们是在客户端(自己的pc,旧笔记本或者树莓派之类的)上运行的这个Python服务,里面可以访问的也是客户端的资源,但实际上用的却是服务端的ip地址,这就说明已经成功了。

但要注意端口是frps.ini里设置的vhost_http_port,是10080,而不是服务端里实际运行的服务的端口5000。

如果想一致保持内网穿透的状态,让frp服务一直自己在后台运行,能用的方法有很多,比如使用supervisor管理。