diff --git a/README.md b/README.md index 29d63cb4eaf9f885b3ef78ab6790fcad18ef6c17..5fff2b7d5c999fe3919808ccf09dcadd4be2c053 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,7 @@ Now it also try to support p2p connect. * [Forward DNS query request](#forward-dns-query-request) * [Forward unix domain socket](#forward-unix-domain-socket) * [Expose a simple http file server](#expose-a-simple-http-file-server) + * [Enable HTTPS for local HTTP service](#enable-https-for-local-http-service) * [Expose your service in security](#expose-your-service-in-security) * [P2P Mode](#p2p-mode) * [Features](#features) @@ -44,6 +45,8 @@ Now it also try to support p2p connect. * [Rewriting the Host Header](#rewriting-the-host-header) * [Set Headers In HTTP Request](#set-headers-in-http-request) * [Get Real IP](#get-real-ip) + * [HTTP X-Forwarded-For](#http-x-forwarded-for) + * [Proxy Protocol](#proxy-protocol) * [Password protecting your web service](#password-protecting-your-web-service) * [Custom subdomain names](#custom-subdomain-names) * [URL routing](#url-routing) @@ -243,11 +246,34 @@ Configure frps same as above. 2. Visit `http://x.x.x.x:6000/static/` by your browser, set correct user and password, so you can see files in `/tmp/file`. +### Enable HTTPS for local HTTP service + +1. Start frpc with configurations: + + ```ini + # 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 + plugin_crt_path = ./server.crt + plugin_key_path = ./server.key + plugin_host_header_rewrite = 127.0.0.1 + ``` + +2. Visit `https://test.yourdomain.com`. + ### Expose your service in security For some services, if expose them to the public network directly will be a security risk. -**stcp(secret tcp)** help you create a proxy avoiding any one can access it. +**stcp(secret tcp)** helps you create a proxy avoiding any one can access it. Configure frps same as above. @@ -484,8 +510,6 @@ tcp_mux = false ### Support KCP Protocol -frp support kcp protocol since v0.12.0. - KCP is a fast and reliable protocol that can achieve the transmission effect of a reduction of the average latency by 30% to 40% and reduction of the maximum delay by a factor of three, at the cost of 10% to 20% more bandwidth wasted than TCP. Using kcp in frp: @@ -639,9 +663,32 @@ In this example, it will set header `X-From-Where: frp` to http request. ### Get Real IP +#### HTTP X-Forwarded-For + Features for http proxy only. -You can get user's real IP from http request header `X-Forwarded-For` and `X-Real-IP`. +You can get user's real IP from HTTP request header `X-Forwarded-For` and `X-Real-IP`. + +#### Proxy Protocol + +frp support Proxy Protocol to send user's real IP to local service. It support all types without UDP. + +Here is an example for https service: + +```ini +# frpc.ini +[web] +type = https +local_port = 443 +custom_domains = test.yourdomain.com + +# now v1 and v2 is supported +proxy_protocol_version = v2 +``` + +You can enable Proxy Protocol support in nginx to parse user's real IP to http header `X-Real-IP`. + +Then you can get it from HTTP request header in your local service. ### Password protecting your web service diff --git a/README_zh.md b/README_zh.md index 952aeb69a5402f323a20ca6db6e8cac6ffe4d2cd..7fdaa0f746d44254961953e9b91e853aa6438c44 100644 --- a/README_zh.md +++ b/README_zh.md @@ -18,6 +18,7 @@ frp 是一个可用于内网穿透的高性能的反向代理应用,支持 tcp * [转发 DNS 查询请求](#转发-dns-查询请求) * [转发 Unix域套接字](#转发-unix域套接字) * [对外提供简单的文件访问服务](#对外提供简单的文件访问服务) + * [为本地 HTTP 服务启用 HTTPS](#为本地-http-服务启用-https) * [安全地暴露内网服务](#安全地暴露内网服务) * [点对点内网穿透](#点对点内网穿透) * [功能说明](#功能说明) @@ -40,6 +41,8 @@ frp 是一个可用于内网穿透的高性能的反向代理应用,支持 tcp * [修改 Host Header](#修改-host-header) * [设置 HTTP 请求的 header](#设置-http-请求的-header) * [获取用户真实 IP](#获取用户真实-ip) + * [HTTP X-Forwarded-For](#http-x-forwarded-for) + * [Proxy Protocol](#proxy-protocol) * [通过密码保护你的 web 服务](#通过密码保护你的-web-服务) * [自定义二级域名](#自定义二级域名) * [URL 路由](#url-路由) @@ -244,6 +247,33 @@ frps 的部署步骤同上。 2. 通过浏览器访问 `http://x.x.x.x:6000/static/` 来查看位于 `/tmp/file` 目录下的文件,会要求输入已设置好的用户名和密码。 +### 为本地 HTTP 服务启用 HTTPS + +通过 `https2http` 插件可以让本地 HTTP 服务转换成 HTTPS 服务对外提供。 + +1. 启用 frpc,启用 `https2http` 插件,配置如下: + + ```ini + # 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 + ``` + +2. 通过浏览器访问 `https://test.yourdomain.com` 即可。 + ### 安全地暴露内网服务 对于某些服务来说如果直接暴露于公网上将会存在安全隐患。 @@ -514,7 +544,7 @@ tcp_mux = false ### 底层通信可选 kcp 协议 -从 v0.12.0 版本开始,底层通信协议支持选择 kcp 协议,在弱网环境下传输效率提升明显,但是会有一些额外的流量消耗。 +底层通信协议支持选择 kcp 协议,在弱网环境下传输效率提升明显,但是会有一些额外的流量消耗。 开启 kcp 协议支持: @@ -566,6 +596,7 @@ tcp_mux = false ### 负载均衡 可以将多个相同类型的 proxy 加入到同一个 group 中,从而实现负载均衡的功能。 + 目前只支持 tcp 类型的 proxy。 ```ini @@ -668,7 +699,34 @@ header_X-From-Where = frp ### 获取用户真实 IP -目前只有 **http** 类型的代理支持这一功能,可以通过用户请求的 header 中的 `X-Forwarded-For` 和 `X-Real-IP` 来获取用户真实 IP。 +#### HTTP X-Forwarded-For + +目前只有 **http** 类型的代理支持这一功能,可以通过用户请求的 header 中的 `X-Forwarded-For` 来获取用户真实 IP,默认启用。 + +#### Proxy Protocol + +frp 支持通过 **Proxy Protocol** 协议来传递经过 frp 代理的请求的真实 IP,此功能支持所有以 TCP 为底层协议的类型,不支持 UDP。 + +**Proxy Protocol** 功能启用后,frpc 在和本地服务建立连接后,会先发送一段 **Proxy Protocol** 的协议内容给本地服务,本地服务通过解析这一内容可以获得访问用户的真实 IP。所以不仅仅是 HTTP 服务,任何的 TCP 服务,只要支持这一协议,都可以获得用户的真实 IP 地址。 + +需要注意的是,在代理配置中如果要启用此功能,需要本地的服务能够支持 **Proxy Protocol** 这一协议,目前 nginx 和 haproxy 都能够很好的支持。 + +这里以 https 类型为例: + +```ini +# frpc.ini +[web] +type = https +local_port = 443 +custom_domains = test.yourdomain.com + +# 目前支持 v1 和 v2 两个版本的 proxy protocol 协议。 +proxy_protocol_version = v2 +``` + +只需要在代理配置中增加一行 `proxy_protocol_version = v2` 即可开启此功能。 + +本地的 https 服务可以通过在 nginx 的配置中启用 **Proxy Protocol** 的解析并将结果设置在 `X-Real-IP` 这个 Header 中就可以在自己的 Web 服务中通过 `X-Real-IP` 获取到用户的真实 IP。 ### 通过密码保护你的 web 服务 diff --git a/conf/frpc_full.ini b/conf/frpc_full.ini index 378612b5f453676a8249613c4bde742ea81e07db..e0e523cebade1b8f23c984d233d17a1ef6b97382 100644 --- a/conf/frpc_full.ini +++ b/conf/frpc_full.ini @@ -190,6 +190,15 @@ plugin_strip_prefix = static plugin_http_user = abc plugin_http_passwd = abc +[plugin_https2http] +type = https +custom_domains = test.yourdomain.com +plugin = https2http +plugin_local_addr = 127.0.0.1:80 +plugin_crt_path = ./server.crt +plugin_key_path = ./server.key +plugin_host_header_rewrite = 127.0.0.1 + [secret_tcp] # If the type is secret tcp, remote_port is useless # Who want to connect local port should deploy another frpc with stcp proxy and role is visitor