使用FRP给树莓派做内网穿透并开机自启

发布于 13 天前  122 次阅读


FRP 项目地址:https://github.com/fatedier/frp

一开始本来想用花生壳什么的做内网穿透,但是花生壳要上传证件信息实名认证,特别麻烦。这个时候看见了frp,刚好手里也有可以用的vps,就开始折腾使用frp来做内网穿透了。

frp is a fast reverse proxy to help you expose a local server behind a NAT or firewall to the internet. As of now, it supports tcp & udp, as well as http and https protocols, where requests can be forwarded to internal services by domain name.

https://github.com/fatedier/frp

FRP的安装与配置

frp采用 Go 语言开发,支持 Windows、Linux、MacOS、ARM等多平台部署。frp安装非常容易,只需下载对应系统平台的软件包,并解压就可用。

为了方便管理我们把解压后的目录重命名为 frp :

wget https://github.com/fatedier/frp/releases/download/v0.28.1/frp_0.28.1_linux_arm64.tar.gz
tar xzvf frp_0.28.1_linux_arm64.tar.gz
mv frp_0.28.1_linux_arm64 frp
上面我们下载的是arm64的,只能在服务器上用,树莓派我们应该下载arm版本的,更多的版本下载: https://github.com/fatedier/frp/releases 

FRP 服务端配置

首先确定我们是在一台有公网IP的服务器上进行配置的,这里以Linux为例,frp默认给我们两个服务端配置文件,一个是简版的frps.ini,另一个是完整的frps_full.ini。

我们以简版为例:

$vim frps.ini
[common]
bind_port = 7000
#默认配置中监听的是7000端口,可修改
启动 FRP 服务端
ubuntu@VM-0-16-ubuntu:~/frp$ ./frps -c ./frps.ini
2019/08/08 23:40:39 [I] [service.go:146] frps tcp listen on 0.0.0.0:7000
2019/08/08 23:40:39 [I] [root.go:204] Start frps success

这样我们就已经启动了一个监听7000端口的frp服务端。

FRP 客户端配置

我们的客户端是在树莓派上面的,因此我们下载的应该是arm版本的。和服务端类似,默认也给出了两个客户端配置文件,分别是简版的frpc.ini和完整版的frpc_full.ini。

我们同样以简版的frpc.ini为例,我们这里假设我们服务器的公网ip为1.2.3.4。

$ vim frpc.ini

[common]
# server_addr 为 FRP 服务端的公网 IP
server_addr = 1.2.3.4
# server_port 为 FRP 服务端监听的端口
server_port = 7000

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22 #要穿透的本地端口
remote_port =6000 # 暴露到外网的端口
启动frp客户端
pi@raspberrypi:~/frp $ ./frpc -c ./frpc.ini
2019/08/08 23:51:22 [I] [service.go:223] login to server success, get run id [68ecfd2834058088], server udp port [0]
2019/08/08 23:51:22 [I] [proxy_manager.go:137] [68ecfd2834058088] proxy added: [ssh]
2019/08/08 23:51:22 [I] [control.go:144] [ssh] start proxy success

这样就已经配置好了,我们现在就可以通过1.2.3.4的6000端口来访问树莓派的SSH服务了。

记得在服务器上放行7000端口和6000端口
$ ssh -oPort=6000 pi@1.2.3.4
#这里ip为服务端ip,端口为我们暴露到外网的端口即6000

配置自动启动

这里介绍两种方法,我们将在服务端和客户端分别使用。

Systemctl

第一种方法我们使用systemctl来控制启动,我们在服务端进行配置。

首先我们需要在/lib/systemd/system/下新建一个名为frps.service的文件。

$sudo vim /lib/systemd/system/frps.service

写入以下内容:

[Unit]
Description=Frp Server Service
After=network.target syslog.target
Wants=network.target network-online.target

[Service]
Type=simple
#启动服务的命令(此处写你的frps的实际安装目录)
ExecStart=/usr/bin/frps -c /etc/frp/frps.ini

[Install]
WantedBy=multi-user.target

:x保存并退出,然后启动frps服务并设置开机自启动:

$sudo systemctl start frps

$sudo systemctl enable frps

其他systemctl命令:

  • 重启 sudo systemctl restart frps
  • 停止 sudo systemctl stop frps
  • 查看应用日志 sudo systemctl status frps

Supervisor

因为如果用Systemctl来给树莓派设置开机自启的话,树莓派很大概率会出现unreachable错误,unreachable就是路由表里没这个项,路由表里没这个项是因为没联网,没联网是因为联网服务还没起它就起了。为了避免这个错误,我们使用Supervisor来进行开机自启,因为Supervisor支持自动重启,这样就可以解决错误发生。

首先我们需要安装Supervisor:

sudo apt install supervisor

然后我们在/etc/supervisor/conf.d下创建配置文件 frpc.conf:

$sudo vim /etc/supervisor/conf.d/frpc.conf

下面是我的配置:

[program:frpc]
command= /usr/bin/frpc -c /etc/frp/frpc.ini ; 程序启动命令
autostart=true      ; 在supervisord启动的时候也自动启动
startsecs=5         ; 启动5秒后没有异常退出,就表示进程正常启动了,默认为1秒
autorestart=true    ; 程序退出后自动重启,可选值:[unexpected,true,false],默认为unexpected,表示进程意外杀死后才重启
startretries=5       ; 启动失败自动重试次数,默认是3
user=root            ; 用哪个用户启动进程,默认是root
priority=999         ; 进程启动优先级,默认999,值小的优先启动
stopasgroup=false     ;默认为false,进程被杀死时,是否向这个进程组发送stop信号,包括子进程
killasgroup=false     ;默认为false,向进程组发送kill信号,包括子进程

写完后,要重新加载一下Supervisor,下面是一些相关命令:

# 重启supervisor
sudo systemctl restart supervisor
# 查看supervisor运行状态
sudo supervisorctl status
#停止frpc
supervisorctl stop frpc
#启动frpc
supervisorctl start frpc
#重启frpc
supervisorctl restart frpc

相关文章:

  1. Frp后台自动启动的几个方法
  2. frp实现内网穿透并配置自动启动
  3. 一款很好用的内网穿透工具--FRP
  4. supervisord守护进程的使用
  5. supervisor 使用详解

猫の手も借りたいほどだ