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/