用frp实现树莓派4B的内网穿透

知识分子没文化
2021-02-28 / 0 评论 / 2,342 阅读 / 1,687 字数 / 正在检测是否收录...
温馨提示:
本文最后更新于2021年10月16日,已超过916天没有更新,如存在内容错误、图片加载失败、链接失效等问题,请留言反馈,博主将在第一时间进行修改。

目录:

环境说明:

服务端设备:阿里云轻量应用服务器

服务端系统:ubuntu 20.04

客户端设备:树莓派4B

客户端系统: Debian-Pi-Aarch64 2.0_无桌面增强版-2021-01-03

前言

引用frp项目的部分官方文档对frp进行一个简单的介绍:

frp是什么?

frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。

为什么使用 frp ?

通过在具有公网 IP 的节点上部署 frp 服务端,可以轻松地将内网服务穿透到公网,同时提供诸多专业的功能特性,这包括:

  • 客户端服务端通信支持 TCP、KCP 以及 Websocket 等多种协议。
  • 采用 TCP 连接流式复用,在单个连接间承载更多请求,节省连接建立时间。
  • 代理组间的负载均衡。
  • 端口复用,多个服务通过同一个服务端端口暴露。
  • 多个原生支持的客户端插件(静态文件查看,HTTP、SOCK5 代理等),便于独立使用 frp 客户端完成某些工作。
  • 高度扩展性的服务端插件系统,方便结合自身需求进行功能扩展。
  • 服务端和客户端 UI 页面。

这一段文档看不懂?没关系,你只需要知道frp是免费开源的内网穿透工具,这就够了。下面链接可以了解到更多:

frp项目官网:https://gofrp.org/

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

frp的项目文档:https://gofrp.org/docs/

进行frp内网穿透需要一台有公网ip的设备作为转发的服务端,本篇用阿里云服务器来作为服务端,给树莓派实现内网穿透,以下是详细步骤:

1.在服务端部署frp

用SSH连接到阿里云服务器,下载amd64架构的frp文件包:

sudo wget https://github.com/fatedier/frp/releases/download/v0.35.1/frp_0.35.1_linux_amd64.tar.gz

然后用tar命令解压下载的压缩包:

sudo tar -zxvf frp_0.35.1_linux_amd64.tar.gz

# 文件名可能会有不同,用ls -a命令查看

进入解压后的文件夹,文件夹中包含amd64架构的服务端二进制文件和客户端二进制文件两种。由于阿里云服务器作为服务端,所以在这上面我们只用到服务端的二进制文件及对应的ini配置文件,其他的文件可以选择删除掉。

01

编辑frps.ini文件:

sudo nano frps.ini

frps.ini文件内容如下:

[common]
bind_port = 7000        # 默认端口为7000

其中,bind_port端口修不修改都可以,但是bind_port端口要与客户端配置文件的server_port端口相同。修改完之后ctrl +o保存,ctrl +x退出。记得要在服务器中放行bind_port端口

2.配置frp客户端

再用SSH连接到树莓派的控制台,下载适用于树莓派的arm64架构的frp文件包:

sudo wget https://github.com/fatedier/frp/releases/download/v0.35.1/frp_0.35.1_linux_arm64.tar.gz

与上一步类似,解压下载的压缩包:

sudo tar -zxvf frp_0.35.1_linux_arm64.tar.gz

# 文件名可能会有不同,用ls -a命令查看

同样的,文件夹中包含了服务端和客户端的两种二进制文件。树莓派作为客户端只用到客户端的二进制文件及对应的ini配置文件,其他的文件可以删除。

02

编辑其中的frpc.ini文件:

sudo nano frpc.ini

frpc.ini文件内容如下:

[common]
server_addr = 127.0.0.1
server_port = 7000

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

按如下参数说明修改配置文件:

server_addr:服务器的IP地址;

server_port:服务器端的端口,与服务端配置文件的bind_port端口相同;

local_ip:要在公网访问的本地设备的地址,这里指客户端本机,填127.0.0.1即可;

local_port:本地设备要暴露的端口,即理解为提供服务的端口

remote_port:在外网的访问端口,此端口上的流量会被转发到本地设备对应的local_port端口上

还有别忘了在服务器防火墙上放行remote_port端口

配置文件中默认有一个ssh的访问配置,如果我们还想让其他的端口在外网访问到,那就可以照猫画虎来添加一个配置。比如在外网用公网ip的8888端口访问本地设备的80端口,就可以这样写:

[http]                  # 名字自定,写在方括号里面
type = tcp
local_ip = 127.0.0.1
local_port = 80
remote_port = 8888

类似的,可以根据需求添加更多的访问配置。

3.启动frp服务

设置完毕,就可以启动frp服务了。

先到阿里云服务器控制台窗口中启动服务端frp服务,在frp的目录中执行:

./frps -c ./frps.ini

03

再连接树莓派的控制台,启动客户端frp服务时同样在frp目录中执行:

./frpc -c ./frpc.ini

04

需要注意的是,一定要先启动服务端frp,再启动客户端frp。要是先启动客户端frp,就会报错:

05

4.连接服务

以上配置完成,就可以在外网访问本地的服务了,访问方式是:服务器的IP地址/域名:端口。此处端口为客户端配置文件中的remote_port端口。

5.将frp加入开机启动

5.1服务端

回到阿里云服务端控制台,在/etc/init.d目录下新建一个脚本文件:

cd /etc/init.d

# 新建脚本文件
sudo nano frp.sh

脚本文件的内容为:

#!/bin/bash
### BEGIN INIT INFO
# Provides:     frp
# Required-Start:  $remote_fs $syslog
# Required-Stop:   $remote_fs $syslog
# Default-Start:   2 3 4 5
# Default-Stop:   0 1 6
# Short-Description: start frp
# Description:    start frp
### END INIT INFO

# 上面一部分不可少,下面这一部分是命令内容,以exit 0结束
# /root/frp换成自己的目录,当前目录用pwd命令查看
cd /root/frp
./frps -c ./frps.ini

exit 0

修改完之后ctrl +o保存,ctrl +x退出。执行以下语句给脚本文件足够的执行权限:

sudo chmod 755 frp.sh
# frp.sh为刚才建的脚本文件名称,这个按实际情况来写

最后再将脚本添加到开机启动就行了:

sudo update-rc.d frp.sh defaults 90
# frp.sh为刚才建的脚本文件名称,这个按实际情况来写

90表示执行的优先级,数字越大表示越晚执行。

附:移除脚本命令:

sudo update-rc.d -f frp.sh remove
5.2客户端

以上方法适用于部分debian系的Linux系统,所以在客户端上也是可以按照上面那种方法实现开机启动frp。可是我到树莓派上试了好像不行,经过多次尝试,基本可以确定问题是由于树莓派上安装的是树莓派爱好者基地的Debian-Pi-Aarch64系统,原来在Debian系Linux上添加开机启动的方法就不太适用了。不过在其官方文档说明中也提供了添加开机自定义脚本的方法:

# 编辑脚本文件"/boot/rc-local" 
sudo nano /boot/rc-local

向脚本文件中添加如下命令,添加在exit 0之前:

cd /home/frp
./frpc -c ./frpc.ini

# "/home/frp"换成自己的frp目录

添加完之后保存退出。

这时候再分别重启服务端和客户端,frp服务就会自动运行了,不再需要手动运行。如果重启之后无法连接访问,建议再等待一两分钟,因为有可能会是其中一端的开机启动服务还未加载完全。

0

评论 (0)

取消