小试frp内网穿透

使用frp内网穿透工具把树莓派上的Cloudreve去盘放到公网。

家中闲置一个树莓派,在上面安装Cloudreve再外接一块移动硬盘,就搭好了一个小小的私有云盘。手机和电脑上的照片随时可以传上去,体验还不错。不过呢有个前提,我人得在家中且连上家里的WiFi才能使用这个云盘,是个小缺憾。所以今天决定装个frp,私有云盘放到公网上。

这里是完成后的效果,支持https域名访问。还不错吧!
-w1508

安装Cloudreve、树莓派上挂载移动硬盘以及安装frp的过程这里就略去不表了,网上能搜到非常多资料。所以本文只说一下几个重要的配置。

域名配置

新加一个二级域名pan.mydomain.com,解析记录如下:

-w885

Nginx配置

公网服务器上Nginx配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
server {
# 1. 配置一个名为 pan.madomain.com 的虚拟服务
server_name pan.mydomain.com;
root /usr/share/nginx/html;

# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;

# 2. 避免 nginx 403 错误, Request Entity Too Large
client_max_body_size 1024m;

location / {
# 3. nginx 反向代理, 将流量转发到 frps 监听的端口
proxy_pass http://localhost:8098;

# 4. nginx 反向代理, 其他配置。注意这里重写了http请求中的Host头
proxy_set_header Host $host:80;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_connect_timeout 7d;
proxy_send_timeout 7d;
proxy_read_timeout 7d;
}

# 5. https 证书配置
listen [::]:443 ssl; # managed by Certbot
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/pan.mydomain.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/pan.mydomain.com/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}

树莓派Nginx配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
server {
listen 80;
listen [::]:80;

server_name pan.mydomain.com;

root /var/www/html;

# Add index.php to the list if you are using PHP
index index.html index.htm index.nginx-debian.html;

location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
// 1. 注意这里的5212端口为Cloudreve服务的端口
proxy_pass http://127.0.0.1:5212;

# 如果您要使用本地存储策略,请将下一行注释符删除,并更改大小为理论最大文件尺寸
#client_max_body_size 600m;
}
}

小提示:

  1. 使用 cerbot 一键为新的域名配置https证书,sudo certbot --nginx -d pan.mydomain.com
  2. 修改 Nginx 配置后记得重启,systemctl restart nginx

frp配置

frps.ini 配置非常简单。内容如下:

1
2
3
4
5
6
7
[common]
bind_port = 6999
vhost_http_port = 8098
dashboard_port = 8099
dashboard_user = a_user
dashboard_pwd = a_pwd
privilege_token = a_token

frpc.ini 配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[common]
server_addr = <server_ip>
server_port = 6999
privilege_token = a_token
login_fail_exit = false

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = <ssh_port>

[pan]
type = http
local_ip = 127.0.0.1
local_port = 80
custom_domains = pan.mydomain.com

总结

是不是感觉配置非常复杂。其实一点也不复杂,听我慢慢解释。

首先,整个链路是这样的:

1
2
3
4
5
Disk <----> Cloudreve <----> Pi(Nginx)

<----> Frp <---->

QCloud(Nginx) <----> Browser

大致访问过程如下:

  1. 用户在浏览器中访问pan.mydomain.com
  2. (腾讯云服务器)Nginx反向代理将上述流量转发到当前服务器的8098端口
  3. 触发frps(公网服务器)和frpc(树莓派)的互动,流量继续转发到树莓派的80端口(为啥是80?可以回头看nginx配置)
  4. (树莓派)Nginx反向代理将上述流量转发到5212端口
  5. Done!(树莓派)Cloudreve云盘正在监听5212端口!

参考