Contents

Realm 端口转发完全指南:跨网段、IPv4/IPv6 双栈中转与负载均衡

1. 为什么需要 Realm?

Firewalld 端口转发 能处理 90% 的单机转发场景——但当你的需求超过「A 端口 → B 机器」这个点对点模型时,firewalld 就开始力不从心了。

以下三种场景,firewalld 要么配置极其繁琐,要么根本做不了:

场景 firewalld Realm
IPv4 → IPv6 跨栈转发 需手写两套规则 一条 endpoint 配置
同一端口转发到多个目标(负载均衡) 不支持 原生多 remote
域名目标(DNS 解析变更自动跟随) 不支持 remote = "domain:port"
流量过滤/白名单 需额外 iptables 规则 内置 include/exclude

Realm 是 Rust 编写的用户态端口转发程序,约 3MB 的二进制文件,依赖为零。它把上述复杂需求收敛到 /etc/realm/config.toml 一个文件中,结构清晰、维护成本低。


2. 实验环境

项目 详情
CPU 架构 x86_64(也提供 aarch64 版本)
操作系统 Debian 12 / Ubuntu 24.04
Realm 版本 v2.9.3
监听示例 [::]:10001-10003(双栈,匹配 IPv4 + IPv6)
目标示例 域名 / IPv4 / IPv6 各一

3. 安装与配置

第 1 步:下载 Realm

sudo mkdir -p /usr/src/realm && cd /usr/src/realm
sudo wget https://github.com/zhboner/realm/releases/download/v2.9.3/realm-x86_64-unknown-linux-gnu.tar.gz
ARM 架构

Oracle Cloud Always Free 的 ARM 机器或其他 ARM 服务器,用 realm-aarch64-unknown-linux-gnu.tar.gz

sudo wget https://github.com/zhboner/realm/releases/download/v2.9.3/realm-aarch64-unknown-linux-gnu.tar.gz

第 2 步:解压并安装到 $PATH

sudo tar -zxvf realm-x86_64-unknown-linux-gnu.tar.gz
sudo chmod +x realm
sudo chown -R root:root realm
sudo mv realm /usr/local/bin/
sudo rm -rf /usr/src/realm

验证安装:

realm --version

第 3 步:编写 config.toml

sudo mkdir -p /etc/realm
sudo nano /etc/realm/config.toml

以下是一个生产级配置模板,覆盖三种常见目标类型:

[log]
level = "info"
output = "/var/log/realm.log"

[network]
use_udp = true

# 转发至域名(DNS 解析自动跟随)
[[endpoints]]
listen = "[::]:10001"
remote = "bl.xzcloudnode.sbs:50309"
tcpFastOpen = true
udp = true

# 转发至 IPv4
[[endpoints]]
listen = "[::]:10002"
remote = "158.21.17.235:35003"
tcpFastOpen = true
udp = true

# 转发至 IPv6
[[endpoints]]
listen = "[::]:10003"
remote = "[2404:7a80:ff20:6900:be24:11ff:fe6c:e661]:30123"
tcpFastOpen = true
udp = true
为什么 listen 用 [::] 而不是 0.0.0.0?
[::] 在 Linux 上默认开启 IPV6_V6ONLY=0,可以同时接收 IPv4 和 IPv6 连接。用 0.0.0.0 则只监 IPv4。除非有特殊需求(如只允许内网 IPv4),否则直接写 [::] 是最省事的选择。

第 4 步:创建 systemd 服务

sudo nano /etc/systemd/system/realm.service
[Unit]
Description=Realm Port Forwarding
After=network.target

[Service]
ExecStart=/usr/local/bin/realm -c /etc/realm/config.toml
Restart=always
User=root
Group=root
LimitNOFILE=1048576

[Install]
WantedBy=multi-user.target

第 5 步:启动并设置开机自启

sudo systemctl daemon-reload
sudo systemctl enable realm --now
sudo systemctl status realm --no-pager

4. 常用命令速查

动作 命令
启动 sudo systemctl start realm
停止 sudo systemctl stop realm
重启 sudo systemctl restart realm
状态 sudo systemctl status realm --no-pager
日志 sudo journalctl -u realm -n 80 --no-pager
实时日志 sudo tail -f /var/log/realm.log

5. Realm vs firewalld:什么时候用哪个?

维度 firewalld Realm
运行层级 内核 netfilter 用户态
性能 接近线速 高(Rust,零开销抽象)
配置复杂度 低(单端口场景) 低(TOML 一目了然)
多目标 / 负载均衡 不支持 原生支持
IPv4↔IPv6 跨栈 需手写两套规则 一个 listen=[::] 搞定
流控 / 限速 / 白名单 需 nftables 配合 内置
国内云厂商友好度 高(内核标准能力) 中(用户态程序,需注意合规使用)

简单结论:点对点转发用 firewalld,跨栈/多目标/负载均衡用 Realm。两者并不互斥——同一台机器上可以共存,各自管理自己的端口集合。


6. FAQ

Q: Realm 延迟会比 firewalld 高吗?

用户态转发的确比内核态多一次上下文切换,但 Realm 基于 Rust 异步运行时(tokio),实际增加延迟在亚毫秒级。对远程桌面、游戏代理这类延迟敏感场景也足够。实测中转机到目标机在同一机房时,增加 < 2ms。

Q: 同一端口可以转发到多个目标吗?

可以。在 config.toml 的同一个 [[endpoints]] 块中,remote 字段支持多个地址(逗号分隔),Realm 自动进行轮询负载均衡。

Q: 在国内云厂商(如阿里云/腾讯云)上用 Realm 安全吗?

Realm 本身是合法的端口转发工具——它不加密、不混淆,功能透明。但国内云厂商对「中转境外流量」的监控较为严格。如果你用 Realm 做国内中转 → 境外落地这类链路,建议配合 WireGuard 提前加密 或使用专线(如 IEPL/IPLC),避免明文流量触发风控。


7. 推荐阅读