frp 是一个高性能的反向代理应用,可以帮助您轻松地进行内网穿透,对外网提供服务,支持 tcp, http, https 等协议类型,并且 web 服务支持根据域名进行路由转发。
相比ngrok,frp内网穿透无需多复杂的配置就可以达到比较好的穿透效果,具有较强的扩展性,支持 tcp, udp, http, https 协议。
在学习搭建前,首先需要理解什么是代理。
Proxy即代理,被广泛应用于计算机领域,主要分为正向代理与反向代理:
正向代理
正向代理隐藏了真实的请求客户端。服务端不知道真实的客户端是谁,客户端请求的服务都被代理服务器代替来请求,某些科学上网工具扮演的就是典型的正向代理角色。用浏览器访问http://www.google.com时被墙了,于是你可以在国外搭建一台代理服务器,让代理帮我去请求 google,代理把请求返回的相应结构再返回给我。 当多个客户端访问服务器时服务器不知道真正访问自己的客户端是那一台。正向代理中,proxy和client同属一个LAN,对server透明。
反向代理
反向代理隐藏了真实的服务端,当我们请求 ww.baidu.com 的时候,背后可能有成千上万台服务器为我们服务,但具体是哪一台,你不知道,也不需要知道,你只需要知道 www.baidu.com 是我们的反向代理服务器,反向代理服务器会帮我们把请求转发到真实的服务器那里去。Nginx就是性能非常好的反向代理服务器,用来做负载均衡。 反向代理中,proxy和server同属一个LAN,对client透明。
FRP实现内网穿透,就在于使用反向代理,使得真实的服务端得以隐藏。当外部用户(client)请求访问服务端VPS的时候,服务端VPS是下图中的客户端(实质上是上图中的server)的反向代理服务器,反向代理服务器会帮我们把请求转发到真实的服务器(下图中的客户端)那里去。这样就实现了内网穿透。
即: Client = 外部用户 proxy = 公网服务器(需要在服务器上搭建FRP服务端) Server = 内网服务器(需要在服务器上搭建FRP客户端)
需要提前准备的材料:
- 公网服务器1台(国外服务器需要关闭时间戳校验)
- 内网服务器1台
- 公网服务器绑定域名1个(可选项)
需要额外注意的事项:
注意,除http(s)以外,客户端frpc.ini内任何端口修改时须在以下范围内: 默认端口白名单:2000-3000,3001,3003,4000-50000
转发远程桌面时,需先在本机开启允许远程协助 我的电脑-右键属性-远程设置
需要注意frpc所在机器和frps所在机器的时间相差不能超过15分钟,因为时间戳会被用于加密验证中,防止报文被劫持后被其他人利用。
服务端(公网服务器)编辑的是:frps.ini
客户端编辑的是:frpc.ini
(1)服务端部署(Linux VPS)
配置 FRP 服务端的前提条件是需要一台具有公网 IP的设备,得益于 FRP 是 Go 语言开发的,具有良好的跨平台特性。你可以在 Windows、Linux、MacOS、ARM等几乎任何可联网设备上部署。
设置为开机自动启动
注意ExecStart中要配置成自己的绝对路径,绝对路径可以通过pwd命令查询。
(2)客户端部署(以树莓派为例)
设置为开机自动启动
这样就可以在 FRP 服务端上成功建立一个客户端连接,当然现在还并不能对外提供任何内网机器上的服务,因为我们并还没有在 FRP 服务端注册任何内网服务的端口。
(1)服务端部署(Linux VPS)
Dashboard 界面: 注意:面板上所有转发的端口都需要在服务器端开放其防火墙!!! 注意:面板上所有转发的端口都需要在服务器端开放其防火墙!!! 注意:面板上所有转发的端口都需要在服务器端开放其防火墙!!!
(2)客户端部署(后附每个穿透方案的详解)
详解:
通过 TCP 访问内网机器
通过 UDP 访问内网机器
通过 FRP 客户端代理其它内网机器访问外网
通过自定义域名访问部署于内网的 Web 服务 点此查看实例
1. 通过代理连接 FRP 服务端
在只能通过代理访问外网的环境内,FRP 客户端支持通过 HTTP_PROXY 参数来配置代理和 FRP 服务端进行通信。要使用此功能可以通过设置系统环境变量 HTTP_PROXY 或者通过在 FRP 客户端 的配置文件中设置 http_proxy 参数来使用此功能。
2. 安全地暴露内网服务(STCP)
对于一些比较敏感的服务如果直接暴露于公网上将会存在安全隐患,FRP 也提供了一种安全的转发方式 STCP。使用 STCP (secret tcp) 类型的代理可以避免让任何人都能访问到穿透到公网的内网服务,要使用 STCP 模式访问者需要单独运行另外一个 FRP 客户端。
下面就以创建一个只有自己能访问到的 SSH 服务代理为例,FRP 服务端和其它的部署步骤相同,主要区别是在 FRP 客户端上。
其次在要访问这个服务的机器上启动另外一个 FRP 客户端,配置如下:
这样就可以通过本机 6005 端口对内网机器 SSH 服务进行访问。
3. 点对点内网穿透
在传输大量数据时如果都经过服务器中转的话,这样会对服务器端带宽压力比较大。
FRP 提供了一种新的代理类型 XTCP 来解决这个问题,XTCP 模式下可以在传输大量数据时让流量不经过服务器中转。
使用方式同 STCP 类似,需要在传输数据的两端都部署上 FRP 客户端上用于建立直接的连接。
首先在 FRP 服务端 配置上增加一个 UDP 端口用于支持该类型的客户端: bind_udp_port = 7001
其次配置 FRP 客户端,和常规 TCP 转发不同的是这里不需要指定远程端口。 修改前:
修改后:
然后在要访问这个服务的机器上启动另外一个 FRP 客户端,配置如下:
这样就可以通过本机 6006 端口对内网机器 SSH 服务进行访问。
目前 XTCP 模式还处于开发的初级阶段,并不能穿透所有类型的 NAT 设备,所以穿透成功率较低。穿透失败时可以尝试 STCP 的方式。