最近有个项目,使用到的装有linux
系统的3399pro
开发板不在工位,和PC
不在同一个局域网下。但是又需要经常远程访问,所以这时候就需要使用内网穿透工具—frp
来帮助PC
能够连接到开发板。
不过前提是,你得有一个公网IP。
一、frp 是什么?frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。
刚开始的时候,代理多数是帮助内网client访问外网server用的。后来出现了反向代理,"反向"这个词在这儿的意思其实是指方向相反,即代理将来自外网客户端的请求转发到内网服务器,从外到内。
项目链接:https://github.com/fatedier/frp
二、为什么使用 frp?通过在具有公网 IP 的节点上部署 frp 服务端,可以轻松地将内网服务穿透到公网,同时提供诸多专业的功能特性,这包括:
- 客户端服务端通信支持 TCP、KCP 以及 Websocket 等多种协议。
- 采用 TCP 连接流式复用,在单个连接间承载更多请求,节省连接建立时间。
- 代理组间的负载均衡。
- 端口复用,多个服务通过同一个服务端端口暴露。
- 多个原生支持的客户端插件(静态文件查看,HTTP、SOCK5 代理等),便于独立使用 frp 客户端完成某些工作。
- 高度扩展性的服务端插件系统,方便结合自身需求进行功能扩展。
- 服务端和客户端 UI 页面。
1、下载
可以在 Github 的 Release 页面中下载到最新版本的客户端和服务端二进制文件,所有文件被打包在一个压缩包中。注意选择和自己的平台匹配的压缩包,如果公网机器和内网机器平台不一样,那就选择各自平台对应的压缩包!!!
2、部署
解压缩下载的压缩包,将其中的 frpc
拷贝到内网服务所在的机器上,将 frps
拷贝到具有公网 IP 的机器上,放置在任意目录。
3、开始使用!
编写好配置文件,然后:
- 先通过
./frps -c ./frps.ini
启动服务端, - 再通过
./frpc -c ./frpc.ini
启动客户端。
1、通过 SSH 访问内网机器
- 在具有公网 IP 的机器上部署
frps
,修改frps.ini
文件,这里使用了最简化的配置,设置了frp
服务器用户接收客户端连接的端口:
[common] bind_port = 7000
- 在需要被访问的内网机器上(SSH 服务通常监听在 22 端口)部署
frpc
,修改frpc.ini
文件,假设frps
所在服务器的公网 IP 为x.x.x.x
:
[common] server_addr = x.x.x.x server_port = 7000 [ssh] type = tcp local_ip = 127.0.0.1 local_port = 22 remote_port = 6000
local_ip
和 local_port
配置为本地需要暴露到公网的服务地址和端口。
remote_port
表示在frp
服务端监听的端口,访问此端口的流量将会被转发到内网服务对应的端口,也即用户访问此端口的请求会被转发到 local_ip:local_port
。
-
分别启动
frps
和frpc
。 -
通过
SSH
访问内网机器,假设frp
服务端用户名为test
:
ssh -oPort=6000 test@x.x.x.x frp 会将请求 x.x.x.x:6000 的流量转发到内网机器的 22 端口。
可以发现在配置文件中,还有一个7000端口,这个端口是frp服务端和frp客户端连接用的。也就是想要访问内网服务(frp客户端)的机器与frp服务端(公网服务器)通过6000端口进行连接,然后frp服务端(公网服务器)再通过7000端口和内网服务(frp客户端)的22端口进行连接,这样就将想要访问内网服务的机器和内网服务连接到了一起!!!
所以,我们才会使用ssh -oPort=6000 test@x.x.x.x
,因为我们直接连接的其实是公网服务器,是它提供了反向代理的功能!!!
2、使用VNC访问内网机器
- 首先你需要在内网机器上安装
vncserver
,例如可以执行以下安装命令:
sudo apt install tightvncserver
- 安装好之后,直接输入以下命令启动
vncserver
:
vncserver#第一次启动需要设置密码。
具体操作请参考此文章:https://www.cnblogs.com/a5idc/p/13539969.html,这里是以Ubuntu
为例的,实际情况以自己的系统版本为准!!!
- 然后和上述
1 通过 SSH 访问内网机器
中描述的差不多,只不过在frpc.ini
多设置了一段内容:
[common] server_addr = x.x.x.x server_port = 7000 [ssh] type = tcp local_ip = 127.0.0.1 local_port = 22 remote_port = 6000 [vnc] type = tcp local_ip = 127.0.0.1 local_port = 5901#这个端口可以在vncserver配置文件中设置 remote_port = 7001
- 最后在要访问内网机器的本地机器上安装
vnc
客户端,如vncviewer
,配置好服务端 的ip、端口号以及密码
之后就可以访问vnc
服务端了,也就是内网机器。
3、安全地暴露内网服务
这个示例将会创建一个只有自己能访问到的 SSH 服务代理。
对于某些服务来说如果直接暴露于公网上将会存在安全隐患。
使用 stcp(secret tcp)
类型的代理可以避免让任何人都能访问到要穿透的服务,但是访问者也需要运行另外一个 frpc
客户端。
frps.ini
内容如下:
[common] bind_port = 7000
- 在需要暴露到内网的机器上部署
frpc
,且配置如下:
[common] server_addr = x.x.x.x server_port = 7000 [secret_ssh] type = stcp #只有 sk 一致的用户才能访问到此服务 sk = abcdefg local_ip = 127.0.0.1 local_port = 22
- 在想要访问内网服务的机器上也部署 frpc,且配置如下:
[common] server_addr = x.x.x.x server_port = 7000 [secret_ssh_visitor] type = stcp #stcp 的访问者 role = visitor #要访问的 stcp 代理的名字 server_name = secret_ssh sk = abcdefg #绑定本地端口用于访问 SSH 服务 bind_addr = 127.0.0.1 bind_port = 6000
- 通过 SSH 访问内网机器,假设用户名为 test:
ssh -oPort=6000 test@127.0.0.1
,这里个人理解端口6000
和用户名test
指的还是frp
服务端的,但是此时使用的IP地址
却是内网机器的。
参考链接:https://gofrp.org/docs/