很多小伙伴询问 frp 原理,文本简单解释一下。在 frp 中一个代理对应一个需要暴露的内网服务。一个客户端可同时配置多个代理。一些概念,理解它们有助于小伙伴们更好地了解和使用 frp。
原理
frp 是由客户端和服务端组成,服务端通常部署在有公网 IP 的机器上,客户端通常部署在需穿透的内网服务所在的机器上。
内网服务器由于没有公网 IP,不能被非局域网内其他用户访问。
用户通过访问服务端 frps,由 frp 负责根据请求端口或其它信息将请求路由到对应的内网机器,从而实现通信。
通过内网穿透技术,可使内网设备即便没有公网 IP 及端口,也可被公网的用户访问。
类型
frp 支持多种代理类型来适配不同使用场景:
类型 | 描述 |
---|---|
tcp | 单纯的 TCP 端口映射,服务端会根据不同端口路由到不同的内网服务 |
udp | 单纯的 UDP 端口映射,服务端会根据不同端口路由到不同的内网服务 |
http | 针对 HTTP 应用定制了一些额外功能,如修改 Host Header,增加鉴权 |
https | 针对 HTTPS 应用定制了一些额外功能 |
stcp | 安全的 TCP 内网代理,需在被访问者和访问者的机器上都部署 frpc,不需在服务端暴露端口 |
sudp | 安全的 UDP 内网代理,需在被访问者和访问者的机器上都部署 frpc,不需在服务端暴露端口 |
xtcp | 点对点的内网穿透代理,功能同 stcp,但是流量不需要经过服务器中转 |
tcpmux | 支持服务端 TCP 端口多路复用,通过同一个端口访问不同的内网服务 |
TCP
1 | [ssh] |
注意:frp 会为本地服务 22
端口,在 frps 所在服务端监听 6000
端口,将 6000
端口接收到的连接和本地服务 22
端口关联,透传流量,从而实现让用户在外部访问内部服务。
UDP
1 | [dns] |
注意:frp 会为本地服务 53
端口,在 frps 所在服务端监听 6000
端口,将 6000
端口接收到的连接和本地服务 53
端口关联,透传流量,从而实现让用户在外部访问内部服务。
XTCP
1 | [stcp-visitor] |
注意:当连接 127.0.0.1:9002 时超过 200ms 打洞还未成功的话,会回退到用 stcp-visitor
建立连接。fallback 后,之前触发的打洞操作仍然会继续,一般来说打洞完成需要耗时会比较长。
TCPMUX
frp 支持将单个端口收到的连接路由到不同代理。目前支持复用器只有 httpconnect
。当 frps.ini 的 common
中设置 tcpmux_httpconnect_port
,frps 将会监听在这个端口,接收 HTTP 的请求。frps 会根据 HTTP 请求中的 Host 路由到不同的后端代理。frps.ini 的配置如下:
1 | [common] |
frpc.ini 的配置如下:
1 | [common] |
条评论