快速代理,用于将NAT或防火墙后的本地服务器暴露给Internet

2020-08-07 02:19:45

FRP是一种快速反向代理,可帮助您将NAT或防火墙后的本地服务器暴露给Internet。目前支持TCP和UDP,支持HTTP和HTTPS协议,可以通过域名将请求转发到内部服务。

玻璃钢正在开发中。在主分支中尝试最新发布的版本,或者使用开发中版本的dev分支。

该协议可能会在版本中更改,我们不保证向后兼容。升级客户端和服务器时,请检查版本日志。

首先,根据您的操作系统和架构,从发布页面下载最新的程序。

将frpc和frpc.ini放到局域网中的服务器B上(该服务器不能从公共互联网连接)。

修改服务器A上的frps.ini,并将bind_port设置为连接到FRP客户端:

在服务器B上,修改frpc.ini以将您的FRPS服务器公共IP作为server_addr字段:

请注意,LOCAL_PORT(在客户端上侦听)和REMOTE_PORT(在服务器上公开)用于流量进出FRP系统,而SERVER_PORT在FRP之间使用。

有时,我们希望将NAT网络后面的本地Web服务暴露给他人,以便使用您自己的域名进行测试,但不幸的是,我们无法将域名解析为本地IP。

修改frpc.ini并将server_addr设置为远程FRPS服务器的IP地址。LOCAL_PORT是您的Web服务的端口:

将www.example.com记录解析为远程FRPS服务器的公网IP,或将CNAME记录解析为您的源域。

修改frpc.ini,将server_addr设置为远程FRPS服务器的IP地址,将DNS查询请求转发到Google公共DNS服务器8.8.8.8:53:

#frpc.ini[common]server_addr=x.x server_port=7000[test_static_file]type=tcp远程端口=6000 plugin=static_file plugin_local_path=/tmp/files plugin_strie_prefix=static plugin_http_user=abc plugin_http_passwd=abc。

从您的浏览器访问http://x.x:6000/static/,并指定正确的用户和密码以查看FRPC计算机上/tmp/files中的文件。

#frpc.ini[common]server_addr=x.x server_port=7000[test_https2http]type=https CUSTOM_DOMAINS=test.example.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 plugin_header_X-from-。

如果直接暴露在公共网络中,某些服务将面临风险。使用STCP(加密TCP)模式时,需要预共享密钥才能从另一个客户端访问服务。

使用以下配置在计算机B上启动frpc。此示例用于公开SSH服务(端口22),并注意预共享密钥的SK字段,此处删除了Remote_port字段:

使用以下配置启动另一个frpc(通常在另一台机器C上),以使用安全密钥(SK字段)访问SSH服务:

#frpc.ini[common]server_addr=x.x server_port=7000[secret_ssh访问者]type=stcp角色=访问者server_name=ret_ssh sk=ABCDEFG bind_addr=127.0.0.1 bind_port=6000。

Xtcp设计用于在客户端之间直接传输大量数据。仍然需要FRPS服务器,因为P2P在这里仅指实际的数据传输。

请注意,它不能穿透所有类型的NAT设备。如果xtcp不起作用,您可能希望后退到stcp。

在机器B上启动frpc,暴露SSH端口。请注意,已删除Remote_port字段:

使用配置启动另一台frpc(通常在另一台计算机C上),以使用P2P模式连接到SSH:

#frpc.ini[common]server_addr=x.x server_port=7000[p2p_ssh访问者]type=xtcp角色=访问者server_name=p2p_ssh sk=ABCDEFG bind_addr=127.0.0.1 bind_port=6000

请阅读完整的示例配置文件,以了解此处未介绍的更多功能。

#frpc.ini[common]server_addr={{.Envs.FRP_SERVER_ADDR}}server_port=7000[ssh]type=TCP LOCAL_IP=127.0.0.1 LOCAL_PORT=22 REMOTE_PORT={{.Envs.FRP_SSH_Remote_Port}}。

Frpc将使用OS环境变量呈现配置文件模板。记住在引用前加上.Envs前缀。

[common]dashboard_port=7500#dashboard';的用户名和密码都是可选的,如果未设置,则默认为admin。DASHBOARD_USER=ADMIN DASHAND_PWD=ADMIN。

然后访问http://[server_addr]:7500查看仪表板,默认情况下用户名和密码都是管理员。

然后访问http://127.0.0.1:7400查看管理员UI,默认情况下用户名和密码都是管理员。

启用仪表板后,FRPS会将监视器数据保存在缓存中。它将在进程重新启动后清除。

您可以通过在frpc.ini和frps.ini的[common]下配置AUTHENTICATION_METHOD来决定使用哪一个。

在[COMMON]下配置AUTHENTATE_HEADBEATS=TRUE将使用配置的身份验证方法来添加和验证frpc和frps之间的每个心跳的身份验证。

在[COMMON]下配置AUTHENTATE_NEW_WORK_CONNS=TRUE将对frpc和frps之间的每个新工作连接执行相同的操作。

当在frpc.ini和frps.ini中的[common]下指定AUTHENTICATION_METHOD=TOKEN时,将使用基于令牌的身份验证。

确保在frps.ini和frpc.ini的[common]部分中指定相同的内标识,以便frpc通过FRPS验证。

当在frpc.ini和frps.ini中的[common]下指定AUTHENTICATION_METHOD=oidc时,将使用基于OIDC的身份验证。

#frpc.in[common]AUTHENTICATION_METHOD=oidc oidc_client_id=98692467-37de-409a-9fac-bb2585826f18#替换为oidc客户端ID oidc_client_secret=oidc_secreoidc=https://oidc-audience.com/.default oidc_Token_Endpoint_url=https://example-oidc-endpoint.com/oauth2/v2.0/token。

要强制FRPS仅接受TLS连接-在frps.ini的[COMMON]部分中配置TLS_ONLY=TRUE。

然后运行命令frpc reload-c./frpc.ini并等待大约10秒钟,让frpc创建、更新或删除代理。

使用frpc status-c./frpc.ini获取所有代理的状态。启用HTTP API需要admin_addr和admin_port字段。

ALLOW_PORTS由特定端口或端口范围(最低端口号、破折号-、最高端口号)组成,用逗号分隔。

FRPS中的vhost_http_port和vhost_https_port可以与bind_port使用相同的端口。FRP将检测连接的协议并相应地处理它。

我们希望将来尝试允许多个代理使用不同的协议绑定相同的远程端口。

在每个代理的配置中设置BIDTAND_LIMIT以启用此功能。支持的单位为MB和KB。

从v0.10.0开始,FRP就像HTTP2多路复用一样支持TCP流多路复用,在这种情况下,到同一FRPC的所有逻辑连接都被多路复用到同一TCP连接中。

KCP是一种快速可靠的协议,可以在比TCP多浪费10%到20%的带宽的情况下,达到平均延迟减少30%到40%,最大延迟减少到原来的3倍的传输效果。

KCP_BIND_PORT编号可以与BIND_PORT相同,因为BIND_PORT字段指定TCP端口。

默认情况下,FRPS会根据用户请求创建到后端服务的新FRPC连接。使用连接池,FRP会保留一定数量的预先建立的连接,从而减少建立连接所需的时间。

#frpc.ini[test1]type=tcp本地端口=8080远程端口=80 group=web group_key=123[test2]type=TCP local_port=8081 remote_port=80 group=web group_key=123。

#frpc.ini[test1]type=TCP LOCAL_PORT=22 REMOTE_PORT=6000#启用TCP运行状况检查Health_check_type=TCP#TCPing timeout秒Health_check_timeout_s=3#如果连续3次运行状况检查失败,则将从FRPS Health_check_max_ailed=3#每10秒进行一次运行状况检查Health_check_interval=10。

使用运行状况检查类型http时,将向服务发送HTTP请求,预计会出现HTTP 2xx OK响应:

#frpc.ini[web]type=http local_ip=127.0.0.1 local_port=80 CUSTOM_DOMAINS=test.example.com#Enable HTTP Health Check Health_check_type=http#frpc将向';/status&##发送GET请求,并预期HTTP 2xx OK响应Health_check_url=/status Health_check_timeout_s=3 Health_check_max_ailed=3 Health_check_interval_s=10。

默认情况下,FRP根本不修改隧道HTTP请求,因为它是逐字节复制。

但是,说到Web服务器和HTTP请求,您的Web服务器可能依赖Host HTTP标头来确定要访问的网站。转发HTTP请求时,FRP可以使用HOST_HEADER_REWRITE字段重写主机标头:

HTTP请求在到达实际Web服务器时会将Host报头重写为Host:dev.example.com,尽管来自浏览器的请求可能包含Host:test.example.com。

FRP支持代理协议将用户的真实IP发送到本地服务。它支持除UDP以外所有类型。

#frpc.ini[web]type=https LOCAL_PORT=443 CUSTOM_DOMAINES=test.example.com#现在支持v1和v2代理协议版本=v2。

您可以在nginx中启用代理协议支持,以在HTTP标头X-Real-IP中显示用户的真实IP,然后读取Web服务中的X-Real-IP标头以获取真实IP。

任何能猜出隧道URL的人都可以访问您的本地Web服务器,除非您使用密码进行保护。

这会使用frpc#39;的配置文件中指定的用户名和密码对所有请求强制执行HTTP Basic Auth。

在浏览器中访问http://test.example.com,现在会提示您输入用户名和密码。

当多人共享一台FRPS服务器时,为http和https类型使用子域配置非常方便。

将*.frps.com解析为FRPS服务器的IP。这通常称为通配符DNS记录。

请注意,如果SUBDOMAIN_HOST不为空,则CUSTOM_DOMAINS不应是SUBDOMAIN_HOST的子域。

位置指定用于路由的URL前缀。FRPS首先搜索由文字字符串给出的最具体的前缀位置,而不考虑列出的顺序。

#frpc.ini[web01]type=http LOCAL_PORT=80 CUSTOM_DOMAINES=web.example.com LOCATIONS=/[web02]type=http LOCAL_PORT=81 CUSTOM_DOMAINES=web.example.com LOCATIONS=/news,/about。

URL前缀为/news或/about的HTTP请求将被转发到web02,其他请求将被转发到web01。

FRP支持接收定向到FRP上单个端口上不同代理的TCP套接字,类似于vhost_http_port和vhost_https_port。

目前唯一支持的TCP端口多路复用方法是httpconnect-HTTP连接隧道。

在[COMMON]下的FRPS中将tcpmux_httpconnect_port设置为0以外的任何值时,FRPS将在此端口上侦听HTTP连接请求。

HTTP CONNECT请求的主机将用于匹配FRP中的代理。当Multiplexer=httpconnect时,可以通过在type=tcpmux proxies下配置CUSTOM_DOMAIN和/或子域,在frPC中配置代理主机。

#frpc.ini[common]server_addr=x.x server_port=7000[proxy1]type=tcpmux多路复用器=httpconnect自定义域=test1[proxy2]type=tcpmux多路复用器=httpconnect自定义域=test2。

在上述配置中,可以使用HTTP连接报头在端口1337上联系FRP,例如:

如果您设置了OS环境变量HTTP_PROXY,或者如果在frpc.ini文件中设置了http_Proxy,则frpc可以使用HTTP代理连接到FRP。

插件用于提供丰富的功能。有一些内置插件,如unix_domain_socket、http_proxy、socks5、static_file,您可以看到示例用法。

指定要与Plugin参数一起使用的插件。Plugin的配置参数应以plugin_开头。插件不使用local_ip和local_port。

请查看我们的问题列表,并考虑向开发分支发送拉取请求。

如果您要添加新功能,请先创建一个问题来描述新功能,以及实现方法。建议被接受后,创建新功能的实现并将其作为Pull请求提交。

对不起,我的英语很差。本文档的改进是受欢迎的,即使是一些打字错误的修复。

注意:我们希望您在问题上给出您的建议,这样其他有相同问题的人可以快速搜索,我们不需要重复回答他们。