[网络] 反向代理与内网穿透:FRPC

缘起: Gradio

  • Gradio是一款快速构建AI Web演示应用的Python Web框架(主要适用于科研、实验室,而非ToC的Web应用),其支持本地运行和远程访问。

1个极简的Gradio代码:app.py

import gradio as gr  # 导入gradio库,gradio用于快速创建机器学习模型的web界面
 
 
# 定义一个名为greet的函数,接收两个参数:name 和 intensity
def greet(name, intensity):
    # 函数返回一个字符串,包含问候语和根据intensity重复的名字
    return "Hello, " + name + "!" * int(intensity)  
 
 
# 使用gr.Interface创建一个UI界面,fn指定了接口的函数,inputs定义了输入类型,outputs定义了输出类型
demo = gr.Interface(
    fn=greet,  # 指定greet函数作为接口的回调函数
    inputs=["text", "slider"],  # 设置两个输入,一个文本输入框和一个滑块
    outputs=["text"],  # 设置一个文本输出,用于显示greet函数的结果
)
 
#demo.launch()  # 启动界面,这将会在本地服务器上运行web应用程序
demo.launch(share=True)  # share=True 即可支持远程访问

如何运行呢?

(base) D:\Workspace\CodeRepositories\gradio-app> python app.py
信息: 用提供的模式无法找到文件。
* Running on local URL:  http://127.0.0.1:7860

Could not create share link. Missing file: C:\Users\xxx\AppData\Roaming\Python\Python312\site-packages\gradio\frpc_windows_amd64_v0.3.

Please check your internet connection. This can happen if your antivirus software blocks the download of this file. You can install manually by following these steps:

1. Download this file: https://cdn-media.huggingface.co/frpc-gradio-0.3/frpc_windows_amd64.exe
2. Rename the downloaded file to: frpc_windows_amd64_v0.3
3. Move the file to this location: C:\Users\xxx\AppData\Roaming\Python\Python312\site-packages\gradio
  • Gradio的远程访问,无需用户精通网络和Web开发相关技术,那么它怎么做到的呢?

从上面的日志中可见,是利用了frpc这款反向代理软件。(公网IP的问题,应是Gradio组织提供的)

  • 由此,本篇的正主frpc开始。

概述:反向代理与内网穿透软件(FRPC)

  • frp 是一个可用于内网穿透高性能反向代理应用
  • 支持 tcp, udp 协议,为 http 和 https 应用协议提供了额外的能力
  • 且尝试性支持了点对点穿透
  • 其名称其实就是使用了 Fast Reverse Proxy 的首字母缩写。

FRPC的架构

反向代理的场景类型

类型 描述
tcp 单纯的 TCP 端口映射,服务端会根据不同的端口路由到不同的内网服务。
udp 单纯的 UDP 端口映射,服务端会根据不同的端口路由到不同的内网服务。
http 针对 HTTP 应用定制了一些额外的功能,例如修改 Host Header,增加鉴权。
https 针对 HTTPS 应用定制了一些额外的功能。
stcp 安全的 TCP 内网代理,需要在被访问者和访问者的机器上都部署 frpc,不需要在服务端暴露端口。
sudp 安全的 UDP 内网代理,需要在被访问者和访问者的机器上都部署 frpc,不需要在服务端暴露端口。
xtcp 点对点内网穿透代理,功能同 stcp,但是流量不需要经过服务器中转。
tcpmux 支持服务端 TCP 端口的多路复用,通过同一个端口访问不同的内网服务。

FRPC 的安装篇

FRPC Install on Windows

Step1 下载安装包

  • url

Step2 解压即安装

$ pwd
/d/Program/frpc/frp_0.39.1_windows_amd64

$ ls -la
total 24262
drwxr-xr-x 1 EDY 197612        0 Jan  4 09:55 ./
drwxr-xr-x 1 EDY 197612        0 Jan  4 09:56 ../
-rw-r--r-- 1 EDY 197612    11358 Feb  9  2022 LICENSE
-rwxr-xr-x 1 EDY 197612 10769408 Feb  9  2022 frpc.exe*
-rw-r--r-- 1 EDY 197612      126 Feb  9  2022 frpc.ini
-rw-r--r-- 1 EDY 197612    10009 Feb  9  2022 frpc_full.ini
-rwxr-xr-x 1 EDY 197612 14029824 Feb  9  2022 frps.exe*
-rw-r--r-- 1 EDY 197612       26 Feb  9  2022 frps.ini
-rw-r--r-- 1 EDY 197612     5155 Feb  9  2022 frps_full.ini
drwxr-xr-x 1 EDY 197612        0 Jan  4 09:55 systemd/
  • frpc : 客户端(一般放内网服务器)
  • frps : 服务端(一般放公网服务器)

补充:v0.61.0(可见与v0.39.1的文件区别较大)

Step3 配置环境变量

  • 新建系统变量: FRP_HOME = D:\Program\frpc\frp_0.39.1_windows_amd64\

  • 编辑系统环境变量Path,新增1项:%FRP_HOME%\

Step4 验证

C:\Users\xxx>frpc --version
0.39.1

C:\Users\xxx>frpc --help
frpc is the client of frp (https://github.com/fatedier/frp)

Usage:
  frpc [flags]
  frpc [command]

Available Commands:
  help        Help about any command
  http        Run frpc with a single http proxy
  https       Run frpc with a single https proxy
  reload      Hot-Reload frpc configuration
  status      Overview of all proxies status
  stcp        Run frpc with a single stcp proxy
  sudp        Run frpc with a single sudp proxy
  tcp         Run frpc with a single tcp proxy
  tcpmux      Run frpc with a single tcpmux proxy
  udp         Run frpc with a single udp proxy
  verify      Verify that the configures is valid
  xtcp        Run frpc with a single xtcp proxy

Flags:
  -c, --config string   config file of frpc (default "./frpc.ini")
  -h, --help            help for frpc
  -v, --version         version of frpc

Use "frpc [command] --help" for more information about a command.

Y 推荐文献

  • FRPC
  • Gradio

应用案例

案例:将内网Linux服务器上的web网站映射到公网上去

做具体的配置前,根据对应的操作系统及架构,从github 页面下载所需版本的程序。

  • frpsfrps.ini 放到具有公网 IP 的机器上。

请注意配置防火墙安全组放过配置文件使用的端口

  • frpcfrpc.ini 放到处于内网环境的机器上。

  • 公网windows上部署frps

Step1 上传frp安装包到**公网上的Windows服务器上

Step2 修改公网服务器的配置文件frps.ini文件

Step3 在公网服务器启动frps.exe程序

  • cmd:
frps.exe -c ./frps.ini

出现 frps started successfully 代表frps启动成功

Step4 在内网liunx上部署frpc

  • frpc上传到本地内网的liunx服务器上并解压此文件
$ cd frp_0.39.1_linux_386

$ ls
frpc frpc_full.ini frpc.ini frps frps_full_ini frps.ini LICENSE systemd

Step5 在内网服务器配置frpc.ini

这里需要有一个自己的公网域名

Step6 在内网服务器启动FRPC

./frpc -c ./frpc.ini

启动frpc,出现[web] start proxy success即可

Step7 在浏览器访问与验证

http://ccq.caichuanqi.cn:8000

在浏览器上访问成功

案例:通过 rdp 访问家里的机器

  • 详情参见:

案例:通过 SSH 访问公司内网机器

  • 详情参见:

案例:通过自定义域名访问部署于内网的 Web 服务

  • 详情参见:

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

  • 详情参见:

FRP 常用功能

统计面板(Dashboard)

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

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

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

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

加密与压缩

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

  • 如果公司内网防火墙对外网访问进行了流量识别与屏蔽,例如禁止了 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 可以占用的带宽。

  • 在代理配置中增加 bandwidth_limit 字段启用此功能,目前仅支持 MB 和 KB 单位。

范围端口映射

  • 在 frpc 的配置文件中可以指定映射多个端口,目前只支持 tcp 和 udp 的类型。

这一功能通过 range: 段落标记来实现,客户端会解析这个标记中的配置,将其拆分成多个 proxy,每一个 proxy 以数字为后缀命名。

例如要映射本地 6000-6005, 6007 这 6 个端口,主要配置如下:

实际连接成功后会创建 8 个 proxy,命名为 test_tcp_0, test_tcp_1 ... test_tcp_7。

X 参考文献

版本: frp_0.25.3_windows_amd64.exe
0.61.3的配置方式上,区别较大

版本: frp_0.33.0_linux_amd64.tar.gz
os : centos

posted @ 2025-01-04 10:16  千千寰宇  阅读(186)  评论(0编辑  收藏  举报