FRP配置详解

frp

建立状态什么是frp?

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

frp还具有P2P连接模式。

  1. 目录
  2. 发展状况
  3. 建筑
  4. 用法示例
  5. 通过SSH访问LAN中的计算机
  6. 通过自定义域访问LAN中的Web服务
  7. 转发DNS查询请求
  8. 转发Unix域套接字
  9. 公开一个简单的HTTP文件服务器
  10. 为本地HTTP服务启用HTTPS
  11. 私下公开您的服务
  12. P2P模式
  13. 特征
  14. 配置文件
  15. 使用环境变量
  16. 仪表板
  17. 管理员界面
  18. 验证客户端
  19. 加密与压缩
  20. TLS
  21. 热装frpc配置
  22. 从客户端获取代理状态
  23. 只允许服务器上的某些端口
  24. 端口复用
  25. 带宽限制
  26. 对于每个代理
  27. TCP流多路复用
  28. 支持KCP协议
  29. 连接池
  30. 负载均衡
  31. 服务健康检查
  32. 重写HTTP主机头
  33. 设置其他HTTP标头
  34. 获取真实IP
  35. HTTP X转发
  36. 代理协议
  37. 要求HTTP基本身份验证(密码)的Web服务
  38. 自定义子域名
  39. URL路由
  40. 通过HTTP PROXY连接到frps
  41. 范围端口映射
  42. 客户端插件
  43. 服务器管理插件

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

把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插件。

服务器管理插件

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值