什么是xfrpc
xfrpc项目是用C语言编写的frp客户端实现,专为OpenWRT和物联网系统设计。该项目的主要动机是为资源有限的设备提供一个轻量级解决方案,比如OpenWRT设备通常ROM和RAM空间有限。该项目旨在提供一个比其他可用选项占用更少空间和内存的frp客户端。
开发状态
xfrpc部分兼容最新的frp发布功能,目标是完全兼容最新的frp发布版本。
以下表格详细列出了兼容功能:
功能 | xfrpc | frpc |
---|---|---|
tcp | 支持 | 支持 |
tcpmux | 支持 | 支持 |
http | 支持 | 支持 |
https | 支持 | 支持 |
custom_domains | 支持 | 支持 |
subdomain | 支持 | 支持 |
socks5 | 支持 | 不支持 |
use_encryption | 不支持 | 支持 |
use_compression | 不支持 | 支持 |
udp | 不支持 | 支持 |
p2p | 不支持 | 支持 |
xtcp | 不支持 | 支持 |
stcp | 不支持 | 支持 |
架构
时序图
sequenceDiagram
title: xfrpc与frps通信交互时序图
participant 本地服务
participant xfrpc
participant frps
participant 远程访问用户
xfrpc ->> frps : TypeLogin消息
frps ->> xfrpc : TypeLoginResp消息
Note right of frps : 根据Login信息里面的pool值,决定给xfrpc发送几条TypeReqWorkConn请求信息
frps ->> xfrpc : frps aes-128-cfb iv[16] 数据
frps -->> xfrpc : TypeReqWorkConn消息
loop 根据Login中的PoolCount创建工作连接数
xfrpc -->> frps : TypeNewWorkConn消息
Note left of xfrpc : 与服务器创建代理服务工作连接,并请求新的工作连接请求
Note right of frps : 处理xfrpc端发送的TypeNewWorkConn消息,注册该工作连接到连接池中
frps ->> xfrpc : TypeStartWorkConn消息
Note left of xfrpc : 将新创建的工作连接与代理的本地服务连接做绑定
end
xfrpc ->> frps : xfrpc aes-128-cfb iv[16] 数据
loop 用户配置的代理服务数
xfrpc -->> frps : TypeNewProxy消息
frps -->> xfrpc : NewProxyResp消息
end
loop 心跳包检查
xfrpc -->> frps : TypePing消息
frps -->> xfrpc : TypePong消息
end
远程访问用户 ->> frps : 发起访问
frps ->> xfrpc : TypeStartWorkconn消息
loop 远程访问用户与本地服务之间的交互过程
frps ->> xfrpc : 用户数据
xfrpc ->> 本地服务 : 用户数据
本地服务 ->> xfrpc : 本地服务数据
xfrpc ->> frps : 本地服务数据
frps ->> 远程访问用户 : 本地服务数据
end
如何构建
在Ubuntu 20.04.3 LTS上构建
要在Ubuntu 20.04 LTS上运行xfrpc,你需要安装以下库:libevent、openssl-dev和json-c。在终端中使用以下命令安装这些库:
sudo apt-get update
sudo apt-get install -y libjson-c-dev libevent-dev libssl-dev
安装完所需的库后,你可以通过在GitHub上fork xfrpc仓库,然后使用以下命令将其克隆到你的本地机器来下载xfrpc源代码:
git clone https://github.com/${YOUR_GITHUB_ACCOUNT_NAME}/xfrpc.git
进入xfrp目录并创建一个build目录,使用以下命令:
cd xfrp
mkdir build
使用以下命令构建和安装xfrpc: 这将编译 xfrpc 并在 build 目录中创建一个可执行文件。然后,您可以通过在终端中运行适当的命令来使用该可执行文件运行 xfrpc。
使用内置第三方库构建 xfrpc
使用内置第三方库构建 xfrpc。
需要 cmake 版本 > 3.1。
要使用内置的第三方库构建 xfrpc,您可以在 GitHub 上 fork xfrpc 仓库,然后在本地克隆它。接着,进入 xfrp 目录,创建一个 build 目录,并使用 cmake 配置构建。
git clone https://github.com/${YOUR_GITHUB_ACCOUNT_NAME}/xfrpc.git
cd xfrp
mkdir build
cmake -D THIRDPARTY_STATIC_BUILD=ON ..
make
通过设置 THIRDPARTY_STATIC_BUILD=ON,构建过程将使用 xfrpc 源代码中包含的库,而不是使用系统上安装的库。
THIRDPARTY_STATIC_BUILD 参数默认设置为 OFF,这意味着默认情况下构建过程将使用系统上安装的库。
需要注意的是,您需要 cmake 版本大于 3.1 才能使用此功能。
使用内置第三方库交叉编译 xfrpc
在 x86 架构下编译 arm 架构或 mips 架构 xfrpc 的方法如下。
在 Ubuntu 22.04 LTS 上测试
交叉编译 mips 架构 xfrpc(仅支持 linux mips,不支持 irix mips) 如果在特定的 mips 架构上无法运行,请修改 thirdparty 文件夹中的 CMakeLists.txt,将 linux-mips32 字符串改为 linux-generic32。修改后可以工作。
sudo apt-get install gcc-mips-linux-gnu # 安装 mips-gcc 编译器
mkdir build && cd build
cmake -DTHIRDPARTY_STATIC_BUILD=mips -DCMAKE_C_COMPILER=mips-linux-gnu-gcc ..
make
CMAKE_C_COMPILER 标志是您的交叉编译器的路径。建议将其放入环境变量中。
交叉编译 arm 架构 xfrpc
sudo apt-get install arm-linux-gnueabihf-gcc
mkdir build && cd build
cmake -DTHIRDPARTY_STATIC_BUILD=arm -DCMAKE_C_COMPILER=arm-linux-gnueabihf-gcc ..
make
在 Alpine 容器中构建静态二进制文件
在项目根目录下
$ DOCKER_BUILDKIT=1 docker build --output out . -f docker/Dockerfile
$ ls out/
xfrpc
在 OpenWrt master 上构建
自版本 1.04.515 起,xfrpc 已包含在 OpenWrt 社区中,这使用户可以轻松地将其包含在自定义固件镜像中。建议使用最新版本的 xfrpc,因为它可能包含错误修复和新功能。
要在 OpenWrt 固件镜像中包含 xfrpc,您可以使用 make menuconfig 命令打开配置菜单。在菜单中,导航至"Network",选择"Web Servers/Proxies",然后选择 xfrpc。这将在将要构建的固件镜像中包含 xfrpc。
使用 asan 构建 xfrpc(用于检测内存泄漏)
当遇到段错误时,请使用以下命令编译 xfrpc:
cmake -DCMAKE_BUILD_TYPE=Debug ..
现在您的 xfrpc 可以检测内存泄漏。我们将来会在 CI 流程中添加它。
快速使用指南
在使用 xfrpc 之前,您应该获取 frps 服务器:frps
frps 是 FRP(快速反向代理)系统的服务器端组件,用于将传入连接转发到 xfrpc。
- frps
要运行 frps,您可以使用以下命令,提供 frps 配置文件的路径:
./frps -c frps.ini
示例中提供了一个 frps.ini 配置文件示例,将 frps 绑定到监听 7000 端口。
# frps.ini
[common]
bind_port = 7000
- xfrpc tcp 支持
xfrpc 是 FRP 系统的客户端组件,可用于转发 TCP 连接。要将传入的 TCP 连接转发到本地服务,您可以在 xfrpc_mini.ini 文件中使用以下示例配置 xfrpc
#xfrpc_mini.ini
[common]
server_addr = your_server_ip
server_port = 7000
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6128
此配置告诉 frp 服务器(frps)将传入的远程端口 6128 上的连接转发到 xfrpc 客户端。xfrpc 客户端随后会将这些连接转发到运行在 IP 地址 127.0.0.1 和端口 22 上的本地服务。
- xfrpc http&https 支持 在xfrpc中支持HTTP和HTTPS相比仅支持TCP需要额外的配置。在frps.ini配置文件中,必须添加vhost_http_port和vhost_https_port选项来指定frp服务器(frps)将监听传入HTTP和HTTPS连接的端口。
# frps.ini
[common]
bind_port = 7000
vhost_http_port = 80
vhost_https_port = 443
确保xfrpc客户端正确配置以与frp服务器通信很重要,需要在xfrpc配置文件中指定正确的服务器地址和端口。
# xfrpc_mini.ini
[common]
server_addr = x.x.x.x
server_port = 7000
[http]
type = http
local_port = 80
local_ip = 127.0.0.1
custom_domains = www.example.com
[https]
type = https
local_port = 443
local_ip = 127.0.0.1
custom_domains = www.example.com
FRP服务器(frps)将把传入的HTTP和HTTPS连接转发到域名"www.example.com",具体位置是xfrpc在配置文件中指定的本地IP和端口(分别为127.0.0.1:80和127.0.0.1:443)。
- 在调试模式下运行
为了排查运行xfrpc时的问题,你可以使用调试模式。这种模式在运行时会提供更多信息。
xfrpc -c frpc_mini.ini -f -d 7
- 在发布模式下运行:
xfrpc -c frpc_mini.ini -d 0
需要注意的是,在发布模式下运行xfrpc会生成较少的日志输出,运行速度也会比调试模式更快,因此在生产环境中建议使用发布模式运行xfrpc。
OpenWrt LuCI配置界面
如果你在OpenWRT设备上运行xfrpc,luci-app-xfrpc是一个不错的选择,它提供了一个基于Web的界面来配置和管理xfrpc。luci-app-xfrpc是LuCI Web界面的一个模块,LuCI是OpenWRT的默认Web界面。
luci-app-xfrpc已被LuCI项目采用,LuCI是OpenWRT的官方Web界面。这意味着它是一个受支持且维护良好的选项,用于在OpenWRT设备上管理xfrpc。
luci-app-xfrpc可以通过OpenWRT的opkg包管理器安装,它提供了一个用户友好的界面来配置xfrpc客户端,包括设置多个连接、自定义域名等选项。
如何为我们的项目做贡献
有关提交补丁和贡献工作流程的详细信息,请参阅CONTRIBUTING。
联系方式
QQ群:331230369
请支持我们并为我们的项目点星
打赏
支付宝打赏
微信打赏