最近有个项目,使用到的装有linux
系统的3399pro
开发板不在工位,和PC
不在同一个局域网下。但是又需要经常远程访问,所以这时候就需要使用内网穿透工具—frp
来帮助PC
能够连接到开发板。
不过前提是,你得有一个公网IP。
frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。
刚开始的时候,代理多数是帮助内网client访问外网server用的。后来出现了反向代理,"反向"这个词在这儿的意思其实是指方向相反,即代理将来自外网客户端的请求转发到内网服务器,从外到内。
项目链接:https://github.com/fatedier/frp
通过在具有公网 IP 的节点上部署 frp 服务端,可以轻松地将内网服务穿透到公网,同时提供诸多专业的功能特性,这包括:
1、下载
可以在 Github 的 Release 页面中下载到最新版本的客户端和服务端二进制文件,所有文件被打包在一个压缩包中。注意选择和自己的平台匹配的压缩包,如果公网机器和内网机器平台不一样,那就选择各自平台对应的压缩包!!!
2、部署
解压缩下载的压缩包,将其中的 frpc
拷贝到内网服务所在的机器上,将 frps
拷贝到具有公网 IP 的机器上,放置在任意目录。
3、开始使用!
编写好配置文件,然后:
./frps -c ./frps.ini
启动服务端,./frpc -c ./frpc.ini
启动客户端。1、通过 SSH 访问内网机器
frps
,修改 frps.ini
文件,这里使用了最简化的配置,设置了 frp
服务器用户接收客户端连接的端口:[common]
bind_port = 7000
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 [email protected]
frp 会将请求 x.x.x.x:6000 的流量转发到内网机器的 22 端口。
可以发现在配置文件中,还有一个7000端口,这个端口是frp服务端和frp客户端连接用的。也就是想要访问内网服务(frp客户端)的机器与frp服务端(公网服务器)通过6000端口进行连接,然后frp服务端(公网服务器)再通过7000端口和内网服务(frp客户端)的22端口进行连接,这样就将想要访问内网服务的机器和内网服务连接到了一起!!!
所以,我们才会使用ssh -oPort=6000 [email protected]
,因为我们直接连接的其实是公网服务器,是它提供了反向代理的功能!!!
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
[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 -oPort=6000 [email protected]
,这里个人理解端口6000
和用户名test
指的还是frp
服务端的,但是此时使用的IP地址
却是内网机器的。参考链接:https://gofrp.org/docs/