树莓派内网穿透
这是自己最近遇到的一个实际问题。因为在做机器学习的内容,需要训练模型,恰好前几天实验室的老师答应借我服务器一用。可是服务器我又不能搬回寝室。因为我们学校比较特殊,宿舍区域接入了公网IP,而教学区域却没有。想着有公网ip的话,会方便许多。突然想到我不是还有树莓派么,为什么不让树莓派接入公网ip后再内网穿透呢!这是个好主意!
虽然网上也有关于介绍树莓派使用frp内网穿透的文章。不过这里的场景有所不同。网上的的案例大都是树莓派处于内网中,作为frp客户端,利用公网上的一台vps将树莓派的服务映射到公网上实现穿透。
什么是内网穿透?
内网穿透,即NAT穿透,网络连接时术语,计算机是局域网内时,外网与内网的计算机节点需要连接通信,有时就会出现不支持内网穿透。
为什么需要内网穿透功能?
因为从公网中访问自己的私有设备向来是一件困难的事情。
自己的服务器、NAS等等设备,它们可能处于路由器后,或者运营商因为IP地址短缺不给你分配公网IP地址。如果我们想直接访问到这些设备(远程桌面,远程文件,SSH等等),一般来说要通过一些转发或者P2P组网软件的帮助。
比如我有一台计算机位于一个很复杂的局域网中,我想要实现远程桌面和文件访问,目前来看其所处的网络环境很难通过简单的端口映射将其暴露在公网之中,有这么几种方法:
- 远程桌面使用TeamViewer。可用,但需要访问端也拥有TeamViewer软件,不是很方便,希望能使用Windows自带的远程桌面。且TeamViewer不易实现远程文件访问。
- 使用蒲公英VPN软件进行组网,可用,但免费版本网络速度极慢,体验不佳,几乎无法正常使用。
- 使用花生壳软件进行DDNS解析,可用,但同第二点所述,免费版本有带宽限制,无法实际使用。
- 搭建frp服务器进行内网穿透,可用且推荐,可以达到不错的速度,且理论上可以开放任何想要的端口,可以实现的功能远不止远程桌面或者文件共享。
frp是什么?
简单地说,frp就是一个反向代理软件,它体积轻量但功能很强大,可以使处于内网或防火墙后的设备对外界提供服务,它支持HTTP、TCP、UDP等众多协议。
因为我寝室的网络已经接入联通公网ip了,所以我是将树莓派作为frp服务器,向校园内网里的其他机器提供内网穿透。虽然我也有很多云服务器,但我最终还是选择了树莓派。
最大的原因还是考虑到延时问题。联通提供公网ip和学校的网络同处于一个局域网网内,这样树莓派和需要内网穿透的机器间的延迟就可以忽略不计,那么也就只有远程连接一方和树莓派所处网络间的延迟了。
因为frp是github上的一个开源项目,这里查看官方文档,非常详细。
frp中文文档链接
frp服务端搭建
因为我使用树莓派作为服务端,所以先下载树莓派对应的版本,截止目前frp最新版本是v0.26.0
如果用的vps,ssh连接到VPS之后运行如下命令查看处理器架构,根据架构下载不同版本的frparch
查看结果,如果是“X86_64“即可选择”amd64”,
https://github.com/fatedier/frp/releases/
现在ssh远程连接上我们的树莓派,我是直接su root后以root身份执行的命令,如果你没有,请每一条命令前面带上 sudo 。
wget https://github.com/fatedier/frp/releases/download/v0.26.0/frp\_0.26.0\_linux\_arm.tar.gz
tar xvf frp_0.26.0_linux_arm.tar.gz
cd frp_0.26.0_linux_arm
这里我们只需要关注如下几个文件
- frps
- frps_full.ini
- frps.ini
该目录下的文件(s结尾代表server)分别是服务端程序和服务端配置文件,(c结尾代表client)分别是客户端程序和客户端配置文件。
vim frps.ini #编辑服务端配置文件,建议自行修改
[common]
bind_port = 7000
dashboard_port = 7500
token = 12345678
dashboard_user = admin
dashboard_pwd = admin
- “bind_port”表示用于客户端和服务端连接的端口,这个端口号我们之后在配置客户端的时候要用到。
- “dashboard_port”是服务端仪表板的端口,若使用7500端口,在配置完成服务启动后可以通过浏览器访问 x.x.x.x:7500 (其中x.x.x.x为VPS的IP)查看frp服务运行信息。
- “token”是用于客户端和服务端连接的口令,请自行设置并记录,稍后会用到。
- “dashboard_user”和“dashboard_pwd”表示打开仪表板页面登录的用户名和密码,自行设置即可。
这样就运行时就执行
======./frps -c frps.ini==
如果看到屏幕输出这样一段内容,即表示运行正常,如果出现错误提示,请检查上面的步骤。
但是如果想偷懒的话,端口均可使用默认值,token、user和password项请自行设置。直接在frps_full.ini这个它给好的配置文件中修改后运行即可
./frps -c frps_full.ini
此时访问 你的ip:7500 并使用自己设置的用户名密码登录,即可看到仪表板界面。
让frps在后台运行
至此,我们的服务端仅运行在前台,如果Ctrl+C停止或者关闭SSH窗口后,frps均会停止运行,因而我们使用 screen命令将其运行在后台。因为我用的树莓派所以
apt install screen
screnn -S frps #新建一个screen名为frps
此时我们就进入了screen里面了。再次执行./frps -c frps.ini
现在直接关闭ssh窗口,frps依旧在运行。frp服务端便搭建完成了。
frp客户端配置
frp的客户端就是我们想要真正进行访问的那台设备,大多数情况下应该会是一台Windows主机,因而本文使用Windows主机做例子;Linux配置方法类似。
同样地,根据客户端设备的情况选择相应的frp程序进行下载
用文本编辑器打开frpc.ini,与服务端类似,内容如下。
[common]
server_addr = x.x.x.x
server_port = 7000
token = 12345678
[rdp]
type = tcp
local_ip = 127.0.0.1
local_port = 3389
remote_port = 7001
因为我这里以远程桌面来演示,所以就没有添加其他的协议。具体参考frps_full.ini中的配置。
在当前目录下打开cmd窗口,我把背景换成了白色。
执行 frpc -c frpc.ini
不要关闭命令行窗口,此时可以在局域网外使用相应程序访问 x.x.x.x:xxxx (IP为VPS的IP,端口为自定义的remote_port)即可访问到相应服务。
此时我们在另外一台机器上进行远程桌面连接进行测试。
这是我在寝室里演示的,最右边那台主机用树莓派的公网ip加端口成功连接上中间那台内网主机,实现了内网穿透。
大功告成!!!
———————(本文转载)——————————-