frp内网转发代理神器详解
一、frp 是什么
二、VPS linux服务器端安装服务器端frps
三、服务器端frps的frps.ini进行配置
四、客服端frpc的frpc.ini进行配置
五、公网服务器端frps启动
则说明服务器端已经启动Frp服务,监听的端口是7000
六、内网主机启动客户端frpc
nohup ./frpc -c frpc.ini
nohup ./frpc -c frpc.ini > frpc.log &
四、Linux 系统下使用 systemd 控制 frps 及配置开机自启
六、代理类型
七、使用场景
1.通过 SSH 访问内网机器
- 在具有公网 IP 的机器上部署 frps,修改 frps.ini 文件,这里使用了最简化的配置,设置了 frp 服务器用户接收客户端连接的端口:
[common] bind_port = 7000
- 在需要被访问的内网机器上(SSH 服务通常监听在 22 端口)部署 frpc,修改 frpc.ini 文件,假设 frps 所在服务器的公网 IP 为 106.13.218.47
[common] server_addr = 106.13.218.47 server_port = 7000 [ssh] type = tcp local_ip = 127.0.0.1 local_port = 22 remote_port = 6000
local_ip 和 local_port 配置为本地需要暴露到公网的服务地址和端口。remote_port 表示在 frp 服务端监听的端口,访问此端口的流量将会被转发到本地服务对应的端口。
- 分别启动 frps 和 frpc
ssh -oPort=6000 test@x.x.x.x
5.frp 会将请求 x.x.x.x:6000 的流量转发到内网机器的 22 端口。
2.通过自定义域名访问内网的 Web 服务
HTTP 类型的代理相比于 TCP 类型,不仅在服务端只需要监听一个额外的端口 vhost_http_port 用于接收 HTTP 请求,还额外提供了基于 HTTP 协议的诸多功能。
[common] bind_port = 7000 vhost_http_port = 8080
[common] server_addr = 106.13.218.47 server_port = 7000
[web] type = http local_port = 80 custom_domains = www.yourdomain.com [web2] type = http local_port = 8080 custom_domains = www.yourdomain2.com
3.转发 DNS 查询请求
DNS 查询请求通常使用 UDP 协议,frp 支持对内网 UDP 服务的穿透,配置方式和 TCP 基本一致。
- frps.ini 内容如下:
[common] bind_port = 7000
- frpc.ini 内容如下:
[common] server_addr = x.x.x.x server_port = 7000 [dns] type = udp local_ip = 8.8.8.8 local_port = 53 remote_port = 6000
这里反代了 Google 的 DNS 查询服务器的地址,仅仅用于测试 UDP 代理,并无实际意义。
- 分别启动 frps 和 frpc。
dig @x.x.x.x -p 6000 www.baidu.com
4.转发 Unix 域套接字
这个示例通过配置 Unix域套接字客户端插件来通过 TCP 端口访问内网的 Unix域套接字服务,例如 Docker Daemon。- frps.ini 内容如下:
[common]
bind_port = 7000
- frpc.ini 内容如下:
[common]
server_addr = x.x.x.x
server_port = 7000
[unix_domain_socket]
type = tcp
remote_port = 6000
plugin = unix_domain_socket
plugin_unix_path = /var/run/docker.sock
- 分别启动 frps 和 frpc。
4.通过 curl 命令查看 docker 版本信息
curl http://x.x.x.x:6000/version
5.对外提供简单的文件访问服务
通过 static_file 插件可以对外提供一个简单的基于 HTTP 的文件访问服务。
- frps.ini 内容如下:
[common] bind_port = 7000
- frpc.ini 内容如下:
[common] server_addr = x.x.x.x server_port = 7000 [test_static_file] type = tcp remote_port = 6000 plugin = static_file # 要对外暴露的文件目录 plugin_local_path = /tmp/file # 用户访问 URL 中会被去除的前缀,保留的内容即为要访问的文件路径 plugin_strip_prefix = static plugin_http_user = abc plugin_http_passwd = abc
- 分别启动 frps 和 frpc。
4.为本地 HTTP 服务启用 HTTPS
- frps.ini 内容如下:
[common] bind_port = 7000
- 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 plugin_header_X-From-Where = frp
- 分别启动 frps 和 frpc。
5.安全地暴露内网服务
对于某些服务来说如果直接暴露于公网上将会存在安全隐患。
使用 stcp(secret tcp) 类型的代理可以避免让任何人都能访问到要穿透的服务,但是访问者也需要运行另外一个 frpc 客户端。
- frps.ini 内容如下:
[common] bind_port = 7000
- 在需要暴露到外网的机器上部署 frpc,且配置如下:
[common] server_addr = x.x.x.x server_port = 7000 [secret_ssh] type = stcp # 只有 sk 一致的用户才能访问到此服务 sk = abcdefg local_ip = 127.0.0.1 local_port = 22
- 在想要访问内网服务的机器上也部署 frpc,且配置如下:
[common] server_addr = x.x.x.x server_port = 7000 [secret_ssh_visitor] type = stcp # stcp 的访问者 role = visitor # 要访问的 stcp 代理的名字 server_name = secret_ssh sk = abcdefg # 绑定本地端口用于访问 SSH 服务 bind_addr = 127.0.0.1 bind_port = 6000
ssh -oPort=6000 test@127.0.0.1
6.点对点内网穿透
frp 提供了一种新的代理类型 xtcp 用于应对在希望传输大量数据且流量不经过服务器的场景。
使用方式同 stcp 类似,需要在两边都部署上 frpc 用于建立直接的连接。
目前处于开发的初级阶段,并不能穿透所有类型的 NAT 设备,所以穿透成功率较低。穿透失败时可以尝试 stcp 的方式。
- frps.ini 内容如下,需要额外配置监听一个 UDP 端口用于支持该类型的客户端:
[common] bind_port = 7000 bind_udp_port = 7000
- 在需要暴露到外网的机器上部署 frpc,且配置如下:
[common] server_addr = x.x.x.x server_port = 7000 [p2p_ssh] type = xtcp # 只有 sk 一致的用户才能访问到此服务 sk = abcdefg local_ip = 127.0.0.1 local_port = 22
- 在想要访问内网服务的机器上也部署 frpc,且配置如下:
[common] server_addr = x.x.x.x server_port = 7000 [p2p_ssh_visitor] type = xtcp # xtcp 的访问者 role = visitor # 要访问的 xtcp 代理的名字 server_name = p2p_ssh sk = abcdefg # 绑定本地端口用于访问 ssh 服务 bind_addr = 127.0.0.1 bind_port = 6000
ssh -oPort=6000 test@127.0.0.1
常用功能
统计面板(Dashboard)
通过浏览器查看 frp 的状态以及代理统计信息展示。
注:Dashboard 尚未针对大量的 proxy 数据展示做优化,如果出现 Dashboard 访问较慢的情况,请不要启用此功能。
需要在 frps.ini 中指定 dashboard 服务使用的端口,即可开启此功能:
[common] dashboard_port = 7500 # dashboard 用户名密码,默认都为 admin dashboard_user = admin dashboard_pwd = admin
打开浏览器通过 http://[server_addr]:7500
访问 dashboard 界面,用户名密码默认为 admin
。
加密与压缩
这两个功能默认是不开启的,需要在 frpc.ini 中通过配置来为指定的代理启用加密与压缩的功能,压缩算法使用 snappy:
# frpc.ini [ssh] type = tcp local_port = 22 remote_port = 6000 use_encryption = true use_compression = true
如果公司内网防火墙对外网访问进行了流量识别与屏蔽,例如禁止了 SSH 协议等,通过设置 use_encryption = true
,将 frpc 与 frps 之间的通信内容加密传输,将会有效防止流量被拦截。
如果传输的报文长度较长,通过设置 use_compression = true
对传输内容进行压缩,可以有效减小 frpc 与 frps 之间的网络流量,加快流量转发速度,但是会额外消耗一些 CPU 资源。
TLS
从 v0.25.0 版本开始 frpc 和 frps 之间支持通过 TLS 协议加密传输。通过在 frpc.ini
的 common
中配置 tls_enable = true
来启用此功能,安全性更高。
为了端口复用,frp 建立 TLS 连接的第一个字节为 0x17。
注意: 启用此功能后除 xtcp 外,不需要再设置 use_encryption。
代理限速
目前支持在客户端的代理配置中设置代理级别的限速,限制单个 proxy 可以占用的带宽。
# frpc.ini [ssh] type = tcp local_port = 22 remote_port = 6000 bandwidth_limit = 1MB
在代理配置中增加 bandwidth_limit
字段启用此功能,目前仅支持 MB
和 KB
单位。
范围端口映射
在 frpc 的配置文件中可以指定映射多个端口,目前只支持 tcp 和 udp 的类型。
这一功能通过 range:
段落标记来实现,客户端会解析这个标记中的配置,将其拆分成多个 proxy,每一个 proxy 以数字为后缀命名。
例如要映射本地 6000-6005, 6007 这 6 个端口,主要配置如下:
# frpc.ini [range:test_tcp] type = tcp local_ip = 127.0.0.1 local_port = 6000-6006,6007 remote_port = 6000-6006,6007
实际连接成功后会创建 8 个 proxy,命名为 test_tcp_0, test_tcp_1 ... test_tcp_7