高性能端口转发工具 Realm 使用指南

项目简介

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

性能优化建议

  1. 启用零拷贝:在 Linux 上设置 zero_copy = true
  2. 调整系统限制:在 /etc/security/limits.conf 中增加文件描述符限制
    * soft nofile 65535
    * hard nofile 65535
  3. 启用 BBR:优化 TCP 拥塞控制
    echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
    echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf
    sysctl -p
  4. 使用 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 协议。

参考链接