FRP配置详解

frp

建立状态什么是frp?

frp是一种快速反向代理,可帮助您将NAT或防火墙后面的本地服务器公开到Internet。到目前为止,它支持TCP和UDP以及HTTP和HTTPS协议,在这些协议中,请求可以通过域名转发到内部服务。

frp还具有P2P连接模式。

用法示例
首先,根据您的操作系统和体系结构从“ 发行”页面下载最新程序。

把frps和frps.ini你的服务器有一个公网IP。

把frpc和frpc.ini到局域网服务器B(即不能从公共互联网连接)。

通过SSH访问LAN中的计算机
frps.ini在服务器A上修改:

# frps.ini [common] bind_port = 7000 frps在服务器A上启动: ./frps -c ./frps.ini 

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

# frpc.ini [common] server_addr = xxxx server_port = 7000 [ssh] type = tcp local_ip = 127.0.0.1 local_port = 22 remote_port = 6000 

frpc在服务器B上启动:

./frpc -c ./frpc.ini 

从另一台计算机通过SSH到服务器B,如下所示(假设用户名是test):

ssh -oPort=6000 test@x.x.x.x 

通过自定义域访问LAN中的Web服务
有时,我们希望将NAT网络背后的本地Web服务公开给其他人,以使用您自己的域名进行测试,但是很遗憾,我们无法将域名解析为本地IP。

但是,我们可以使用frp公开HTTP(S)服务。

修改frps.ini,将vhost HTTP端口设置为8080:

# frps.ini [common] bind_port = 7000 vhost_http_port = 8080 

开始frps:

./frps -c ./frps.ini 

修改frpc.ini并设置server_addr为远程frps服务器的IP地址。该local_port是你的web服务的端口:

# frpc.ini [common] server_addr = xxxx server_port = 7000 [web] type = http local_port = 80 custom_domains = www.example.com 

开始frpc:

./frpc -c ./frpc.ini 

将A记录解析www.example.com为远程frps服务器的公共IP或将CNAME记录解析为您的原始域。

现在,使用url访问您的本地Web服务http://www.example.com:8080。

转发DNS查询请求
修改frps.ini:
# frps.ini

[common] bind_port = 7000 

开始frps:

./frps -c ./frps.ini 

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

# frpc.ini [common] server_addr = xxxx server_port = 7000 [DNS] type = udp local_ip = 8.8.8.8 local_port = 53 remote_port = 6000 

启动frpc:

./frpc -c ./frpc.ini 

使用以下dig命令测试DNS解析:

dig @x.x.x.x -p 6000 www.google.com 

转发Unix域套接字
将Unix域套接字(例如Docker守护进程套接字)公开为TCP。

frps与上面的配置相同。

从frpc配置开始:

# frpc.ini [common] server_addr = xxxx server_port = 7000 [unix_domain_socket] type = tcp remote_port = 6000 plugin = unix_domain_socket plugin_unix_path = /var/run/docker.sock 

测试:使用获取Docker版本curl:

curl http://x.x.x.x:6000/version 

公开一个简单的HTTP文件服务器
从公共Internet浏览存储在LAN中的文件。

frps与上面的配置相同。

从frpc配置开始:

# frpc.ini [common] server_addr = xxxx server_port = 7000 [test_static_file] type = tcp remote_port = 6000 type = static_file plugin_local_path = / tmp / files plugin_strip_prefix =static plugin_http_user = abc plugin_http_passwd = abc 

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

为本地HTTP服务启用HTTPS
从frpc配置开始:

# frpc.ini [common] server_addr = xxxx 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-Where = frp 

造访https://test.example.com。

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

frps与上面的配置相同。

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

# frpc.ini [common] server_addr = xxxx server_port = 7000 [secret_ssh] type = stcp sk = abcdefg local_ip = 127.0.0.1 local_port = 22 

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

# frpc.ini [common] server_addr = xxxx server_port = 7000 [secret_ssh_visitor] type = stcp role = visitor server_name = secret_ssh sk = abcdefg bind_addr = 127.0.0.1 bind_port = 6000 

在计算机C上,使用以下命令连接到计算机B上的SSH:

ssh -oPort=6000 127.0.0.1 

P2P模式
xtcp设计用于直接在客户端之间传输大量数据。仍然需要frps服务器,因为此处的P2P仅指实际的数据传输。

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

在frps.ini为xtcp配置UDP端口时:

# frps.ini bind_udp_port = 7001 

frpc在计算机B上启动,公开SSH端口。请注意,该remote_port字段已删除:

# frpc.ini [common] server_addr = xxxx server_port = 7000 [p2p_ssh] type = xtcp sk = abcdefg local_ip = 127.0.0.1 local_port = 22 

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

# frpc.ini [common] server_addr = xxxx server_port = 7000 [p2p_ssh_visitor] type = xtcp type = xtcp server_name = p2p_ssh sk = abcdefg bind_addr = 127.0.0.1 bind_port = 6000 

在计算机C上,使用以下命令连接到计算机B上的SSH:

ssh -oPort=6000 127.0.0.1 

特征
配置文件
阅读完整的示例配置文件,以查找此处未描述的更多功能。

frps的完整配置文件(服务器)

frpc的完整配置文件(客户端)

使用环境变量
可以使用Go的标准格式在配置文件中引用环境变量:

# frpc.ini [common] server_addr = {{.Envs.FRP_SERVER_ADDR}} server_port = 7000 [ssh] typee = tcp local_ip = 127.0.0.1 local_port = 22 remote_port = {{.Envs.FRP_SSH_REMOTE_PORT}} 

通过上面的配置,变量可以frpc像这样传递到程序中:

export FRP_SERVER_ADDR="x.x.x.x" export FRP_SSH_REMOTE_PORT="6000" ./frpc -c ./frpc.ini 

frpc将使用OS环境变量呈现配置文件模板。请记住为您的引用加上前缀.Envs。

仪表板
通过仪表板检查frp的状态和代理的统计信息。

为仪表板配置端口以启用此功能:

[common] dashboard_port = 7500 # dashboard的用户名和密码均为可选,如未设置,默认为admin。 dashboard_user =admin dashboard_pwd =admin 

然后访问http://[server_addr]:7500以查看仪表板,其中用户名和密码均为admin默认值。

仪表板

管理员界面
管理员界面可帮助您检查和管理frpc的配置。

配置管理界面的地址以启用此功能:

[common] admin_addr = 127.0.0.1 admin_port = 7400 admin_user = admin admin_pwd = admin 

然后访问http://127.0.0.1:7400以查看管理界面,admin默认情况下,用户名和密码均为默认值。

验证客户端
始终在和token中的[common]部分中使用相同的内容。frps.inifrpc.ini

加密与压缩
这些功能默认情况下处于关闭状态。您可以打开加密和/或压缩:

# frpc.ini [ssh] type = tcp local_port = 22 remote_port = 6000 use_encryption = true use_compression = true 

TLS
FRP支持之间的TLS协议frpc和frps自v0.25.0。

tls_enable = true 

在[common]部分中进行配置frpc.ini以启用此功能。

对于端口多路复用,frp发送第一个字节0x17以拨打TLS连接。

热装frpc配置
在admin_addr和admin_port领域都需要启用HTTP API:

# frpc.ini [common] admin_addr = 127.0.0.1 admin_port = 7400 

然后运行命

令frpc reload -c ./frpc.ini 

并等待大约10秒钟,以frpc创建或更新或删除代理。

请注意,[common]部分中的参数除“ start”外不会被修改。

从客户端获取代理状态
使用

frpc status -c ./frpc.ini 

让所有代理的状态。的admin_addr和admin_port字段是必需的用于实现HTTP API。

只允许服务器上的某些端口
allow_portsin frps.ini用于避免端口滥用:

# frps.ini [common] allow_ports = 2000-3000,3001,3003,4000-50000 

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

端口复用
vhost_http_port而vhost_https_port在中国植物志可以使用具有相同的端口bind_port。frps将检测连接的协议并进行相应处理。

我们希望将来允许多个代理将同一远程端口与不同的协议绑定。

带宽限制
对于每个代理

# frpc.ini [SSH] type = TCP LOCAL_PORT = 22 REMOTE_PORT = 6000 BANDWIDTH_LIMIT = 1MB 

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

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

您可以通过修改frps.ini和禁用此功能frpc.ini:

# frps.ini和frpc.ini,必须相同 [common] tcp_mux = false 

支持KCP协议
KCP是一种快速可靠的协议,可以实现以下效果:将平均等待时间减少30%至40%,并将最大延迟减少三倍,从而节省了10%至20%的带宽浪费比TCP。

KCP模式使用UDP作为基础传输。在frp中使用KCP:

以frps启用KCP:

# frps.ini [common] bind_port = 7000 #指定KCP的UDP端口。 kcp_bind_port = 7000 

该kcp_bind_port数字可以与相同bind_port,因为bind_portfield指定一个TCP端口。

配置frpc.ini为使用KCP连接到frps:

# frpc.ini [common] server_addr = xxxx #与frps.ini中的“ kcp_bind_port”相同 server_port = 7000 协议 = kcp 

连接池
默认情况下,frps会根据用户请求创建与后端服务的新frpc连接。通过连接池,frps可以保留一定数量的预先建立的连接,从而减少了建立连接所需的时间。

此功能适用于大量的短连接。

配置每个代理可以使用的池计数限制frps.ini:

# frps.ini [common] max_pool_count = 5 

启用并指定连接池数:

# frpc.ini [common] pool_count = 1 

负载均衡
负载平衡受支持group。

此功能仅适用于类型tcp和http现在。

# frpc.ini [test1] type = tcp local_port = 8080 remote_port = 80 group = web group_key = 123 [test2] type = tcp local_port = 8081 remote_port = 80 group = web group_key = 123 

group_key 用于身份验证。

与端口80的连接将随机分配给同一组中的代理。

对于type tcp,remote_port在同一组中应该相同。

对于类型http,custom_domains,subdomain,locations应该是相同的。

服务健康检查
运行状况检查功能可通过负载平衡帮助您实现高可用性。

添加health_check_type = tcp或health_check_type = http启用健康检查。

使用运行状况检查类型tcp,将对服务端口执行ping(TCPing)操作:

# frpc.ini [TEST1] type = TCP LOCAL_PORT = 22 REMOTE_PORT = 6000 #启用TCP健康检查 health_check_type = TCP # TCPing超时秒 health_check_timeout_s = 3 #如果健康检查失败在连续3次,则该代理将来自FRPS移除 health_check_max_failed = 3 #每10秒进行一次健康检查 health_check_interval_s = 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 #启用HTTP健康检查 health_check_type = http # frpc将GET请求发送到'/ status' #并期望使用HTTP 2xx OK响应 health_check_url = / status health_check_timeout_s = 3 health_check_max_failed = 3 health_check_interval_s = 10 

重写HTTP主机头
默认情况下,frp根本不修改隧道的HTTP请求,因为它是一个逐字节的副本。

但是,谈到Web服务器和HTTP请求,您的Web服务器可能依赖于HostHTTP标头来确定要访问的网站。Host在转发HTTP请求时,frp可以使用以下host_header_rewrite字段重写标头:

# frpc.ini [web] type = http local_port = 80 custom_domains = test.example.com host_header_rewrite = dev.example.com 

尽管来自浏览器的请求可能具有,但HTTP请求在到达实际的Web服务器时将具有Host重写的标头。Host: dev.example.comHost: test.example.com

设置其他HTTP标头
类似于Host,您可以使用代理类型覆盖其他HTTP请求标头http。

# frpc.ini [web] type = http local_port = 80 custom_domains = test.example.com host_header_rewrite = dev.example.com header_X-From-Where = frp 

请注意,带有前缀的参数header_将添加到HTTP请求标头中。

在此示例中,它将X-From-Where: frp在HTTP请求中设置标头。

获取真实IP
HTTP X转发
此功能仅适用于http代理。

您可以从HTTP请求标头X-Forwarded-For和获取用户的真实IP X-Real-IP。

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

这是https服务的示例:

# frpc.ini [web] type = https local_port = 443 custom_domains = test.example.com #现在支持v1和v2 proxy_protocol_version = v2 

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

要求HTTP基本身份验证(密码)的Web服务
可以猜测您的隧道URL的任何人都可以访问您的本地Web服务器,除非您使用密码对其进行保护。

这会对使用frpc的configure文件中指定的用户名和密码的所有请求强制实施HTTP Basic Auth。

仅当代理类型为http时才能启用。

# frpc.ini [web] type = http local_port = 80 custom_domains = test.example.com http_user = abc http_pwd = abc 

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

自定义子域名
subdomain当许多人共享一台frps服务器时,可以方便地对http和https类型使用configure。

# frps.ini subdomain_host = frps.com 

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

# frpc.ini [web] type = http local_port = 80 subdomain = test 

现在,您可以在上访问您的Web服务test.frps.com。

请注意,如果subdomain_host不为空,则custom_domains不应为的子域subdomain_host。

URL路由
frp支持通过URL路由将HTTP请求转发到不同的后端Web服务。

locations指定用于路由的URL的前缀。frps首先搜索文字字符串给定的最特定的前缀位置,而不管列出的顺序如何。

# frpc.ini [web01] type = http local_port = 80 custom_domains = web.example.com locations = / [web02] type = http local_port = 81 custom_domains = web.example.com locations = / news // about 

HTTP与URL前缀请求/news或/about将被转发到web02和其他请求WEB01。

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

它仅在protocol为tcp时有效。

# frpc.ini [common] server_addr = xxxx server_port = 7000 http_proxy = http:// user:pwd@192.168.1.128:8080 

范围端口映射
名称以开头的代理服务器range:将支持映射范围端口。

# frpc.ini [range:test_tcp] type = tcp local_ip = 127.0.0.1 local_port = 6000-6006,6007 remote_port = 6000-6006,6007 

FRPC将产生8个代理像test_tcp_0,test_tcp_1…, test_tcp_7。

客户端插件
默认情况下,frpc仅将请求转发到本地TCP或UDP端口。

插件用于提供丰富的功能。有内置的插件,如unix_domain_socket,http_proxy,socks5,static_file,你可以看到例如使用。

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

使用插件http_proxy:

# frpc.ini [http_proxy] type = tcp remote_port = 6000 plugin = http_proxy plugin _http_user = abc plugin _http_passwd = abc 

plugin_http_user和plugin_http_passwd是在使用的配置参数http_proxy插件。

服务器管理插件

原文链接:https://blog.csdn.net/u013331606/article/details/103972375/

© 版权声明
THE END
喜欢就支持一下吧
点赞6 分享