[Raspberry PI CM4] 通过内网穿透FRP实现远程访问

实现原理

  • 在公网上购买一台带有公网IP的服务器,其上部署FRP服务器
  • 在树莓派上部署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的控制面板状态

FRP 服务器运行状态

🔧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地址

DNS 解析

  • 在Nginx 中添加反向代理
    本例使用的是宝塔面板,简化了Nginx的配置
    使用宝塔面板新建两个网站

  • 网站1,域名设置为 atlas2.demo.yourdomain.cn
    

    然后添加反向代理
    反向代理

则后续可以使用atlas2.demo.yourdomain.cn 代替访问atlas2.demo.yourdomain.cn:7080,不需要再访问时输入端口号

  • 网站2,域名设置为 abc2.demo.yourdomain.cn
    

同样添加反向代理
反向代理2

则后续可以使用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通讯

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。