项目简介
Realm 是一款由 Rust 语言编写的高性能端口转发(Relay)工具,由 zhboner 开发维护。项目地址:https://github.com/zhboner/realm
核心特性
- 零配置运行:支持一键启动,无需复杂配置
- 高性能转发:双向并发流量处理,极低延迟
- 资源占用低:Rust 语言天生优势,内存占用极小
- 协议支持:TCP/UDP 流量转发,支持 WebSocket、TLS 传输
- 负载均衡:内置多种负载均衡策略
- 跨平台:支持 Linux、Windows、macOS,支持 ARM 架构
应用场景
1. 代理流量中转(完整三端配置)
解决客户端到目标服务器之间网络质量差的问题:
┌──────────────────────────────────────────────────────────────────┐ │ │ │ 客户端(A) 中转服务器(B) 目标服务器(C) │ │ │ │ │ │ │ │ │ │ 连接 B:5299 │ 转发到 C:5241 │ 节点监听 │ │ │ ───────────────► │ ─────────────────► │ 在 5241 │ │ │ ◄─────────────── │ ◄──────────────── │ │ │ │ └──────────────────────────────────────────────────────────────────┘
|
适用于:绕过网络封锁、改善跨境连接质量、隐藏真实服务器 IP
下面详细说明每台服务器需要进行的操作:
目标服务器 (C) - 正常运行节点
C 是你的「落地机」,只需要正常运行你的代理节点,不需要安装 Realm。
假设你使用 VLESS + Reality 协议,配置示例:
{ "inbounds": [ { "listen": "0.0.0.0", "port": 5241, "protocol": "vless", "settings": { "clients": [ { "id": "你的UUID", "flow": "xtls-rprx-vision" } ], "decryption": "none" }, "streamSettings": { "network": "tcp", "security": "reality", "realitySettings": { "show": false, "dest": "www.microsoft.com:443", "serverNames": ["www.microsoft.com"], "privateKey": "私钥", "shortIds": [""] } } } ], "outbounds": [ { "protocol": "freedom", "settings": {} } ] }
|
注意:C 的节点监听在 5241 端口,Realm 会把流量转发到这个端口。
中转服务器 (B) - 安装配置 Realm
B 是「中转机」,需要安装 Realm 并配置端口转发。
步骤 1:安装 Realm
mkdir -p /etc/realm
cd /etc/realm wget https://github.com/zhboner/realm/releases/download/v2.7.0/realm-x86_64-unknown-linux-gnu.tar.gz tar -zxvf realm-x86_64-unknown-linux-gnu.tar.gz chmod +x realm
|
步骤 2:创建配置文件
vim /etc/realm/config.toml
|
填入以下内容(根据实际情况修改):
[log] level = "warn" output = "realm.log"
[network] use_udp = true zero_copy = true tcp_timeout = 300 udp_timeout = 30
[[endpoints]] listen = "0.0.0.0:5299" remote = "目标服务器C的IP:5241"
|
步骤 3:测试运行
cd /etc/realm ./realm -c config.toml
|
看到类似输出表示运行成功:
2026/04/28 12:00:00 [INFO] realm started 2026/04/28 12:00:00 [INFO] listening on 0.0.0.0:5299
|
按 Ctrl+C 停止测试。
步骤 4:设置开机自启
cat > /etc/systemd/system/realm.service << 'EOF' [Unit] Description=Realm Relay Service After=network-online.target Wants=network-online.target systemd-networkd-wait-online.service
[Service] Type=simple ExecStart=/etc/realm/realm -c /etc/realm/config.toml WorkingDirectory=/etc/realm Restart=on-failure RestartSec=5s User=root
[Install] WantedBy=multi-user.target EOF
systemctl daemon-reload systemctl enable realm systemctl start realm
|
步骤 5:放行防火墙端口
ufw allow 5299/tcp ufw allow 5299/udp
iptables -A INPUT -p tcp --dport 5299 -j ACCEPT iptables -A INPUT -p udp --dport 5299 -j ACCEPT
|
客户端 (A) - 修改连接配置
A 是你的上网设备(手机、电脑),需要把代理配置的服务器地址从 C 改为 B 的 IP。
以 sing-box 为例,修改 outbound:
{ "outbounds": [ { "type": "vless", "tag": "中转节点", "server": "中转服务器B的IP", "server_port": 5299, "uuid": "你的UUID", "flow": "xtls-rprx-vision", "reality": { "public_key": "公钥", "short_id": "短ID" } } ] }
|
流量走向:
A (客户端) │ 连接 中转服务器B 的 5299 端口 │ ▼ B (中转服务器) [Realm 监听 0.0.0.0:5299] │ 转发流量到 目标服务器C 的 5241 端口 │ ▼ C (目标服务器) [节点监听 0.0.0.0:5241]
|
完整配置示例
B(中转服务器)的完整配置:
[log] level = "warn" output = "realm.log"
[network] use_udp = true zero_copy = true fast_open = true tcp_timeout = 300 udp_timeout = 60
[[endpoints]] listen = "0.0.0.0:5299" remote = "目标服务器C的IP:5241"
[[endpoints]] listen = "0.0.0.0:5298" remote = "目标服务器C的IP:22" use_udp = false
|
进阶:WebSocket 伪装传输
如果中转网络对直接 TCP 转发有限制,可以使用 WebSocket 模式:
B(中转服务器)配置:
[[endpoints]] listen = "0.0.0.0:443" remote = "127.0.0.1:5299" listen_transport = "ws;host=your-domain.com;path=/relay"
|
需要配合 Nginx/Caddy 等 Web 服务器,将 /relay 路径的流量代理到本地端口。
C(目标服务器)的 sing-box 配置:
{ "inbounds": [ { "listen": "127.0.0.1", "port": 5299, "protocol": "vless", "streamSettings": { "network": "ws", "wsSettings": { "path": "/relay" } } } ] }
|
多中转串联
如果需要多级中转(更多跳):
客户端(A) → 中转B:5299 → 中转D:5300 → 目标C:5241
|
只需在每个中转节点都安装 Realm,并依次转发即可。协议本身支持多层跳转。
常见问题排查
| 问题 |
原因 |
解决方法 |
| 连接超时 |
防火墙未放行端口 |
检查 B 的 5299 端口是否开放 |
| 连接被重置 |
协议被识别 |
启用 WebSocket + TLS 伪装 |
| 延迟很高 |
中转节点选择不当 |
选择地理位置更近的节点 |
| UDP 不通 |
use_udp 未开启 |
配置中设为 use_udp = true |
| 日志报错 |
目标服务器连接失败 |
检查 C 的服务是否正常运行 |
2. IPv4/IPv6 互通
将 IPv6 流量转发到 IPv4 服务,或反之。常见用例:
- 幻兽帕鲁游戏服务器(不支持原生 IPv6)
- 任何需要 IPv4/IPv6 互转的场景
3. 游戏联机服务
为不支持原生网络协议的游戏提供转发支持。
安装方式
方式一:下载预编译二进制(推荐)
访问 Release 页面 下载对应架构的压缩包:
| 架构 |
下载文件 |
| x86_64 |
realm-x86_64-unknown-linux-gnu.tar.gz |
| aarch64 |
realm-aarch64-unknown-linux-gnu.tar.gz |
| armv7 |
realm-armv7-unknown-linux-gnueabihf.tar.gz |
| Windows |
realm-x86_64-pc-windows-gnu.tar.gz |
mkdir -p /etc/realm cd /etc/realm wget https://github.com/zhboner/realm/releases/download/v2.7.0/realm-x86_64-unknown-linux-gnu.tar.gz tar -zxvf realm-x86_64-unknown-linux-gnu.tar.gz chmod +x realm
|
方式二:使用一键脚本
wget -qO- https://raw.githubusercontent.com/zywe03/realm-xwPF/main/xwPF.sh | sudo bash -s install
wget -qO- https://v6.gh-proxy.org/https://raw.githubusercontent.com/zywe03/realm-xwPF/main/xwPF.sh | sudo bash -s install
|
方式三:Docker 部署
docker pull ghcr.io/zhboner/realm:latest
docker run -d --name realm \ -v /path/to/config.toml:/etc/realm/config.toml \ -p 8443:8443 \ ghcr.io/zhboner/realm:latest \ -c /etc/realm/config.toml
|
方式四:从源码编译
需要安装 Rust 工具链:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
git clone https://github.com/zhboner/realm && cd realm
cargo build --release
|
配置详解
配置文件格式
Realm 支持 TOML 和 JSON 两种配置格式,推荐使用 TOML。
基础配置文件示例
创建 /etc/realm/config.toml:
[log] level = "warn" output = "realm.log"
[network] use_udp = true zero_copy = true fast_open = true tcp_timeout = 300 udp_timeout = 30
[[endpoints]] listen = "0.0.0.0:8443" remote = "目标服务器IP:443"
[[endpoints]] listen = "0.0.0.0:10000" remote = "example.com:443"
|
使用 WebSocket 传输
[[endpoints]] listen = "0.0.0.0:40000" remote = "127.0.0.1:50000" listen_transport = "ws;host=example.com;path=/relay"
[[endpoints]] listen = "0.0.0.0:50000" remote = "127.0.0.1:51000" remote_transport = "ws;host=example.com;path=/relay"
|
使用 TLS 传输
[[endpoints]] listen = "0.0.0.0:443" remote = "目标服务器:443" listen_transport = "tls;servername=example.com"
|
启用负载均衡
[log] level = "warn"
[[endpoints]] listen = "0.0.0.0:8443" remote = ["backend1.example.com:443", "backend2.example.com:443", "backend3.example.com:443"] balance = "round_robin"
|
完整配置示例
[log] level = "warn" output = "/var/log/realm.log"
[dns] mode = "ipv4_and_ipv6" protocol = "tcp_and_udp" min_ttl = 0 max_ttl = 3600 cache_size = 10000
[network] use_udp = true zero_copy = true fast_open = true tcp_timeout = 300 udp_timeout = 60 send_proxy = false accept_proxy = false
[[endpoints]] listen = "0.0.0.0:8443" remote = "1.1.1.1:443"
[[endpoints]] listen = "0.0.0.0:8444" remote = "8.8.8.8:53" use_udp = true
|
命令行参数
realm -c config.toml
realm -c config.toml -d
realm -c config.toml -u
realm -c config.toml -m
realm -c config.toml -t
realm -c /path/to/config/
export REALM_CONF='{"endpoints":[{"listen":"127.0.0.1:5000","remote":"1.1.1.1:443"}]}' realm
|
一键安装脚本
以下是一键安装脚本,整合了下载、解压、配置和服务设置:
#!/bin/bash
set -e
VERSION="2.7.0" INSTALL_DIR="/etc/realm" BINARY_PATH="/usr/local/bin/realm" CONFIG_PATH="${INSTALL_DIR}/config.toml" ARCH=$(uname -m)
case $ARCH in x86_64) PACKAGE="realm-x86_64-unknown-linux-gnu.tar.gz" ;; aarch64) PACKAGE="realm-aarch64-unknown-linux-gnu.tar.gz" ;; armv7l) PACKAGE="realm-armv7-unknown-linux-gnueabihf.tar.gz" ;; *) echo "不支持的架构: $ARCH" exit 1 ;; esac
echo "正在下载 Realm v${VERSION}..." mkdir -p ${INSTALL_DIR} cd ${INSTALL_DIR} wget -q "https://github.com/zhboner/realm/releases/download/v${VERSION}/${PACKAGE}"
echo "正在解压..." tar -zxvf ${PACKAGE} chmod +x realm mv realm ${BINARY_PATH} rm -f ${PACKAGE}
cat > ${CONFIG_PATH} << 'EOF' [log] level = "warn" output = "realm.log"
[network] use_udp = true zero_copy = true tcp_timeout = 300 udp_timeout = 30
[[endpoints]] listen = "0.0.0.0:8443" remote = "目标服务器IP:443" EOF
echo "配置已创建: ${CONFIG_PATH}" echo "请编辑配置文件后运行: systemctl start realm"
cat > /etc/systemd/system/realm.service << 'EOF' [Unit] Description=Realm Relay Service After=network-online.target Wants=network-online.target systemd-networkd-wait-online.service
[Service] Type=simple ExecStart=/usr/local/bin/realm -c /etc/realm/config.toml WorkingDirectory=/etc/realm Restart=on-failure RestartSec=5s User=root
[Install] WantedBy=multi-user.target EOF
echo "安装完成!" echo "" echo "启动服务:" echo " systemctl daemon-reload" echo " systemctl enable realm" echo " systemctl start realm" echo "" echo "查看状态:" echo " systemctl status realm" echo "" echo "查看日志:" echo " journalctl -u realm -f"
|
保存为 install-realm.sh 后执行:
chmod +x install-realm.sh sudo ./install-realm.sh
|
与代理软件集成
配合 sing-box 使用
作为中转时,客户端配置示例:
{ "outbounds": [ { "type": "vless", "tag": "relay", "server": "中转服务器IP", "server_port": 8443, "uuid": "你的UUID", "flow": "xtls-rprx-vision", "reality": { "public_key": "公钥", "short_id": "短ID" } } ] }
|
配合 Xray/V2Ray 使用
在 Xray 的 inbound 或 outbound 中将服务器地址指向 Realm 中转地址即可。
系统服务管理
systemctl daemon-reload
systemctl enable realm
systemctl start realm
systemctl stop realm
systemctl restart realm
systemctl status realm
journalctl -u realm -f
|
性能优化建议
- 启用零拷贝:在 Linux 上设置
zero_copy = true
- 调整系统限制:在
/etc/security/limits.conf 中增加文件描述符限制* soft nofile 65535 * hard nofile 65535
|
- 启用 BBR:优化 TCP 拥塞控制
echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf sysctl -p
|
- 使用 MPTCP:在多路径网络环境下启用
-m 参数
常见问题
Q: 转发后显示的 IP 是中转服务器 IP?
Realm 是四层代理,不会修改原始数据包。如需保留原始 IP,可使用 send_proxy 选项配合支持 Proxy Protocol 的上游服务。
Q: 如何验证转发是否生效?
ss -tlnp | grep 8443
nc -zv localhost 8443
tail -f /etc/realm/realm.log
|
Q: UDP 转发不生效?
确保配置中 use_udp = true,且目标服务支持 UDP 协议。
参考链接