一、 背景
购买了树莓派4B,可以放在家里当作一个小型的服务器使用,因为想在外的时候也可以访问,就可以使用frp这个工具来实现内网穿透。之前也在给手机使用Linux Deploy时使用过,这次刚好记录下配置过程,实现通过公网访问树莓派的一些服务。
二、简介
1. frp是什么?
frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。
Github:https://github.com/fatedier/frp
2. 为什么使用 frp ?
通过在具有公网 IP 的节点上部署 frp 服务端,可以轻松地将内网服务穿透到公网,同时提供诸多专业的功能特性,这包括:
- 客户端服务端通信支持 TCP、KCP 以及 Websocket 等多种协议。
- 采用 TCP 连接流式复用,在单个连接间承载更多请求,节省连接建立时间。
- 代理组间的负载均衡。
- 端口复用,多个服务通过同一个服务端端口暴露。
- 多个原生支持的客户端插件(静态文件查看,HTTP、SOCK5 代理等),便于独立使用 frp 客户端完成某些工作。
- 高度扩展性的服务端插件系统,方便结合自身需求进行功能扩展。
- 服务端和客户端 UI 页面。
三、过程
1. 服务端frps
下载frp
| 1
 | wget https://github.com/fatedier/frp/releases/download/v0.36.2/frp_0.36.2_linux_amd64.tar.gz
 | 
解压到指定文件夹,并重命名文件夹
| 12
 
 | tar -C /home/ryan/ -xzf frp_0.36.2_linux_amd64.tar.gzmv frp_0.36.2_linux_amd64 Frp
 
 | 
这样frp的文件存放的目录会在/home/ryan/Frp目录下
编辑配置文件/home/ryan/Frp/frps.ini:
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 
 | [common]bind_addr = 0.0.0.0
 bind_port = 7070
 vhost_http_port = 7080
 
 dashboard_addr = 0.0.0.0
 dashboard_port = 7090
 dashboard_user = admin
 dashboard_pwd = xxxxxxxxx
 
 log_file = /home/ryan/Frp/frps.log
 log_level = info
 log_max_days = 3
 
 authentication_method = token
 token = 12345678
 
 allow_ports = 7000-8000
 
 | 
然后在/etc/systemd/system下新建frps.service服务,用来实现控制服务的启动、关闭和随系统启动
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 
 | [Unit]
 Description = Frp Server
 After = network.target syslog.target
 Wants = network.target
 
 [Service]
 Type = simple
 User=ryan
 Restart=on-failure
 RestartSec=60s
 
 ExecStart = /home/ryan/Frp/frps -c /home/ryan/Frp/frps.ini
 
 [Install]
 WantedBy = multi-user.target
 
 | 
保存后,执行:
| 12
 3
 
 | sudo systemctl daemon-reload sudo systemctl enable frps
 sudo systemctl start frps
 
 | 
这样服务端就配置好了。
2. 客户端frpc
下载frp
| 1
 | wget https://github.com/fatedier/frp/releases/download/v0.36.2/frp_0.36.2_linux_arm64.tar.gz
 | 
解压到指定文件夹,并重命名文件夹
| 12
 
 | tar -C /home/ryan/ -xzf frp_0.36.2_linux_arm64.tar.gzmv frp_0.36.2_linux_arm64 Frp
 
 | 
这样frp的文件存放的目录会在/home/ryan/Frp目录下
编辑配置文件/home/ryan/Frp/frpc.ini:
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 
 | [common]server_addr = 1.2.3.4
 server_port = 7070
 
 log_file = /home/ryan/Frp/frpc.log
 log_level = info
 log_max_days = 3
 
 token = 12345678
 
 [ssh]
 type = tcp
 local_ip = 127.0.0.1
 local_port = 22
 remote_port = 7022
 
 [demo]
 type = http
 local_ip = 127.0.0.1
 local_port = 80
 subdomain = demo
 custom_domains = demo.ryanshang.com
 
 | 
然后在/etc/systemd/system下新建frpc.service服务,用来实现控制服务的启动、关闭和随系统启动
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 
 | [Unit]
 Description = Frp Client
 After = network.target syslog.target
 Wants = network.target
 
 [Service]
 Type = simple
 User=ryan
 Restart=on-failure
 RestartSec=60s
 
 ExecStart = /home/ryan/Frp/frpc -c /home/ryan/Frp/frpc.ini
 
 [Install]
 WantedBy = multi-user.target
 
 | 
保存后,执行:
| 12
 3
 
 | sudo systemctl daemon-reload sudo systemctl enable frpc
 sudo systemctl start frpc
 
 | 
这样客户端就配置好了。
这时候可以使用ssh来在公网连接树莓派:
| 1
 | ssh ryan@ryanshang.com -p 7022
 | 
不过网站demo暂时还无法访问,需要对服务端和客户端的nginx进行额外配置
给服务端的nginx增加配置:
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 
 | server {listen 80;
 server_name demo.ryanshang.com;
 location / {
 proxy_pass http://127.0.0.1:7080;
 proxy_redirect http://$host/ http://$http_host/;
 proxy_set_header X-Real-IP $remote_addr;
 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 proxy_set_header Host $host;
 }
 location ~* \.(jpg|jpeg|gif|png|svg|css|scss|js|ico|xml|woff|woff2|ttf|otf|eot)$ {
 proxy_pass http://127.0.0.1:7080;
 proxy_redirect http://$host/ http://$http_host/;
 proxy_set_header X-Real-IP $remote_addr;
 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 proxy_set_header Host $host;
 }
 }
 
 | 
使用sudo nginx -s reload,重新加载nginx配置。
然后给客户端的nginx增加配置:
| 12
 3
 4
 5
 6
 7
 8
 
 | server {listen 80;
 server_name demo.ryanshang.com;
 location / {
 root /opt/Web/demo;
 index index.html;
 }
 }
 
 | 
这样在公网就可以访问demo.ryanshang.com这个部署在树莓派上的站点了。