使用 frp 实现树莓派 SSH 和 XRDP 的外网远程登录

我们知道,在同一个局域网内,可以很容易的通过 SSH 和 XRDP 来登录到树莓派中。但很多时候,我们需要在外网登录到树莓派,比如,在公司登录到家里的树莓派。

通过在家里的路由器上设置端口映射,是可以实现外网访问的,但有个致命的缺点:家用宽带都是动态 IP。

那么,有没有其它方法呢?借助 frp 这个开源工具就可以。

先决条件

要使用 frp 实现外网登录的目标,首先你得有一台带公网固定 IP 的 VPS(或云主机)

适用场景

虽然本文讲述的是外网登录树莓派,但它可应用于更多场景:

  • 外网访问内网的某个服务
  • 微信公众号和小程序的本地开发调试
  • 你能想到的其他场景

本案例的环境

服务器

  • CentOS 7 x64, 带公网固定 IP
  • 公网 IP 假设为:12.34.56.78

内网机器

​ 树莓派 3B+

开始行动

frp 分为 frpsfrpc,它们在同一个压缩包里。frps 用于服务端,frpc 用于客户端。

服务端

下载 frp

到 https://github.com/fatedier/frp/releases 下载最新版的 frp。由于我的服务器是 CentOS 7 x64,所以我下载的是 frp_0.21.0_linux_amd64.tar.gz

cd /opt
wget https://github.com/fatedier/frp/releases/download/v0.21.0/frp_0.21.0_linux_amd64.tar.gz

frp 使用的 go 语言编写,所以下载好之后,直接解压就可以了:

tar zxvf frp_0.21.0_linux_amd64.tar.gz

配置 frps

服务端使用 frps,配置文件为 frps.ini。 通常,frps.ini 可以不做任何修改:

[common]
bind_port = 7000

使用 supervisor 管理 frps

创建一个 frps.conf 文件,让 supervisor 管理:

[program:frps]
directory=/opt/frp_0.21.0_linux_amd64
command=/opt/frp_0.21.0_linux_amd64/frps -c /opt/frp_0.21.0_linux_amd64/frps.ini
autostart=true
autorestart=true
startsecs=10
stdout_logfile=/var/log/frps/stdout.log
stdout_logfile_maxbytes=1MB
stdout_logfile_backups=10
stdout_capture_maxbytes=1MB
stderr_logfile=/var/log/frps/stderr.log
stderr_logfile_maxbytes=1MB
stderr_logfile_backups=10
stderr_capture_maxbytes=1MB

让 supervisor 载入并管理:

mkdir -p /var/log/frps
supervisorctl
supervisor> reload
Really restart the remote supervisord process y/N? y

至此,服务端配置完毕。

客户端

下载

下载树莓派对应的 frp:

cd /opt
sudo wget https://github.com/fatedier/frp/releases/download/v0.21.0/frp_0.21.0_linux_arm.tar.gz
sudo tar zxvf frp_0.21.0_linux_arm.tar.gz

配置

客户端使用 frpcfrpc.ini 配置文件。

sudo vim /opt/frp_0.21.0_linux_arm/frpc.ini

输入以下内容:

[common]
server_addr = 12.34.56.78 # 改成你的vps的ip
server_port = 7000 # 和你的服务器里的 frps.ini 配置的端口保持一致

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22 # 本机端口
remote_port = 6022 # 映射到服务器的端口
use_encryption = true
use_compression = true

配置之后,树莓派的 22 端口将被映射到服务器的 6022 端口。在外网,只要通过 服务器ip:6022 就能访问到树莓派的 22 端口。

进程管理

创建一个 frpc.conf 文件,让 supervisor 管理:

[program:frpc]
directory=/opt/frp_0.21.0_linux_arm
command=/opt/frp_0.21.0_linux_arm/frpc -c /opt/frp_0.21.0_linux_arm/frpc.ini
autostart=true
autorestart=true
startsecs=10
stdout_logfile=/var/log/frpc/stdout.log
stdout_logfile_maxbytes=1MB
stdout_logfile_backups=10
stdout_capture_maxbytes=1MB
stderr_logfile=/var/log/frpc/stderr.log
stderr_logfile_maxbytes=1MB
stderr_logfile_backups=10
stderr_capture_maxbytes=1MB

让 supervisor 载入并管理:

sudo mkdir -p /var/log/frpc
sudo supervisorctl
supervisor> reload
Really restart the remote supervisord process y/N? y

至此,客户端配置完毕。

现在,在外网,可以这样连接到树莓派的 SSH:

ssh -p 6022 [email protected]

XRDP 的配置

安装好 xrdp 之后,你可以使用和 ssh 一样的方式来处理。注意,服务端不需要做任何改动,只要在树莓派的 frpc.ini 加上以下内容,并重载 supervisor 的配置即可:

sudo vim /opt/frp_0.21.0_linux_arm/frpc.ini

添加以下内容:

[xrdp]
type = tcp
local_ip = 127.0.0.1
local_port = 3389
remote_port = 43389
use_encryption = true
use_compression = true

使用 Windows 的远程桌面连接即可。注意,连接时需要指定端口:

12.34.56.78:43389
CentOS CentOS 7 树莓派 RASPBIAN Raspberry Pi 2018-08-16 17:37 9080800