一、 背景
购买了树莓派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
|
解压到指定文件夹,并重命名文件夹
1 2
| tar -C /home/ryan/ -xzf frp_0.36.2_linux_amd64.tar.gz mv frp_0.36.2_linux_amd64 Frp
|
这样frp的文件存放的目录会在/home/ryan/Frp
目录下
编辑配置文件/home/ryan/Frp/frps.ini
:
1 2 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
服务,用来实现控制服务的启动、关闭和随系统启动
1 2 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
|
保存后,执行:
1 2 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
|
解压到指定文件夹,并重命名文件夹
1 2
| tar -C /home/ryan/ -xzf frp_0.36.2_linux_arm64.tar.gz mv frp_0.36.2_linux_arm64 Frp
|
这样frp的文件存放的目录会在/home/ryan/Frp
目录下
编辑配置文件/home/ryan/Frp/frpc.ini
:
1 2 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
服务,用来实现控制服务的启动、关闭和随系统启动
1 2 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
|
保存后,执行:
1 2 3
| sudo systemctl daemon-reload sudo systemctl enable frpc sudo systemctl start frpc
|
这样客户端就配置好了。
这时候可以使用ssh来在公网连接树莓派:
1
| ssh ryan@ryanshang.com -p 7022
|
不过网站demo暂时还无法访问,需要对服务端和客户端的nginx进行额外配置
给服务端的nginx增加配置:
1 2 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增加配置:
1 2 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
这个部署在树莓派上的站点了。