您的位置 首页 > 数码极客

外网如何点对点连接内网

frp 是一个可用于内网穿透的高性能的反向代理应用,支持 tcp, udp 协议,为 http 和 HTTPS 应用协议提供了额外的能力,且尝试性支持了点对点穿透。可以用它进行小程序开发。

将 frps 及 放到具有公网 IP 的机器上。

将 frpc 及 放到处于内网环境的机器上。

通过 ssh 访问公司内网机器

  1. 修改 文件,这里使用了最简化的配置,设置了 frp 服务器端接收客户端流量的端口:
# [common] bind_port = 7000
  1. 启动 frps:

./frps -c ./

  1. 修改 文件,假设 frps 所在服务器的公网 IP 为 x.x.x.x:
# [common] server_addr = x.x.x.x server_port = 7000 [ssh] type = tcp local_ip = 127.0.0.1 local_port = 22 remote_port = 6000

注意,local_port(客户端侦听)和 remote_port(服务器端暴露)是用来出入 frp 系统的两端,server_port 则是服务器用来与客户端通讯的。

  1. 启动 frpc:

./frpc -c ./

  1. 通过 ssh 访问内网机器,假设用户名为 test:

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

通过自定义域名访问部署于内网的 web 服务

有时想要让其他人通过域名访问或者测试我们在本地搭建的 web 服务,但是由于本地机器没有公网 IP,无法将域名解析到本地的机器,通过 frp 就可以实现这一功能,以下示例为 http 服务,https 服务配置方法相同, vhost_http_port 替换为 vhost_https_port, type 设置为 https 即可。

  1. 修改 文件,设置 http 访问端口为 8080:
# [common] bind_port = 7000 vhost_http_port = 8080
  1. 启动 frps:

./frps -c ./

  1. 修改 文件,假设 frps 所在的服务器的 IP 为 x.x.x.x,local_port 为本地机器上 web 服务对应的端口, 绑定自定义域名 www.yourdomain.com:
# [common] server_addr = x.x.x.x server_port = 7000 [web] type = http local_port = 80 custom_domains = www.yourdomain.com
  1. 启动 frpc:

./frpc -c ./

  1. 将 www.yourdomain.com 的域名 A 记录解析到 IP x.x.x.x,如果服务器已经有对应的域名,也可以将 CNAME 记录解析到服务器原先的域名。
  2. 通过浏览器访问 即可访问到处于内网机器上的 web 服务。

对外提供简单的文件访问服务

通过 static_file 插件可以对外提供一个简单的基于 HTTP 的文件访问服务。

frps 的部署步骤同上。

  1. 启动 frpc,启用 static_file 插件,配置如下:
# [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
  1. 通过浏览器访问 来查看位于 /tmp/file 目录下的文件,会要求输入已设置好的用户名和密码。

为本地 HTTP 服务启用 HTTPS

通过 https2http 插件可以让本地 HTTP 服务转换成 HTTPS 服务对外提供。

  1. 启用 frpc,启用 https2http 插件,配置如下:
# [common] server_addr = x.x.x.x server_port = 7000 [test_htts2http] type = https custom_domains = plugin = https2http plugin_local_addr = 127.0.0.1:80 # HTTPS 证书相关的配置 plugin_crt_path = . plugin_key_path = . plugin_host_header_rewrite = 127.0.0.1 plugin_header_X-From-Where = frp
  1. 通过浏览器访问 https:// 即可。

安全地暴露内网服务

对于某些服务来说如果直接暴露于公网上将会存在安全隐患。

使用 stcp(secret tcp) 类型的代理可以避免让任何人都能访问到要穿透的服务,但是访问者也需要运行另外一个 frpc。

以下示例将会创建一个只有自己能访问到的 ssh 服务代理。

frps 的部署步骤同上。

  1. 启动 frpc,转发内网的 ssh 服务,配置如下,不需要指定远程端口:
# [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
  1. 在要访问这个服务的机器上启动另外一个 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
  1. 通过 ssh 访问内网机器,假设用户名为 test:

ssh -oPort=6000 test@127.0.0.1

点对点内网穿透

frp 提供了一种新的代理类型 xtcp 用于应对在希望传输大量数据且流量不经过服务器的场景。

使用方式同 stcp 类似,需要在两边都部署上 frpc 用于建立直接的连接。

目前处于开发的初级阶段,并不能穿透所有类型的 NAT 设备,所以穿透成功率较低。穿透失败时可以尝试 stcp 的方式。

  1. frps 除正常配置外需要额外配置一个 udp 端口用于支持该类型的客户端:
bind_udp_port = 7001
  1. 启动 frpc,转发内网的 ssh 服务,配置如下,不需要指定远程端口:
# [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
  1. 在要访问这个服务的机器上启动另外一个 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
  1. 通过 ssh 访问内网机器,假设用户名为 test:

ssh -oPort=6000 test@127.0.0.1

Dashboard

通过浏览器查看 frp 的状态以及代理统计信息展示。

注:Dashboard 尚未针对大量的 proxy 数据展示做优化,如果出现 Dashboard 访问较慢的情况,请不要启用此功能。

需要在 中指定 dashboard 服务使用的端口,即可开启此功能:

[common] dashboard_port = 7500 # dashboard 用户名密码,默认都为 admin dashboard_user = admin dashboard_pwd = admin

打开浏览器通过 http://[server_addr]:7500 访问 dashboard 界面,用户名密码默认为 admin。

Admin UI

Admin UI 可以帮助用户通过浏览器来查询和管理客户端的 proxy 状态和配置。

需要在 中指定 admin 服务使用的端口,即可开启此功能:

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

打开浏览器通过 访问 Admin UI,用户名密码默认为 admin。

如果想要在外网环境访问 Admin UI,将 7400 端口映射出去即可,但需要重视安全风险。

监控

frps 当启用 Dashboard 后,会默认开启内部的监控,数据存放在内存中,每次重启进程后会清空,监控数据可以通过 dashboard 的地址发送 HTTP 请求获取。

目前还支持 Prometheus 作为可选的监控系统。

Prometheus

在 中启用 Dashboard,并且设置 enable_prometheus = true,则通过 http://{dashboard_addr}/metrics 可以获取到 Prometheus 的监控数据。

客户端身份验证

目前 frpc 和 frps 之间支持两种身份验证方式,token 和 oidc。

通过 和 中 [common] section 的 authentication_method 参数配置需要使用的验证方法。

authenticate_heartbeats = true 将会在每一个心跳包中附加上鉴权信息。

authenticate_new_work_conns = true 将会在每次建立新的工作连接时附加上鉴权信息。

Token

当 authentication_method = token,将会启用基于 token 的验证方式。

需要在 和 的 [common] section 中设置相同的 token。

OIDC

当 authentication_method = oidc,将会启用基于 OIDC 的身份验证。

验证流程参考 Client Credentials Grant

启用这一验证方式,配置 和 如下:

# [common] authentication_method = oidc oidc_issuer = oidc_audience = [common] authentication_method = oidc oidc_client_id = 98692467-37de-409a-9fac-bb2585826f18 # Replace with OIDC client ID oidc_client_secret = oidc_secret oidc_audience = oidc_token_endpoint_url =

加密与压缩

这两个功能默认是不开启的,需要在 中通过配置来为指定的代理启用加密与压缩的功能,压缩算法使用 snappy:

# [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 协议加密传输。通过在 的 common 中配置 tls_enable = true 来启用此功能,安全性更高。

为了端口复用,frp 建立 TLS 连接的第一个字节为 0x17。

通过将 的 [common] 中 tls_only 设置为 true,可以强制 frps 只接受 TLS 连接。

注意: 启用此功能后除 xtcp 外,不需要再设置 use_encryption。

客户端热加载配置文件

当修改了 frpc 中的代理配置,可以通过 frpc reload 命令来动态加载配置文件,通常会在 10 秒内完成代理的更新。

启用此功能需要在 frpc 中启用 admin 端口,用于提供 API 服务。配置如下:

# [common] admin_addr = 127.0.0.1 admin_port = 7400

之后执行重启命令:

frpc reload -c ./

等待一段时间后客户端会根据新的配置文件创建、更新、删除代理。

需要注意的是,[common] 中的参数除了 start 外目前无法被修改。

通过密码保护你的 web 服务

由于所有客户端共用一个 frps 的 http 服务端口,任何知道你的域名和 url 的人都能访问到你部署在内网的 web 服务,但是在某些场景下需要确保只有限定的用户才能访问。

frp 支持通过 HTTP Basic Auth 来保护你的 web 服务,使用户需要通过用户名和密码才能访问到你的服务。

该功能目前仅限于 http 类型的代理,需要在 frpc 的代理配置中添加用户名和密码的设置。

# [web] type = http local_port = 80 custom_domains = http_user = abc http_pwd = abc

通过浏览器访问 http://,需要输入配置的用户名和密码才能访问。

责任编辑: 鲁达

1.内容基于多重复合算法人工智能语言模型创作,旨在以深度学习研究为目的传播信息知识,内容观点与本网站无关,反馈举报请
2.仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证;
3.本站属于非营利性站点无毒无广告,请读者放心使用!

“外网如何点对点连接内网”边界阅读