高性能端口转发工具 Realm 使用指南
Rust 写的高性能端口转发工具 Realm:安装方式、配置文件详解、TCP/UDP 双向中转、WebSocket 与 TLS 传输、负载均衡和游戏联机实战。
项目简介
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 # 如果节点启用 UDP(如 WireGuard、游戏等)设为 true
zero_copy = true # Linux 启用零拷贝提升性能
tcp_timeout = 300
udp_timeout = 30
[[endpoints]]
listen = "0.0.0.0:5299" # B 监听的端口,客户端连接这个端口
remote = "目标服务器C的IP:5241" # 转发到 C 的对应端口
步骤 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
ufw allow 5299/tcp
ufw allow 5299/udp # 如果启用 UDP
# 如果使用 iptables
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", // 改为 B 的 IP
"server_port": 5299, // 改为 B 监听的端口
"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
# TCP + UDP 基础转发
[[endpoints]]
listen = "0.0.0.0:5299"
remote = "目标服务器C的IP:5241"
# 可添加多组转发规则
[[endpoints]]
listen = "0.0.0.0:5298"
remote = "目标服务器C的IP:22" # SSH 转发
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 |
# 以 x86_64 Linux 为例
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 工具链:
# 安装 Rust
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
# 克隆源码
git clone https://github.com/zhboner/realm && cd realm
# 编译
cargo build --release
# 二进制文件位于 target/release/realm
配置详解
配置文件格式
Realm 支持 TOML 和 JSON 两种配置格式,推荐使用 TOML。
基础配置文件示例
创建 /etc/realm/config.toml:
[log]
level = "warn" # 日志级别: trace, debug, info, warn, error
output = "realm.log" # 日志输出文件
[network]
use_udp = true # 启用 UDP 转发
zero_copy = true # 启用零拷贝(Linux)
fast_open = true # TCP Fast Open
tcp_timeout = 300 # TCP 超时(秒)
udp_timeout = 30 # UDP 超时(秒)
[[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" # 负载均衡策略: random, round_robin, least_conn
完整配置示例
[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
# 后台运行(Unix)
realm -c config.toml -d
# 强制启用 UDP
realm -c config.toml -u
# 启用 MPTCP
realm -c config.toml -m
# 禁用 TCP
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
# Realm 一键安装脚本
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"
# 创建 systemd 服务
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 中转地址即可。
系统服务管理
# 重新加载 systemd 配置
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 协议。
参考链接
- GitHub: https://github.com/zhboner/realm
- 一键脚本: https://github.com/zywe03/realm-xwPF
- Docker: ghcr.io/zhboner/realm
评论