时间:2019年03月27日 | 作者 : liuhui | 分类 : FRP教程 | 浏览: 14055次 | 评论 0 人
阿里云限量代金券 | 此广告位出租25元/月 |
中文文档
frp 是一个高性能的反向代理应用,可以帮助您轻松地进行内网穿透,对外网提供服务,支持 tcp, udp, http, https 等协议类型,并且 web 服务支持根据域名进行路由转发。
frp 的作用
开发状态
架构
使用示例
通过 ssh 访问公司内网机器
通过自定义域名访问部署于内网的 web 服务
转发 DNS 查询请求
功能说明
端口白名单
Dashboard
身份验证
加密与压缩
服务器端热加载配置文件
特权模式
连接池
修改 Host Header
通过密码保护你的 web 服务
自定义二级域名
URL 路由
通过 HTTP PROXY 连接 frps
开发计划
为 frp 做贡献
捐助
支付宝扫码捐赠
Paypal 捐赠
贡献者
利用处于内网或防火墙后的机器,对外网环境提供 http 或 https 服务。
对于 http 服务支持基于域名的虚拟主机,支持自定义域名绑定,使多个域名可以共用一个80端口。
利用处于内网或防火墙后的机器,对外网环境提供 tcp 服务,例如在家里通过 ssh 访问处于公司内网环境内的主机。
可查看通过代理的所有 http 请求和响应的详细信息。(待开发)
frp 目前正在前期开发阶段,master 分支用于发布稳定版本,dev 分支用于开发,您可以尝试下载最新的 release 版本进行测试。
目前的交互协议可能随时改变,不能保证向后兼容,升级新版本时需要注意公告说明。
根据对应的操作系统及架构,从 Release 页面下载最新版本的程序。
将 frps 及 frps.ini 放到有公网 IP 的机器上。
将 frpc 及 frpc.ini 放到处于内网环境的机器上。
修改 frps.ini 文件,配置一个名为 ssh 的反向代理:
# frps.ini
[common]
bind_port = 7000
[ssh]
listen_port = 6000
auth_token = 123
启动 frps:
./frps -c ./frps.ini
修改 frpc.ini 文件,设置 frps 所在服务器的 IP 为 x.x.x.x;
# frpc.ini
[common]
server_addr = x.x.x.x
server_port = 7000
auth_token = 123
[ssh]
local_ip = 127.0.0.1
local_port = 22
启动 frpc:
./frpc -c ./frpc.ini
通过 ssh 访问内网机器,假设用户名为 test:
ssh -oPort=6000 test@x.x.x.x
有时想要让其他人通过域名访问或者测试我们在本地搭建的 web 服务,但是由于本地机器没有公网 IP,无法将域名解析到本地的机器,通过 frp 就可以实现这一功能,以下示例为 http 服务,https 服务配置方法相同, vhost_http_port 替换为 vhost_https_port, type 设置为 https 即可。
修改 frps.ini 文件,配置一个名为 web 的 http 反向代理,设置 http 访问端口为 8080,绑定自定义域名 www.yourdomain.com
:
# frps.ini
[common]
bind_port = 7000
vhost_http_port = 8080
[web]
type = http
custom_domains = www.yourdomain.com
auth_token = 123
启动 frps;
./frps -c ./frps.ini
修改 frpc.ini 文件,设置 frps 所在的服务器的 IP 为 x.x.x.x,local_port 为本地机器上 web 服务对应的端口:
# frpc.ini
[common]
server_addr = x.x.x.x
server_port = 7000
auth_token = 123
[web]
type = http
local_port = 80
启动 frpc:
./frpc -c ./frpc.ini
将 www.yourdomain.com
的域名 A 记录解析到 IP x.x.x.x
,如果服务器已经有对应的域名,也可以将 CNAME 记录解析到服务器原先的域名。
通过浏览器访问 http://www.yourdomain.com:8080
即可访问到处于内网机器上的 web 服务。
DNS 查询请求通常使用 UDP 协议,frp 支持对内网 UDP 服务的穿透,配置方式和 TCP 基本一致。
修改 frps.ini 文件,配置一个名为 dns 的反向代理:
# frps.ini
[common]
bind_port = 7000
[dns]
type = udp
listen_port = 6000
auth_token = 123
启动 frps:
./frps -c ./frps.ini
修改 frpc.ini 文件,设置 frps 所在服务器的 IP 为 x.x.x.x,转发到 Google 的 DNS 查询服务器 8.8.8.8
的 udp 53 端口:
# frpc.ini
[common]
server_addr = x.x.x.x
server_port = 7000
auth_token = 123
[dns]
type = udp
local_ip = 8.8.8.8
local_port = 53
启动 frpc:
./frpc -c ./frpc.ini
通过 dig 测试 UDP 包转发是否成功,预期会返回 www.google.com
域名的解析结果:
dig @x.x.x.x -p 6000 www.goolge.com
通过浏览器查看 frp 的状态以及代理统计信息展示。
需要在 frps.ini 中指定 dashboard 服务使用的端口,即可开启此功能:
[common]
dashboard_port = 7500
# dashboard 用户名密码可选,默认都为 admin
dashboard_user = admin
dashboard_pwd = admin
打开浏览器通过 http://[server_addr]:7500
访问 dashboard 界面,用户名密码默认为 admin
。
出于安全性的考虑,服务器端可以在 frps.ini 中为每一个代理设置一个 auth_token 用于对客户端连接进行身份验证,例如上文中的 [ssh] 和 [web] 两个代理的 auth_token 都为 123。
客户端需要在 frpc.ini 中配置自己的 auth_token,与服务器中的配置一致才能正常运行。
需要注意的是 frpc 所在机器和 frps 所在机器的时间相差不能超过 15 分钟,因为时间戳会被用于加密验证中,防止报文被劫持后被其他人利用。
这个超时时间可以在配置文件中通过 authentication_timeout
这个参数来修改,单位为秒,默认值为 900,即 15 分钟。如果修改为 0,则 frps 将不对身份验证报文的时间戳进行超时校验。
这两个功能默认是不开启的,需要在 frpc.ini 中通过配置来为指定的代理启用加密与压缩的功能,无论类型是 tcp, http 还是 https:
# frpc.ini
[ssh]
type = tcp
listen_port = 6000
auth_token = 123
use_encryption = true
use_gzip = true
如果公司内网防火墙对外网访问进行了流量识别与屏蔽,例如禁止了 ssh 协议等,通过设置 use_encryption = true
,将 frpc 与 frps 之间的通信内容加密传输,将会有效防止流量被拦截。
如果传输的报文长度较长,通过设置 use_gzip = true
对传输内容进行压缩,可以有效减小 frpc 与 frps 之间的网络流量,加快流量转发速度,但是会额外消耗一些 cpu 资源。
当需要新增一个 frpc 客户端时,为了避免将 frps 重启,可以使用 reload 命令重新加载配置文件。
reload 命令仅能用于修改代理的配置内容,[common] 内的公共配置信息无法修改。
首先需要在 frps.ini 中指定 dashboard_port:
# frps.ini
[common]
bind_port = 7000
dashboard_port = 7500
启动 frps:
./frps -c ./frps.ini
修改 frps.ini 增加一个新的代理 [new_ssh]:
# frps.ini
[common]
bind_port = 7000
dashboard_port = 7500
[new_ssh]
listen_port = 6001
auth_token = 123
执行 reload 命令,使 frps 重新加载配置文件,实际上是通过 7500 端口发送了一个 http 请求
./frps -c ./frps.ini --reload
之后启动 frpc,[new_ssh] 代理已经可以使用。
如果想要避免每次增加代理都需要操作服务器端,可以启用特权模式。
特权模式被启用后,代理的所有配置信息都可以在 frpc.ini 中配置,无需在服务器端做任何操作。
在 frps.ini 中设置启用特权模式并设置 privilege_token,客户端需要配置同样的 privilege_token 才能使用特权模式创建代理:
# frps.ini
[common]
bind_port = 7000
privilege_mode = true
privilege_token = 1234
启动 frps:
./frps -c ./frps.ini
在 frpc.ini 配置代理 [ssh],使用特权模式创建,无需事先在服务器端配置:
# frpc.ini
[common]
server_addr = x.x.x.x
server_port = 7000
privilege_token = 1234
[ssh]
privilege_mode = true
local_port = 22
remote_port = 6000
remote_port 即为原先在 frps.ini 的代理中配置的 listen_port 参数,使用特权模式后需要在 frpc 的配置文件中指定。
启动 frpc:
./frpc -c ./frpc.ini
通过 ssh 访问内网机器,假设用户名为 test:
ssh -oPort=6000 test@x.x.x.x
启用特权模式后为了防止端口被滥用,可以手动指定允许哪些端口被使用,在 frps.ini 中通过 privilege_allow_ports 来指定:
# frps.ini
[common]
privilege_mode = true
privilege_token = 1234
privilege_allow_ports = 2000-3000,3001,3003,4000-50000
privilege_allow_ports 可以配置允许使用的某个指定端口或者是一个范围内的所有端口,以 ,
分隔,指定的范围以 -
分隔。
默认情况下,当用户请求建立连接后,frps 才会请求 frpc 主动与后端服务建立一个连接。当为指定的代理启用连接池后,frp 会预先和后端服务建立起指定数量的连接,每次接收到用户请求后,会从连接池中取出一个连接和用户连接关联起来,避免了等待与后端服务建立连接以及 frpc 和 frps 之间传递控制信息的时间。
这一功能比较适合有大量短连接请求时开启。
首先可以在 frps.ini 中设置每个代理可以创建的连接池上限,避免大量资源占用,默认为 100,客户端设置超过此配置后会被调整到当前值:
# frps.ini
[common]
max_pool_count = 50
在 frpc.ini 中为指定代理启用连接池,指定预创建连接的数量:
# frpc.ini
[ssh]
type = tcp
local_port = 22
pool_count = 10
通常情况下 frp 不会修改转发的任何数据。但有一些后端服务会根据 http 请求 header 中的 host 字段来展现不同的网站,例如 nginx 的虚拟主机服务,启用 host-header 的修改功能可以动态修改 http 请求中的 host 字段。该功能仅限于 http 类型的代理。
# frpc.ini
[web]
privilege_mode = true
type = http
local_port = 80
custom_domains = test.yourdomain.com
host_header_rewrite = dev.yourdomain.com
原来 http 请求中的 host 字段 test.yourdomain.com
转发到后端服务时会被替换为 dev.yourdomain.com
。
由于所有客户端共用一个 frps 的 http 服务端口,任何知道你的域名和 url 的人都能访问到你部署在内网的 web 服务,但是在某些场景下需要确保只有限定的用户才能访问。
frp 支持通过 HTTP Basic Auth 来保护你的 web 服务,使用户需要通过用户名和密码才能访问到你的服务。
该功能目前仅限于 http 类型的代理,需要在 frpc 的代理配置中添加用户名和密码的设置。
# frpc.ini
[web]
privilege_mode = true
type = http
local_port = 80
custom_domains = test.yourdomain.com
http_user = abc
http_pwd = abc
通过浏览器访问 test.yourdomain.com
,需要输入配置的用户名和密码才能访问。
在多人同时使用一个 frps 时,通过自定义二级域名的方式来使用会更加方便。
通过在 frps 的配置文件中配置 subdomain_host
,就可以启用该特性。之后在 frpc 的 http、https 类型的代理中可以不配置 custom_domains
,而是配置一个 subdomain
参数。
只需要将 *.subdomain_host
解析到 frps 所在服务器。之后用户可以通过 subdomain
自行指定自己的 web 服务所需要使用的二级域名,通过 {subdomain}.{subdomain_host}
来访问自己的 web 服务。
# frps.ini
subdomain_host = frps.com
将泛域名 *.frps.com
解析到 frps 所在服务器的 IP 地址。
# frpc.ini
[web]
privilege_mode = true
type = http
local_port = 80
subdomain = test
frps 和 fprc 都启动成功后,通过 test.frps.com
就可以访问到内网的 web 服务。
需要注意的是如果 frps 配置了 subdomain_host
,则 custom_domains
中不能是属于 subdomain_host
的子域名或者泛域名。
同一个 http 或 https 类型的代理中 custom_domains
和 subdomain
可以同时配置。
frp 支持根据请求的 URL 路径路由转发到不同的后端服务。
通过配置文件中的 locations
字段指定一个或多个 proxy 能够匹配的 URL 前缀(目前仅支持最大前缀匹配,之后会考虑正则匹配)。例如指定 locations = /news
,则所有 URL 以 /news
开头的请求都会被转发到这个服务。
# frpc.ini
[web01]
privilege_mode = true
type = http
local_port = 80
custom_domains = web.yourdomain.com
locations = /
[web02]
privilege_mode = true
type = http
local_port = 81
custom_domains = web.yourdomain.com
locations = /news,/about
按照上述的示例配置后,web.yourdomain.com
这个域名下所有以 /news
以及 /about
作为前缀的 URL 请求都会被转发到 web02,其余的请求会被转发到 web01。
在只能通过代理访问外网的环境内,frpc 支持通过 HTTP PROXY 和 frps 进行通信。
可以通过设置 HTTP_PROXY
系统环境变量或者通过在 frpc 的配置文件中设置 http_proxy
参数来使用此功能。
# frpc.ini
server_addr = x.x.x.x
server_port = 7000
http_proxy = http://user:pwd@192.168.1.128:8080
推荐您阅读更多有关于“”的文章
Powered By Z-Blogphp
分享:
支付宝
微信