概述

家里配置好了树莓派之后,由于运营商没有提供公网IP地址,因此,想要从外网访问到我们的树莓派,就需要配置内网穿透了。

内网穿透的方案很多,常见的有Ngrok和FRP。对比了一下,感觉FRP更加简单一些,就选择了这个。评价好像也是FRP更加稳定。自己搭建好了之后,结果也挺满意的。

FRP的内网穿透方式很简单,理解起来就是代理,流量转发。用一张图解释就是如下的

frp

首先,公网服务器启动frp服务器端frps,监听一些端口,接收用户的请求;之后,内网服务器启动frp的客户端frpcfrpc启动之后,根据配置的端口,连接frps,建立隧道。之后的通信都是基于此了。当用户的请求到达公网服务器的frps之后,根据内部协议,frps将数据转发给frpc客户端。frpc客户端收到数据之后,根据规则,再转发给配置里面的指定端口。这样就达到了公网入方向的穿透,出方向也是一样的。简而言之就是代理吧。

事实上,如果公网服务器跑了Nginx,和frps端口冲突了。则可能还会通过Nginx来代理frps的端口。就是层层代理了。

安装&配置FRP

FRP的官网上下载对应服务器平台的包。公网是阿里云的,那么就下载Linux-amd64版本的,内网是树莓派,就下载Linux-arm的。

下载好了之后,在公网服务器配置好frps.ini文件,如下是我的文件配置

[common]
bind_port = 8008

dashboard_port = 8009
dashboard_user = xxx
dashboard_pwd = xxx

vhost_https_port = 443
vhost_http_port = 80

运行frps。注意,服务器上开启了相应端口的访问。

然后,在树莓派上配置好frpc.ini文件

[common]
server_addr = 阿里云服务器IP地址
server_port = 8008
log_file = /var/log/frpc.log

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 8022

[web01]
type = https
local_ip = 127.0.0.1
local_port = 443
custom_domains = https.raspberry.cn

[web02]
type = http
local_ip = 127.0.0.1
local_port = 80
custom_domains = http.raspberry.cn

就这样,运行frpc就OK了。真的很简单。

supervisor

为了保证服务的稳定运行。这里我们配置supervisor来运行。配置文件如下

[program:frp]
process_name=frpc
command=/usr/local/bin/frpc -c /etc/frpc.ini
autostart=true
autorestart=true
user=root
numprocs=1
redirect_stderr=true
stdout_logfile=/var/log/frpc_super.log

好了,这样就能够随时随地访问我的树莓派了。

如果没有公网服务器的话,可以选择其他人搭建的免费穿透服务。挺折腾的,期待日后IPv6早点普遍,就不用折腾这么复杂了。