[Raspberry PI CM4] 通过内网穿透FRP实现远程访问
实现原理
- 在公网上购买一台带有公网IP的服务器,其上部署FRP服务器
- 在树莓派上部署FRP客户端,与公网服务器上的FRP服务程序建立内网穿透连接
- 任意能够访问互联网的设备访问公网服务器,公网服务器通过内网穿透连接将访问内容转发到树莓派

实现步骤
🔧1. 公网服务器搭建FRP服务器
- 下载FRP程序,注意此处选择平台和操作系统对应的版本,我使用的是x86_64位Linux系统
wget https://github.com/fatedier/frp/releases/download/v0.49.0/frp_0.49.0_linux_amd64.tar.gz
- 解压FRP程序
tar -zxvf frp_0.49.0_linux_amd64.tar.gz
- 将FRP 服务器相关的文件移动到/usr/local/frp文件夹
mkdir /usr/local/frp
mv frp_0.49.0_linux_amd64/frps* /usr/local/frp/
- 修改FRP 服务器配置文件frps.ini,并添加以下内容
[common]
bind_addr = 0.0.0.0
bind_port = 7000
dashboard_addr = 0.0.0.0
dashboard_port = 7500
dashboard_user = username
dashboard_pwd = password
authentication_method = token
authenticate_heartbeats = false
token = tokentobeused
- FRP设置开机启动
- 添加Systemd服务文件
vim /etc/systemd/system/frps.service
- 服务文件中增加以下内容
[Unit]
Description=frps daemon
After=syslog.target network.target
Wants=network.target
[Service]
Type=simple
ExecStart=/usr/local/frp/frps -c /usr/local/frp/frps.ini
Restart= always
RestartSec=1min
[Install]
WantedBy=multi-user.target
- 启动FRP服务器程序
sudo systemctl start frps
- 设置FRP服务器程序开机启动
sudo systemctl enable frps
- 查看FRP服务器程序运行状态
sudo systemctl status frps
⌨️登录IP:7500端口号,可以查看FRPS的控制面板状态

🔧2. 树莓派搭建FRP客户端
- 下载FRP程序,注意此处选择平台和操作系统对应的版本,💡树莓派使用的是arm+linux
wget https://github.com/fatedier/frp/releases/download/v0.49.0/frp_0.49.0_linux_arm.tar.gz
- 解压FRP程序
tar -zxvf frp_0.49.0_linux_arm.tar.gz
- 将FRP 客户端相关的文件移动到/usr/local/frp文件夹,💡注意是与frpc相关的文件
mkdir /usr/local/frp
mv frp_0.49.0_linux_arm/frpc* /usr/local/frp/
- 修改FRP 服务器配置文件frpc.ini,并添加以下内容
[common]
server_addr = 43.138.xx,yy
server_port = 7000
token = tokentobeused
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 7022
💡 注意server_addr 要填写FRPS使用的公网IP地址
💡 server_port要与服务器端设置的bind_port保持一致
💡 token 客户端和服务器要保持一致,作为绑定密码
🚪 此处开放了一个SSH连接,访问时使用服务器IP+端口7022,就可访问到树莓派的SSH端口22
- FRP设置开机启动
- 添加Systemd服务文件frpc
sudo nano /etc/systemd/system/frpc.service
- 服务文件中增加以下内容
[Unit]
Description=frpc daemon
After=syslog.target network.target
Wants=network.target
[Service]
Type=simple
ExecStart=/usr/local/frp/frpc -c /usr/local/frp/frpc.ini
Restart= always
RestartSec=1min
[Install]
WantedBy=multi-user.target
- 启动FRP服务器程序
sudo systemctl start frpc
- 设置FRP服务器程序开机启动
sudo systemctl enable frpc
- 查看FRP服务器程序运行状态
sudo systemctl status frpc
🛠️3. 远程连接测试
💻Remote host中填入FRP服务器的IP地址,端口填入7022,则可以远程访问树莓派的SSH 22端口

💡如果在购买的域名解析中将对应的域名解析到了FRP服务器的IP地址,则Remote host也可填入对应的域名

📏在FRP服务器管理面板中,可以看到对应的连接情况
⚠️FRPS 使用到的所有端口,注意在防火墙中放行⚠️
💪4. 远程访问Web 服务
经过上面的配置,我们已经能够将普通的TCP 报文进行穿透,实现远程SSH 登录
在本地还有两台设备,分别提供了HTTP Web和HTTPS Web 网页服务,
我们还需要继续配置Web 内网穿透
- 在FRP 服务器端的配置文件frps.ini中添加以下内容
vhost_http_port = 7080
subdomain_host = demo.yourdomain.cn
- subdomain_host 中需填入已经备案的域名,
且*.demo.yourdomain.cn DNS泛解析已经指向了FRPS服务器IP地址

在Nginx 中添加反向代理
本例使用的是宝塔面板,简化了Nginx的配置
使用宝塔面板新建两个网站网站1,域名设置为 atlas2.demo.yourdomain.cn然后添加反向代理

则后续可以使用atlas2.demo.yourdomain.cn 代替访问atlas2.demo.yourdomain.cn:7080,不需要再访问时输入端口号
网站2,域名设置为 abc2.demo.yourdomain.cn
同样添加反向代理
则后续可以使用abc2.demo.yourdomain.cn 代替访问abc2.demo.yourdomain.cn:7080,不需要再访问时输入端口号
- 在FRP 客户端的配置文件frpc.ini中添加以下内容
[web_abc2]
type = http
local_ip = 192.168.0.10
local_port = 80
subdomain = abc2
use_encryption = true
use_compression = true
http_user = admin
http_pwd = admin
[web_atlas2]
type = http
subdomain = atlas2
plugin = http2https
plugin_local_addr = 192.168.0.11:443
plugin_host_header_rewrite = 192.168.0.11
plugin_header_X-From-Where = frp
web_abc2 设置代理本地局域网中的192.168.0.10:80 的http web服务, 可以远程使用abc2.demo.yourdomain.cn来访问
web_atlas2 设置代理本地局域网中的192.168.0.11:443 的https web服务, 可以远程使用atlas2.demo.yourdomain.cn来访问
配置中使用http2https插件,FRPS和FRPC之间是https通讯, 访问者与FPRS之间是普通的http通讯