在树莓派上设置frp穿透
步骤/目录:
1.购买阿里云服务器,安装frp并配置frps服务器端
2.树莓派下载frp并配置frpc客户端
3.其他
4.设置frpc开机自启并开启服务
5.验证
本文首发于个人博客https://lisper517.top/index.php/archives/11/
,转载请注明出处。
本篇文章的目的是使用公网ip地址访问树莓派的ssh和vnc。
本文实验日期为2022年2月10日。使用的是树莓派4B(内存8G版),系统为Pi OS 32位桌面版(2022年1月28日更新,镜像名 2022-01-28-raspios-bullseye-armhf.img );云服务器为阿里云,系统镜像为Ubuntu 20.04。
本文中的大多数操作在前文已经进行过,此处仅做总结。唯一新增之处是穿透vnc。
另外要提醒,因为frp修改使得对被穿透端口的操作都发生在本地,所以即使禁用本地端口,还是可以从公网ip访问到本地端口。
1.购买阿里云服务器,安装frp并配置frps服务器端
首先介绍一下frp。frp分为frps(server)和frpc(client),其中frps运行在有公网ip的云服务器上,frpc运行在内网中的机器上。frp主要用于把内网机器的端口映射到云服务器端口,比如把内网机器的22端口(一般用于ssh)映射到云服务器的6000端口,那么访问云服务器的6000端口即可接入内网机器的ssh服务。如果有其他方法搞到公网ip,也可以跳过这一步。
随便选择一个便宜的服务器,购买后安装镜像,这里选择的系统镜像是Ubuntu 20.04。在左侧 服务器运维-远程连接 中设置一下root账户密码,然后下载putty,通过putty连接:连接类型为SSH,端口为默认的22,主机地址填云服务器的ip地址。输入root和root密码后即登录到云服务器。
目前frp最新版本为0.38.0(2021年10月25更新)。这里安装frp到/bin目录下(wget github速度慢可以换成gitee上的仓库):
cd /bin
wget https://github.com/fatedier/frp/releases/download/v0.38.0/frp_0.38.0_linux_amd64.tar.gz
tar -zxvf frp_0.38.0_linux_amd64.tar.gz
mv frp_0.38.0_linux_amd64 frp
cd frp
nano frps.ini
然后配置一下frps.ini:
[common]
bind_port = 7000
#frpc上也要有相同的token值
token = 你的密码
#配置log
log_file = /var/logs/frps.log
log_level = info
log_max_days = 3
#frps统计板
dashboard_port = 7500
dashboard_user = wuhuqifei
dashboard_pwd = wuhuqifei
kcp_bind_port = 7000
解读一下配置选项:bind_port是frp使用的端口;token是密码令牌;log是日志相关;dashboard是统计板,设置好以后,网页访问 服务器ip:7500 即可看到frps的统计情况,user和pwd分别设置统计板的用户名密码(不用太复杂,简单易记即可)。如果后面运行frps时显示没有frps.log文件,可以自己新建一个并chmod改一下权限(或者直接删掉log相关设置)。最后的kcp_bind_port是多消耗15%左右流量、降低tcp延迟的,不要也可以不加。
详细配置可以参考frps_full.ini。
配置完成后,需要打开云服务器相应端口。在 安全-防火墙 中新增规则,打开7000和7500端口(云服务器在此处打开,非云服务器则使用ufw、iptables等。云服务器用ufw会出问题)。
附带一些github上常见问题:
流量是否经过服务器中转?
目前除了 xtcp 外,其他类型的内网穿透模式的流量都需要经过 frps 所在服务器中转。
网络传输速度慢是什么原因?
由于流量需要经过服务器转发,所以传输速度的快慢取决于服务器的下行带宽和客户端的上行带宽,通常家用宽带的上行带宽较低,限制了出口的速度。
另外一种情况是服务器部署在国外的 VPS 上,丢包率较高,也会影响到传输速度。这种情况下可以考虑开启 kcp 传输模式。
开启加密和压缩会消耗一定的 cpu 资源,且影响到传输速度,具体影响情况取决于机器性能。
客户端连接失败,提示 authorization failed
出现这种情况说明鉴权失败,检查 frps 和 frpc 的配置文件中的 token 是否一致。
客户端连接失败,提示 authorization timeout
出现这种情况是因为 frps 所在服务器和 frpc 所在服务器的系统时间相差较大。如果不希望在身份校验时加入系统时间,可以将 frps 配置文件中的 authentication_timeout 设置为 0 来解决这个问题。
frpc 能否在系统启动阶段无网络时一直等待而不是直接退出?
在 frpc 的配置文件中将 login_fail_exit 设置为 false,则 frpc 启动后会不断尝试连接 frps,直到连接成功,而不是直接退出。
最后使用./frps -c ./frps.ini
即可启动frps。启动后不能关闭putty,这时可以访问7500端口查看是否成功开启。
设置frps开机自动开启参考 不同系统下的开机自动运行 。
2.树莓派下载frp并配置frpc客户端
安装方法同上(版本是arm非64版,树莓派4B的CPU是64位但使用的Pi OS为32位。下载链接)。安装完成之后修改一下frpc.ini文件(frp文件夹放在/bin下为例):
[common]
server_addr = 云服务器ip地址
server_port = 7000
token = 你的密码
login_fail_exit = false
#下面的log部分也可以不加
log_file = /var/logs/frpc.log
log_level = info
log_max_days = 3
[pi4B-ssh-1]
type = tcp
local_ip = localhost
local_port = 22
remote_port = 50022
#若之前设置过gogs-ssh则不用再加[pi4B-ssh-1]
[pi4B-vnc-1]
type = tcp
local_ip = localhost
local_port = 3389
remote_port = 5902
3.其他
检查一下端口开放情况:服务器需要开放50022和5902端口(不要用ufw,要在 安全-防火墙 中添加规则);树莓派开放3389和22端口(本例用ufw添加规则。也可以不打开树莓派的本地端口,笔者需要在局域网中使用,所以打开)。
另外,记得删除一下安装包。
最后,为了降低风险,平时可以关闭树莓派vnc端口,需要时通过ssh打开。
4.设置frpc开机自启并开启服务
frp在systemd文件夹中放了.service文件。拷贝到/etc/systemd/system下即可:
cd /bin/frp/systemd
cp frpc.service /etc/systemd/system/frpc.service
然后打开/etc/systemd/system/frpc.service,把其中的User=nobody
删掉,ExecStart和ExecReload改一下即可(放在其他路径就改成其他的):
ExecStart=/bin/frp/frpc -c /bin/frp/frpc.ini
ExecReload=/bin/frp/frpc reload -c /bin/frp/frpc.ini
最后enable+start:
systemctl enable frpc.service
systemctl start frpc.service
5.验证
若之前在树莓派的/etc/ssh/sshd_config
中设置了不允许密码登录,这里验证时需改为yes:
PasswordAuthentication yes
另外注意登录的用户是否被禁止登录。
使用windows自带的 远程桌面连接 连接到 服务器ip:5902,显示出桌面;
使用PuTTY连接到 服务器ip:50022 端口,成功连接到树莓派ssh服务。