FRP内网穿透


一、什么是FRP

1.1 FRP简介

FRP(Fast Reverse Proxy)是一个开源、高性能的内网穿透和反向代理应用,它支持TCP、UDP、HTTP、HTTPS等多种协议。FRP可以帮助用户将内网服务以安全、便捷的方式通过具有公网IP节点的中转暴露到公网。

FRP由客户端(frpc)和服务端(frps)组成,服务端通常部署在具有公网IP的机器上,而客户端部署在需要穿透的内网服务所在的机器上。通过这种方式,FRP实现了内网服务的公网访问,同时提供了安全性和便利性。

FRP的一些应用场景:

  • 远程访问内网服务:例如,通过FRP访问家里或公司的服务器,而不需要配置复杂的端口映射。
  • 开发环境共享:开发者可以通过FRP共享自己本地的开发环境,外部团队可以直接访问内网的应用和API。
  • 穿透防火墙/NAT:即使内网服务器处于NAT后面或防火墙后面,仍然可以通过FRP将服务暴露到公网。

1.2 FRP工作原理

  • 服务端(frps)运行,监听一个主端口,等待客户端(frpc)的连接;
  • 客户端(frpc)连接到服务端(frps)的主端口,同时告诉服务端要监听的端口和转发类型;
  • 服务端fork新的进程监听客户端指定的监听端口;
  • 外网用户连接到上一步服务端fork的进程所监听的端口,服务端(frps)通过和客户端(frpc)的连接将数据转发到客户端(frpc);
  • 客户端(frpc)进程再将数据转发到本地服务
  • 后续流量从内网本地服务转发给frpc,frpc转发给frps,frps转发给外网用户,从而实现内网对外暴露服务的能力。

图中,内网本地的127.0.0.1:80端口的web服务通过客户端配置,映射到VPS上的47.97.177.130:30001端口。后续流量从本地80端口转发到frpc,frpc通过vps的7000端口转发给vps,vps在把流量转发到30001端口,如此便实现了内网服务在外网的暴露,外网用户可以从外网访问到内网的80端口的服务。

二、实现FRP内网穿透的前提条件

  1. VPS一台(也可以是具有公网IP的实体机),因为frp的原理是利用服务端VPS来进行流量转发,因而VPS的性能直接决定了后续连接的质量。
  2. 访问目标设备(就是你最终要访问的内网设备)
  3. 简单的Linux命令基础

三、实现方法

3.1 服务端(frps)

1)通过SSH与VPS建立连接,然后执行arch命令查看硬件架构的类型。

arch命令是一个用于显示当前主机的硬件架构类型的Linux命令。这个命令在多个Linux发行版中都是可用的,包括RedHat、RHEL、Ubuntu、CentOS等。通过使用arch命令,你可以快速地获取当前系统的硬件架构信息,这对于跨平台编程、软件包管理和系统故障排除等场景非常有用。

2)根据架构不同,选择相应版本并进行下载。

如果是x86_64即可选择amd64

wget https://github.com/fatedier/frp/releases/download/v0.22.0/frp_0.22.0_linux_amd64.tar.gz

x86_64 和 amd64:

x86_64amd64都是指64位的x86架构,它们是同一种架构的不同名称。

  1. x86_64
    • 这个术语是英特尔(Intel)的64位扩展架构的官方名称。
    • x86_64是x86架构的64位扩展,x86是英特尔最初为其8086处理器定义的32位架构。
    • x86_64架构支持64位内存寻址,允许操作系统和应用程序访问超过4GB的内存。
  2. amd64
    • amd64是AMD为其64位处理器架构所使用的名称。
    • 实际上,amd64x86_64是兼容的,因为AMD的64位处理器也是基于x86架构设计的。
    • amd64同样支持64位计算和更大的内存寻址空间。

尽管名称不同,但这两个术语都指的是同一种64位计算架构。在大多数情况下,它们可以互换使用,因为它们在技术上是等效的。这种架构被广泛应用于个人电脑、服务器和工作站中,因为它提供了更好的性能和更大的内存寻址能力。

所以在这里,arch返回的架构如果是x86_64,那么下载frp的时候可以选择amd64的安装包。

3)解压查看文件内容

tar -zxvf frp_0.22.0_linux_amd64.tar.gz

文件夹改个名,方便使用

mv frp_0.22.0_linux_amd64 frp

查看文件夹内容:

  • frps
  • frps.ini
  • frpc
  • frpc.ini

其中frps和frps.ini是frp的服务端程序及配置文件,frpc和frpc.ini是frp的客户端程序及配置文件。首先在VPS配置服务端程序,客户端程序相关的文件可以删除。

4)frps.ini

[common]
bind_port = 7000
dashboard_port = 7500
token = 12345678
dashboard_user = admin
dashboard_pwd = admin
vhost_http_port = 10080
vhost_https_port = 10443
  1. bind_port = 7000:这是frp服务端监听的端口,用于接收来自客户端的连接。默认情况下,客户端会将流量发送到这个端口。
  2. dashboard_port = 7500:这是frp的仪表板(Dashboard)端口,用于访问frp的Web管理界面。通过这个端口,你可以查看连接状态、流量统计等信息。
  3. token = 12345678:这是用于客户端和服务端之间认证的令牌。客户端在连接到服务端时需要提供这个令牌,以确保连接的安全性。
  4. dashboard_user = admin:这是访问仪表板时使用的用户名。
  5. dashboard_pwd = admin:这是访问仪表板时使用的密码。
  6. vhost_http_port = 10080:这是用于虚拟主机的HTTP端口。如果你配置了frp的虚拟主机功能,那么通过这个端口可以访问绑定的域名。
  7. vhost_https_port = 10443:这是用于虚拟主机的HTTPS端口。与vhost_http_port类似,但是用于加密的HTTPS流量。

5)启动frps

./frps -c frps.ini

如果看到屏幕输出这样一段内容,即表示运行正常,如果出现错误提示,请检查上面的步骤。

[service.go:130] frps tcp listen on 0.0.0.0:7000
[service.go:172] http service listen on 0.0.0.0:10080
[service.go:193] https service listen on 0.0.0.0:10443
[service.go:216] Dashboard listen on 0.0.0.0:7500
[root.go:210] Start frps success

此时访问vpsip:7500 并使用自己设置的用户名密码登录,即可看到仪表板界面。

6)服务端后台运行

nohup ./frps -c frps.ini &
  • nohup:nohup是一个后台程序管理工具,用于运行命令并其在你退出终端会话后仍然继续运行。nohup的名称来源于“no hang up”(不要挂断)。
  • ./frps:这是frp服务端程序的可执行文件。./表示当前目录,frps`是要执行的程序。
  • -c frps.ini:这是传递给frps程序的一个参数,指定使用frps.ini文件作为配置文件。
  • &:这个符号将命令放到后台执行,即使终端关闭,程序也会继续运行。

当你执行这个命令时,frps服务会使用frps.ini配置文件中的设置启动,并在后台运行,不会占用终端。这样,你可以继续使用终端进行其他操作,而frps服务会在后台保持运行状态。

如果你需要查看frps服务的输出,可以使用nohup命令的输出重定向功能,例如:

nohup ./frps -c frps.ini > frps.log 2>&1 &

这个命令会将frps的标准输出(stdout)和标准错误(stderr)都重定向到frps.log文件中,这样你就可以通过查看frps.log文件来获取服务的日志信息。

输出如下内容即表示正常运行:

nohup: ignoring input and appending output to 'nohup.out'

此时可先使用Ctrl+C关闭nohup,frps依然会在后台运行,使用jobs命令查看后台运行的程序jobs,在结果中我们可以看到frps正在后台正常运行

[1]+  Running                 nohup ./frps -c frps.ini &

此时访问 vpsip:7500 依然可以打开仪表板界面,至此,服务端即设置完成,可以关闭SSH窗口。

3.2 客户端(frpc)

frp客户端部署在我们真正想访问的内网设备。

1)根据内网设备类型下载相应的frp程序

2)frpc.ini配置文件

[common]
server_addr = 【填vps的ip==frps的ip】
server_port = 7000
token = won517574356
[rdp]
type = tcp
local_ip = 127.0.0.1           
local_port = 3389
remote_port = 7001  
[smb]
type = tcp
local_ip = 127.0.0.1
local_port = 445
remote_port = 7002

这是 frp 客户端的配置文件,用于定义客户端如何连接到服务端以及如何转发特定的端口。下面是各配置项的详细解释:

[common] 部分:

  • server_addr:服务端的IP地址,这里需要填写你的VPS(虚拟专用服务器)的IP地址,也就是运行 frps 的服务器的IP。
  • server_port:服务端监听的端口,这里设置为7000,与服务端配置文件中的 bind_port 相对应。
  • token:用于客户端和服务端之间认证的令牌,这里设置为 won517574356,需要与服务端配置文件中的 token 一致。

[rdp] 部分:

  • type:代理类型,这里设置为 tcp,表示使用TCP协议。
  • local_ip:内网中需要被代理的机器的IP地址,这里设置为 127.0.0.1,通常用于本地机器。
  • local_port:内网中需要被代理的机器的端口,这里设置为3389,是Windows远程桌面(RDP)的标准端口。
  • remote_port:在服务端上开放的端口,用于外部访问,这里设置为7001。

[smb] 部分:

  • type:代理类型,这里同样设置为 tcp
  • local_ip:内网中需要被代理的机器的IP地址,这里也是 127.0.0.1
  • local_port:内网中需要被代理的机器的端口,这里设置为445,是Windows文件共享(SMB)的标准端口。
  • remote_port:在服务端上开放的端口,用于外部访问,这里设置为7002。

通过这个配置文件,你可以将内网中的RDP和SMB服务暴露给公网,使得你可以从外部通过VPS的IP地址和相应的 remote_port 来访问这些服务。例如,你可以通过 server_addr:7001 来访问RDP服务,通过 server_addr:7002 来访问SMB服务。

3)运行客户端程序

frpc程序不能直接双击运行!

找到程序安装位置:

./frpc -c frpc.ini
[service.go:205] login to server success, get run id [2b65b4e58a5917ac], server udp port [0]
[proxy_manager.go:136] [2b65b4e58a5917ac] proxy added: [rdp smb]
[control.go:143] [smb] start proxy success
[control.go:143] [rdp] start proxy success

运行frpc程序,窗口中输出如上内容表示运行正常。

不关闭命令行窗口,此时可以在局域网外使用相应程序访问 vpsip:remote_port (端口为自定义的remote_port)即可访问到相应服务。

4)客户端后台运行及开机自启

创建fprc.bat文件:

@echo off
if "%1" == "h" goto begin
mshta vbscript:createobject("wscript.shell").run("""%~nx0"" h",0)(window.close)&&exit
:begin
REM
cd C:\frp
frpc -c frpc.ini
exit

这段代码是一个Windows批处理脚本(.bat 文件),用于以隐藏窗口的方式运行 frp 客户端程序 frpc。下面是脚本的详细解释:

  1. @echo off:关闭命令的回显,使得执行时不会显示执行的命令。
  2. if "%1" == "h" goto begin:检查传递给批处理脚本的第一个参数(%1),如果参数是 h,则跳转到标签 begin
  3. mshta vbscript:createobject("wscript.shell").run("""%~nx0"" h",0)(window.close)&&exit:如果第一个参数不是 h,则使用 mshta 命令(Microsoft HTML Application)执行一个VBScript脚本来运行当前脚本,并传递 h 作为参数,同时关闭 mshta 窗口。%~nx0 是当前批处理文件的名称和扩展名。
  4. :begin:一个标签,用于在条件满足时跳转到这里。
  5. cd C:\frp:将命令行的当前目录更改为 C:\frp,假设 frpc.ini 配置文件和 frpc 可执行文件位于这个目录。
  6. frpc -c frpc.ini:运行 frpc 客户端程序,并使用 frpc.ini 配置文件。
  7. exit:退出批处理脚本。

这个脚本的目的是让用户可以通过双击批处理文件来以隐藏窗口的方式启动 frpc 客户端,而不需要打开命令行窗口。如果用户希望在命令行中启动 frpc 并看到输出,他们可以传递 h 作为参数,例如 your_script.bat h,这样就不会使用 mshta 来隐藏窗口。

请注意,使用 mshta 来隐藏窗口是一种不太常见的做法,可能会被一些安全软件视为可疑行为。此外,mshta 命令在某些Windows版本中可能已被禁用。

之后直接运行这个 .bat 文件即可启动frpc并隐藏窗口(可在任务管理器中退出)。

如果想要开机启动,把这个 .bat 文件放在Windows的开机启动文件夹即可。

之后如果想暴露其他服务,只需要需要在frpc.ini后追加规则即可。

建议在使用frp直接测试内网穿透前,先在局域网内测试好相关功能的正常使用,并配置好可能会影响的Windows防火墙等内容,在内网调试通过后再使用frp进行内网穿透测试。

参考


文章作者: 司晓凯
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 司晓凯 !
  目录