frp 是什么?
frp是一个反向代理应用,它专注于内网穿透,具备高性能,支持TCP、UDP、HTTP、HTTPS等多种协议,它能够把内网服务,借助具有公网IP节点的中转向公网暴露,且是以安全、便捷的方式进行的。
为什么使用 frp?
在带有公网 IP 的节点之上落实 frp 服务端的部署操作,能够轻易地把内网服务穿透至公网,并且还能提供许多专业的功能特性,这些涉及到:
安装
关于如何安装 frp 的说明。
frp 是用 Golang 编写而成,能支持跨平台,只要下载对应平台的二进制文件便可执行,不存在额外依赖。
系统需求
鉴于采用了Golang进行编写,因而系统需求与最新的Golang针对系统以及平台的要求是一样的,具体的状况能够去参考。
下载
现今能够于Github的Release界面里获取到最新版的客户端以及服务端二进制文件,全部的文件被收纳于一个压缩包内。
部署
对下载得来的压缩包进行解压缩操作,把其中的frpc复制之后传送至处于内网服务所存在的那台机器之上,把frps复制后放置到有着公网IP的那台机器跟前,置于任意的一个目录当中。
开始使用!
编制配置文件,首先借由./frps -c ./frps.ini启动服务端,接着凭借./frpc -c ./frpc.ini启动客户端。要是有在后台长久运行的需求,建议联合其他工具运用,比如systemd和supervisor。
假使属于 Windows 用户范畴,那就得于 cmd 终端里去执行命令。
概念
一些概念,理解它们有助于您更好地了解和使用 frp。
原理
frp 主要是由客户端(frpc)以及服务端(frps)所构成,服务端一般是设置在有着公网 IP 的机器之上,客户端通常是安置在需要进行穿透的内网服务所在的那台机器上面。
不存在公网 IP 的内网服务,是无法被并非处于局域网之内的其他用户所实现访问的。
用户借助对服务端的 frps 进行访问,这种访问行为里,frp 承担着这样的职责,那就是依据请求所涉及的端口或者其他相关信息,把请求朝着对应的内网机器进行路由,最终达成通信的目的。
代理
在frp里,存在着这样一种情况,即一个代理是与一个需要被暴露的内网服务彼此对应的。并且,还有这样一个事实,那就是一个客户端能够支持同时去配置多个代理。
代理类型
frp 支持多种代理类型来适配不同的使用场景。
类型描述
tcp
仅仅只是单纯的 TCP 端口映射,在服务端那里,会依据不一样的端口,将其路由到不相同的内网服务。
udp
仅只是单纯的UDP端口进行映射时,服务端会依据各不相同有别的端口线路,径直到不同的内网服务那里去。
http
面向HTTP应用专门定制了好些额外的功能,像是对Host Header进行修改,还要增添鉴权。
https
针对 HTTPS 应用定制了一些额外的功能。
stcp
具备安全性的 TCP 内网代理,这种情况下钓鱼网,要在被访问者的机器之上部署 frpc,并且,还需要在访问者的机器之上部署 frpc,而此情形下,并不需要在服务端将端口进行暴露。
sudp
要实现安全的 UDP 内网代理,得在被访问者那台机器上部署 frpc,也要在访问者的机器上部署 frpc,且无需在服务端暴露端口。
xtcp
一种内网穿透代理方式,它是点对点的,其功能与 stcp 相同,然而流量并不需要经由服务器进行中转。
tcpmux
促成服务端 TCP 端口推行多路复用之举,借由同一端口达成对各异内网服务的访问。
通过 SSH 访问内网机器
这个示例,借助简单配置,使 TCP 类型的代理得以实现,进而让用户能够访问到处于内网的服务器。
把frps部署于具备公网IP的机器之上,对frps.ini文件进行修改。在此采用了最为简化的配置,设置了frp服务器用户用以接收客户端连接的端口。
[common]
bind_port = 7000
在内网机器上需安装frpc并进行部署,此内网机器是需要被访问的,SSH服务一般监听在22端口。要修改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服务端监听的那个端口,访问这个端口的流量,将会被转发到本地服务相对应的端口。
分别启动 frps 和 frpc。
通过 SSH 访问内网机器,假设用户名为 test:
ssh -oPort=6000 test@x.x.x.x
这个请求 x.x.x.x:6000 的流量,会被 frp 转发,转发到的是内网机器的 22 端口。
通过自定义域名访问内网的 Web 服务
这个示例,借助简单配置,配置了 HTTP 类型的代理,从而让用户得以访问到,访问到那处于内网的 Web 服务。
比起 TCP 类型,HTTP 类型的代理,在服务端,仅需监听一个额外端口 vhost_http_port,用来接收 HTTP 请求,并且,还额外给出了基于 HTTP 协议的众多功能。
更改 frps.ini 文件,将监听 HTTP 请求的端口设定为 8080。
[common]
bind_port = 7000
vhost_http_port = 8080
对 frpc.ini 文件作出修改,假定 frps 所在服务器的 IP 是 x.x.x.x,local_port 乃是本地机器上 Web 服务监听的端口,将自定义域名绑定为 custom_domains。
[common]
server_addr = x.x.x.x
server_port = 7000
[web]
type = http
local_port = 80
custom_domains = www.yourdomain.com
[web2]
type = http
local_port = 8080
custom_domains = www.yourdomain2.com
分别启动 frps 和 frpc。
要把,www.yourdomain.com,以及,www.yourdomain2.com:这两个域名的,A记录,解析到, IP就是x.x.x.x处去,当服务器那里,原来存着有,对应的域名时,也能够把, CNAME记录,解析一下,解析到哪儿呢?解析到服务器,之前的那个域名那里,如果不想这样操作,或者也有一种办法,能够通过,修改, HTTP请求的, Host字段,来达成,同样的效果。
访问内网机器上80端口处在的服务,可凭借浏览器去往http://www.yourdomain.com:8080 ,而访问内网机器上8080端口的服务,就要去往http://www.yourdomain2.com:8080。
转发 DNS 查询请求
此示例借助简便的配置,对 UDP 类型的代理予以运用,进而实现 DNS 查询请求的转发。
通常情况下,DNS 查询请求会采用 UDP 协议,frp 能够支持对内网 UDP 服务进行穿透,其配置方式与 TCP 大体上是一样的。
frps.ini 内容如下:
[common]
bind_port = 7000
frpc.ini 内容如下:
[common]
server_addr = x.x.x.x
server_port = 7000
[dns]
type = udp
local_ip = 8.8.8.8
local_port = 53
remote_port = 6000
此处反向代理置入了 Google 的 DNS 查询服务器的地址gab122gov,纯粹是用以开展 UDP 代理的测试,不存在实际的用途意义。
分别启动 frps 和 frpc。
凭借 dig 测试,UDP 包转发成功会得以知晓,预期之中,www.baidu.com 域名的解析结果将会被返回。
挖掘,在地址为x.x.x.x的地方,使用端口6000,针对百度网址www.baidu.com进行操作。
转发 Unix 域套接字
这个示例借助配置Unix域套接字客户端插件来达成通过TCP端口去访问处于内网之中的Unix域套接字服务,像Docker Daemon这样的,是其中的例子。
frps.ini 内容如下:
[common]
bind_port = 7000
frpc.ini 内容如下:
[common]
server_addr = x.x.x.x
server_port = 7000
[unix_domain_socket]
type = tcp
remote_port = 6000
plugin = unix_domain_socket
plugin_unix_path = /var/run/docker.sock
分别启动 frps 和 frpc。
通过 curl 命令查看 docker 版本信息
进行curl操作,目标地址为http://x.x.x.x:6000/version ,是要获取版本信息。
对外提供简单的文件访问服务
这个示例,借助配置static_file客户端插件,把本地文件,在公网上进行暴露,以供其他人去访问。
借助static_file插件,能够对外给予一个简易的、基于HTTP的文件访问服务,用以服务文件需求。
frps.ini 内容如下:
[common]
bind_port = 7000
frpc.ini 内容如下:
[common]
server_addr = x.x.x.x
server_port = 7000
[test_static_file]
type = tcp
remote_port = 6000
plugin = static_file
# 要对外暴露的文件目录
plugin_local_path = /tmp/file
# 用户访问 URL 中会被去除的前缀,保留的内容即为要访问的文件路径
plugin_strip_prefix = static
plugin_http_user = abc
plugin_http_passwd = abc
分别启动 frps 和 frpc。
要查看处于 /tmp/file 目录下的文件,需借助浏览器访问 http://x.x.x.x:6000/static/ ,如此便会要求输入已设定好的用户名以及密码。
为本地 HTTP 服务启用 HTTPS
经由https2http插件,能够使得本地HTTP服务转变成HTTPS服务,进而对外进行提供。
frps.ini 内容如下:
[common]
bind_port = 7000
frpc.ini 内容如下:
[common]
server_addr = x.x.x.x
server_port = 7000
[test_htts2http]
type = https
custom_domains = test.yourdomain.com
plugin = https2http
plugin_local_addr = 127.0.0.1:80
# HTTPS 证书相关的配置
plugin_crt_path = ./server.crt
plugin_key_path = ./server.key
plugin_host_header_rewrite = 127.0.0.1
plugin_header_X-From-Where = frp
分别启动 frps 和 frpc。
借助于浏览器来开展针对https://test.yourdomain.com的访问行为。
安全地暴露内网服务
这个示例将会创建一个只有自己能访问到的 SSH 服务代理。
对于某些服务来说如果直接暴露于公网上将会存在安全隐患。
采用 stcp(也就是 secret tcp)这样类型的代理gab122gov,能够防止让随便哪个人都能够访问到那想要穿透的服务,然而,访问者同样也得去运行另外一个 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
在想要访问内网服务的机器上也部署 frpc,且配置如下:
[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 访问内网机器,假设用户名为 test:
点对点内网穿透
这个示例,将会演示一种方式,这种方式以内网服务为对象,是不借助服务器进行中转流量从而达成访问目的的。
frp提供了一种新的代理类型,其为xtcp,该代理类型可用于应对场景,什么场景呢,就是在希望传输大量数据的时候,并且流量不经过服务器的那种特定场景。
运用方式跟 stcp 相仿佛,都得在两边分别部署 frpc以便构建直接连接。
当下正处于开发的起始阶段,没办法穿透全部种类的NAT设备,穿过时的成功概率比较低,穿透失败之际能够试着采用stcp的办法。
下面是 frps.ini 的内容,要额外去配置监听一个用于支持该类型客户端的 UDP 端口:
[common]
bind_port = 7000
bind_udp_port = 7000
在需要暴露到内网的机器上部署 frpc,且配置如下:
[common]
server_addr = x.x.x.x
server_port = 7000
[p2p_ssh]
type = xtcp
# 只有 sk 一致的用户才能访问到此服务
sk = abcdefg
local_ip = 127.0.0.1
local_port = 22
在想要访问内网服务的机器上也部署 frpc,且配置如下:
[common]
server_addr = x.x.x.x
server_port = 7000
[p2p_ssh_visitor]
type = xtcp
# xtcp 的访问者
role = visitor
# 要访问的 xtcp 代理的名字
server_name = p2p_ssh
sk = abcdefg
# 绑定本地端口用于访问 ssh 服务
bind_addr = 127.0.0.1
bind_port = 6000
通过 SSH 访问内网机器,假设用户名为 test:
ssh -oPort=6000 test@127.0.0.1
名师辅导
环球网校
建工网校
会计网校
新东方
医学教育
中小学学历