内网穿透的作用包括跨网段访问一个局域网中的一台主机。

如上图,假设我们想要通过主机 A 访问主机 C,但是主机 A 和主机 C 绑定的都是私有 ip 地址,所以它们之间是无法直接进行通信的。要想使得 A 和 C 能够进行通信,就需要用到内网穿透的技术。
我们可以借助 frps(服务端)和 frpc(客户端)来实现主机 A 对主机 C 的访问。
需要做的是:
- 在绑定了公网 ip 的主机 B 中配置 frps(服务端)
- 在主机 C 中配置 frpc(客户端)
frps/frpc 的工具包的 github 地址是:
Releases · fatedier/frp · GitHub[1]
下载适合自己机器的版本即可。
在服务端,即主机 B 中,编辑 frps.ini 文件:
[common]
bind_port = 7000
dashboard_port = 7500
dashboard_user = admin
dashboard_pwd = admin
authentication_method = token
token = pass123456
然后可以启动服务端,切换到 frps 软件的解压目录之后,使用命令:
./frps -c frps.ini

在客户端,即主机 C 中,编辑 frpc.ini 文件:
[common]
server_addr = x.x.x.x#公网ip地址
authentication_method = token
token = pass123456
server_port = 7000
[Fusion-ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 20022
[Fusion-rdp]
type = tcp
local_ip = 127.0.0.1
local_port = 3389
remote_port = 23389
客户端会根据 frpc.ini 文件中配置的 server 的 ip 以及 port 与 服务端监听的 7000 端口进行连接
客户端使用命令连接到服务端:
./frpc -c frpc.ini

这里主机 C(客户端)相当于是充当了反向代理的角色,而主机 B(服务端)充当了正向代理的角色。
正向代理是代理客户端,为客户端收发请求,使真实客户端对服务器不可见;而反向代理是代理服务器端,为服务器收发请求,使真实服务器对客户端不可见。
因此,主机 B 用来接收主机 A 发送过来的请求,然后主机 B 将请求转发给主机 C,从而主机 A 和主机 C 就能够进行通信了。
比如根据上面 frpc.ini 配置的 ssh 的内容,可知主机 A 通过 ssh 访问主机 B 的 20022 端口的时候,主机 B 会把该请求转发给主机 C 的 22 端口,因此主机 A 和主机 C 就建立了 ssh 的连接。
举例:
Windows 中 openssh 的下载地址是:mls-software.com[2],安装完成之后,可以直接在 powershell 的命令行中调用 ssh 命令。
现在通过主机 A(WIndows7)进行 ssh 访问,我们还知道主机 B 和主机 C 都是 linux 系统。
假设主机 C 中有两个用户,一个用户的用户名是 acat,另一个用户的用户名是 oracle,
那么 ssh 命令的格式是为: ssh -p 公网的转发端口 主机 C 的用户名 @公网的 ip

同样,可以使用 SFTP 协议传输文件,相当于是使用 SCP 命令来完成这种操作,因为 SCP 相当于是传输文件的过程中加了密。
命令格式:
把主机 A(本地机器 WIndows7)上的文件传到主机 C:(注意这里的 P 是大写的)
scp -P 公网的转发端口 主机 A 文件路径 主机 C 用户名 @公网 ip 地址: 主机 C 文件路径

拉取主机 C 上的文件到主机 A(本地机器 Windows7)中:
scp -P 公网的转发端口 主机 C 用户名 @公网 ip 地址: 主机 C 文件路径 主机 A 的目录

PS:
配置为服务

转载请注明:XAMPP中文组官网 » 使用frps和frpc实现内网穿透